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