参考手册:
UG625:https://china.xilinx.com/support/documentation/sw_manuals/xilinx14_7/cgd.pdf
UG903:https://www.xilinx.com/support/documentation/sw_manuals/xilinx2017_4/ug903-vivado-using-constraints.pdf
作为FPGA开发者来说我们需要编写规范的代码,能做多好就做多好,这样可以尽可能降低编译器的工作难度,如果再适时地给编译器一些恰当的指导和建议(通过约束),就可以使FPGA设计更加高效。
一、时钟约束
1.外部输入时钟clk_in周期为10ns,占空比为25%,相移为90°约束形式为:
create_clock -name clk_in -period 10 -waveform{2.5 5} [get_ports clk_in]
# {2.5 5} 表示一个周期的波形中2.5ns - 5ns 为高。如果没有指定waveform默认为{0,period/2}为高
2.时钟clk_2由时钟clk_in衍生,clk_2频率为clk_in的频率除以2,clk_2表示modu_2模块的clk_out。
create_generated_clock -name clk_2 -source [get_port clk_in] -divide_by 2 [get_pins modu_2/clk_out]
# clk_in 0011001100110011001100
# clk_2 0011110000111100001111
3.时钟clk_3由时钟clk_in衍生,clk_3表示modu_3模块的clk_out。
create_generated_clock -name clk_3 -source [get_ports clk_in] -edges {1 3 5}[get_pins top/modu_3/clk_out]
# edges{1 3 5}表示从上升沿开始算起,在clk_in的第1、3、5时钟沿clk_3时钟沿变化。
# clk_in 001110011100111001110011100
# clk_3 001111100000111110000011111
4.设置clock group来确认各个时钟之间的关系。两个主时钟 clkin_1 和 clkin_2 进入 FPGA由不同的时钟网络传递,这两个时钟及他们的衍生时钟是一组异步时钟。
set_clock_groups -name async_clk -asynchronous \
-group [get_clocks -include_generated_clocks clkin_1] \
-group [get_clocks -include_generated_clocks clkin_2]
# -asynchronous 表示异步
# -include_generated_clocks 表示包括衍生时钟
5.有时同一模块在不同模式需要不同时钟来驱动。例如bufgctrl_i/O可由bufgctrl_i/I0和bufgctrl_i/I1衍生。
create_generated_clock -name clk125_bufgctrl \
-divide_by 1 [get_pins bufgctrl_i/O] \
-source [get_ports bufgctrl_i/I0]
create_generated_clock -name clk250_bufgctrl \
-divide_by 1 [get_pins bufgctrl_i/O] \
-source [get_ports bufgctrl_i/I1] \
-add -master_clock clk125_bufgctrl
# -add -master_clock表示添加时钟,否则是直接覆盖。
set_clock_groups –physically_exclusive \
–group clk125_bufgctrl \
–group clk250_bufgctrl
# -physically_exclusive 表示时钟物理意义上不会同时存在,如果为-logically_exclusive则是逻辑上独立。
二、引脚约束
1.将led1信号放在芯片的W13引脚
set_property PACKAGE_PIN W13 [get_port led1]
2.将led1所在引脚的电气标准设置为LVCMOS33:
set_property IOSTANDARD LVCMOS33 [get_ports led1]
3.将led1引脚上拉电阻约束为有效:
set_property PULLUP true [get_ports led1]
4.将led1引脚下拉电阻约束为有效:
set_property PULLDOWN true [get_ports led1]
5.IO的驱动能力不够导致线上的电平不能马上到达期望的波形,从而产生抖动。提高电源及时供给能力可以采用在芯片电源引脚周围加入较大电容储能。默认驱动能力为12mA。驱动能力有< 2 4 6 8 12 16 24 >mA(如果驱动不上看共地有没有问题)。将led1所在管脚驱动能力设置为16mA:
set_property DRIVE 16 [get_ports led1]
6.输出(双向)引脚转换速率slew rate可以设置为快fast和慢slow。默认为slow。
将led1所在输出引脚转换速率设置为快:
set_property SLEW FAST [get_ports led1]
7.高速收发器通道位置约束
set_property LOC GTXE2_CHANNEL_X0Y8 [get_cells 例化路径/gtx_support_i/gtx_init_i/inst/gtx_i/gt0_gtx_i/gtxe2_i]
8.输入输出模块IOB的约束。(如果在FF输出Q除了到OBUF连线输出外还有其他连接,就无法实现IOB寄存器的布局,只能用CLB中的寄存器。需要将该信号再按时钟打一拍再单独输出。)
set_property IOB TRUE [get_ports led1]
# led1 输出使用IOB
set_property IOB TRUE [all_inputs]
# 所有输入使用IOB
9.PCIE等、使用GT接口的链路时延需要配置链路参数。
# up_pcie_drive
set_property TX_RXDETECT_REF 3'b001 [get_cells {例化路径/inst/gt_top_i/pipe_wrapper_i/pipe_lane[0].gt_wrapper_i/gtx_channel.gtx_channel.gtxe2_channel_i}]
set_property TX_MARGIN_FULL_0 7'b1001010 [get_cells {例化路径/inst/gt_top_i/pipe_wrapper_i/pipe_lane[0].gt_wrapper_i/gtx_channel.gtx_channel.gtxe2_channel_i}]
三、注意事项
1.Vivado按照行序从上往下在约束文件中读取XDC的tcl指令,越后面的指令优先级越高,但描述越精确的指令优先级越高(与指令顺序无关)。相同目标属性的约束会向前覆盖。 因为synthesis and implementation algorithms are timing-driven一般把时钟约束放在前面物理位置约束放在后面。物理约束只在implementation时布局器与布线器会使用。
参考顺序:
Timing Assertions Section
Primary clocks
Virtual clocks
Generated clocks
Clock Groups
Input and output delay constraints
Timing Exceptions Section
False Paths
Max Delay / Min Delay
Multicycle Paths
Case Analysis
Disable Timing
Physical Constraints Section
2.一个Vivado工程中可以添加多个XDC文件,XDC文件也是有先后顺序的,可以在界面用鼠标拖拽来调整XDC文件的顺序。工程较大时一般把时钟约束和物理约束放到不同的文件当中,不同IP不同组放到不同文件。VIVADO也可以支持多组XDC文件集合,但是只有1个集合起作用(active)。如果我们一次create多个synthesis或者implementation,我们还可以为它们每一个分别制定一个约束文件。
3.每个XDC约束指令最好单独地完整地写一行(单个命令编写换行时行末加上"\" . "\"后不能有空格)。 注释以“#”开头且与指令不写在同一行。否则指令可能会解析错误。
四、更多编写方式可查看Vivado的XDC编写模板
五、其他约束
bit文件压缩
set_property BITSTREAM.GENERAL.COMPRESS true [current_design]
Flash固化文件为spi x4
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
老闻:“你聊个微信笑得这么开心是不是耍朋友了?”
小杨:“我TM刚分手!开心什么哦,哎~”
老吴:“肯定是无缝衔接,换了个新的。”
东子:“肯定是嘛,你们搞FPGA的讲究的就是个时序。”
阿科:“逻辑组的这些批个个都是时间管理大师。”