劉 晟
(上海諾基亞貝爾股份有限公司,江蘇 南京 210037)
隨著半導(dǎo)體芯片和人工智能產(chǎn)業(yè)的發(fā)展,現(xiàn)場可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)逐漸受到重視。其靈活性和可定制性都是非常具有吸引力的特性。為解決系統(tǒng)設(shè)計問題,F(xiàn)PGA 越來越多地整合系統(tǒng)模塊,同時進(jìn)一步集成了重要控制功能。
隨著FPGA的規(guī)模及速度的持續(xù)提高,被測試設(shè)計(Device Under Test,DUT)的時序驗(yàn)證及邏輯功能驗(yàn)證必須分開進(jìn)行:寄存器傳輸級(Register Transfer Level,RTL)驗(yàn)證電路邏輯功能的正確性;靜態(tài)時序分析(Static Timing Analysis,STA)驗(yàn)證電路時序的正確性[1]。STA工具通過給設(shè)計添加多個時序約束,實(shí)現(xiàn)控制邏輯的綜合、映射及布局布線,以此來規(guī)范FPGA的設(shè)計時序,使設(shè)計達(dá)到滿足全部的時序要求[2]。
時序分析的方法是檢查FPGA內(nèi)部布局布線的延時,保證所有時序的有正時序裕量,即滿足:
式中,Trequired_time表示所約束時長,Tarrival_time表示實(shí)際延時,Slack表示時間裕量,為正表示時序收斂。時序裕量的計算需要依據(jù)不同的時序路徑,分析約束條件,得到設(shè)計頻率最高值。STA工具將DUT上的時序路徑分成4種:
(1)輸入端口→觸發(fā)器D端口(Pad-to-Setup);
(2)觸發(fā)器CLK端口 → 觸發(fā)器D端口(Clock-to-Setup);
(3)觸發(fā)器CLK端口 → 輸出端口(Clockto-Pad);
(4)輸入端口 → 輸出端口(Pad-to-Pad)。
時序分析數(shù)據(jù)傳輸路徑的示意圖如圖1所示。任何復(fù)雜的時序電路基本都可以用該模型來表示。只有確保數(shù)據(jù)準(zhǔn)確無誤地在觸發(fā)器之間傳輸,才能確定數(shù)據(jù)傳輸延時的區(qū)間。
圖1 數(shù)據(jù)傳輸路徑圖
時鐘沿到達(dá)前數(shù)據(jù)從不穩(wěn)定狀態(tài)過渡到穩(wěn)定狀態(tài)所經(jīng)歷的時間稱為建立時間(Tsu)。數(shù)據(jù)在穩(wěn)定后需要在時鐘上升沿保持的時間稱為保持時間(Th)。建立時間和保持時間是矛盾的兩方面。圖2為同一時鐘下的建立時間與保持時間的關(guān)系。Tco為時鐘上升沿到來后,觸發(fā)器輸出端口產(chǎn)生信號輸出所需時間為觸發(fā)器輸出時間。
圖2 同一時鐘下的時間關(guān)系圖
圖2可以看作是圖1的子集,是時序電路中的基本模塊結(jié)構(gòu)。其時序如圖3所示。
建立時間和保持時間必須滿足式(2)、式(3):
Tpd為時鐘從源觸發(fā)器(Source clk)到目標(biāo)觸發(fā)器(Destin clk)的路徑延時。
圖3 建立時間和保持時間時序圖
FPGA所有的同步路徑都基于時鐘,如晶振產(chǎn)生的時鐘、以太網(wǎng)恢復(fù)出的時鐘、ADC/DAC的數(shù)據(jù)時鐘等,稱為主時鐘(Primary Clock)。其他由主時鐘產(chǎn)生的時鐘,稱為衍生時鐘(Generated Clock)。
主時鐘需要通過命令create_clock創(chuàng)建,如定義一個名為clk_in,周期為10ns,占空比50%,通過輸入端口clk_in輸入到FPGA的主時鐘:
create_clock -name clk_in -period 10ns get_ports clk_in
創(chuàng)建主時鐘后,STA工具自動確定該主時鐘的起點(diǎn)為仿真時序的“零點(diǎn)”,在“零點(diǎn)”之前的路徑延時都被忽略。如果主時鐘是以差分對的形式輸入FPGA,那么只需要約束差分的正相端口。
衍生時鐘分為兩種,一種由時鐘管理單元創(chuàng)建,其約束由工具自動推導(dǎo)得出,不需要用戶手動約束;另一種由用戶通過寄存器或組合邏輯設(shè)計得到,通過命令create_generated_clock來創(chuàng)建約束。此外還需要考慮時鐘的延時(latency)和抖動(jitter)等因素。由圖2可以看出,由于存在時鐘路徑,到達(dá)REG1和REG2的時鐘有先后,稱為時鐘延時,用set_clock_latency命令約束。外部器件輸入時鐘本身屬性,或者電源噪聲、電路板噪聲等因素,都會導(dǎo)致輸入時鐘產(chǎn)生抖動,用set_system_jitter命令約束。
對于異步時鐘,假設(shè)圖2中的REG1和REG2的時鐘異步,則要約束不同的時鐘組,以避免路徑的跨時鐘域(Clock Domain Cross,CDC)錯誤。例如:
create_clock_groups -name asy_clk -asynchronous-group source_clk -group destin_clk
I/O數(shù)據(jù)傳輸方案根據(jù)不同的數(shù)據(jù)速率,對齊方式,時鐘源等來做區(qū)分[4]。盡管場景不同,但都適用于相同的原則:分析FPGA與上下游設(shè)備的建立保持時間。
約束設(shè)計中I/O約束的命令有以下幾種[3]:
(1)set_max_delay;
(2)set_min_delay;
(3)set_input_delay -max <maxdelay> -min<mindelay>;
(4)set_output_delay -max <maxdelay> -min<mindelay>。
命令(1)和命令(2)用來約束異步組合邏輯接口。組合邏輯延時是不被任何時鐘序列捕獲的輸入和輸出FPGA的路徑延時,傳輸路徑如圖4所示。
圖4 組合邏輯的延時圖
命令(3)和命令(4)用來約束時序邏輯接口。通過max和min參數(shù)設(shè)定最大/最小延時時間。
圖5 同步邏輯輸入電路
圖5為Input約束。Input延時表示輸入數(shù)據(jù)相對于輸入時鐘的時間差。
Input的最大和最小輸入延時分別為:
圖6為Output約束。Output延時表示輸出數(shù)據(jù)相對于輸入時鐘的時間差。
Output的最大和最小輸出延時分別為:
圖6 同步邏輯輸出電路
為保證約束的完整性,Input和Output的maxdelay和mindelay必須同時約束。Input的maxdelay描述的是setup相關(guān)的上游器件的延時;mindelay描述的是hold相關(guān)的上游器件的延時。Output的maxdelay描述的是setup相關(guān)的下游器件的延時;mindelay描述的是hold相關(guān)的下游器件的延時。
STA是基于基本元素(Basic Element Logics,BELs)的。即使路徑上有多個BEL封裝在同一個切片(Slice)中,仍然需要對每個BEL進(jìn)行時序特性描述。
setup檢查下一個時鐘周期之前傳遞完數(shù)據(jù)。第一個clock的上升沿發(fā)送,第二個clock的上升沿接收。當(dāng)時鐘連接到FPGA的port/pin/net時,檢查包括時鐘從連接到路徑端點(diǎn)的傳播。數(shù)據(jù)路徑延時使用路徑最長延時,而目標(biāo)時鐘延時使用路徑最短延時。setup檢查從起始點(diǎn)時鐘的啟動沿開始,到終結(jié)點(diǎn)時鐘的捕獲沿結(jié)束。
hold檢查數(shù)據(jù)在接收端的時鐘邊沿后還仍然能穩(wěn)定保持的時間。同一個時鐘沿既是啟動沿也是捕獲沿。這就意味著當(dāng)時鐘發(fā)生跳變時,引起的時鐘更改是否在相同的時鐘邊沿到達(dá)目標(biāo)模塊(通常是從同一個時鐘的上升沿觸發(fā))之前傳播到目標(biāo)模塊。其中最短延時被用于源時鐘和數(shù)據(jù)路徑的延時,最長延時被用于目標(biāo)時鐘的延時。
I/O接口可以分為系統(tǒng)同步和源同步。前者是指FPGA和上下游器件之間僅傳遞數(shù)據(jù),時鐘通過系統(tǒng)板級同步;后者是指FPGA和上下游器件之間同時傳遞數(shù)據(jù)和時鐘,用時鐘同步數(shù)據(jù)。源同步基本不受傳輸線延時影響,時鐘頻率更高,約束也相對更復(fù)雜。
在系統(tǒng)同步模式下,僅需考慮FPGA上下游器件延時Tco及數(shù)據(jù)板級延時Tdata_PCB。I/O的啟動與捕獲如圖7所示。啟動沿對應(yīng)上游器件時鐘,捕獲沿對應(yīng)下游器件時鐘。
圖7 系統(tǒng)同步I/O時序圖
在系統(tǒng)同步接口中,捕獲數(shù)據(jù)的預(yù)期邊沿是靠近數(shù)據(jù)窗口末尾的邊沿。當(dāng)Tco和Tdata_PCB已知時,可直接指定FPGA輸入延時。由此可以導(dǎo)出FPGA接收到的實(shí)際有效數(shù)據(jù)在最大和最小情況下的通用數(shù)據(jù)窗口。每個捕獲沿也是下一個數(shù)據(jù)的啟動沿,可以用來做hold分析。相應(yīng)約束為:
在源同步模式下,數(shù)據(jù)和隨路時鐘之間存在相位關(guān)系,接收端必須使用該時鐘來鎖存數(shù)據(jù)。源同步可劃分為單數(shù)據(jù)率(Single Data Rate,SDR)和雙數(shù)據(jù)率(Double Data Rate,DDR)、中心對齊和邊沿對齊等多種方式。這里以中心對齊的SDR方式為例,I/O的啟動與捕獲如圖8所示。
圖8 源同步I/O時序圖
在中心對齊的SDR方式下,F(xiàn)PGA捕獲的波形數(shù)據(jù)不依賴于捕獲沿。因此,最大和最小延時通常通過圖中所示的無效數(shù)據(jù)(skew)來計算得到。當(dāng)捕獲沿時間早于使用負(fù)設(shè)置捕獲的數(shù)據(jù)時,STA工具中的默認(rèn)設(shè)置時間分析不能將前沿同時視為啟動沿和捕獲沿。相應(yīng)約束為:
如果分析不相關(guān)的時鐘域信號,就會得到錯誤的結(jié)果。因此STA工具需要知道哪些路徑要進(jìn)行特殊的時序分析。主要有兩種類型:多周期路徑約束和假路徑約束。
上文的I/O約束有一個基本的條件,就是數(shù)據(jù)在單個時鐘周期內(nèi)完成寄存器之間的傳輸。但是在實(shí)際的設(shè)計中,設(shè)計的復(fù)雜性會導(dǎo)致延時較大,往往數(shù)據(jù)在發(fā)送多個時鐘周期之后才起作用[3],導(dǎo)致啟動和捕獲之間需要多個時鐘周期。
在上文的圖2中,如果中間的組合邏輯模塊延時較大,需要多個時鐘周期來完成從REG1到REG2的數(shù)據(jù)傳輸,就稱為多周期路徑,如圖9和圖10所示。一個很好的解決方法是使用時鐘使能信號,在N個時鐘周期后讀取數(shù)據(jù)。將數(shù)據(jù)率變?yōu)闀r鐘頻率的1/N。
圖9 多周期路徑約束原理
圖10 多周期路徑約束時序
如果不設(shè)置多周期路徑約束,則STA工具會按照單周期路徑來約束,會導(dǎo)致時序不滿足,或者過分優(yōu)化,造成過約束,侵占本該更高優(yōu)先級的約束資源[3]。因此最好在模塊描述中給出多周期路徑的注釋,并添加到約束文件中。相應(yīng)的約束命令為:
其中N表示經(jīng)過多周期路徑的時鐘數(shù)。
所謂“假路徑”,是設(shè)計人員告訴STA工具那些不需要進(jìn)行約束分析的路徑。主要包括3種:(1)在邏輯函數(shù)中不存在的路徑,比如多個主從總線通信、多路選擇功能等;(2)多異步時鐘域的路徑,可以使用先進(jìn)先出(First Input First Output,F(xiàn)IFO)模塊進(jìn)行通信;(3)測試功能邏輯路徑,如內(nèi)建自測(Built-in Self Test,BIST)、邊界掃描測試等。以上情況設(shè)置假路徑的約束命令分別為:
假路徑的設(shè)置,可以確保定義的路徑不做檢查,提高STA效率。前提是要求設(shè)計人員對設(shè)計路徑熟悉,同時也會增加約束文件的復(fù)雜度。如果判斷不好約束的優(yōu)先級,有時也會適得其反,因此需要謹(jǐn)慎操作。
本文探討了幾種FPGA的靜態(tài)時序約束方法,分析了電路時序原理,介紹了相應(yīng)的語句。FPGA時序約束越來越復(fù)雜,用好時序約束,對邏輯電路的設(shè)計能起到事半功倍的效果。然而時序約束不能一概而論,用固定的幾種約束方法解決所有的時序問題。需要FPGA設(shè)計人員在實(shí)際的工作中積累經(jīng)驗(yàn),找準(zhǔn)阻礙時序收斂的根本原因分析解決。