FPGA的時序約束

在給FPGA作邏輯綜合和佈局佈線時,須要在工具中設定時序的約束。一般,在FPGA設計工具中都FPGA中包含有4種路徑:從輸入端口到寄存器,從寄存器到寄存器,從寄存器到輸出,從輸入到輸出的純組合邏輯。一般,須要對這幾種路徑分別進行約束,以便使設計工具可以獲得最優化的結果。下面對這幾種路徑分別進行討論。 工具

 


(1)從輸入端口到寄存器: 
     這種路徑的約束是爲了讓FPGA設計工具可以儘量的優化從輸入端口到第一級寄存器之間的路徑延遲,使其可以保證系統時鐘可靠的採到從外部芯片到FPGA的信號。約束名稱:input delay. 約束條件的影響主要有4個因素:外部芯片的Tco,電路板上信號延遲Tpd,FPGA的Tsu, 時鐘延遲Tclk. Tco的參數一般須要查外部芯片的數據手冊。計算公式:input delay = Tco+Tpd+Tsu-Tclk. FPGA的Tsu也須要查FPGA芯片的手冊。FPGA速度等級不一樣,這個參數也不一樣。Tpd和Tclk須要根據電路板實際的參數來計算。一般,每10cm的線長能夠按照1ns來計算. 例如:系統時鐘100MHz,電路板上最大延遲2ns, 時鐘最大延遲 1.7ns, Tco 3ns, FPGA的Tsu爲0.2ns. 那麼輸入延遲的值:max Input delay = 2+3+0.2-1.7=3.5ns. 這個參數的含義是指讓FPGA的設計工具把FPGA的輸入端口到第一級寄存器之間的路徑延遲(包括門延遲和線延遲)控制在 10ns-3.5ns=6.5ns 之內。佈局

 

(2)寄存器到寄存器: 
    這種路徑的約束是爲了讓FPGA設計工具可以優化FPGA內寄存器到寄存器之間的路徑,使其延遲時間必須小於時鐘週期,這樣才能確保信號被可靠的傳遞。因爲這種路徑只存在於FPGA內部,一般經過設定時鐘頻率的方式就能夠對其進行約束。對於更深刻的優化方法,還能夠採用對寄存器的輸入和寄存器的輸出加入適當的約束,來使邏輯綜合器和佈線器可以對某條路徑進行特別的優化。還能夠經過設定最大扇出數來迫使工具對其進行邏輯複製,減小扇出數量,提升性能。性能

 

(3)寄存器到輸出: 
   這種路徑的約束是爲了讓FPGA設計工具可以優化FPGA內部從最後一級寄存器到輸出端口的路徑,確保其輸出的信號可以被下一級芯片正確的採到。 約束的名稱:output delay,約束條件的影響主要有3個因素:外部芯片的Tsu,電路板上信號延遲Tpd,時鐘延遲Tclk.Tsu的參數一般須要查外部芯片的數據手冊。計算公式:output delay = Tsu+Tpd-Tclk.例如:系統時鐘100MHz,電路板上最大延遲2ns, 時鐘最大延遲 1.7ns, Tsu 1ns, 輸出延遲的值:max output delay = 1+2-1.7=1.3ns .   這個參數的含義是指讓FPGA的設計工具把最後一級寄存器到輸出端口之間的路徑延遲(包括門延遲和線延遲)控制在 10ns-1.3ns=8.7ns 之內。
(4)從輸入端口到輸出端口: 
     這種路徑是指組合邏輯的延遲,指信號從輸入到輸出沒有通過任何寄存器。給這種路徑加約束條件,須要虛擬一個時鐘,而後經過約束來指定哪些路徑是要受該虛擬時鐘的約束。在Synplifypro和Precision中都有相應的約束來處理這種路徑。優化

 

 

 

    關於輸入輸出延遲的一些參數,若是要把這些參數和altera,xilinx的軟件結合起來,也不是一件容易的事情。之前altera和xilinx的約束條件設定很是煩雜,各自都有一套。彷佛你們也不太看重約束條件的設定,大多時候都是不管如何先上板,而後經過signaltap和Chipscope來調。當FPGA規模大了以後,佈線一次都須要很長時間,這種方法的弊端就愈來愈嚴重。實際上能夠借鑑ASIC的設計方法:加比較完善的約束條件,而後經過RTL仿真,時序分析,後仿真來解決問題,儘可能避免在FPGA電路板上來調試。altera最早意識到這一點,它採用了Synopsys的SDC格式。SDC的格式也獲得了邏輯綜合器的支持。並且設定方法比較容易掌握。這個帖子會詳細討論一下這種格式的約束設定方法。
   設計

 

    時鐘的設定方法:時鐘要分紅兩種,一種是從端口上直接輸入的時鐘,另外一種是在FPGA內部產生的時鐘。內部產生的時鐘又要分紅兩種,從鎖相環出來的(包括altera的PLL和Xilinx的DLL)和從邏輯單元出來的,例如通常的計數器分頻就是這種狀況。從鎖相環出來的時鐘能夠經過端口直接加,由於通常的綜合工具和佈線工具都可以自動的把端口的時鐘約束傳遞到鎖相環,而且根據鎖相環的倍頻關係自動施加到下一級。而從邏輯單元出來的就須要單獨對其進行約束。 
 3d

 

    在SDC格式中,建立時鐘的命令 create_clock, 後面要帶3個參數:name ,period, waveform. name的含義是指建立這個時鐘約束的名字,而不是時鐘自己的名字。要把這個約束和時鐘信號關聯起來,還須要在後面加些東西。period的單位缺省是ns. waveform是用來指定佔空比。除了這三個參數之外,經常還要加 get_ports的命令,來指定時鐘的輸入端口。下面的例子是一個較爲完整的設定時鐘的例子: 
       create_clock   -name clk1   -period 10.000 –waveform { 2.000 8.000 } [get_ports sysclk]
    這個例子表示,有一個clk1的約束,在這個約束中設定了時鐘的週期爲10ns, 佔空比爲2ns低電平,8ns高電平。 這個叫作clk1的約束是針對sysclk這個端口的。
    若是是利用內部鎖相環分頻出來不少其餘時鐘的約束,能夠再也不另外施加其餘約束,邏輯綜合器和佈線器都能根據鎖相環的參數自動計算。若是是利用內部的邏輯單元分頻出來的信號,則必須利用get_registers指定分頻的寄存器名。例如上例:
   create_clock  -name clk1  -period 10.000 –waveform { 2.000 8.000 } [get_registers cnt_clk]. 
   對於邏輯單元分頻的時鐘信號,也能夠採用命令create_generated_clock會更加精確。舉例以下: 
     create_generated_clk -name clk2 -source [getports sysclk] -div 4 [get_registers   cnt_clk]
   這個約束命令描述了一個clk2的約束,約束的對象是由sysclk分頻4次獲得的時鐘,這個時鐘是由cnt_clk這個寄存器產生的。調試

 

   在高速的系統中,對時鐘的描述可能會要求的更多,更加細緻。例如,會要求對時鐘的抖動和時鐘的延遲進行描述。在SDC的文件格式中,能夠經過兩個命令來描述:set_clock_uncertainty 和 set_clock_latency 來設定。
   時鐘的延遲相對來說比較簡單。延遲通常分爲外部延遲和內部時鐘線網的延遲。一般在約束時只對外部延遲作約束,在set_clock_latency的命令後帶 -source的參數就能夠了。 例如:
        set_clock_latency -source 2 [get_clocks {clk_in}]
   時鐘的抖動要稍微複雜一些。由於這個值不但會影響到對Tsu的分析,也會影響到對Thold的分析。所以,採用set_clock_uncertainty的參數要多一些。若是要理解這個命令對系統時序分析的影響,就須要對altera的延時計算的概念須要作更多的說明。orm

 

   對於set_clock_uncertainty的狀況,就稍微複雜一些。由於set_clock_uncertainty的值既影響創建時間的計算,也影響保持時間的計算,所以,須要在設定時分別指明:
       set_clock_undertainty –setup 0.500 –from clkA –to clkA
       set_clock_uncertainty –hold 0.300 –from clkA –to clkA

    前面的內容裏面提供了計算輸入輸出延遲的計算方法。輸出延遲的命令是set_output_delay. 有幾個參數要加:參考時鐘,最大最小值,和端口的名稱。以下面的例子中描述。
       set_output_delay -clock CLK -max 1.200   [get_ports OUT]
       set_output_delay -clock CLK -min 0.800   [get_ports OUT]
    輸入延遲的命令很相似: 
      set_input_delay -clock CLK -max 2.000    [get_ports IN]
      set_input_delay -clock CLK -min 1.600    [get_ports IN]對象

 

    對一些特殊的設計要求,例如不關心的數據傳遞路徑和多拍的路徑,還須要增長false path 和 Multicycle的設定。這兩個約束比較簡單,容易設定,可是很是關鍵。若是設定的很差,系統性能會大打折扣。false path是指在時序分析中不考慮其延遲計算的路徑。例若有些跨越時鐘域的電路等。設定的方法:
       set_false_path -from [get_clocks clkA] -to [get_clocks clkB]
       set_false_path -from   regA -to   regB
    第一條命令是設定了從時鐘域clkA到時鐘域clkB的全部路徑都爲false path。第二條命令設定了從 regA到regB的路徑爲false path。這兩種路徑在作時序分析時都會被忽略。multicycle的設定和false path的設定方法差很少。

    爲了讓邏輯綜合器和佈局佈線器可以根據時序的約束條件找到真正須要優化的路徑,咱們還須要對時序報告進行分析,結合邏輯綜合器的時序報告,佈線器的時序報告,經過分析,能夠看出是否芯片的潛能已經被徹底挖掘出來。blog

 

########################################################################################################

 

時序約束目的:1、提升設計的工做頻率2、得到正確的時序分析報告(STA:靜態時序分析)

 

經常使用的時序概念:週期,最大時鐘頻率、時鐘創建時間、時鐘保持時間、時鐘到輸出延時、管腳到管腳延時、Slack和時鐘偏斜(Skew).

 

週期:如圖1是週期示意圖,當計算出Tperiod,那麼固然fmax=1/Tperiod,fmax是顯示設計最重要的性能指標之一。

 

時鐘創建時間:如圖3所示是時鐘創建時間的計算方法

 

時鐘保持時間:一樣利用圖3的模型計算Th=clkdelay-datadelay+Microhold

 

注意:前兩個公式中提到的Microsetup 和Microhold通常均是一個小於1ns的常量。

 

時鐘輸出延遲:他是指在時鐘有效到數據有效的最大時鐘間隔如圖4所示Tco=clkdelay+datadelay+Microco

 

slack:表示設計是否知足時序的一個稱謂:正的slack表示知足時序,負的slack表示不知足時序。保持時間slack是一個重要的概念,引發不知足的主要緣由是時鐘偏斜大於數據路徑的偏斜。

 

Quartus2時序分析工具和優化嚮導:

 

經常使用的三種時序約束設置方法:1 經過Assignment/timing settings 2 Assignment/timing wiard

 

tool 3 Assignment/Assignment editor選擇在圖形界面下完成對設計的時序約束。通常狀況下前兩種是作全局的時序約束,後一種是作局部的時序約束,另外還能夠經過修改.qsf文件來實現。

 

時序約束思想:時序約束通常都是先全局後個別,若是衝突則個別的優先級更高。

 

1、將編繹器設置爲時序驅動編繹,便是指讓編繹過程儘可能向着知足時序約束方向努力!assignment/settings/fitter setting.

 

2、全局時鐘設置若是在設計中只有一個全局時鐘,或者全部的時鐘同頻,能夠在Quartus2中只設置一個全局時鐘約束。 Assignment/timing settings

 

3、時序嚮導在用記對時序約束設置不熟悉的狀況下,能夠選擇使用嚮導。 Assignment/classic timing analyser wizards.

 

4、能夠設置獨立時鐘與衍生時鐘,衍生時鐘是由獨立時鐘變化而來的,他是由獨立時鐘分頻,倍頻,移相等變化而來的,能夠在設置中肯定兩者的關係 Assignment/settings/timing analyse setting/classic timing analyse setting/individual clock。

 

5、經過assignment editor 設置個別時鐘約束

 

 

 

Tperiod的計算公式

 

 

 

邏輯延時與互連延時

 

 

 

時鐘創建時間計算

 

 

 

時鐘到輸出計算方法

相關文章
相關標籤/搜索