多周期路径约束

多周期路径,我们一般按照以下4个步骤来约束:

1. 带有使能的数据

首先来看带有使能的数据,在本工程中的Tming Report中,也提示了同一个时钟域之间的几个路径建立时间不满足要求

其实这几个路径都是带有使能的路径,使能的周期为2倍的时钟周期,本来就应该在2个时钟周期内去判断时序收敛。因此,我们添加时序约束:

set_multicycle_path 2 -setup -from [get_cells {cmd_parse_i0/send_resp_data_reg[*]} -include_replicated_objects] -to [get_cells {resp_gen_i0/to_bcd_i0/bcd_out_reg[*]}]

set_multicycle_path 1 -hold -from [get_cells {cmd_parse_i0/send_resp_data_reg[*]} -include_replicated_objects] -to [get_cells {resp_gen_i0/to_bcd_i0/bcd_out_reg[*]}]

也可以写为:

set_multicycle_path -from [get_cells {cmd_parse_i0/send_resp_data_reg[*]} -include_replicated_objects] -to [get_cells {resp_gen_i0/to_bcd_i0/bcd_out_reg[*]}] 2

set_multicycle_path -hold -from [get_cells {cmd_parse_i0/send_resp_data_reg[*]} -include_replicated_objects] -to [get_cells {resp_gen_i0/to_bcd_i0/bcd_out_reg[*]}] 1

这两种写法是等价的。

我们也可以直接点击右键通过GUI的方式进行约束,效果都是一样的。

在工程的uart_tx_ctl.v和uart_rx_ctl.v文件中,也存在带有使能的数据,但这些路径在未加多路径约束时并未报出时序错误或者警告。

在接收端,捕获时钟频率是200MHz,串口速率是115200,采用16倍的Oversampling,因此使能信号周期是时钟周期的200e6/115200/16=108.5倍。

在接收端,捕获时钟频率是166667MHz,串口速率是115200,采用16倍的Oversampling,因此使能信号周期是时钟周期的166.667e6/115200/16=90.4倍。

因此,时序约束如下:

# 串口接收端

set_multicycle_path -from [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL] 108

set_multicycle_path -hold -from [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL] 107

# 串口发送端

set_multicycle_path -from [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL] 90

set_multicycle_path -hold -from [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL] 89

约束中的filter参数也将在下一章节具体讲解。

2. 两个有数据交互的时钟之间存在相位差

在本工程中,没有这种应用场景,因此不需要添加此类约束。

3. 存在快时钟到慢时钟的路径

在本工程中,没有这种应用场景,因此不需要添加此类约束。

4. 存在慢时钟到快时钟的路径

在本工程中,没有这种应用场景,因此不需要添加此类约束。

综上,我们所有的时序约束如下:

# 主时钟约束

create_clock -period 25.000 -name clk2 [get_ports clk_in2]

# 衍生时钟约束

create_generated_clock -name clk_samp -source [get_pins clk_gen_i0/clk_core_i0/clk_tx] -divide_by 32 [get_pins clk_gen_i0/BUFHCE_clk_samp_i0/O]

create_generated_clock -name spi_clk -source [get_pins dac_spi_i0/out_ddr_flop_spi_clk_i0/ODDR_inst/C] -divide_by 1 -invert [get_ports spi_clk_pin]

create_generated_clock -name clk_tx -source [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKIN1] [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKOUT1]

create_generated_clock -name clk_rx -source [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKIN1] [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKOUT0]

# 设置异步时钟

set_clock_groups -asynchronous -group [get_clocks clk_samp] -group [get_clocks clk2]

# 延迟约束

create_clock -period 6.000 -name virtual_clock

set_input_delay -clock [get_clocks -of_objects [get_ports clk_pin_p]] 0.000 [get_ports rxd_pin]

set_input_delay -clock [get_clocks -of_objects [get_ports clk_pin_p]] -min -0.500 [get_ports rxd_pin]

set_input_delay -clock virtual_clock -max 0.000 [get_ports lb_sel_pin]

set_input_delay -clock virtual_clock -min -0.500 [get_ports lb_sel_pin]

set_output_delay -clock virtual_clock -max 0.000 [get_ports {txd_pin {led_pins[*]}}]

set_output_delay -clock virtual_clock -min -0.500 [get_ports {txd_pin {led_pins[*]}}]

set_output_delay -clock spi_clk -max 1.000 [get_ports {spi_mosi_pin dac_cs_n_pin dac_clr_n_pin}]

set_output_delay -clock spi_clk -min -1.000 [get_ports {spi_mosi_pin dac_cs_n_pin dac_clr_n_pin}]

# 伪路径约束

set_false_path -from [get_clocks clk_rx] -to [get_clocks clk_tx]

set_false_path -from [get_ports rst_pin]

# 多周期约束

set_multicycle_path 2 -setup -from [get_cells {cmd_parse_i0/send_resp_data_reg[*]} -include_replicated_objects] -to [get_cells {resp_gen_i0/to_bcd_i0/bcd_out_reg[*]}]

set_multicycle_path 1 -hold -from [get_cells {cmd_parse_i0/send_resp_data_reg[*]} -include_replicated_objects] -to [get_cells {resp_gen_i0/to_bcd_i0/bcd_out_reg[*]}]

# 串口接收端

set_multicycle_path 108 -setup -from [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL]

set_multicycle_path 107 -hold -from [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL]

# 串口发送端

set_multicycle_path 90 -setup -from [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL]

set_multicycle_path 89 -hold -from [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL]

重新Synthesis并Implementation后,可以看到,已经没有了时序错误

仅有的两个warning也只是说rst没有设置input_delay,spi_clk_pin没有设置output_delay,但我们已经对rst设置了伪路径,而spi_clk_pin是我们约束的输出时钟,无需设置output_delay。

到这里,教科书版的时序约束教程就基本讲完了。但我们平时的工程中,跟上面这种约束还是有差异的:

•   首先是虚拟时钟,这个约束在平时的工程中基本不会用到,像需要设置虚拟时钟的场景,我们也都是通过设计来保证时序收敛,设置虚拟时钟的意义不大。

•   第二就是output delay,在FPGA的最后一级寄存器到输出的路径上,往往都使用了IOB,也就是IO block,因此最后一级寄存器的位置是固定的,从buffer到pad的走线延时是确定的。在这种情况下,是否满足时序要求完全取决于设计,做约束只是验证一下看看时序是否收敛。所以也基本不做。但是input delay是需要的,因为这是上一级器件输出的时序关系。

•   第三个就是多周期路径,我们讲了那么多多周期路径的应用场景,但实际我们是根据Timing report来进行约束的,即便那几种场景都存在,但如果Timing report中没有提示任何的时序 warning,我们往往也不会去添加约束。

•   第四个就是在设置了多周期后,如果还是提示Intra-Clocks Paths的setup time不过,那就要看下程序,是否写的不规范。比如

如果设置了多周期路径后,还是提示Intra-Clocks Paths的setup time不过,那就要看下程序,是否写的不规范。比如

always @ (posedge clk)

begin

regA <= regB;

if(regA != regB)

regC <= 4'hf;

else

regC <= {regC[2:0], 1'b0};

if((&flag[3:0]) && regA != regB)

regD <= regB;

end

这么写的话,如果时钟频率稍微高一点,比如250MHz,就很容易导致从regB到regD的setup time不满足要求。因为begin end里面的代码都是按顺序执行的,要在4ns内完成这些赋值与判断的逻辑,挑战还是挺大的。因此,我们可以改写为:

always @ (posedge clk)

begin

regA <= regB;

end

always @ (posedge clk)

begin

if(regA != regB)

regC <= 4'hf;

else

regC <= {regC[2:0], 1'b0};

end

always @ (posedge phy_clk)

begin

if((&flag[3:0]) && regA != regB)

regD <= regB;

end

把寄存器的赋值分开,功能还是一样的,只是分到了几个always中,这样就不会导致时序问题了。

本文转自:科学计算technomania,作者:猫叔,转载此文目的在于传递更多信息,版权归原作者所有。

fpga如何约束走线_FPGA时序约束实战篇之多周期路径约束相关推荐

  1. fpga如何约束走线_FPGA时序约束的几种方法

    对自己的设计的实现方式越了解,对自己的设计的时序要求越了解,对目标器件的资源分布和结构越了解,对EDA工具执行约束的效果越了解,那么对设计的时序约束目标就会越清晰,相应地,设计的时序收敛过程就会更可控 ...

  2. fpga如何约束走线_FPGA设计约束技巧之XDC约束之I/O篇 (上)

    <XDC约束技巧之时钟篇>中曾对I/O约束做过简要概括,相比较而言,XDC中的I/O约束虽然形式简单,但整体思路和约束方法却与UCF大相径庭.加之FPGA的应用特性决定了其在接口上有多种构 ...

  3. fpga如何约束走线_FPGA中的CLOCK REGION和SLR是什么含义

    上期内容:FPGA中的BEL, SITE, TILE是什么含义 由BEL到SITE再到TILE,具体内容可看上篇推文,那么TILE之上是什么呢? CLOCKREGION不同类型的TILE按列排列构成了 ...

  4. (85)Vivado 多周期路径约束情况

    (85)Vivado 多周期路径约束情况 1 文章目录 1)文章目录 2)时序约束引言 3)FPGA时序约束课程介绍 4)Vivado 多周期路径约束情况 5)技术交流 6)参考资料 2 时序约束引言 ...

  5. (84)多周期路径约束基础

    (84)多周期路径约束基础 1 文章目录 1)文章目录 2)时序约束引言 3)FPGA时序约束课程介绍 4)多周期路径约束基础 5)技术交流 6)参考资料 2 时序约束引言 1)什么是静态时序分析? ...

  6. fpga如何约束走线_经验总结:FPGA时序约束的6种方法

    对自己的设计的实现方式越了解,对自己的设计的时序要求越了解,对目标器件的资源分布和结构越了解,对EDA工具执行约束的效果越了解,那么对设计的时序约束目标就会越清晰,相应地,设计的时序收敛过程就会更可控 ...

  7. fpga如何约束走线_如何正确的约束时钟—Vivado优化到关键路径

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

  8. ddr走线教程_Xilinx FPGA的DDR走线规则

    今天从xilinx网站下载 Xilinx Virtex-6/Spartan-6 FPGA DDR3 Signal Integrity Analysis and PCB Layout Guideline ...

  9. 【 FPGA 】设置多周期路径约束

    先写个模子在这里,后面填充说明内容.

最新文章

  1. Android自定义控件NumberCircleProgressBar(圆形进度条)的实现
  2. 大数据领域可以应聘的岗位
  3. delphi7升级delphi2007可以互用马_莱万特 VS 马竞:西甲
  4. 管理本地多个SSH Key
  5. Android开发5——文件读写
  6. 【转】GPS从入门到放弃(一) --- GPS基础原理
  7. TextField对象相关的属性和方法总结
  8. 手机uc浏览器夜间模式怎么设置调成全黑
  9. MySQL数据库的远程连接配置
  10. linux安装了xml怎么编译,linux下libxml库的安装及编译
  11. 非线性方程求根算法的C++实现
  12. 【Pytorch神经网络理论篇】 40 Transformers中的词表工具Tokenizer
  13. 汇编中DOSBox的使用
  14. 机器学习:邹博邹伟教学
  15. MagicDraw建模显示中文问题
  16. 简单易懂的现代魔法……原来是C++啊
  17. 小程序(原生) 跳转页面的几种方法
  18. 河北省地税数据上收集中及异地容灾应用(RealSync数据库同步复制)
  19. 如何购买阿里云服务器和域名,Xshell连接服务器,域名备案。
  20. 聚合供应链,Saas系统

热门文章

  1. 个人觉得好的文章链接推荐【转载,侵权立删】
  2. 计算机网络(二十五)-IP数据报格式
  3. Leetcode--260. 只出现一次的数字Ⅲ
  4. linux安装DNS服务命令,Linux下的安装和配置DNS服务器
  5. java接收uniapp上传的图片_uni-app 上传图片的坑
  6. java开源对象池_JAVA 对象池
  7. python decimal_【进阶】嫌弃Python慢,试试这几个方法?
  8. LaTeX引用多篇bibtex格式文献
  9. 图像处理中的通信原理——冈萨雷斯读书笔记(一)
  10. PHP之MVC项目实战(二)