xilinx©的新一代设计套件 vivado 中引入了全新的约束文件 xdc,在很多规则和技巧上都跟上一代产品 ise 中支持的 ucf 大不相同,给使用者带来许多额外挑战。xilinx 工具专家告诉你,其实用好 xdc 很容易,只需掌握几点核心技巧,并且时刻牢记:xdc 的语法其实就是 tcl 语言。
xdc 的优势
xdc 是 xilinx design constraints 的简写,但其基础语法来源于业界统一的约束规范sdc(最早由 synopsys 公司提出,故名 synopsys design constraints)。所以 sdc、xdc跟 vivado tcl 的关系如下图所示。
xdc 在本质上就是 tcl 语言,但其仅支持基本的 tcl 语法如变量、列表和运算符等等,对其它复杂的循环以及文件 i/o 等语法可以通过在 vivado 中 source 一个 tcl 文件的方式来补充。(对 tcl 话题感兴趣的读者可以参考作者的另一篇文章《tcl 在 vivado 中的应用》)xdc 与 ucf 的最主要区别有两点:
1.xdc 可以像 ucf 一样作为一个整体文件被工具读入,也可以在实现过程中被当作一个个单独的命令直接执行。这就决定了 xdc 也具有 tcl 命令的特点,即后面输入的约束在有冲突的情况下会覆盖之前输入的约束(时序例外的优先级会在下节详述)。另外,不同于 ucf 是全部读入再处理的方式,在 xdc 中,约束是读一条执行一条,所以先后顺序很重要,例如要设置 io 约束之前,相对应的 clock 一定要先创建好。
2.ucf 是完全以 fpga 的视角看问题,所以缺省认为所有的时钟之间除非预先声明是同步的,否则就视作异步而不做跨时钟域时序分析;xdc 则恰恰相反,asic 世界的血缘背景决定了在其中,所有的时钟缺省视作全同步,在没有时序例外的情况下,工具会主动分析每一条跨时钟域的路径。
xdc的基本语法
xdc的基本语法可以分为时钟约束、i/o约束以及时序例外约束三大类。根据xilinx的ultrafast设计方法学中baseline部分的建议(ug949中有详细介绍),对一个设计进行约束的先后顺序也可以依照这三类约束依次进行。本文对可以在帮助文档中查到的基本xdc语法不做详细解释,会将重点放在使用方法和技巧上。
时钟约束
时钟约束必须最早创建,对7系列fpga来说,端口进来的主时钟以及gt的输出rxclk/txclk都必须由用户使用create_clock自主创建。而衍生时钟则分为以下两类:
mmcm/pll/bufr的输出时钟都可以由vivado自动推导,无需用户创建。若用户仅希望改变衍生钟的名字,其余频率等都由工具自动推导,则只需写明三个option,其余不写即可:create_generated_clock [-name arg] [-source args] [-master_clock arg] 工具不能自动推导出衍生钟的情况,包括使用寄存器和组合逻辑搭建的分频器等,必须由用户使用create_generated_clock来创建。
i/o约束
在设计的初级阶段,可以不加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 templates中都有示例。2014.1版后还有一个timing constraints wizard可供使用。
时序例外约束
时序例外约束包括set_max_delay/set_min_delay,set_multicycle_path,set_false_path等,这类约束除了要满足xdc的先后顺序优先级外,还受到自身优先级的限制。一个总的原则就是针对同一条路径,对约束目标描述越具体的优先级越高。不同的时序例外约束以及同一约束中不同条件的优先级如下所示:
举例来说,依次执行如下两条xdc,尽管第二条最后执行,但工具仍然认定第一条约束设定的15为clk1到clk2之间路径的max delay值。
再比如,对图示路径依次进行如下四条时序例外约束,优胜者将是第二条。但如果再加入最后一条约束,false path的优先级最高,会取代之前所有的时序例外约束。
高效的时钟约束
约束最终是为了设计服务,所以要用好xdc就需要深入理解电路结构和设计需求。接下来我们就以常见fpga设计中的时钟结构来举例,详细阐述xdc的约束技巧。
时序的零起点
用create_clock定义的主时钟的起点即时序的“零起点”,在这之前的上游路径延时都被工具自动忽略。所以主时钟创建在哪个“点”很重要,以下图所示结构来举例,分别于fpga输入端口和bufg输出端口创建一个主时钟,在时序报告中体现出的路径延时完全不同,很明显sysclk_bad的报告中缺少了之前一段的延时,时序报告不可信。
时钟定义的先后顺序
时钟的定义也遵从xdc/tcl的一般优先级,即:在同一个点上,由用户定义的时钟会覆盖工具自动推导的时钟,且后定义的时钟会覆盖先定义的时钟。若要二者并存,必须使用 -add 选项。
上述例子中bufg的输出端由用户自定义了一个衍生钟clkbufg,这个衍生钟便会覆盖此处原有的sysclk。此外,图示bufr工作在bypass模式,其输出不会自动创建衍生钟,但在bufr的输出端定义一个衍生钟clkbufr,并使用-add 和 -master_clock 选项后,这一点上会存在sysclk和clkbufg两个重叠的时钟。如下的tcl命令验证了我们的推论。
不同于ucf约束,在xdc中,所有的时钟都会被缺省认为是相关的,也就是说,网表中所有存在的时序路径都会被vivado分析。这也意味着fpga设计人员必须通过约束告诉工具,哪些路径是无需分析的,哪些时钟域之间是异步的。
如上图所示,两个主时钟ssclkin和sysclk由不同的端口进入fpga,再经由不同的时钟网络传递,要将它们设成异步时钟,可以使用如下约束:
其中,-include_generated_clocks 表示所有衍生钟自动跟其主时钟一组,从而与其它组的时钟之间为异步关系。不加这个选项则仅仅将时钟关系的约束应用在主时钟层面。
重叠(单点多个)时钟
重叠时钟是指多个时钟共享完全相同的时钟传输网络,例如两个时钟经过一个mux选择后输出的时钟,在有多种运行模式的设计中很常见。
如下图所示,clk125和clk250是clkcore_buf的两个输入时钟,不约束时钟关系的情况下,vivado会对图示路径做跨时钟域(重叠时钟之间)分析。这样的时序报告即便没有违例,也是不可信的,因为clk125和clk250不可能同时驱动这条路径上的时序元件。这么做也会增加运行时间,并影响最终的实现效果。
如果clk125和clk250除了通过clkcore_buf后一模一样的扇出外没有驱动其它时序元件,我们要做的仅仅是补齐时钟关系的约束。
在很多情况下,除了共同的扇出,其中一个时钟或两个都还驱动其它的时序元件,此时建议的做法是在clkcore_buf的输出端上创建两个重叠的衍生钟,并将其时钟关系约束为-physically_exclusive 表示不可能同时通过。这样做可以最大化约束覆盖率,也是ise和ucf中无法做到的。
其它高级约束
时钟的约束是xdc的基础,熟练掌握时钟约束,也是xdc约束技巧的基础。其它高级约束技巧,包括复杂的cdc(clock domain crossing)约束和接口时序(sdr、ddr、系统同步接口和源同步接口)约束等方面还有很多值得注意的地方。
三星考虑分拆成两家公司 评估时间至少需要6个月
DPU这份“洪荒之力”发展的如何呢?
汽车核心零部件供需问题的思考
华为荣耀V9play起步价仅为999元,华为为什么要坚持做低端机?原因很简单!
智慧交通解决方案-EMA英码科技
XDC的时钟约束及优势
CC-LINK转Modbus网关在智慧城市建设中的应用介绍
物联网需要注意的四大挑战
全自动落地式BGA返修台:微电子制造业的精密工具
Innoviz助力实现消费者自动驾驶汽车计划
中英高校联合研究新成果:3D打印石墨烯基充电电池
苹果未来四年会购买高通的5G调制解调器
华硕飞马4A评测 续航拍照是亮点配置略低需改善
压电陶瓷片的原理说明
唯样携手Seeed:种下一颗种子,长出一片创意森林
特斯拉致死车祸调查新结果:并非自动驾驶的原因
怎样使用打印机,打印机的基础知识有哪些?
AI的力量可以提高效率 改善零售业部署体验
电机轴承过热的原因以及处理方法
广东联通联合华为进行5G网络测试实现了单用户下行峰值速率达2.5Gbps