XDC简介
XDC是Xilinx Design Constraints的缩写,但其基本语法来自SDC,是业界统一的约束规范。XDC本质上是一种Tcl语言,但它只支持基本的Tcl语法,如变量、列表、运算符等。其他复杂的循环和文件I/O语法可以通过在Vivado中获取Tcl文件来补充。
下图显示了SDC、XDC和Vivado Tcl之间的关系。
XDC的基本语法可以分为三类:时钟约束、I/O约束和时序异常约束。根据Xilinx中基线的建议的超快速设计方法学(详见UG949),设计上的约束序列也可以根据这三种类型的约束来执行。本文不会详细解释可以在帮助文档中找到的基本XDC语法,而是将重点放在用法和技巧上。
时钟约束
必须尽早创建时钟约束。对于7系列FPGA,来自端口的主时钟和GT的输出RXCLK/TX CLK必须由用户使用create_clock创建。衍生时钟分为以下两类:
MMCM/PLL/BUFR的输出时钟都可以由Vivado自动获得,无需用户创建。如果用户只想更改衍生时钟的名称,其他频率由工具自动推导,只需指定三个选项,其余留空:create _ generated _ cl ock[-name arg][-source args][-master _ clock arg]工具无法自动推导衍生时钟,包括用寄存器和组合逻辑构建的分频器,用户必须使用create_generated_cl ock。
输入输出约束
在设计的初始阶段,可以消除I/O约束,工具可以专注于满足FPGA内部的时序要求。时序要求基本满足后,再加入I/O约束来实现。
XDC的I/O约束有以下几点需要注意:
没有任何I/O约束的端口时序要求被视为无限。
XDC的set _ input _ delay/set _ output _ delay对应UCF的OFFSET IN/OFFSET OUT,只是视角相反。OFFSET IN/OFFSET OUT从FPGA内部延迟的角度约束端口时序,set _ input _ delay/set _ output _ delay从系统的角度约束端口时序。
典型的I/O序列,包括系统同步、源同步、SDR和DDR等。显示在Vivado图形界面的XDC模板中。在2014.1版之后,还有一个时间约束向导可用。
时序异常约束
例外的时序约束包括设置最大延迟/设置最小延迟、设置多周期路径、设置错误路径等。这些制约因素受到他们自己的优先事项以及XDC的优先事项的限制。一个总的原则是,对于同一条路径,约束目标的描述越具体,优先级越高。不同时序异常约束和同一约束中不同条件的优先级如下:
例如,下面两个xdc按顺序执行。虽然第二个是最后执行的,但工具仍然确定第一个约束设置的15是clk1和clk2之间路径的最大延迟值。
例如,如果将以下四个顺序异常约束依次应用于所示路径,则第二个将胜出。但是,如果添加了最后一个约束,则错误路径具有最高优先级,并将替换所有先前的时序异常约束。
有效的时钟约束
归根结底,约束是为设计服务的,所以要用好XDC,我们需要对电路结构和设计要求有深刻的理解。接下来,我们以常见FPGA设计中的时钟结构为例,阐述XDC的约束技巧。
时间序列的零起点
由create_clock定义的主时钟的起点是零起点时序的,在此之前,工具会自动忽略上游路径延迟。因此,点创建主时钟的时间非常重要。以下图所示的结构为例。当分别在FPGA输入端口和BUFG输出端口创建主时钟时,时序报告中反映的路径延迟完全不同。显然sysclk_bad的报告中遗漏了前期的延迟,时序报告不可信。
时钟定义序列
时钟的定义也遵循了XDC/Tcl的一般优先级,即在同一点上,用户定义的时钟会覆盖工具自动推导出的时钟,后面定义的时钟会覆盖
在上面的例子中,用户将BUFG的输出定义为派生时钟clkbufg,它将覆盖这里的原始sysclk。此外,图示的BUFR工作在旁路模式,其输出不会自动创建衍生时钟。然而,在bufr的输出端定义一个衍生时钟clkbufr并使用-add和-master_clock选项后,将会有两个重叠的时钟,sysclk和clkbufg。下面的Tcl命令验证了我们的推断。
与UCF约束不同的是,在XDC,所有的时钟在默认情况下都会被认为是相关的,即网表中所有现有的时序路径都会被Vivado分析。这也意味着FPGA设计人员必须通过约束告诉工具哪些路径不需要分析,哪些时钟域是异步的。
如上图所示,两个主时钟ssclkin和sysclk通过不同的端口进入FPGA,然后经过不同的时钟网络。要将它们设置为异步时钟,可以使用以下约束:
其中-include_generated_clocks意味着所有派生时钟都自动与其主时钟分组,因此它们与其他时钟是异步的。如果没有此选项,时钟关系的约束仅适用于主时钟级别。
重叠(单点多点)时钟
重叠时钟是指多个时钟共享同一个时钟传输网络。例如,多路复用器选择两个时钟并输出,这在采用多种工作模式的设计中很常见。
如下图所示,clk125和clk250是clkcore_buf的两个输入时钟。如果时钟关系不受约束,Vivado将跨时钟域(重叠时钟之间)分析图中所示的路径。即使没有违规,这样的时序报告也是不可信的,因为clk125和clk250不可能同时驱动这条路径上的时序元件。这样做还会增加运行时间,影响最终的实现效果。
如果clk125和clk250不驱动除了经过clkcore_buf后的同一个风扇之外的其他定时元件,我们要做的就是填充时钟关系的约束。
许多情况下,除了公共扇出之外,一个或两个时钟还驱动其它时序元件。此时建议在clkcore_buf的输出端创建两个重叠的导数时钟,并将它们的时钟关系约束为-physical _ exclusive,也就是说不可能同时通过。这可以最大化约束覆盖范围,这在伊势和UCF是不可能的。
其他高级约束
时钟约束是XDC的基础。掌握时钟约束也是XDC约束技能的基础。其他先进的约束技术,包括复杂的CDC(时钟域交叉)约束和接口时序(SDR、DDR、系统同步接口和源同步接口)约束,仍然有很多需要注意的地方。
标签:时钟约束时序