VIVADO時序約束及STA基礎


一、前言

  無論是FPGA應用開發還是數字IC設計,時序約束和靜態時序分析(STA)都是十分重要的設計環節。在FPGA設計中,可以在綜合后和實現后進行STA來查看設計是否能滿足時序上的要求。本文闡述基本的時序約束和STA操作流程。內容主要來源於《Vivado從此開始》這本書,我只是知識的搬運工。

二、時序約束與XDC腳本

  時序約束的目的就是告訴工具當前的時序狀態,以讓工具盡量優化時序並給出詳細的分析報告。一般在行為仿真后、綜合前即創建基本的時序約束。Vivado使用SDC基礎上的XDC腳本以文本形式約束。以下討論如何進行最基本時序約束相關腳本。

1 時序約束首要任務是創建主時鍾,主時鍾即為時鍾引腳進入時鍾信號或高速收發器生成時鍾。[create_clock]

  create_clock -name clk_name -period N -waveform {pos_time neg_time} [get_ports port_name] (划線部分可選)

  創建兩個異步的主時鍾:

  create_clock -name clk_a -period 10 [get_ports clk_a]

  create_clock -name clk_b -period 15 [get_ports clk_b]

  set_clock_groups -asynchronous -group clk_a -group clk_b

  當兩個主時鍾是異步關系,它們生成時鍾同樣是異步關系:

  set_clock_groups -asynchronous -group [get_clocks clk_a -include_generated_clocks] \

  -group [get_clocks clk_b -include_generated_clocks]

  差分時鍾僅約束P端口:

  create_clock -name clk -period 10 [get_ports clk_p]

  高速收發器生成時鍾作為主時鍾:

  create_clock -name gt0_txclk -period 8  [get_pins GT0/.../TXOUTCLK]

  有一種特殊情況無需與具體引腳綁定,即創建虛擬時鍾。該約束用於設定輸入/輸出延遲。需要創建虛擬時鍾的場景是輸入FPGA的數據由FPGA內部產生時鍾采樣,如串口通信。

  create_clock -name clk_v -period 5 

2 創建主時鍾后,需要約束生成時鍾:[create_generated_clock]

  生成時鍾分為兩種。由PLL MMCM等專用時鍾單元生成產生的時鍾信號,Vivado會自動產生相關約束。還有一種是自定義生成時鍾,一般為邏輯分頻得到。

  時鍾源是時鍾端口:

  create_generated_clock -name clk_div -source [get_ports clk] -divide_by 2 [get_pins rega/Q] 意思是在rega單元的Q引腳上的時鍾信號clk_div是由clk經過2分頻得到的生成時鍾。

  時鍾源是引腳:

  create_generated_clock -name clk_div -source [get_pins rega/C] -divide_by 2 [get_pins rega/Q]

  除了使用-divide_by -multiply_by表示主時鍾和生成時鍾的頻率關系,也可以用 -edges實現更精確的表達:

  create_generated_clock -name clk_div -source [get_pins rega/C] -edges {1 3 5} [get_pins rega/Q]

  相移關系使用-edge_shift命令描述。

  該約束命令還常用於重命名時鍾信號:

  create_generated_clock -name clk_rename [get_pins clk_gen/.../CLKOUT0]

3 創建時鍾組:[set_clock_groups]

  a. 異步時鍾情況:

  set_clock_groups -asynchronous -group clk_a -group clk_b  clk_a和clk_b是異步時鍾。

  b. 物理互斥情況:

  create_clock -name clk_a -period 10 [get_ports clk]

  create_clock -name clk_b -period 8 [get_ports clk] -add

  create_clock -name clk_c -period 5 [get_ports clk] -add

  set_clock_groups -physically_exclusive -group clk_a -group clk_b -group clk_c

  該種情況僅是為了觀察clk引腳時鍾信號周期依次為10ns 8ns和5ns時,時序是否收斂。因此這三個時鍾物理上不同時存在。

  c. 邏輯互斥情況:

  set_clock_groups -logically_exclusive\

  -group [get_clocks -of [get_pins clk_core/.../CLKOUT0]] -group [get_clocks -of [get_pins clk_core/.../CLKOUT1]]

  clkout0和clkout1送入到BUFGMUX中,后續根據sel信號確定選擇哪一個作為工作時鍾。此時clkout0和clkout1同時存在電路中,但僅有一個會作為后續電路工作時鍾,因此邏輯上互斥。

  特殊用法:當asynchronous 的group只有一個,說明改組內時鍾是同步的,但與其他所以時鍾異步。

4 設置偽路徑:[set_false_path]

  設置偽路徑后,不再對特殊路徑進行時序分析。特殊路徑如測試邏輯、添加同步電路后的跨時鍾域路徑等。在兩個時鍾域之間應該相互設置為set_false:

  set_false_path -from [get_clocks clk_a] -to [get_clocks clk_b]

  set_false_path -from [get_clocks clk_b] -to [get_clocks clk_a]

5 常用時鍾相關命令:

  report_clocks:查看創建的所有時鍾

   report_property [get_clocks <clk_name>]:查看時鍾clk_name的屬性

  report_clock_network:查看時鍾的生成關系網絡

  report_clock_interaction:查看時鍾交互關系

  其中最后一項非常重要,經常被用於查看異步時鍾域之間的路徑是否安全。若存在不安全路徑,需要添加同步、握手或FIFO后,設置為異步時鍾組或false_path。

  鍵入該命令后,會生成時鍾交互矩陣。對角線是每個時鍾內部路徑,其他非黑色部分即為存在對應兩個時鍾的跨時鍾域路徑。紅色部分是非安全路徑,若不處理會產生亞穩態。

三、查看時序報告(STA)

   本節以一個有很多時序問題的工程為例進行講解。在綜合后即可打開時序概要查看時序報告。

  打開后有如下界面:

  其中Design Timing Summary是時序概況,包括最大延遲分析、最小延遲分析以及脈沖寬度三個部分。其中WNS或WHS為負數,說明當前設計無法滿足建立時間或保持時間要求,也就是說數據無法被穩定采樣。

  Clock Summary內的信息與使用report_clocks TCL腳本調出來的信息相似,包含了全部已創建的時鍾信號。Check Timing部分則包含了未被約束的部分,我們可以根據該部分信息進一步添加必要的約束。Intra-Clock Paths和Inter-Clock Paths則分別描述了同步和異步電路時序路徑的裕量參數。

  點擊WNS或WHS后的數值可以直接找到時序裕量最差的路徑:

  雙擊路徑信息所在行任意位置,界面會跳轉到該路徑的詳細信息界面:

  四類時序路徑中,除了FPGA輸入端口到輸出端口這一特殊情況外,其他時序路徑均由源時鍾路徑、數據路徑和目的時鍾路徑三部分構成。上表中各項的具體解釋見官方文檔UG908.

  本文說明了時序約束和STA的關系,基本時序約束情形及相應的XDC腳本。之后簡單介紹了如何在VIVADO中查看時序報告來分析時序問題。后續會以網絡通信中常見的RGMII接口設計實例闡述I/O延遲約束部分。


免責聲明!

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



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