1.主時(shí)鐘約束
??主時(shí)鐘通常是FPGA器件外部的板機(jī)時(shí)鐘或FPGA的高速收發(fā)器輸出數(shù)據(jù)的同步恢復(fù)時(shí)鐘信號(hào)等。下面這句語(yǔ)法大家一定不會(huì)陌生。該語(yǔ)句用于對(duì)主時(shí)鐘的名稱、周期、占空比以及對(duì)應(yīng)物理引腳進(jìn)行約束。
create_clock -name <clock_name> -periood <period> -waveform {<rise_time> <fall_time>} [get_ports <port_name>]
??在設(shè)計(jì)中,未約束的時(shí)鐘可以通過(guò)時(shí)鐘網(wǎng)絡(luò)報(bào)告和時(shí)鐘確認(rèn)報(bào)告查看。在打開(kāi)綜合和實(shí)現(xiàn)設(shè)計(jì)后,輸入如下指令:
report_clock_networks
check_timing
??對(duì)于將高速傳輸器(gt)的輸出時(shí)鐘網(wǎng)絡(luò)作為主時(shí)鐘約束,命令如下:
creat_clock -name rxclk -period 6.667 [get_nets gt0/RXOUTCLK]
??對(duì)于一些硬件原語(yǔ)的輸出時(shí)鐘引腳,若與其輸入時(shí)鐘之間沒(méi)有很強(qiáng)的因果關(guān)聯(lián)性,也可以將這個(gè)硬件原語(yǔ)的輸出引腳作為時(shí)鐘源進(jìn)行主時(shí)鐘約束。
??對(duì)于差分時(shí)鐘,只需要對(duì)差分緩沖器的輸入正端(sys_clk_p)進(jìn)行主時(shí)鐘約束即可。若同時(shí)對(duì)正負(fù)端進(jìn)行約束,會(huì)導(dǎo)致不真實(shí)的CDC(clock domain crossing)路徑產(chǎn)生。
??對(duì)于MMCM和PLL,系統(tǒng)會(huì)自動(dòng)生成相應(yīng)的約束文件,不需要手動(dòng)約束。
??在一些時(shí)序路徑中,如一些引腳上的數(shù)據(jù)信號(hào),其同步時(shí)鐘只存在于外部芯片,并不存在于FPGA器件內(nèi)。這種情況下,為了時(shí)序分析的需要也必須定義一個(gè)時(shí)鐘用于描述時(shí)序數(shù)據(jù)引腳的外部時(shí)鐘信號(hào),這個(gè)時(shí)鐘就是虛擬時(shí)鐘。虛擬時(shí)鐘的約束不需要引腳。
create_clock -name clk_virt -period 10
2.時(shí)鐘特性約束
??對(duì)于時(shí)鐘抖動(dòng)的約束有以下兩條 ,其中set_input_jitter只能約束主時(shí)鐘,set_system_jitter對(duì)系統(tǒng)抖動(dòng)進(jìn)行定義。
set_input_jitter [get_clocks <clock_name>] <jitter_in_ns>
set_system_jitter <clock_name> <jitter_in_ns>
??除時(shí)鐘抖動(dòng)以為的所有可能影響時(shí)鐘周期性偏差的因素,都可以使用set_clock_uncertainty命令進(jìn)行約束定義。也稱用戶不確定性。
set_clock_uncertainty -<setup/hold/空出來(lái)表示兩者都有> -from [get_clocks <clock0_name>] -to [get_clocks <clock1_name>] <uncertainty_value>
??對(duì)于時(shí)鐘延時(shí)約束,有以下命令:
set_clock_latency [-clock <args>] [-rise] [-fall] [-min/max/空出來(lái)表示兩者都有] [-source] <latency> <objects>
3.衍生時(shí)鐘約束
??衍生時(shí)鐘主要是指由已有的主時(shí)鐘進(jìn)行分頻、倍頻或者相移而產(chǎn)生出來(lái)的時(shí)鐘信號(hào),如由MMCM或一些設(shè)計(jì)邏輯所驅(qū)動(dòng)產(chǎn)生的時(shí)鐘信號(hào)。一般Vivado的時(shí)序工具能夠自動(dòng)產(chǎn)生正確的衍生時(shí)鐘,若設(shè)計(jì)者認(rèn)為自動(dòng)產(chǎn)生的衍生時(shí)鐘有誤,也可以手動(dòng)進(jìn)行衍生時(shí)鐘的約束。
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>
4.IO接口約束
??IO接口的時(shí)序約束主要包括set_input_delay和set_output_delay,輸入輸出約束差不多,主要約束如下:
set_input_delay -clock<args> -reference_pin<args> -clock_fall -rise -max -add_delay <delay> <objects>
#下面對(duì)命令進(jìn)行解釋
-clock 用于指定約束引腳的同步時(shí)鐘(源時(shí)鐘),其后的<args>即需要指定的同步時(shí)鐘名稱,這個(gè)時(shí)鐘可以是設(shè)計(jì)中事先定義的主時(shí)鐘或虛擬時(shí)鐘。
-reference_pin 用于指定延時(shí)值<delay>的參考時(shí)鐘,其后的<args>即需要指定的參考時(shí)鐘名稱。該項(xiàng)是可選項(xiàng),不指定該選項(xiàng),則指定延時(shí)值的參考時(shí)鐘就是-clock指定的同步時(shí)鐘。
-clock_fall 指定輸入延時(shí)約束取值相對(duì)于同步時(shí)鐘的下降沿。若不指定,默認(rèn)為-clock_rise
-rise 指定約束信號(hào)相對(duì)時(shí)鐘的邊沿關(guān)系是上升沿,也可以用-fall指定為下降沿
-max 設(shè)定最大延時(shí)值,也可以是-min最小值。若不指定,則是最大最小值都包括
-add_delay 用于多組參考組合的輸入引腳約束
<delay> 設(shè)定延時(shí)值
<objects> 指定約束的目標(biāo)輸入引腳名稱
??關(guān)于輸入延時(shí)的計(jì)算如下:
set_input_delay(max)= -Tc2j_pcb(min) + Tco(max) + Td_pcb(max)
set_input_delay(min)= -Tc2j_pcb(min) + Tco(max) + Td_pcb(min)
其中c2j_pcb代表時(shí)鐘源在pcb上的走線延時(shí),d_pcb為數(shù)據(jù)在pcb上的走線延時(shí),co為外部芯片數(shù)據(jù)引腳輸出數(shù)據(jù)所經(jīng)過(guò)的延時(shí),查芯片手冊(cè)可以獲得。
set_output_delay(max)= Td_pcb(max) - Tc2j_pcb(min) + Tsu
set_output_delay(min)= Td_pcb(min) - Tc2j_pcb(min) - Th
5.時(shí)鐘例外約束
??進(jìn)行時(shí)序例外約束的原因:時(shí)序分析工具默認(rèn)的時(shí)序檢查方式可能與工程實(shí)現(xiàn)的實(shí)際情況不符合(通常是約束過(guò)緊,可能導(dǎo)致時(shí)序失?。?。因此,設(shè)計(jì)者需要額外增加一些約束命令,用于調(diào)整既有的時(shí)序檢查方式,以保證時(shí)序工具的時(shí)序檢查與實(shí)際情況一致。
??進(jìn)行時(shí)序例外約束的典型例子:1.異步時(shí)鐘域路徑,通??梢允褂脮r(shí)鐘分組約束或虛假路徑約束以及多周期約束。2.某些邏輯的時(shí)序單元并非每個(gè)時(shí)鐘周期都及進(jìn)行數(shù)據(jù)采樣傳輸,此時(shí)可以使用多周期約束,適當(dāng)放寬這些路徑的約束 。3.有時(shí)設(shè)計(jì)中希望對(duì)時(shí)序路徑施加更緊的約束,以獲得更大的時(shí)序余量,此時(shí)可以使用最大/最小延時(shí)約束。4.某些組合路徑是靜態(tài)的(賦值不變)或不需要進(jìn)行時(shí)序約束,此時(shí)可以使用虛假路徑約束忽略這些路徑。
5.1多周期約束
??多周期約束語(yǔ)法如下:
set_multicycle_path <path_multiplier> -setup/hold -start/end -from <startpoints> -to <endpoints> -through <pins/cells/nets>
#
-start和-end用于指定約束命令的周期參數(shù)是以源時(shí)鐘還是以目標(biāo)時(shí)鐘作為參考時(shí)鐘。
??對(duì)于源時(shí)鐘和目標(biāo)時(shí)鐘同頻同相的時(shí)序路徑分析,是否使用-start和-end是沒(méi)有頭差異的。
??保持時(shí)間的時(shí)鐘周期數(shù)=建立時(shí)間的<path_multiplier>參數(shù)-1-保持時(shí)間的<path_multiplier>參數(shù)。在一般情況下,若只對(duì)setup進(jìn)行set_multicycle_path約束,則保持時(shí)間的<path_multiplier>參數(shù)默認(rèn)為0,也就是保持時(shí)間的時(shí)鐘周期數(shù)默認(rèn)和建立時(shí)間的<path_multiplier>參數(shù)相差一個(gè)時(shí)鐘周期。那么僅對(duì)setup進(jìn)行約束,則建立時(shí)間和保持時(shí)間關(guān)系同時(shí)向右移動(dòng)<path_multiplier>參數(shù)-1個(gè)時(shí)鐘周期,若加上對(duì)hold的<path_multiplier>參數(shù)約束,則保持時(shí)間關(guān)系會(huì)向左移動(dòng)hold的<path_multiplier>參數(shù)個(gè)時(shí)鐘周期,從而達(dá)到多周期約束的效果。
??下面給出示意圖。
??當(dāng)約束僅為set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]時(shí),圖形如下:??當(dāng)約束為set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]和set_multicycle_path 1 -hold -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]時(shí),圖形如下:
??對(duì)于同頻異相的時(shí)鐘,在默認(rèn)情況下時(shí)序工具會(huì)尋找與clk1相鄰最近的clk2時(shí)鐘上升沿,并以clk1和clk2相對(duì)時(shí)間最短(時(shí)序要求最高,即最壞情況)的一組時(shí)鐘沿的時(shí)序路徑進(jìn)行分析。此時(shí),使用如下約束命令進(jìn)行調(diào)整:
set_multicycle_path 2 -setup -from [get_clocks CLK1] -to [get_clocks CLK2]
??對(duì)于慢時(shí)鐘域到快時(shí)鐘域或者快時(shí)鐘域到慢時(shí)鐘域有異曲同工之妙,需要注意的是-start和-end的確認(rèn),下面給出這兩種情況的通用約束方法。
#慢-快
set_multicycle_path N -setup -end -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path N-1 -hold -end -from [get_clocks CLK1] -to [get_clocks CLK2]
#快-慢
set_multicycle_path N -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path N-1 -hold -start -from [get_clocks CLK1] -to [get_clocks CLK2]
5.2虛假路徑約束
??所謂虛假路徑,是指該路徑是設(shè)計(jì)中的非功能路徑或沒(méi)有任何時(shí)序要求的路徑。做虛假路徑約束的原因:可以減少編譯時(shí)間,同時(shí)騰出有限的布局布線資源,用于提升整體的時(shí)序性能。常見(jiàn)的虛假路徑包括:1.已經(jīng)做過(guò)同步處理的跨時(shí)鐘域路徑。2.上電后只做一次初始化寫(xiě)入寄存器路徑。3.復(fù)位或測(cè)試邏輯路徑。4.某些實(shí)際并不存在的時(shí)序路徑。例如,設(shè)計(jì)中的兩個(gè)異步是哦只能怪域之間的數(shù)據(jù)通信已經(jīng)使用雙寄存器鎖存等方式進(jìn)行同步了,就可以使用虛假路徑約束關(guān)閉這兩個(gè)時(shí)鐘之間的數(shù)據(jù)路徑檢查。約束的基本語(yǔ)法如下:
set_false_path -setup/hold -from <node_list> -to <node_list> -through <node_list>
#對(duì)于兩個(gè)或多個(gè)相斥時(shí)鐘做約束推薦用法
set_clock_groups -group CLKA -group CLKB
5.3最大/最小延時(shí)約束
??最大延時(shí)約束將覆蓋默認(rèn)的建立時(shí)間分析的最大路徑延時(shí)值。最小延時(shí)約束將覆蓋默認(rèn)的保持時(shí)間分析的最小路徑延時(shí)值?;炯s束語(yǔ)法如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-661972.html
set_max_delay <delay> -datapath_only -from <node_list> -to <node_list> -through <node_list>
set_min_delay <delay> -from <node_list> -to <node_list> -through <node_list>
??其中,-datapath_only只能用于含有-from選項(xiàng)的set_max_delay約束命令中。該選項(xiàng)會(huì)將時(shí)鐘偏斜考慮移除,同時(shí)會(huì)將約束路徑的保持時(shí)間檢查設(shè)置為false路徑,相當(dāng)于同時(shí)對(duì)此路徑自動(dòng)生成了set_false_path -hold約束。也就是說(shuō),若對(duì)同一路徑進(jìn)行set_min_delay約束,將會(huì)被忽略。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-661972.html
到了這里,關(guān)于tcl學(xué)習(xí)之路(五)(Vivado時(shí)序約束)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!