Vivado与ISE中的约束
1 Introduction
尽管ISE工具使用较少,xilinx已经没有对其进行更新了。但是如果项目中使用了7系列以前的芯片的话只能使用ISE进行开发。VIVADO与ISE之间进行转换时最大的差异就是约束文件,VIVADO使用的是类似于SDC的xdc文件而ISE使用的是ucf文件。在数字IC开发时习惯于先参考DC综合的sdc文件完成VIVADO的xdc文件的编写然后完成ucf文件的编写。ucf的Xilinx的官方指导文件可以参考ug625、ug612 ,xdc可以参考ug911。本文介绍数字IC设计FPGA验证中常用的约束语法,包括物理约束、时钟周期约束、input_output约束、false_path约束、multi_cycle约束。本文主要对常用的语法进行简单总结。更详细的相关约束使用方法以及含义还需要参考官方的文档。
2 物理约束
ASIC的约束不包括物理约束在转换到FPGA版本时需要进行物理约束以指定IO对应的管脚。常用约束属性包括IO的管脚以及电平标准。需要注意的是当IO需要作为时钟输入时只有特定的引脚才支持。
xdc下IO以及电平约束如下
set_property IOSTANDAED LVCMOS18 [get_ports {sclk}];
set_property PACKAGE_PIN A11 [get_ports {sclk}];
ucf对应的约束如下
NET "sclk" LOC = A11;
NET "sclk" IOSTANDARD = LVCMOS33
3 时钟周期约束
时钟周期约束是最常用的约束类型,时钟周期约束直接决定了FPGA系统可运行的最高频率。通常ASIC约束的频率会大于FPGA约束频率,而FPGA中资源更丰富工艺更先进的芯片频率也可以约束更高。当正确约束后出现时序违例时最直接的方法就是降低约束的频率来消除时序违例,时序违例不大时改变综合策略也可以消除时序违例。
在xdc中约束时钟周期如下
create_clock -name sys_clk -period 5 [get_ports sclk];
在ucf时钟周期约束如下
NET "sclk" TNM = sys_clk
TIMESPEC "TS_sys_clk" = PERIOD "TNM_clk_ref" 5 ns ;
占空比可以指定,默认的占空比为50%,通常占空比都为50%。
4 input_output约束
在ASIC中输入输出约束通常是时钟周期的0.7倍。在FPGA中最好以接近外部器件实际的延迟进行约束。input与output中延迟的最大值用于建立时间的分析,最小值用于保持时间的分析。
在xdc中语法对应如下
set_input_delay -clock sclk -max 10ns [get_ports din];
set_input_delay -clock sclk -min 2ns [get_ports din];
set_output_delay -clock sclk -max 10ns [get_ports din];
set_output_delay -clock sclk -min 2ns [get_port din];
在ucf中语法如下
OFFSET = IN 10 ns BEFORE sclk;
OFFSET = OUT 10 ns BEFORE sclk;
5 false_path约束
false_path在ASIC设计约束中常见,通常SOC中都会有多个时钟,或者功能上不存在的路径。多个时钟的电路在设计中需要进行跨时钟域处理来保证能采样到信号同时不会发生亚稳态的问题。有时在使用购买的IP时提供商也会提供其电路模块中的伪路径。
在xdc中语法如下
set_false_path -from [get_ports A] -through [get_pins B] -to [get_ports C];
set_false_path -from [get_clocks clka] -to [get_clocks clkb];
在ucf中语法为如下,其中TNM与TNM_NET(Timing Name Net)区别在于TNM_NET作用于pad nets时TNM_NET会包括buffer之后的synchronous elements(同步元素,包括触发器、锁存器、RAM、DSP等资源)而TNM只能包括指定的nets到pad element。在其它情况下它们的效果一致。详细的区别说明见ug612
NET "A" TNM = "a";
NET "B" TNM = "c";
TIMESPEC TS_MultiPath = FROM a TO c;
NET "clka" TNM_NET = "GRP_CLKA";
NET "clkb" TNM_NET = "GRP_CLKB";
TIMESPEC TS_TIG = FROM "GRP_CLKA" TO "GRP_CLKB" TIG;
6 multi_cycle
在ASCI中有的组合电路比如复杂的计算单元延迟较大而系统的运行频率较高时不能在一个周期内产生计算结果。在HDL代码设计中会增加相关控制信号来保证一次计算经过了足够多的周期保证数据的正确。如果不对相关路径进行约束直接进行综合一方面会导致时序违例产生同时也增加了综合与实现运行的时间。
在xdc中进行多周期约束的语法如下
set_multicycle_path -from [get_cells a] -to [get_cells b] -setup 2;
set_multicycle_path -from [get_cells a] -to [get_cells b] -hold 1;
在ucf中对应语法为
NET a TNM = FFS "A";
NET b TNM = FFS "B";
NET "sclk" TNM_NET = "SCLK";
TIMESPEC "TS_SCLK" = PERIOD "SCLK" 20 ns HIGH 50%;
TIMESPEC TS_a_b = FROM "A" TO "B" TS_SCLK*2;