目錄
一、時序約束的步驟
二、時序網(wǎng)表和路徑
2.1 時序網(wǎng)表
2.2 時序路徑?
三、時序約束的方式
三、時鐘約束
3.1 主時鐘約束
3.2 虛擬時鐘約束
3.3?衍生時鐘約束
3.4 時鐘組約束
3.5 時鐘特性約束
3.6 時鐘延時約束
一、時序約束的步驟
????????上一章了解了時序分析和約束的很多基本概念(FPGA時序分析與時序約束(一)),只需要去理解如何進(jìn)行時序分析即可,而我們只需要對綜合工具提出時序約束的要求,綜合工具就會對這些路徑進(jìn)行計算。而時序約束可以分為四個主要步驟進(jìn)行:
1.時鐘約束(Create Clock):主時鐘、虛擬時鐘、衍生時鐘;
2.輸入/輸出接口約束(Input/Output Delays,I/O約束):系統(tǒng)同步接口、源同步接口;
3.時鐘分組和跨時鐘約束(Clock Groups and CDC):異步;
4.時序例外約束(Timing Exceptions):多周期路徑、虛假路徑。
? ? ? ? 而一般時序分析會涉及三種情況:
最好的條件(Best Case):速度最快的情況;
最壞的條件(Worst?Case):速度最慢的情況;
典型的條件(Typical?Case):速度介于最快和最慢之間。
? ? ? ? 這三種情況分別對應(yīng)如下細(xì)節(jié):
BCF(Best Case):fast process, lowest temperature, high voltage;
WCS (Worst Case):slow process, high temperature, lowest voltage;
TYP(Typical Case):typical process, nominal temperature, nominal voltage.
? ? ? ? 其中芯片工藝(process)、電壓(voltage)、溫度(temperature) 共同組成了PVT組合,時序分析工具會根據(jù)仿真需求使用不同的PVT組合用于STA分析。
? ? ? ? 芯片的工藝角(Process corner)分為快速工藝角(fast corner)、慢速工藝角(slow corner)、典型工藝角(typical corner)。時序分析工具通過Worst corner 保證建立時間的時序,通過Best corner來保證保持時間的時序。由于一般情況下設(shè)計以建立時間違例為主,所以時序分析工具默認(rèn)使用slow corner。
二、時序網(wǎng)表和路徑
2.1 時序網(wǎng)表
? ? ? ? 時序網(wǎng)表包含設(shè)計的綜合節(jié)點(diǎn)和連接,時序分析工具需要網(wǎng)表來執(zhí)行時序分析。而時序網(wǎng)表將設(shè)計單元劃分成單元、管腳、網(wǎng)絡(luò)和端口來進(jìn)行延遲的測量。
- Cell?: FPGA中的基本結(jié)構(gòu)單元,包含查找表、寄存器、DSP、I/O單元等;
- Pin?: Cell的輸入輸出端口(這里的Pins不包括器件的輸入輸出引腳);
- Net?: 兩個或多個互連組件的集合;
- Port?: 頂層邏輯的輸入輸出端口,對應(yīng)已經(jīng)分配的器件引腳。?
2.2 時序路徑?
? ? ? ? 時序分析工具對設(shè)計中確定的所有時序路徑的時序性能進(jìn)行測量,時序路徑分為四種:
邊沿路徑 (Edge paths) —從端口到管腳,從管腳到管腳以及從管腳到端口的連接; 時鐘路徑(Clock paths)—從器件端口或內(nèi)部生成的時鐘管腳到寄存器的時鐘管腳的連接; 數(shù)據(jù)路徑(Data paths)—從順序單元的端口或數(shù)據(jù)輸出管腳到另一個順序單元的端口或數(shù)據(jù)輸入管腳的連接; 異步路徑(Asynchronous paths)—從另一個順序單元(例如異步復(fù)位或異步清除)的異步管腳或端口的連接。
三、時序約束的方式
? ? ? ? 到現(xiàn)在位置,時序約束的概念、步驟、順序等都概念都有所了解了,那么到底怎么樣進(jìn)行時序約束呢?時序約束的方式主要有兩種:
1.通過FPGA開發(fā)工具進(jìn)行約束,Intel的是Timing Analyzer,Xilinx的是Vavado
2.通過Tcl語言手動編寫約束腳本
三、時鐘約束
3.1 主時鐘約束
????????主時鐘通常是FPGA器件外部的板級時鐘(如晶振、數(shù)據(jù)傳輸?shù)耐綍r鐘等)或FPGA的高速收發(fā)器輸出數(shù)據(jù)的同步恢復(fù)時鐘信號等。
? ? ? ? 通過create_clock命令可對主時鐘進(jìn)行約束定義:
create_clock -name<clock_name> -period<period> -waveform{<rise_time><fall_time>} [get_ports<port_name>]
- <clock_name>是設(shè)計者自定義的主時鐘名稱,后續(xù)的約束若引用已經(jīng)定義的時鐘,<clock_name>是唯一的引用標(biāo)識,如果不指定,則會默認(rèn)使用<port_name>所指定的時鐘物理節(jié)點(diǎn);
- <period>是主時鐘周期,單位ns,取值必須大于0;
- waveform的<rise_time>是上升沿時間,默認(rèn)0,<fall_time>是下降沿時間,默認(rèn)時鐘周期一半,單位都是ns;這里可以理解為設(shè)置時鐘的占空比,如果沒有定義wavaform則默認(rèn)占空比50%;
- get_ports表示定義的時鐘是FPGA的物理引腳,<port_name>是定義的主時鐘的物理節(jié)點(diǎn)名稱;FPGA內(nèi)部網(wǎng)絡(luò)也能作為主時鐘的物理節(jié)點(diǎn),使用get_nets定義;高速收發(fā)器的引腳則使用get_pins定義。
????????主時鐘是幫助時序分析工具定義了時序路徑分析的一個時間零點(diǎn),時鐘傳輸過程中的延時和不確定性都會基于這個時間零點(diǎn)進(jìn)行計算和分析,而其他時序約束也會經(jīng)常引用主時鐘,因此在時序約束中必須先定義主時鐘約束。
引腳輸入的主時鐘約束?
????????如上圖是一個周期10ns、占空比50%的時鐘sysclk接在sysclk端口上,對該輸入時鐘引腳的約束為:
//周期10ns、占空比50%的時鐘sysclk接在sysclk端口上
create_clock -period 10 [get_ports sysclk]
//周期10ns、占空比25%、相位偏移 90° 的時鐘devclk接在ClkIn端口上
create_clock -name devclk -period 10 -waveform {2.5 5} [get_ports ClkIn]
高速收發(fā)器主時鐘約束?
? ? ? ? ?高速傳輸器的輸出時鐘網(wǎng)絡(luò)經(jīng)過時鐘管理單元mmcn0后會產(chǎn)生多個衍生時鐘,此時通常要將GT傳輸器的輸出時鐘作為主時鐘約束。
//周期3.33ns、占空比50%的時鐘rxclk接在gt0/RXOUTCLK端口上
create_clock -name rxclk -period 3.33 [get_ports gt0/RXOUTCLK]
差分信號主時鐘約束
? ? ? ? 當(dāng)差分緩沖器產(chǎn)生的時鐘信號作為PLL的輸入時鐘,只需要對差分緩沖器的正端(SYS_CLK_clk_p)進(jìn)行約束,因?yàn)橹付ㄕ撕髸r序分析工具就能自動識別負(fù)端。
create_clock -name sysclk -period 3.33 [get_ports SYS_CLK_clk_p]
3.2 虛擬時鐘約束
? ? ? ? 在主時鐘約束的基本語法中,get_ports是指主時鐘的實(shí)際物理節(jié)點(diǎn),意味著這個主時鐘是實(shí)際存在于FPGA器件內(nèi)的。但虛擬時鐘并不是實(shí)際存在于FPGA器件中,因此在物理上沒有連接任何網(wǎng)表,它是用于描述時序數(shù)據(jù)引腳的外部時鐘信號。
????????虛擬時鐘必須在輸入和輸出延遲約束使用之前定義,通常被用于以下情況的輸入和輸出延時約束:
- 時序分析(一般是I/O引腳相關(guān)的時序路徑)的參考時鐘不是FPGA內(nèi)部的設(shè)計時鐘(主時鐘);
- 與FPGA器件的I/O路徑相關(guān)的內(nèi)部驅(qū)動時鐘與其板級驅(qū)動時鐘不同步;
- 對I/O的驅(qū)動時鐘指定一些特殊的抖動和延時值,但不希望影響此時鐘在FPGA內(nèi)部的時鐘傳輸特性。
????????虛擬時鐘同樣用create_clock定義,只是省去了端口項(xiàng),:
create_clock -name<clock_name> -period<period> -waveform{<rise_time><fall_time>}
? ? ? ? 比如在一些引腳上的數(shù)據(jù)信號,其同步時鐘只存在于外部芯片,并不存在于FPGA器件,此時為了時序分析也需要定義一個時鐘用于外部時鐘信號,即虛擬時鐘。
系統(tǒng)同步接口的虛擬時鐘約束
? ? ? ? ?如上圖reg2的驅(qū)動時鐘是真實(shí)存在的,可以對其進(jìn)行主時鐘約束;外部芯片中reg1的主時鐘并不會傳輸?shù)絝pga器件,可以對其進(jìn)行虛擬時鐘約束:
create_clock -period 10 -name VIR_SLK -waveform {0 5}
create_clock -period 10 -name SYS_SLK -waveform {0 5} [get_clock clk]
3.3?衍生時鐘約束
? ? ? ? 衍生時鐘是主時鐘進(jìn)行分頻,倍頻,相移而產(chǎn)生的時鐘信號,如時鐘管理單元MMCM或PLL所驅(qū)動產(chǎn)生的時鐘信號。衍生時鐘的定義取決于主時鐘的特性,衍生時鐘的約束必須指定時鐘源,這個時鐘源可以是一個已經(jīng)約束好的主時鐘或另一個衍生時鐘。衍生時鐘并不直接定義頻率、占空比等參數(shù),而是定義其與時鐘源的相對關(guān)系,如分頻系數(shù)、倍頻系數(shù)、相移差值、占空比轉(zhuǎn)換等。
? ? ? ? 衍生時鐘分為自動衍生時鐘(Auto-Generated Clocks)和手動衍生時鐘。時序工具能夠識別時鐘調(diào)整模塊(Clock Modifying Blocks,CMB)及其基于輸入主時鐘的變更特性,自動為CMB輸出的時鐘信號創(chuàng)建約束。若設(shè)計者認(rèn)為自動衍生時鐘有誤,可使用create_generate_clock命令重新約束衍生時鐘,此時自動衍生時鐘的約束會被忽略。
? ? ? ? 可以通過check_timing命令查看為約束的主時鐘和衍生始終,通過create_generate_clock命令對其進(jìn)行約束:
create_generated_clock -name <generated_clock_name>
-source <master_clock_source_pin_or_port>
-multiply_by <mult_factor>\
-divide_by <div_factor>
<pin_or_port>
<generated_clock_name>是用于指定的衍生時鐘名,若不指定則由pin_or_port指定物理節(jié)點(diǎn)作為名稱;
<master_clock_source_pin_or_port>指定源時鐘的物理節(jié)點(diǎn)(引腳或端口),源時鐘可以是一個主時鐘、虛擬時鐘或者衍生時鐘;
<mult_factor>指定衍生時鐘相對于源時鐘的倍頻系數(shù),值必須大于等于1.0;
<div_factor>指定衍生時鐘相對于源時鐘的分頻系數(shù),值必須大于等于1.0;
<pin_or_port>指定衍生時鐘的物理節(jié)點(diǎn)、引腳或端口名稱。
2分頻的衍射時鐘約束?
// 主時鐘約束
create_clock -name clkin -period 10 [get_ports clkin]
// 將clkin作為時鐘源
create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 [get_pins REGA/Q]
// 將REGA作為時鐘源
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2 [get_pins REGA/Q]
????????可以使用 -edges選項(xiàng)直接描述基于主時鐘邊沿的生成時鐘的波形,而不是使用-divide_by選項(xiàng)。參數(shù)是主時鐘邊沿索引列表,用于定義生成的時鐘邊沿的時間位置,從時鐘上升沿開始。?
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -edges {1 3 5} [get_pins REGA/Q]
? ? ? ? 可以使用-divide_by、?-multiply_by實(shí)現(xiàn)分頻和倍頻
#4/3倍頻的衍生時鐘
create_generated_clock -name clkdiv4_3 -source [get_pins mmcm0/CLKIN] -multiply_by 4 -divide_by 3 [get_pins mmcm0/CLKOUT]
?相位偏移的衍生時鐘約束
????????可以使用-edges、-edge_shift實(shí)現(xiàn)占空比改變和相移,
# 生成占空比25%且相移90°的衍生時鐘,主時鐘的邊沿分別為1、2、3,衍生時鐘則需要將邊沿移動2.5、0、2.5
# First rising edge: 0ns + 2.5ns = 2.5ns
# Falling edge: 5ns + 0ns = 5ns
# Second rising edge: 10ns + 2.5ns = 12.5ns
create_clock -name clkin -period 10 [get_ports clkin]
create_generated_clock -name clkshift -source [get_pins mmcm0/CLKIN] -edges {1 2 3} -edge_shift {2.5 0 2.5} [get_pins mmcm0/CLKOUT]
3.4 時鐘組約束
? ? ? ? 時鐘組能夠指定設(shè)計中哪些時鐘是不相關(guān)的。默認(rèn)情況下,時序分析工具會對所有時鐘之間的路徑進(jìn)行時序分析,除非通過使用時鐘組(clock group)或虛假路徑(false path)約束來指定。set_clock_groups命令禁用所識別的時鐘組之間的時序分析,而不禁用同一組內(nèi)的時鐘之間的時序分析。
????????可以多次使用-group選項(xiàng)指定多個時鐘組。如果在設(shè)計中沒有時鐘組中的時鐘,則時鐘組為空。set_clock_groups約束僅當(dāng)至少有兩個組有效且不為空時才有效。如果只有一個組仍然有效,而所有其他組都為空,則不應(yīng)用set_clock_groups約束,會生成錯誤消息。
set_clock_groups [-asynchronous] [-exclusive] -group <names>
- -asynchronous :?指定互斥時鐘(與 -exclusive 選項(xiàng)相同)。存在是為了兼容性;
- -exclusive :?指定互斥時鐘;
- -group :?有效目的地(使用Tcl字符串匹配來匹配字符串模式)。
????????時鐘組提供了一種快速便捷的方法來指定哪些時鐘不相關(guān)。異步時鐘是那些完全不相關(guān)的時鐘(例如,具有不同的理想時鐘源)。獨(dú)占時鐘是那些不同時激活的時鐘(例如,多路復(fù)用時鐘)。 TimeQuest 將“-exclusive”和“-asynchronous”這兩個選項(xiàng)視為相同。 set_clock_groups 的結(jié)果是任何組中的所有時鐘都與其他組中的所有時鐘相分離。該命令相當(dāng)于從每個組中的每個時鐘到每個其他組中的每個時鐘調(diào)用 set_false_path ,反之亦然,使得 set_clock_groups 更容易指定以切割時鐘域。使用單個 -group 選項(xiàng)告訴 TimeQuest 將這組時鐘從設(shè)計中的所有其他時鐘中刪除,包括將來創(chuàng)建的時鐘。
create_clock -period 10.000 -name clkA [get_ports sysclk[0]]
create_clock -period 10.000 -name clkB [get_ports sysclk[1]]
# 設(shè)置clkA和clkB為互斥時鐘
set_clock_groups -exclusive -group {clkA} -group {clkB}
# 上一行相當(dāng)于以下兩條命令
set_false_path -from [get_clocks clkA] -to [get_clocks clkB]
set_false_path -from [get_clocks clkB] -to [get_clocks clkA]
3.5 時鐘特性約束
? ? ? ? 當(dāng)時鐘在FPGA內(nèi)部傳輸時,會因?yàn)闀r鐘走線路徑和硬件噪聲引起時鐘沿的延時和波形變化,稱其為時鐘傳輸延時和不確定性。在FPGA的時序分析中主要通過時鐘抖動(Clock Jitter)和時鐘不確定性(Clock Uncertainty)進(jìn)行約束定義。
3.5.1 時鐘抖動
輸入抖動
????????輸入抖動是連續(xù)的時鐘邊緣與標(biāo)準(zhǔn)或理想的時鐘到達(dá)時間的差值。輸入抖動是一個絕對值,表示時鐘邊緣兩側(cè)的變化。set_input_jitter命令只能約束主時鐘,不能用于約束衍生時鐘的抖動值。但除了MMCM或PLL外,主時鐘設(shè)定的抖動值會傳遞給它的衍生時鐘。
set_input_jitter [get_clock<clock_name>] <jitter_in_ns>
- get_clocks用于指定需要約束抖動值的主時鐘名<clock_name>;
- <jitter_in_ns>指定抖動值,取值必須大于等于0ns。?
# 約束多個主時鐘的抖動值需要多條set_input_jitter命令
set_input_jitter clk1 0.3
set_input_jitter clk2 0.3
# 主時鐘抖動值會傳遞給衍生時鐘
create_clock -period 10 -name sysclk [get_ports clk]
create_generated_clock -name sysclkdiv2 -source [get_ports sysclk] -divide_by 2 [get_pins clkgen/sysclkdiv/Q]
set_input_jitter sysclk 0.15
? ?系統(tǒng)抖動
????????系統(tǒng)抖動是由于電源噪聲、板噪聲或任何額外的系統(tǒng)抖動造成的整體抖動,使用set_system_jitter命令約束系統(tǒng)抖動。
set_input_jitter <jitter_in_ns>
- <jitter_in_ns>指定所有時鐘的系統(tǒng)抖動值,取值必須大于等于0ns。?
3.5.2 時鐘不確定性
? ? ? ? 除時鐘抖動以外的所有可能影響時鐘周期性偏差的因素,都可以使用set_clock_uncertainty命令進(jìn)行約束。
set_clock_uncertainty -setup -form [get_clocks<clock0_name>] -to [get_clocks<clock1_name>]<uncertainy_value>
- -setup表示定義建立時間檢查的時鐘不確定性時間,也可以使用hold表示定義保持時間檢查的時鐘不確定性時間;如果不指定-setup和-hold,則表示同時定義建立時間堅持和保持時間檢查的不確定時間;
- -from指定源時鐘,-to指定目標(biāo)時鐘,對于非跨時鐘域的路徑一般不需要指定from和to;
- get_clocks用于指定實(shí)際的屋里節(jié)點(diǎn)名稱;
- <uncertainty_value> 指定時鐘不確定時間,單位ns。
? ? ? ? 為了區(qū)分set_clock_uncertainty命令約束的時鐘不確定值和用于時序分析計算出的時鐘不確定時間,稱set_clock_uncertainty命令約束的時鐘不確定值為用戶不確定性(User Uncertainty,UU)時間,UU時用于時序分析的時鐘不確定時間的一部分。
? ? ? ? 時序分析的Clock Uncertainty時間計算公式如下:
- Tsj是最壞情況的系統(tǒng)抖動時間,由set_system_jitter設(shè)定值換算而來;
- Tij是set_input_jitter設(shè)定的輸入抖動時間;
- Dj是由一些硬件原語(MMCM或PLL等)產(chǎn)生的離散時鐘抖動;
- PE(Phase Error)是由MMCM或PLL等產(chǎn)生的相位誤差,一般都有固定值;
- UU(User Uncertainty)是set_clock_uncertainty設(shè)定的時鐘不確定性值。
? ? ? ? 而在進(jìn)行建立時間關(guān)系和保持時間關(guān)系的Data Required Time計算時,都會將?Clock Uncertainty時間考慮在內(nèi)。計算建立時間關(guān)系的數(shù)據(jù)需求時間時,時鐘不確定時間作為一個加項(xiàng);計算保持時間關(guān)系的數(shù)據(jù)需求時間時,時鐘不確定時間作為一個減項(xiàng)。因此可以通過使用set_clock_uncertainty命令為某個時鐘或某兩個時鐘之間的時序路徑添加時序裕量。
# 為主時鐘clk添加0.5ns裕量以添加改時鐘的建立時間和保持時間
set_clock_uncertainty -from clk -to clk0 0.500
# 當(dāng)源時鐘和目的時鐘時兩個不同的主時鐘且數(shù)據(jù)傳輸時雙向的,將0.5ns的時鐘不確定性分半設(shè)置
set_clock_uncertainty -from clk0 -to clk1 0.250 -setup
set_clock_uncertainty -from clk1 -to clk0 0.250 -setup
3.6 時鐘延時約束
? ? ? ? 時鐘到達(dá)寄存器輸入端口的總延時包括了時鐘源延時和時鐘網(wǎng)絡(luò)延時。
set_clock_latency [-clock<args>] [-rise] [-fall] [-min] [-max] [-source] <latency> <objects>
- [-clock]可選項(xiàng),時鐘名稱<args>對應(yīng)指定約束時鐘<objects>;若不定義時鐘<args>,則時鐘延時值<latency>將會應(yīng)用于所有目標(biāo)時鐘<objects>所驅(qū)動的時序路徑;
- [-rise][-fall]指定時鐘延時的邊沿;
- [-min][-max]指定時鐘延時的最大值或最小值且只能指定其一;若不指定則延時值同時作為最大最小值進(jìn)行定義;
- [-source]指定時鐘延時的基本類型;若不指定則默認(rèn)[-network]類型
- [-source]時鐘源延時,約束用于定義時序分析時實(shí)際使用的時鐘對于理想時鐘波形的延時;
- [-network]時鐘網(wǎng)絡(luò)延時,約束用于定義時鐘信號從設(shè)計中的某個指定節(jié)點(diǎn)傳輸?shù)皆醇拇嫫鞯臅r鐘輸入端口的延時;
- <latency>指定時鐘延時值,單位ns;
- <objects> 指定約束時鐘的名稱。
參考文獻(xiàn):文章來源:http://www.zghlxwxcb.cn/news/detail-776672.html
《FPGA時序約束與分析》
《正點(diǎn)原子FPGA靜態(tài)時序分析與時序約束》?
《Intel Quartus Prime Standard Edition用戶指南: Timing Analyzer》
《Vivado Design Suite User Guide: Using Constraints(UG903)》
《Vivado Design Suite 用戶指南: 設(shè)計分析與收斂技巧 (UG906)》文章來源地址http://www.zghlxwxcb.cn/news/detail-776672.html
到了這里,關(guān)于FPGA時序分析與時序約束(二)——時鐘約束的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!