FPGA時序約束和timequest timing analyzer


FPGA時序約束

時鍾約束

#**************************************************************

# Create Clock

#**************************************************************

create_clock -period 8 -name "ENET0_RX_CLK" [get_ports ENET0_RX_CLK]

create_clock -period 8 -name "ENET1_RX_CLK" [get_ports ENET1_RX_CLK]

create_clock -period 8 -name "ENET2_RX_CLK" [get_ports ENET2_RX_CLK]

 

get_portsget_netsget_pins區別

 

PLL時鍾約束

# Uncommenting one of the following derive_pll_clocks lines

# will instruct the TimeQuest Timing Analyzer to automatically

# create derived clocks for all PLL outputs for all PLLs in a

# Quartus design.

# If the PLL inputs are constrained elsewhere, uncomment the

# next line to automatically constrain all PLL output clocks.

derive_pll_clocks

# If the PLL inputs are not constrained elsewhere, uncomment

# the next line to automatically constrain all PLL input and

# output clocks.

# derive_pll_clocks -create_base_clocks

 

方法 1 – 自動創建基時鍾和 PLL 輸出時鍾
這一方法使您能夠自動地約束 PLL 的輸入和輸出時鍾。ALTPLL megafunction 中指定的
所有 PLL 參數都用於約束 PLL 的輸入和輸出時鍾。自動更新了 ALTPLL megafunction
的修改。當創建 PLL 的輸入和輸出時鍾時,不必跟蹤 PLL 參數的更改或指定正確的值。
為了自動約束所有輸入和輸出 , 要將 derive_pll_clocks 命令和 -create_base_clocks
選項一起使用。基於 PLL MegaWizard TM  Plug-In Manager 例化,TimeQuest
analyzer
確定正確的設置。


derive_pll_clocks -create_base_clocks

 

方法 2 – 手動創建基時鍾和自動創建 PLL 輸出時鍾
通過這種方法 , 可以手動約束 PLL 的輸入時鍾並且使 TimeQuest analyzer 能夠自動
約束 PLL 的輸出時鍾。除此之外 , ALTPLL megafunction 中指定的輸入時鍾頻率相
反,您可以指定一個不同的輸入時鍾頻率。通過使用 ALTPLL megafunction 中指定的
參數自動創建 PLL 輸出時鍾。您可以嘗試不同的輸入時鍾頻率 , 同時保持相同的 PLL
輸出時鍾參數。
1
確保指定的所有輸入時鍾頻率與當前配置的 PLL 相兼容
可以將此方法與 derive_pll_clocks 命令一起使用並且手動創建 PLL 的輸入時鍾。


create_clock -period 10.000 -name clk [get_ports {clk}]
derive_pll_clocks

 

方法 3 – 手動創建基時鍾和 PLL 輸出時鍾
通過這種方法 , 可以手動約束 PLL 的輸入時鍾和輸出時鍾。指定了所有的 PLL 參數並
且參數值可以不同於 ALTPLL megafunction 中指定的參數值。除此之外 , 您可以嘗試
各種 PLL 輸入和輸出頻率以及參數。
您可以將該方法與 create_clock create_generate_clock 命令的組合一起使用。


create_clock -period 10.000 -name clk [get_ports {clk}]
create_generated_clock \
-name PLL_C0 \
-source [get_pins {PLL|altpll_component|pll|inclk[0]}] \
[get_pins {PLL|altpll_component|pll|clk[0]}]
create_generated_clock \
-name PLL_C1 \
-multiply_by 2 \
-source [get_pins {PLL|altpll_component|pll|inclk[0]}] \
[get_pins {PLL|altpll_component|pll|clk[1]}]

 

 

時鍾約束出錯

 

Warning (332174): Ignored filter at SDC1.sdc(1): CPU_clk could not be matched with a port

Warning (332049): Ignored create_clock at SDC1.sdc(1): Argument <targets> is an empty collection

Warning (332060): Node: SYS_clk was determined to be a clock but was found without an associated clock assignment.

沒有對時鍾進行約束設置

Node: <Node name> was determined to be a clock but was found without an associated clock assignment. (ID: 332060)

 

CAUSE: This can be caused in two ways: 1) A clock assignment was determined to be invalid, so its source objects no longer have a clock associated with them. 2) When analyzing the netlist, the node was found feeding a clock port with no other clocks feeding it.

ACTION: Use the derive_clocks command to automatically find all clock nodes in the design. Also, for any clocks that were ignored, review the warning or error message associated with the command to prevent the clock from being ignored.

 

Timequest timing analyzer使用方法

 

步驟1:執行初始編譯

在應用時序約束設計之前,通過表1創建一個初始數據庫。初始數據庫從設計的post-map結過中生成。

 

表 1-1. 執行初始編譯 (1)

Quartus II軟件GUI

命令行

在Processing菜單上,指向Start,點擊Start Analysis & Synthesis。

輸入: quartus_map filtrefr

表 1-1注釋:

  1. quartus_map用於創建一個post-map數據庫。
  2. Analysis & Synthesis階段生成post-map數據庫。
  3. 您也可以為初始數據庫創建一個post-fit網表。不過,創建一個post-map網表耗時較少,並且用於本教程的例子已經足夠了。

圖 1    Analysis & Synthesis

步驟2:運行TimeQuest Timing Analyzer

通過表 2-1中的程序,運行TimeQuest Timing Analyzer來創建和驗證所有時序約束和例外。此命令將打開TimeQuest shell。

表 2-1. 運行TimeQuest Timing Analyzer

Quartus II軟件GUI

命令行

在Tools菜單中,單擊TimeQuest Timing Analyzer。

輸入:

quartus_sta –sr

project_open fir_filter -revision filtrefr

1 當您直接從Quartus II軟件中運行TimeQuest Timing Analyzer時,當前工程將會自動打開。如果使用GUI,那么當出現下面的消息時,請選擇No:

"No SDC files were found in the Quartus Settings File and filtref.sdc doesn't exist. Would you like to generate an SDC file from the Quartus Settings File?"

圖 2TimeQuest Timing Analyzer

步驟3:創建一個Post-map時序網表

在指定時序要求之前,請創建一個時序網表。您可以從post-map或post-fit數據庫中創建一個時序網表。在這一步驟中,通過表 3-1中的程序,從"步驟1:執行初始編譯"中創建的post-map數據庫中創建一個時序網表。

表 3-1. 創建一個Post-Map時序網表

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Netlist菜單上,點擊Create Timing Netlist。 出現 Create Timing Netlist對話框。

2.在Input netlist中,選擇Post-Map。

3.點擊OK。

輸入:create_timing_netlist –post_map

1 您不能在Tasks面板中使用Create Timing Netlist命令來創建一個post-map時序網表。默認情況下,Create Timing Netlist需要一個post-fit數據庫。

圖 3Create Timing Netlist

圖 4Input netlist

圖 5waiting

 

圖 6創建完畢

步驟4:指定時序要求

在設計中定義時鍾。每個時鍾的屬性列表請參考表 4-1

表 4-1.設計中的時鍾

時鍾端口名稱

要求

Cpsl_Clk25M_i

50/50占空比的25 MHz

在設計中創建時鍾並通過表 4-2中的程序分配正確的時鍾端口。要了解關於TimeQuest Timing Analyzer所支持的約束的詳細信息,請參考Quartus II 手冊 第3卷中的TimeQuest Timing Analyzer章節。

表 4-2. 創建時鍾並分配時鍾端口

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Constraints菜單中,點擊 Create Clock。出現Create Clock對話框。對25 MHz時鍾指定參數。單擊RUN。

輸入:

#create the 25 MHz (20 ns) clock create_clock –period 20 [get_ports Cpsl_Clk25M_i]

2. 在Constraints菜單中,點擊Drive PLL clocks。出現Drive PLL clocks對話框,前面指定了PLL基時鍾,什么都不選直接單擊RUN即可。

 

1 默認情況下,如果未使用-waveform選項,那么create_clock命令假設50/50的占空比。

f 要了解關於創建不同占空比時鍾的詳細信息,請參考Quartus II手冊 第3卷中的TimeQuest Timing Analyzer章節。

完成表 4-2中顯示的程序后,時鍾定義完成。

圖 7Create clock

圖 8設置參數

圖 9指定時鍾

圖 10 Create clock設置完畢

圖 11Drive PLL clocks

步驟5:更新時序網表(timing Netlist)

在您創建時序約束或例外后,通過表 5-1中的程序,對時序網表進行更新,將所有時序要求應用到時序網表(新的clkclkx2時鍾約束)。

1 只要應用了新的時序約束,就必須對時序網表進行更新。

表 5-1. 更新時序網表(Timing Netlist)

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,雙擊Update Timing Netlist命令。

輸入:update_timing_netlist

圖 12Update Timing Netlist

步驟6:保存Synopsys Design Constraints(SDC)文件

在為設計指定時鍾約束並更新時序網表后,您可以通過表 6-1中的程序來選擇創建SDC文件。通過TimeQuest Timing Analyzer GUI或者在控制台(console)中指定的約束不會自動保存

1 如果您在設計流程中無意覆蓋任何約束,那么請使用這個初始SDC文件來恢復所有約束。初始SDC文件可作為包含設計的原始約束和例外的"golden" SDC文件。

表 6-1. 保存SDC文件

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Tasks面板中,雙擊Write SDC File命令。出現Write SDC File對話框。

2.在File Name欄輸入名稱。

輸入:write_sdc -name.sdc r

新的.sdc文件包含"步驟4:指定時序要求"中定義的時鍾約束。Write SDC File命令可以覆蓋任何現有的SDC文件。當這種情況出現時,新的SDC文件沒有保持順序或注釋。因此,Altera建議單獨保存利用文本編輯器可以手動編輯的一個golden SDC文件。這使您能夠根據自身的規范輸入注釋並組織文件。

步驟7:對初始時時序網表生成時序報告

通過表 7-1中的程序定義的時鍾,在指定時序約束和更新時序網表后,生成時序報告,這驗證了時鍾被正確地定義並應用到正確的節點。TimeQuest Timing Analyzer提供易於使用的報告生成命令,使您能夠驗證設計中的所有的時序要求。

表 7-1. 保存SDC命令

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,雙擊Report SDC命令。

輸入:report_sdc

圖 13生成SDC約束報告(SDC Assignments Report)

SDC Assignments報告了在指定設計中包含的所有時序約束和例外。生成兩個報告:一個用於時鍾和一個用於時鍾組。

可以用表 7-2中的程序生成一個報告,來總結設計中所有的時鍾。

表 7-2. 生成報告時鍾報告(Report Clocks Report)

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,雙擊Report Clocks命令。

輸入:report_clocks

圖 14時鍾報告

 

通過表 7-3中的程序,使用Report Clock Transfers命令生成一個報告來驗證所有的時鍾到時鍾傳輸都是有效的。這種報告包含設計中所有的時鍾到時鍾傳輸。

表 7-3. 生成報告時鍾傳輸(Report Clock Transfers)

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,雙擊Report Clock Transfers命令。

輸入:report_clock_transfers

圖 15時鍾傳輸報告(Clock Transfers Report)

 

本環節只是告訴這個部分偽路徑可以作為例外不進行分析。實際的時序要在做設計時保證其正確。So,不再詳細描述,以后可能會補充。

 

Clock Transfers報告表明在clk(源時鍾)和clkx2(目的時鍾)之間存在跨時鍾域路徑。共有16條路徑,其中clk為源節點提供時鍾,clkx2為目的節點提供時鍾。

在fir_filter設計中,不必分析clkclkx2的時鍾傳輸,因為它們是忽略路徑。通過表 7-4中的程序聲明clkclkx2的路徑為偽路徑。當完成該程序后,TimeQuest Timing Analyzer表明Clock Transfers報告是過時的。

表 7-4. 聲明偽路徑

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Clock Transfers報告中,在From Clock列選擇clk。

2.右擊並選擇Set False Paths Between Clock Domains。這個命令表明將所有由clk驅動的源寄存器到由clkx2驅動的目的寄存器之間的路徑設為偽路徑。

輸入:

set_false_path -from [get_clocks clk] \

-to [get_clocks clkx2] r

1 另外,也可以使用set_clock_groups命令來聲明兩個時鍾域之間的路徑為偽路徑。例如,set_clock_groups -asynchronous -group [get_clocks clk] -group

[get_clocks clkx2]。該命令表明clkclkx2以及clkx2clk的所有路徑為偽路徑。此方法是優選的。

由於您添加了一個新的時序約束,通過表 2-14中的程序更新時序網表(timing netlist)。

表 2-14. 更新Timing Netlist

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,雙擊Update Timing Netlist命令。

輸入:update_timing_netlistr

在GUI中輸入set_false_path后,所有生成的報告面板上都標有"Out of Date",這表明報告面板不包含反映TimeQuest Timing Analyzer中當前狀態的約束或者例外的結果。要更新報告面板,必須重新生成所有的報告。

在命令行,重新輸入命令。在GUI中,右擊報告面板列表中任何過時(out-of-date) 的報告,並選擇Regenerate或Regenerate all。

更新時序網表后,通過表 2-15中的程序驗證時鍾到時鍾傳輸已經被聲明為偽路徑。

表 2-15. 驗證使用Report SDC命令

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,雙擊Report SDC。

輸入:report_sdcr

圖 2-4顯示了新的SDC Assignments報告。

圖 2-4中顯示的報告表明時鍾約束和偽路徑是正確的。

使用Report Clocks和Report Clock Transfers命令來驗證這兩個時鍾已經從分析中移除了。圖 2-5顯示了Clock Transfers報告。

步驟8:保存約束到SDC文件

在指定設計中所有的時鍾約束和偽路徑后,通過表 8-1中的程序將時序約束和例外保存到SDC文件。

表 8-1. 保存約束到SDC文件

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Tasks面板中,雙擊Write SDC File。出現Write SDC File對話框。

2.在File name欄,輸入-name.sdc.

輸入:write_sdc -name.sdc

1 這一過程覆蓋之前所創建的filtref.sdc文件。如果通過Write SDC File命令覆蓋SDC,那么在新的SDC文件中移除了定制的格式和注釋。

.sdc 文件包含時鍾約束偽路徑例外

步驟9:執行Timing-Driven編譯

保存約束到SDC文件后,在設計上運行一個全編譯以優化布線,從而符合約束。不過,在開始全編譯之前,通過表 9-1中的程序將SDC添加到工程中。

表 9-1. 添加SDC文件到工程中

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Project菜單中,點擊Add/Remove Files In Project。出現Add/Remove Files In Project對話框。

2.通過瀏覽來選擇.sdc。

3.點擊OK。

輸入:

set_global_assignment -name SDC_FILE \ -name.sdc

將SDC添加到工程后,通過表 9-2中的程序,在設計上運行一個全編譯。

表 9-2. 運行一個全編譯

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Processing菜單中,點擊Start Compilation。

輸入:quartus_sh --flow compile -name

完成編譯后,TimeQuest Timing Analyzer在Compilation Report中生成時鍾建立和時鍾保持的檢查總結報告。

步驟10:在TimeQuest Timing Analyzer中驗證時序

要獲得指定路徑中詳細的時序分析數據,請查看TimeQuest Timing Analyzer中的時序分析結果。

 

1 完全執行布線布局功能(place-and-route)后,運行"步驟2:運行TimeQuest Timing Analyzer"中所介紹的TimeQuest Timing Analyzer。生成一個post-fit時序網表,通過表 10-1中的程序,讀取SDC文件並更新時序網表來生成關於最新編譯的報告。

 

表 10-1. 生成關於Latest Compilation的報告

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,雙擊所需報告的命令。例如:Report All Summaries。

輸入:

create_timing_netlist read_sdc filref.sdc update_timing_netlist report_clocks

create_timing_summary -setup create_timing_summary -hold create_timing_summary -recovery create_timing_summary -removal report_min_pulse_width -nworst 10

1 當雙擊其中一個報告命令時,Create Timing Netlist、Read SDC和Update Timing Netlist命令依次在Tasks面板中執行,自動生成時序網表。

時鍾建立檢查確保每個寄存器至寄存器的傳輸不違反SDC指定的時序約束。通過表 10-2中的程序,生成一個時鍾建立總結,對設計中的所有時鍾進行檢查,來驗證沒有出現違規。

表 10-2. 生成時鍾設置總結檢查(Clock Setup Summary Check)

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,雙擊 Report Setup Summary。

輸入:create_timing_summary –setup

 

Summary (Setup)報告

1 clkx2時鍾沒有出現在Summary (Setup)報告中,這是因為clkclkx2之間所有的時鍾路徑已經聲明是偽路徑。此外,fir_filter設計不包含任何寄存器到寄存器的路徑,其中目的寄存器路徑由clkx2來驅動。

Summary (Setup)報告中的Slack列表明clk能滿足約束,並有11.588 ns的余量。End Point TNS列是指定時鍾域中所有的總負裕量(TNS)的總和。使用這個值來測量指定時鍾域中失敗路徑的總數。

 

生成Summary (Setup)報告后,通過表 2-21中的程序,在設計中生成一個時鍾保持檢查總結。

表 10-3. 生成Summary (Hold) Report

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,雙擊Report Hold Summary。

輸入:create_timing_summary –hold r

圖 16Summary (Hold)報告

Summary (Hold)報告表明clk時鍾節點符合時序約束,並有0.661 ns的余量。在執行全編譯之前,通過表 10-4中的程序指定所有的時序約束和例外。這樣可以確保 Fitter優化設計中的關鍵路徑。

您可以使用Report Unconstrained Paths命令來驗證已經約束fir_filter設計中的所有路徑。

表 10-4. 指定時序約束和例外

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

在Tasks面板中,雙擊Report Unconstrained Paths。

輸入:report_ucp r

圖 17Unconstrained Paths總結報告

Unconstrained Paths總結報告表明有大量的未約束路徑,並詳細介紹了這些路徑的類型。

要充分約束此設計,利用由TimeQuest Timing Analyzer所提供的整套SDC約束。要充分約束fir_filter設計,約束所有的輸入和輸出端口。使用Set Input Delay和Set Output Delay對話框,或set_input_delayset_output_delay約束來指定輸入和輸出延遲值。

由於附加約束應用於設計,通過文本編輯器(例如:inout_delay.sdc)創建僅包含輸入和輸出約束的額外SDC。添加表 10-5所示的輸入和輸出延遲分配到"步驟8:保存約束到SDC文件"創建的新SDC中。

10-5. 輸入和輸出延遲分配

The TimeQuest Timing Analyzer GUI

The TimeQuest Timing Analyzer Console

1.Constraints菜單中,點擊Set Input Delay。出現Set Input Delay對話框。

2.輸入以下內容:

Clock name: clk

Delay value: 2

Targets: [get_ports {d[0] d[1] d[2] d[3] \

d[4] d[5] d[6] d[7] newt reset}]

3.Constraints菜單中,點擊Set Output Delay。出現Set Output Delay對話框。

4.輸入以下內容:

Clock name: clk

Delay value: 1.5

Targets: [get_ports {yn_out[0] yn_out[1] \ yn_out[2] yn_out[3] yn_out[4] yn_out[5] \ yn_out[6] yn_out[7] yvalid follow}]

要約束輸入端口,輸入:

set_input_delay -clock clk 2 \

[get_ports {d* newt reset}] r

要約束輸出端口,輸入:

set_output_delay -clock clk 1.5 \ [get_ports {yn_out* yvalid follow}] r

在讀取包含輸入和輸出延遲約束的SDC后,所有設計中的端口應該都加上了約束。

1 記住讀取新的約束后更新時序網表。要了解更多信息,請參考"步驟5:更新時序網表(Timing Netlist)"。要驗證所有設計中的端口都已經加上了約束,重新生成Unconstrained Paths Summary 報告。

圖 18重新生成Unconstrained Paths Summary報告

結論

通過表 10-6中的程序,對設計的時鍾或節點生成特定的時序檢查報告。表 10-6中的程序生成一個報告,其中clk驅動目的寄存器,並且目的寄存器為 acc:inst3|result,報告10條最差路徑。

10-6. 生成Report Timing報告

TimeQuest Timing Analyzer GUI

TimeQuest Timing Analyzer Console

1.在Tasks面板中,雙擊Report Timing。出現Report Timing 對話框。

2.輸入以下內容:

To Clock: clk

To: acc:inst3|result*

Report number of paths: 10

3.剩下其它的欄使用默認的設置。

輸入:

report_timing -to_clock clk -to / acc:inst3|result* -setup -npaths 10

圖 2-10顯示了Report Timing報告。

使用Tasks面板中的Report Top Failing Paths命令來生成一個報告,該報告詳細介紹了設計中的最差的失敗路徑。

 

根據Quartus_II_TimeQuest說明書_CH.pdf修改而成,因原教程使用的工程quartus中lisence不支持器件。

 

 

結論

您創建新的約束或例外,基於新的約束或例外重新運行Quartus II Fitter來優化設計。設計上的多個迭代對於完成所需的結果是必要的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM