XDC 与UCF 的最主要区别:
XDC 可以像UCF 一样作为一个整体文件被工具读入也可以在实现过程中被当做一个单独的命令直接执行。这就决定了XDC也具有Tcl命令的特点,即后面输入的约束在有冲突的情况下会覆盖之前的约束。另外,不同于UCF是全部读入再处理的方式,在XDC中,约束是读一条执行一条,所以先后顺序很重要,例如要设置IO约束之前,相应的clock一定要先创建好。
UCF 是完全以FPGA 的视角看问题,所以缺省认所有的时之间除非预先声明是同步的,否则就视作异步而不做跨时钟域时序分析;XDC则恰恰相反。
必须是最高创建的。对于7系列的FPGA来说,端口进来的时钟以及GT的时钟输出RXCLK/TXCLK都必须由用户create_clock自主创建为主时钟。如果是差分输入的时钟,可以仅仅在差分对的P侧用get_ports获取端口,并用create_clock创建。
例如:create_clock -name clk_200 -period 5 [get_ports clk200_p]
VIVADO的衍生时钟:MMCM、PLL、BUFR的输出作为衍生时钟,可以由VIVADO自动推导,无需用户创建。自动推导的好处在于其配置改变而不会影响输出时钟的频率和相位,用户不需要改写约束,VIVADO仍然可以自动推导出正确的频率/相位信息。劣势在于,用户并不清楚自动推导出的衍生时钟的名字,当设计层级改变时,衍生时钟的名字也有可能改变。这样就会带来一个问题:用户需要使用这些衍生时钟的名字来创建IO约束、时钟关系或者是时序例外等约束,要么不知道时钟名字,要么时钟名字就是错的。
create_generated_clock -name my_clk_name [get_pins mmcm0/CLKOUT]\
-source [get_pins mmcm0/CLKIN] -master_clock main_clk
推荐的做法是,由用户来指定这类衍生时钟的名字,其余频率等由VIVADO自动推导。这样就只需写明create_generated_clock的三个option,其余不写即可。
用户自动以的衍生时钟:寄存器和组合逻辑搭建的分频器等,必须由用户使用create_generated_clock来创建。
create_clock -name clk1 -period 4 [get_ports CKP1]
create_generated_clock -name clk2 [get_pins REGA/Q] -source [get_ports CKP1] -divide_by 2
在设计的初级阶段,可以不加IO约束,让工具专注于满足FPGA内部的时序要求。当时序满足基本要求后。再加上IO约束实现。XDC的IO约束有以下几点需要注意:
1.不加任何IO约束的端口时序要求被视作无穷大。
2.XDC中的set_input_delay/set_output_delay对应于UCF中OFFSET IN/OFFSET OUT,但视角相反。OFFSET IN/OFFSET OUT是从FPGA内部延时的角度来约束端口时序,set_input_delay/set_output_delay则是从系统角度来约束。
3.典型的IO时序,包括系统同步、源同步、SDR和DDR等等,在VIVADO图形界面的XDC templates中都有示例。
时序例外约束包括set_max_delay/set_min_delay,set_multicycle_path, set_false_path等,这类约束除了要满足XDC的先后顺序优先级外,还要受到自身优先级的限制。一个总的原则就是针对同一条路径,对约束目标描述的越具体,则优先级越高。不同的时序例外约束以及同一约束中不同条件的约束优先级如下: