FPGA設(shè)計時序約束七、設(shè)置時鐘不確定約束
一、背景
????在之前的時序分析中,通常是假定時鐘是穩(wěn)定理想的,即設(shè)置主時鐘周期后按照周期精確的進(jìn)行邊沿跳動。在實際中,時鐘是非理想存在較多不確定的影響,存在時延和波形的變化,要準(zhǔn)確分析時序也需將其考慮進(jìn)來,下面將對其進(jìn)行介紹。
二、時鐘例外
????Vivado的時序約束中,考慮時鐘不穩(wěn)定影響的約束包括set_clock_latency,
set_clock_uncertainty,set_input_jitter,set_system_jitter,這些約束可分為兩類:clock latency和clock uncertainty
2.1 clock latency
????信號從外部傳輸?shù)紽PGA內(nèi)部后,時鐘到達(dá)內(nèi)部的目的地存在確定的時延,該時延包括源點的延時(source latency)和網(wǎng)絡(luò)延時(network latency,也稱為插入時延)。source latency表示時鐘信號從波形的起點傳輸?shù)叫酒袋c引腳的時延,時鐘網(wǎng)絡(luò)時延表示時鐘信號從芯片源點引腳到芯片寄存器時鐘引腳的時延。
????網(wǎng)絡(luò)延時在預(yù)布線階段會分析工具自動的估算,在完成布線后可以精確的計算。在許多非賽靈思的時序分析工具中,要求設(shè)置set_propagated_clock約束來計算時鐘樹上的傳輸延時。vivado不需要該命令,會默認(rèn)自動考慮所有時鐘的傳輸時延,對于生成時鐘的時延,包含主時鐘的插入時延和自身的網(wǎng)絡(luò)時延。
????賽靈思器件使用set_clock_latency約束主要是約束器件外部的時鐘時延,約束命令設(shè)置界面如圖

Relative clocks:設(shè)置與指定對象objects相關(guān)聯(lián)的時鐘時延,為可選項。
Latency type:選擇時延類型,可以是Source或Network,未進(jìn)行設(shè)置時,默認(rèn)為Network
Latency value:設(shè)置時延值應(yīng)用的分析類型,min為hold,max為setup,不勾選時,對setup/hold分析都有效。
Source latency variation bound:在latency type選Source才能設(shè)置該項,設(shè)置時鐘延時是早于early還是晚于late時鐘邊沿到達(dá),early表示應(yīng)用于hold分析,late應(yīng)用于setup分析,不設(shè)置時對setup/hold分析都有效
Operating condition:設(shè)置延時
Clock rise latency/Clock fall latency:設(shè)置時延是針對上升沿觸發(fā),下降沿觸發(fā),還是對兩者都觸發(fā)的場景
Object:時鐘時延約束的對象,可以是clocks,cell pins,I/O port
2.2 clock uncertainty
clock uncertainty包含clock jitter,input jitter,system jitter
2.2.1 clock jitter
對于ASIC器件來說,時鐘抖動clock jitter通常表示時鐘不確定的特征,但對于FPGA來說,時鐘抖動是可預(yù)知的,時序分析工具會自動計算時鐘抖動。
2.2.2 input jitter
輸入抖動input jitter是指與理想的連續(xù)時鐘到達(dá)時間相比,連續(xù)的時鐘邊沿到達(dá)時間存在變化,輸入抖動是一個絕對值,代表了每一個時鐘沿的變動。使用set_input_jitter約束可以設(shè)置每一個主時鐘的輸入抖動,但不能直接對生成時鐘設(shè)置時鐘抖動,時序分析工具會自動的根據(jù)主時鐘的輸入抖動計算生成時鐘的時鐘抖動。
a)對于來自于MMCM或PLL的生成時鐘,將用一個獨立的抖動值來替代時鐘抖動
b)對于來自組合邏輯的生成時鐘,生成時鐘的時鐘抖動和主時鐘相同
set_input_jitter設(shè)置方式簡單,對象只能為clock。

系統(tǒng)抖動system jitter是由于電源供電噪聲,板級噪聲,或其他系統(tǒng)的抖動一起引起的抖動,使用約束命令set_system_jitter設(shè)置的抖動是針對整個設(shè)計,所有的時鐘。
以經(jīng)過主時鐘的時鐘輸入端口clkin設(shè)置ps的時鐘抖動為例
2.2.3 additional clock uncertainty
使用set_clock_uncertainty可以對不同的場景,延時或者是需要的時鐘關(guān)系設(shè)置時鐘不確定性,對于設(shè)置中的部分添加時序裕量是一種很方便的方式。

Clock uncertainty type:有兩種設(shè)置不確定性方式,simple uncertainty和interclock uncertainty。simple uncertainty是針對同步時鐘,objects可以是Cell pins,clocks,I/O port,interclock uncertainty針對異步時鐘,需設(shè)置-from和-to參數(shù)
跨時鐘間的不確定性總是優(yōu)于簡單的時鐘不確定性,不受約束順序的影響。以下面約束為例,盡管第二條簡單的不確定約束放在后面,從clk1到clk2的時序路徑不確定性依舊為2ns
當(dāng)在跨時鐘域的兩個時鐘間設(shè)置了不確定約束時,需確保約束了兩個時鐘域間所有的跨時鐘域路徑,如clk1到clk2,clk2到clk1。
三、工程設(shè)計
?工程代碼
a)無時鐘不確定約束時,路徑中clock uncertainty也存在,時序分析工具會自動計算Total system jitter,此處為0.071,按照公式(Tsj^2+Tij^2+DJ)/2+PE的值為0.035。

b) 設(shè)置set_clock_latency約束
時序分析報告,setup分析中source clock path路徑的clock source latency為0.8

c) 設(shè)置set_clock_uncertainty值為2.660,因為設(shè)計中clk1和clk2為異步時鐘域,Clock uncertainty type選擇interclock uncertainty。
查看時序路徑中setup或hold路徑的Clock uncertainty為2.695ns,該值的計算可以看右側(cè)中的計算公式(Tsj^2+Tij^2+DJ)/2+PE+UU。UU為用戶約束的不確定值,即為2.66ns,和約束值一致。

同理,查看路徑的clock path skew,通過clock path skew equation可以知道計算方式,DCD-SCD-CPR

d) 設(shè)置set_input_jitter為1.66ns
查看setup路徑中clock uncertainty值為0.831ns,查看計算使用值中total input jitter為1.66ns,和約束值一致

四、參考資料
用戶手冊:ug903-vivado-using-constraints-en-us-2022.2.pdf
鏈接:https://pan.baidu.com/s/17AK_-J4wRXiFLtLTorlrwg?pwd=mylt?
提取碼:mylt??