????????为了准确地对设计中的外部时序上下文进行建模,必须提供输入和输出端口的时序信息。因此要进行输入输出延时约束,延迟约束用的是set_input_delay
和set_output_delay
,分别用于input端和output端,其时钟源可以是时钟输入管脚,也可以是虚拟时钟。
set_input_delay -clock<args> -reference_pin<args> -clock_fall -rese -max -add_delay<delay><objects>
- -clock用于指定约束引脚的同步时钟(源时钟),<args>为同步时钟的名称,可以是主时钟或虚拟时钟;
- -reference_pin用于指定延时值<delay>的参考时钟,<args>为参考时钟名称;可选项,若不指定该选项则默认参考时钟为-clock指定的同步时钟;
- -clock_fall指定输入延时约束取值相对于同步时钟的下降沿;可选项,若不指定则默认为-clock_rise;
- -rise指定约束信号相对时钟边沿的关系是上升沿,也可以用-fall指定为下降沿;
- -max表示设定最大延时值,也可以用-min设置最小延时值;若不指定-max或-min。则输入延时值同时用最大和最小延时值的时序分析路径;
- <delay>指定将应用到目标输入引脚的延时值,有效值为大于或等于0的浮点数,默认为1.0;
- <objects>用于指定约束的目标输入引脚名称。
? ? ? ? 首先定义输入引脚为CLK0的主时钟sysCLK,然后约束了-max和-min值同2ns的输入延时约束
create_clock -name sysClk -period 10 [get_ports CLK0]
set_input_delay -clock sysClk 2 [get_ports DIN]
????????首先定义虚拟时钟clk_port_virt,然后约束了-max和-min值同2ns的输入延时约束
create_clock -name clk_port_virt -period 10
set_input_delay -clock clk_port_virt 2 [get_ports DIN]
????????首先定义输入引脚为CLK0的主时钟sysCLK,然后约束了-max和-min值分别为4ns和1ns的输入延时约束
create_clock -name sysClk -period 10 [get_ports CLK0]
set_input_delay -clock sysClk 4 [get_ports DIN]
set_output_delay -clock sysClk 1 [get_ports DOUT]
? ? ? ? 对输入引脚DIN进行约束,指定其相对同步时钟clk1下降沿后2ns的输入延时
set_input_delay -clock_fall -clock clk1 2 [get_ports DIN]
? ? ? ? 对输入引脚reset进行约束,指定其同步时钟为wbCLK,相对参考时钟wbCLK_IBUF_BUFG_inst/O上升沿后2ns的输入延时值
set_input_delay -clock wbCLK 2 -reference_pin [get_pin wbCLK_IBUF_BUFG_inst/0] [get_ports reset]
? ? ? ? 对输入时钟引脚DDR_CLK_IN做主时钟约束,命名为clk_ddr,以clk_ddr作为同步时钟,对输入数据引脚DDR_IN分别做同步时钟上升沿和下降沿的输入延时约束,并分别指定其输入延时的最大值和最小值。
create_clock -name clk_ddr -period 6 [get_ports DDR_CLK_IN]
set_input_delay -clock clk_ddr -max 2.1 [get_ports DDR_IN]
set_input_delay -clock clk_ddr -max 1.9 [get_ports DDR_IN] -clock_fall -add_delay
set_input_delay -clock clk_ddr -min 0.9 [get_ports DDR_IN]
set_input_delay -clock clk_ddr -min 1.1 [get_ports DDR_IN] -clock_fall -add_delay
????????set_output_delay命令用于指定输出数据引脚相对于其时钟沿的路径延时。通常输出延时值包含了数据信号从FPGA引脚到外部芯片的板级延时、外部芯片的建立时间和保存时间等。输出延时值可以是正值或负值。
????????set_output_delay以-max和-min参数分别表示约束的最大值和最小值,最大值用于建立时间检查,最小值用于保持时间检查。
????????set_output_delay约束命令的语法与set_input_delay相似:
set_output_delay -clock<args> -reference_pin<args> -clock_fall -rese -max -add_delay<delay><objects>
- -clock用于指定约束引脚的同步时钟(源时钟),<args>为同步时钟的名称,可以是主时钟或虚拟时钟;
- -reference_pin用于指定延时值<delay>的参考时钟,<args>为参考时钟名称;可选项,若不指定该选项则默认参考时钟为-clock指定的同步时钟;
- -clock_fall指定输入延时约束取值相对于同步时钟的下降沿;可选项,若不指定则默认为-clock_rise;
- -rise指定约束信号相对时钟边沿的关系是上升沿,也可以用-fall指定为下降沿;
- -max表示设定最大延时值,也可以用-min设置最小延时值;若不指定-max或-min。则输入延时值同时用最大和最小延时值的时序分析路径;
- <delay>指定将应用到目标输入引脚的延时值,有效值为大于或等于0的浮点数,默认为1.0;
- <objects>用于指定约束的目标输入引脚名称。
? ? ? ? 对输出引脚DOUT进行输出延时约束,首先定义主时钟sysCLK,然后约束了-max和-min值同6ns的输出延时约束
create_clock -name sysClk -period 10 [get_ports CLK0]
set_output_delay -clock sysClk 6 [get_ports DOUT]
???????? 对输出引脚DOUT进行输出延时约束,首先定义虚拟时钟clk_port_virt,然后约束了-max和-min值同6ns的输入延时约束
create_clock -name clk_port_virt -period 10
set_output_delay -clock clk_port_virt 6 [get_ports DOUT]
???????? 对DDR数据端口DDR_DOUT进行输出延时约束,参考时钟为主时钟clk_ddr。在约束中输出数据引脚DDR_OUT在时钟clk_ddr的上升沿和下降沿同时需要采样,所以使用-clock_fall -add -delay选项额外指定下降沿的输出延时(无-clock_fall -add -delay选项默认为上升沿的输出延时约束)
create_clock -name clk_ddr -period 6 [get_ports DDR_CLK_IN]
set_output_delay -clock clk_ddr -max 2.1 [get_ports DDR_OUT]
set_output_delay -clock clk_ddr -max 1.9 [get_ports DDR_OUT] -clock_fall -add_delay
set_output_delay -clock clk_ddr -min 0.9 [get_ports DDR_OUT]
set_output_delay -clock clk_ddr -min 1.1 [get_ports DDR_OUT] -clock_fall -add_delay
FPGA时序分析与约束(13)——I/O接口约束-CSDN博客
参考文献:
《FPGA时序约束与分析》
《正点原子FPGA静态时序分析与时序约束》?
《Intel Quartus Prime Standard Edition用户指南: Timing Analyzer》
《Vivado Design Suite User Guide: Using Constraints(UG903)》
《Vivado Design Suite 用户指南: 设计分析与收敛技巧 (UG906)》