0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA时序约束案例之多周期路径约束的四个步骤

454398 来源:科学计算technomania 作者:猫叔 2020-11-14 11:13 次阅读

作者:猫叔

多周期路径约束

多周期路径,我们一般按照以下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中,这样就不会导致时序问题了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1625

    文章

    21619

    浏览量

    601149
  • 寄存器
    +关注

    关注

    31

    文章

    5290

    浏览量

    119787
  • 时序约束
    +关注

    关注

    1

    文章

    115

    浏览量

    13403
收藏 人收藏

    评论

    相关推荐

    FPGA的IO口时序约束分析

      在高速系统中FPGA时序约束不止包括内部时钟约束,还应包括完整的IO时序约束
    发表于 09-27 09:56 1702次阅读

    FPGA时序约束之衍生时钟约束和时钟分组约束

    FPGA设计中,时序约束对于电路性能和可靠性非常重要。在上一篇的文章中,已经详细介绍了FPGA时序约束
    发表于 06-12 17:29 2546次阅读

    FPGA时序约束之伪路径和多周期路径

    前面几篇FPGA时序约束进阶篇,介绍了常用主时钟约束、衍生时钟约束、时钟分组约束的设置,接下来介
    发表于 06-12 17:33 1694次阅读

    FPGA时序约束时序路径时序模型

    时序路径作为时序约束时序分析的物理连接关系,可分为片间路径和片内
    发表于 08-14 17:50 759次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>时序</b><b class='flag-5'>约束</b>之<b class='flag-5'>时序</b><b class='flag-5'>路径</b>和<b class='flag-5'>时序</b>模型

    FPGA I/O口时序约束讲解

    前面讲解了时序约束的理论知识FPGA时序约束理论篇,本章讲解时序
    发表于 08-14 18:22 1519次阅读
    <b class='flag-5'>FPGA</b> I/O口<b class='flag-5'>时序</b><b class='flag-5'>约束</b>讲解

    FPGA时序约束--基础理论篇

    FPGA开发过程中,离不开时序约束,那么时序约束是什么?简单点说,FPGA芯片中的逻辑电路,从输
    发表于 11-15 17:41

    FPGA时序约束方法

    FPGA时序约束方法很好地资料,两大主流的时序约束都讲了!
    发表于 12-14 14:21 19次下载

    FPGA开发之时序约束周期约束

    时序约束可以使得布线的成功率的提高,减少ISE布局布线时间。这时候用到的全局约束就有周期约束和偏移约束
    发表于 02-09 02:56 699次阅读

    FPGA中的时序约束设计

    好的FPGA设计一定是包含两层面:良好的代码风格和合理的约束时序约束作为
    发表于 11-17 07:54 2534次阅读
    <b class='flag-5'>FPGA</b>中的<b class='flag-5'>时序</b><b class='flag-5'>约束</b>设计

    FPGA时序约束案例:伪路径约束介绍

    路径约束 在本章节的2 约束主时钟一节中,我们看到在不加时序约束时,Timing Report会提示很多的error,其中就有跨时钟域的e
    的头像 发表于 11-14 11:28 2949次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>时序</b><b class='flag-5'>约束</b>案例:伪<b class='flag-5'>路径</b><b class='flag-5'>约束</b>介绍

    FPGA时序约束的概念和基本策略

    A 时序约束的概念和基本策略 时序约束主要包括周期约束(FFS到FFS,即触发器到触发器)和偏移约束
    的头像 发表于 09-30 15:17 5002次阅读

    FPGA设计之时序约束四大步骤

    本文章探讨一下FPGA时序约束步骤,本文章内容,来源于配置的明德扬时序约束专题课视频。
    发表于 03-16 09:17 3539次阅读
    <b class='flag-5'>FPGA</b>设计之<b class='flag-5'>时序</b><b class='flag-5'>约束</b><b class='flag-5'>四大步骤</b>

    FPGA设计之时序约束

    上一篇《FPGA时序约束分享01_约束四大步骤》一文中,介绍了时序
    发表于 03-18 10:29 1619次阅读
    <b class='flag-5'>FPGA</b>设计之<b class='flag-5'>时序</b><b class='flag-5'>约束</b>

    浅谈FPGA时序约束四大步骤

    很多读者对于怎么进行约束约束步骤过程有哪些等,不是很清楚。明德扬根据以往项目的经验,把时序约束步骤
    的头像 发表于 07-02 10:56 5452次阅读
    浅谈<b class='flag-5'>FPGA</b>的<b class='flag-5'>时序</b><b class='flag-5'>约束</b><b class='flag-5'>四大步骤</b>

    FPGA时序约束的原理是什么?

    FPGA开发过程中,离不开时序约束,那么时序约束是什么?简单点说,FPGA芯片中的逻辑电路,从输
    发表于 06-26 14:42 657次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>时序</b><b class='flag-5'>约束</b>的原理是什么?