0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA時序約束案例之多周期路徑約束的四個步驟

454398 ? 來源:科學計算technomania ? 作者:貓叔 ? 2020-11-14 11:13 ? 次閱讀

作者:貓叔

多周期路徑約束

多周期路徑,我們一般按照以下4個步驟來約束:

1. 帶有使能的數(shù)據(jù)

首先來看帶有使能的數(shù)據(jù),在本工程中的Tming Report中,也提示了同一個時鐘域之間的幾個路徑建立時間不滿足要求


其實這幾個路徑都是帶有使能的路徑,使能的周期為2倍的時鐘周期,本來就應(yīng)該在2個時鐘周期內(nèi)去判斷時序收斂。因此,我們添加時序約束:

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文件中,也存在帶有使能的數(shù)據(jù),但這些路徑在未加多路徑約束時并未報出時序錯誤或者警告。

在接收端,捕獲時鐘頻率是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
# 串口發(fā)送端
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參數(shù)也將在下一章節(jié)具體講解。

2. 兩個有數(shù)據(jù)交互的時鐘之間存在相位差

在本工程中,沒有這種應(yīng)用場景,因此不需要添加此類約束。

3. 存在快時鐘到慢時鐘的路徑

在本工程中,沒有這種應(yīng)用場景,因此不需要添加此類約束。

4. 存在慢時鐘到快時鐘的路徑

在本工程中,沒有這種應(yīng)用場景,因此不需要添加此類約束。

綜上,我們所有的時序約束如下:

# 主時鐘約束
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]

# 設(shè)置異步時鐘
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]
# 串口發(fā)送端
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后,可以看到,已經(jīng)沒有了時序錯誤


僅有的兩個warning也只是說rst沒有設(shè)置input_delay,spi_clk_pin沒有設(shè)置output_delay,但我們已經(jīng)對rst設(shè)置了偽路徑,而spi_clk_pin是我們約束的輸出時鐘,無需設(shè)置output_delay。

到這里,教科書版的時序約束教程就基本講完了。但我們平時的工程中,跟上面這種約束還是有差異的:

首先是虛擬時鐘,這個約束在平時的工程中基本不會用到,像需要設(shè)置虛擬時鐘的場景,我們也都是通過設(shè)計來保證時序收斂,設(shè)置虛擬時鐘的意義不大。

第二就是output delay,在FPGA的最后一級寄存器到輸出的路徑上,往往都使用了IOB,也就是IO block,因此最后一級寄存器的位置是固定的,從buffer到pad的走線延時是確定的。在這種情況下,是否滿足時序要求完全取決于設(shè)計,做約束只是驗證一下看看時序是否收斂。所以也基本不做。但是input delay是需要的,因為這是上一級器件輸出的時序關(guān)系。

第三個就是多周期路徑,我們講了那么多多周期路徑的應(yīng)用場景,但實際我們是根據(jù)Timing report來進行約束的,即便那幾種場景都存在,但如果Timing report中沒有提示任何的時序 warning,我們往往也不會去添加約束。

第四個就是在設(shè)置了多周期后,如果還是提示Intra-Clocks Paths的setup time不過,那就要看下程序,是否寫的不規(guī)范。比如

如果設(shè)置了多周期路徑后,還是提示Intra-Clocks Paths的setup time不過,那就要看下程序,是否寫的不規(guī)范。比如

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,就很容易導(dǎo)致從regB到regD的setup time不滿足要求。因為begin end里面的代碼都是按順序執(zhí)行的,要在4ns內(nèi)完成這些賦值與判斷的邏輯,挑戰(zhàn)還是挺大的。因此,我們可以改寫為:

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中,這樣就不會導(dǎo)致時序問題了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1625

    文章

    21627

    瀏覽量

    601251
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5295

    瀏覽量

    119824
  • 時序約束
    +關(guān)注

    關(guān)注

    1

    文章

    115

    瀏覽量

    13403
收藏 人收藏

    評論

    相關(guān)推薦

    FPGA的IO口時序約束分析

      在高速系統(tǒng)中FPGA時序約束不止包括內(nèi)部時鐘約束,還應(yīng)包括完整的IO時序約束
    發(fā)表于 09-27 09:56 ?1705次閱讀

    FPGA時序約束之衍生時鐘約束和時鐘分組約束

    FPGA設(shè)計中,時序約束對于電路性能和可靠性非常重要。在上一篇的文章中,已經(jīng)詳細介紹了FPGA時序約束
    發(fā)表于 06-12 17:29 ?2557次閱讀

    FPGA時序約束之偽路徑和多周期路徑

    前面幾篇FPGA時序約束進階篇,介紹了常用主時鐘約束、衍生時鐘約束、時鐘分組約束的設(shè)置,接下來介
    發(fā)表于 06-12 17:33 ?1700次閱讀

    FPGA時序約束時序路徑時序模型

    時序路徑作為時序約束時序分析的物理連接關(guān)系,可分為片間路徑和片內(nèi)
    發(fā)表于 08-14 17:50 ?766次閱讀
    <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時序約束理論篇,本章講解時序
    發(fā)表于 08-14 18:22 ?1527次閱讀
    <b class='flag-5'>FPGA</b> I/O口<b class='flag-5'>時序</b><b class='flag-5'>約束</b>講解

    FPGA時序約束--基礎(chǔ)理論篇

    FPGA開發(fā)過程中,離不開時序約束,那么時序約束是什么?簡單點說,FPGA芯片中的邏輯電路,從輸
    發(fā)表于 11-15 17:41

    FPGA時序約束方法

    FPGA時序約束方法很好地資料,兩大主流的時序約束都講了!
    發(fā)表于 12-14 14:21 ?19次下載

    FPGA開發(fā)之時序約束周期約束

    時序約束可以使得布線的成功率的提高,減少ISE布局布線時間。這時候用到的全局約束就有周期約束和偏移約束。
    發(fā)表于 02-09 02:56 ?699次閱讀

    FPGA中的時序約束設(shè)計

    好的FPGA設(shè)計一定是包含兩層面:良好的代碼風格和合理的約束。時序約束作為
    發(fā)表于 11-17 07:54 ?2534次閱讀
    <b class='flag-5'>FPGA</b>中的<b class='flag-5'>時序</b><b class='flag-5'>約束</b>設(shè)計

    FPGA時序約束案例:偽路徑約束介紹

    路徑約束 在本章節(jié)的2 約束主時鐘一節(jié)中,我們看到在不加時序約束時,Timing Report會提示很多的error,其中就有跨時鐘域的e
    的頭像 發(fā)表于 11-14 11:28 ?2952次閱讀
    <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,即觸發(fā)器到觸發(fā)器)和偏移約束
    的頭像 發(fā)表于 09-30 15:17 ?5010次閱讀

    FPGA設(shè)計之時序約束四大步驟

    本文章探討一下FPGA時序約束步驟,本文章內(nèi)容,來源于配置的明德?lián)P時序約束專題課視頻。
    發(fā)表于 03-16 09:17 ?3540次閱讀
    <b class='flag-5'>FPGA</b>設(shè)計之<b class='flag-5'>時序</b><b class='flag-5'>約束</b><b class='flag-5'>四大步驟</b>

    FPGA設(shè)計之時序約束

    上一篇《FPGA時序約束分享01_約束四大步驟》一文中,介紹了時序
    發(fā)表于 03-18 10:29 ?1622次閱讀
    <b class='flag-5'>FPGA</b>設(shè)計之<b class='flag-5'>時序</b><b class='flag-5'>約束</b>

    淺談FPGA時序約束四大步驟

    很多讀者對于怎么進行約束,約束步驟過程有哪些等,不是很清楚。明德?lián)P根據(jù)以往項目的經(jīng)驗,把時序約束步驟
    的頭像 發(fā)表于 07-02 10:56 ?5458次閱讀
    淺談<b class='flag-5'>FPGA</b>的<b class='flag-5'>時序</b><b class='flag-5'>約束</b><b class='flag-5'>四大步驟</b>

    FPGA時序約束的原理是什么?

    FPGA開發(fā)過程中,離不開時序約束,那么時序約束是什么?簡單點說,FPGA芯片中的邏輯電路,從輸
    發(fā)表于 06-26 14:42 ?665次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>時序</b><b class='flag-5'>約束</b>的原理是什么?