左麗麗,劉國斌,吳維林,陳 云
(上海航天軟件測評中心,上海 201109)
隨著軍工產(chǎn)品向著高集成度、小型化、高速和高可靠性方向發(fā)展,F(xiàn)PGA和CPLD等可編程邏輯器件在軍工產(chǎn)品中的應(yīng)用數(shù)量成爆發(fā)式增長[1]。相對于傳統(tǒng)的邏輯器件,F(xiàn)PGA能夠很大程度縮短實(shí)驗(yàn)時(shí)間[2],隨著設(shè)計(jì)規(guī)模的增大和設(shè)計(jì)復(fù)雜度的提高,許多原本應(yīng)用于專用集成電路(ASIC)的驗(yàn)證方法如STA(static timing analysis, 靜態(tài)時(shí)序分析)方法也逐漸應(yīng)用到 FPGA的設(shè)計(jì)驗(yàn)證中。靜態(tài)時(shí)序分析不需要測試向量,即使沒有仿真條件也能快速地分析電路中所有時(shí)序路徑是否滿足約束要求[3]。
本文使用靜態(tài)時(shí)序分析工具Prime Time,針對某FPGA設(shè)計(jì)中SRAM的讀寫接口設(shè)計(jì)進(jìn)行時(shí)序驗(yàn)證。采用衍生時(shí)鐘約束,輸入、輸出延時(shí)約束,多周期路徑約束相結(jié)合的方式,將FPGA的輸入輸出信號關(guān)聯(lián)起成一個(gè)回路,成功的對FPGA與SRAM之間的交互進(jìn)行環(huán)路分析。根據(jù)分析結(jié)果,快速準(zhǔn)確發(fā)現(xiàn)了接口設(shè)計(jì)的缺陷和薄弱環(huán)節(jié),高效實(shí)現(xiàn)設(shè)計(jì)的優(yōu)化。
某圖像處理FPGA在進(jìn)行設(shè)計(jì)時(shí)采用3片SRAM接口進(jìn)行圖像數(shù)據(jù)的預(yù)存。硬件接口圖如圖1所示。
圖1 FPGA設(shè)計(jì)硬件接口框圖
2片SRAM與FPGA的信號連接關(guān)系如表1所示。
表1 SRAM與FPGA對外接口信號表
設(shè)計(jì)中采用的主處理時(shí)鐘頻率為70 M,在對SRAM進(jìn)行讀寫控制時(shí),需滿足芯片讀寫時(shí)序要求,根據(jù)器件手冊SRAM讀數(shù)據(jù)時(shí)序及時(shí)序參數(shù)如圖2,SRAM寫數(shù)據(jù)時(shí)序及時(shí)序參數(shù)如圖3。
圖2 讀SRAM數(shù)據(jù)時(shí)序及時(shí)序參數(shù)圖
圖3 寫SRAM數(shù)據(jù)時(shí)序及時(shí)序參數(shù)圖
由圖2~3可知,SRAM讀寫操作由多個(gè)信號同時(shí)控制,包括CS0#、CS1#、WE#、OE#、Address和Din/Dout,且相互之間需滿足一定的時(shí)序關(guān)系才能保證SRAM的正常工作。為了便于控制,設(shè)計(jì)中將CS0#、CS1#置為常有效,通過WE#和OE#控制讀寫邏輯的產(chǎn)生。
FPGA的驗(yàn)證工作,在很多方面都表現(xiàn)出了較高的復(fù)雜性和較強(qiáng)的技術(shù)性[4]。按照傳統(tǒng)的驗(yàn)證流程,依次進(jìn)行前仿真驗(yàn)證、靜態(tài)時(shí)序分析、后仿真驗(yàn)證。
考慮各時(shí)序參數(shù)的要求,在進(jìn)行接口設(shè)計(jì)時(shí)考慮各信號的相關(guān)性,盡量避免同時(shí)跳變,寫時(shí)序下地址和數(shù)據(jù)的持續(xù)時(shí)間較長,而WE#在地址和數(shù)據(jù)穩(wěn)定時(shí)有效,為各時(shí)序參數(shù)預(yù)留充分的余量,讀時(shí)序下采用地址驅(qū)動(dòng)SRAM數(shù)據(jù)輸出,F(xiàn)PGA在下個(gè)周期讀取數(shù)據(jù), 前仿真結(jié)果如圖5。
圖4 SRAM寫時(shí)序前仿真結(jié)果圖
圖5 SRAM讀時(shí)序前仿真結(jié)果圖
前仿真情況下,SRAM讀寫時(shí)序參數(shù)測試結(jié)果如表2所示。
表2 SRAM時(shí)序參數(shù)
功能前仿真結(jié)果表明讀寫時(shí)序均滿足要求,且各時(shí)序參數(shù)均存在一定的余量,因此對設(shè)計(jì)進(jìn)一步開展靜態(tài)時(shí)序分析。
從信號接口表可以看出,與SRAM的接口中除了數(shù)據(jù)線之外,均為FPGA的輸出信號,因此在靜態(tài)時(shí)序分析時(shí),由于輸入數(shù)據(jù)sram*_dat與本地的70 M時(shí)鐘并無固定的相位關(guān)系,按照常規(guī)處理方式,僅進(jìn)行了output delay的約束,靜態(tài)時(shí)序分析通過后進(jìn)一步通過布局布線后的仿真驗(yàn)證接口處理功能的正確性。
在后仿真驗(yàn)證SRAM接口時(shí),進(jìn)行了3種工況的布局布線后仿真。寫時(shí)序的產(chǎn)生完全由FPGA輸出控制,且寫時(shí)序在靜態(tài)時(shí)序分析時(shí)已添加了時(shí)序約束,后仿真的結(jié)果表明靜態(tài)時(shí)序分析的結(jié)果與后仿真的結(jié)果一致且均滿足時(shí)序要求。
但讀時(shí)序的驗(yàn)證則遇到了問題,寫時(shí)序的產(chǎn)生完全取決于FPGA,數(shù)據(jù)線和控制線均由FPGA輸出產(chǎn)生,控制相對簡單。而讀時(shí)序動(dòng)作的完成需要FPGA和SRAM配合完成,讀時(shí)序的整個(gè)過程其實(shí)可以劃分為分為3個(gè)子過程:1)FPGA輸出讀時(shí)序控制信號CS0#、CS1#、WE#、OE#和Address;2)SRAM在以上信號的控制下輸出對應(yīng)的數(shù)據(jù);3)FPGA讀取SRAM輸出的數(shù)據(jù)并在內(nèi)部進(jìn)行取數(shù)。在模擬SRAM讀時(shí)序接口時(shí),由圖2可知,讀時(shí)序下時(shí)序參數(shù)例如tAA為最大值、tOH為最小值,均非典型值,因此若要考慮覆蓋性,則需要進(jìn)行仿真的模式非常之多:最大工況下tAA取最大值、最大工況下tAA取最小值、最大工況下tAA取典型值、最小工況下tAA取最大值、最小工況下tAA取最小值等等。
以上的仿真方案存在如下問題:
1)tAA值的選取直接影響了仿真效果;
2)后仿耗時(shí)巨大,且存在多種工況多種模式,在整個(gè)FPGA設(shè)計(jì)規(guī)模較大的情況下,此種驗(yàn)證方式嚴(yán)重降低了驗(yàn)證效率;
3)一旦發(fā)現(xiàn)接口時(shí)序不滿足,由于為后仿真網(wǎng)表,代碼中的信號在布線后的名稱被改變,追溯和定位問題困難,即便發(fā)現(xiàn)問題后進(jìn)行修改,很可能造成參數(shù)A在某工況下滿足要求了,而參數(shù)B又出錯(cuò)了。
基于以上的問題,到了后仿真階段再進(jìn)行接口時(shí)序的驗(yàn)證,不但效率低下,而且設(shè)計(jì)方案變更困難。測試投入和成本較高,不利于型號的快速研制[5],因此項(xiàng)目組決定重新使用靜態(tài)時(shí)序分析的方式對SRAM接口進(jìn)行驗(yàn)證
靜態(tài)時(shí)序分析的驗(yàn)證方法,它可以簡單的定義為:設(shè)計(jì)者提出一些特定的時(shí)序要求,或者說是添加特定的時(shí)序約束,套用特定的時(shí)序模型,針對特定的電路進(jìn)行分析。時(shí)序分析的目的就是確保在FPGA芯片的3種工況下,整個(gè)設(shè)計(jì)的接口設(shè)計(jì)滿足上級和下級系統(tǒng)接口時(shí)序需求[6]。利用分析結(jié)果給出的路徑延遲可以反向的進(jìn)行設(shè)計(jì)改善,指導(dǎo)綜合和布局布線工具,從而實(shí)現(xiàn)優(yōu)化設(shè)計(jì)。Prime Time是Synopsys公司的一款功能強(qiáng)大的全芯片和門級靜態(tài)時(shí)序分析工具,也是業(yè)界最流行的工具,常被用來分析大規(guī)模、同步、數(shù)字ASIC。
STA的工作原理是提取數(shù)字電路的所有時(shí)序路徑,計(jì)算信號在時(shí)序路徑上的傳播延遲,分析其中最大路徑延遲和最小路徑延遲[7]。靜態(tài)時(shí)序分析時(shí)將設(shè)計(jì)分成4種時(shí)序路徑,每條路徑包含一個(gè)起點(diǎn)和終點(diǎn),時(shí)序路徑的起點(diǎn)只能是設(shè)計(jì)的輸入端口或者內(nèi)部寄存器的時(shí)鐘輸入端,終點(diǎn)只能是內(nèi)部寄存器的數(shù)據(jù)輸入端或者設(shè)計(jì)的基本輸出端口。因此STA的4種時(shí)序路徑包括:
1)從輸入端口到寄存器的數(shù)據(jù)D端;
2)從寄存器的時(shí)鐘CLK端到寄存器的數(shù)據(jù)D端;
3)從寄存器的時(shí)鐘CLK端到輸出端口;
4)從輸入端口到輸出端口。
靜態(tài)時(shí)序分析主要是通過對最大路徑延遲和最小路徑延遲的分析,檢查建立時(shí)間、保持時(shí)間、移除時(shí)間、恢復(fù)時(shí)間等是否滿足要求。
結(jié)合本項(xiàng)目的實(shí)際情況,SRAM接口的靜態(tài)時(shí)序路徑包含以上4種路徑中的2種:即從輸入端口到寄存器的數(shù)據(jù)D端的路徑和從觸發(fā)器的時(shí)鐘CLK端到輸出端口的路徑,這兩種路徑在沒有添加相關(guān)約束情況下并不會自動(dòng)分析,因此即使input delay為0,也需要進(jìn)行約束,若不約束,靜態(tài)時(shí)序分析工具并不會按照默認(rèn)0進(jìn)行計(jì)算,而是直接忽略。添加合理的約束是決定靜態(tài)時(shí)序分析質(zhì)量的決勝因素。
FPGA時(shí)序約束的工作就是模擬FPGA的實(shí)際工作環(huán)境,包括定義FPGA的時(shí)鐘頻率,設(shè)置數(shù)據(jù)端口的輸入輸出延時(shí),設(shè)置芯片電路內(nèi)部的偽路徑等[8]。時(shí)序約束的作用主要是指導(dǎo)FPGA軟件按照一定的原則布局布線,以控制邏輯路徑端點(diǎn)間的布線延時(shí)。同時(shí),時(shí)序約束還為靜態(tài)時(shí)序分析器提供時(shí)序分析的標(biāo)準(zhǔn)和依據(jù)[9]。
數(shù)據(jù)的到達(dá)時(shí)間:輸入數(shù)據(jù)在有效時(shí)鐘沿后到達(dá)所需要的時(shí)間。通常由三部分組成:時(shí)鐘到達(dá)寄存器時(shí)間,寄存器輸出延時(shí)和數(shù)據(jù)傳輸延時(shí)。
數(shù)據(jù)要求時(shí)間:在時(shí)鐘鎖存的建立時(shí)間和保持時(shí)間之間數(shù)據(jù)必須保持穩(wěn)定,從源時(shí)鐘起點(diǎn)到達(dá)這種穩(wěn)定狀態(tài)需要的時(shí)間即為數(shù)據(jù)需求時(shí)間,默認(rèn)的參考值是一個(gè)時(shí)鐘周期。如果數(shù)據(jù)能夠在一個(gè)要求時(shí)間內(nèi)到達(dá)終點(diǎn),那么這條路徑符合設(shè)計(jì)規(guī)則。SLACK=要求時(shí)間-到達(dá)時(shí)間
其中,要求時(shí)間為約束時(shí)長,到達(dá)時(shí)間為添加延時(shí)候的實(shí)際到達(dá)時(shí)刻,SLACK為時(shí)序余量,正值表示滿足時(shí)序,負(fù)值表示不滿足時(shí)序,靜態(tài)時(shí)序分析把上公式作為依據(jù),分析設(shè)計(jì)中的所有時(shí)序路徑。如果得到的靜態(tài)時(shí)序分析報(bào)告中SLACK為負(fù)值,那么此時(shí)序路徑存在時(shí)序問題,是一條影響整個(gè)電路工作性能的關(guān)鍵路徑。在邏輯綜合、布局布線等階段進(jìn)行靜態(tài)時(shí)序分析,就能及時(shí)發(fā)現(xiàn)并修改關(guān)鍵路徑上存在的時(shí)序問題,達(dá)到修正錯(cuò)誤,優(yōu)化設(shè)計(jì)的目的。
因此,正確且全面的約束是時(shí)序設(shè)計(jì)的重要環(huán)節(jié),約束過少或過于放松實(shí)際上即是對設(shè)計(jì)的放松,也不能發(fā)揮靜態(tài)時(shí)序分析應(yīng)有的作用。
3.2.1 設(shè)置輸入端口延時(shí)
輸入端口延時(shí)的約束可以優(yōu)化從輸入端口到第一級寄存器之間的路徑延遲,保證系統(tǒng)時(shí)鐘采到的外部信號可靠、穩(wěn)定。FPGA端口需要跟不同的外部器件連接,通過設(shè)置輸入延時(shí)來模擬端口信號在片外路徑的傳播情況,可使靜態(tài)時(shí)序分析結(jié)果更加符合實(shí)際。設(shè)置輸入端口延時(shí)的語法如下:
set_input_delay[-clock clock_name]
[-clock_fall]
[-level_sensitive]
[-rise]
[-fall]
[-max]
[-min]
[-add_delay]
[-network_latency_included]
[-source_latency_included]
delay_value
port_pin_list
由上可知,輸入端口延時(shí)約束的兩大要素分別為:延時(shí)值、相關(guān)的時(shí)鐘。簡單的解釋就是外部輸入相對某時(shí)鐘的延時(shí)時(shí)間,此處外部輸入數(shù)據(jù)必須和時(shí)鐘有固定或較固定的相位關(guān)系。根據(jù)圖2所示,SRAM輸入到FPGA的數(shù)據(jù)與地址、片選、讀使能均有較固定相位關(guān)系,但設(shè)計(jì)中采用片選、讀使能接固定值、讀地址驅(qū)動(dòng)數(shù)據(jù)輸出的方式產(chǎn)生讀數(shù)據(jù),因此可約束輸入數(shù)據(jù)相對讀地址的延時(shí)值。由圖可知,SRAM數(shù)據(jù)相對于讀地址的延時(shí)最大值為tAA-12 ns,最小值為tOH-3ns,根據(jù)此信息進(jìn)入如下約束,兩組SRAM的約束相同:
set_input_delay 12 -max -clock sram1_adclk [get_ports sram1_dat]
set_input_delay 3 -min -clock sram1_adclk [get_ports sram1_dat]
3.2.2 時(shí)鐘的創(chuàng)建
對于時(shí)鐘的約束有兩種,create_clock和create_generated_clock。create_clock命令用于創(chuàng)建一個(gè)時(shí)鐘,包括時(shí)鐘名稱、源、周期和波形。create_generated_clock用于創(chuàng)建一個(gè)衍生時(shí)鐘。
在3.2.1節(jié)中提到,設(shè)計(jì)中采用讀使能驅(qū)動(dòng)的方式產(chǎn)生讀數(shù)據(jù),因此可約束輸入數(shù)據(jù)相對讀使能的延時(shí)值。但根據(jù)set_input_delay的語法要求,約束的輸入延時(shí)只能是相對于時(shí)鐘的,而設(shè)計(jì)中的讀使能信號并非時(shí)鐘,此時(shí)就用到了虛擬時(shí)鐘,此處可以使用衍生時(shí)鐘的約束方式來實(shí)現(xiàn),設(shè)置衍生時(shí)鐘約束的語法如下:
create_generated_clock [-name clock_name]
-source master_pin
[-edges edge_list]
[-divide_by factor]
[-multiply_by factor]
[-duty_cycle percent]
[-invert]
[-edge_shift shift_list]
[-add]
[-master_clock clock]
source_objects
設(shè)計(jì)中FPGA和SRAM的數(shù)據(jù)流交互實(shí)際上均與70 M時(shí)鐘clk_70 M相關(guān),在70 M時(shí)鐘下產(chǎn)生SRAM的地址信號SRAM1_ADD,SRAM輸出數(shù)據(jù)到FPGA后,F(xiàn)PGA再使用70 M的時(shí)鐘讀取SRAM數(shù)據(jù),以SRAM1為例,數(shù)據(jù)的交互如圖6所示。
圖6 SRAM1與FPGA數(shù)據(jù)交互
基于以上的信息,首先將70 M時(shí)鐘約束為時(shí)鐘,再將SRAM1_ADD約束為70 M時(shí)鐘的衍生時(shí)鐘,約束方法如下:
create_clock -period 14.286 clkin -name CLK_fpga70 -waveform [list 0 [expr 7.143]]
create_generated_clock -name sram1_adclk -source [get_ports clkin] -divide_by 1 [get_ports sram1_add[5]]
3.2.3 定義多周期路徑
默認(rèn)情況下靜態(tài)時(shí)序分析工具基于單周期進(jìn)行時(shí)序的檢查,set_multicycle_path可以將普通的單周期電路擴(kuò)展為多周期,用在同源但不同周期或者成倍頻關(guān)系的時(shí)鐘域之間,設(shè)置多周期約束的語法如下:
set_multicycle_path [-setup]
[-hold]
[-rise]
[-fall]
[-start]
[-end]
[-from from_list]
[-to to_list]
[-through through_list]
path_multiplier
在一定程度上講多周期約束實(shí)際上是對時(shí)序檢查的放松,因此一定要確定設(shè)計(jì)中確實(shí)采用了多周期的設(shè)計(jì)方法,才能進(jìn)行多周期的約束。
set_multicycle_path -to [get_ports sram1_dat] -setup 2 -start
set_multicycle_path -to [get_ports sram1_dat] -hold 1 -start
經(jīng)過以上約束后,運(yùn)行靜態(tài)時(shí)序分析軟件,發(fā)現(xiàn)端口SRAM1_DAT在讀操作情況下建立時(shí)間不滿足要求,以其中的一條路徑為例進(jìn)行分析,結(jié)果如圖7所示。
圖7 SRAM1讀時(shí)序接口靜態(tài)時(shí)序分析結(jié)果
由圖7可知,整個(gè)路徑的起點(diǎn)為sram1_adclk,即輸出到SRAM的地址信號,在此條路徑計(jì)算時(shí)首先添加了SRAM地址線上的輸出延時(shí)信息“clock network delay”,之后添加了約束的輸入延時(shí)值“input external delay”,之后再添加FPGA內(nèi)部的延時(shí)信息,與圖8中的數(shù)據(jù)流吻合,結(jié)合到圖6中,各延時(shí)數(shù)據(jù)分布如下:
圖8 靜態(tài)時(shí)序分析中的延時(shí)與數(shù)據(jù)路徑對應(yīng)關(guān)系
進(jìn)一步對以上的路徑在后仿真時(shí)進(jìn)行驗(yàn)證,在后仿真時(shí)將以上的數(shù)據(jù)路徑分別找出,發(fā)現(xiàn)延時(shí)數(shù)據(jù)與靜態(tài)時(shí)序分析的數(shù)據(jù)值吻合,進(jìn)一步證明該種約束方案快速且有效。
由于靜態(tài)時(shí)序分析時(shí)清楚的列出數(shù)據(jù)的路徑及每一級的延時(shí)信息,這就方便設(shè)計(jì)人員分析導(dǎo)致問題發(fā)生的關(guān)鍵原因,從而進(jìn)一步調(diào)整方案,從上述的分析結(jié)果看,造成該問題的主要原因是由于SRAM的地址存取時(shí)間tAA、保持時(shí)間tOH在3~12 ns的范圍內(nèi),該范圍過大。一般情況下tAA參與建立時(shí)間余量的計(jì)算,tOH參與保持時(shí)間余量的計(jì)算,在調(diào)整設(shè)計(jì)后很難達(dá)到建立時(shí)間和保持時(shí)間的平衡,建立時(shí)間滿足了,保持時(shí)間又出錯(cuò)了,或者最大工況下滿足了,最小工況又出錯(cuò)了。
基于以上的原因,將設(shè)計(jì)方案進(jìn)行調(diào)整,由地址驅(qū)動(dòng)改為讀使能驅(qū)動(dòng)控制讀時(shí)序,由圖2可知,讀使能驅(qū)動(dòng)情況下的延時(shí)值在0~6 ns之間,處于更加可控的延時(shí)范圍內(nèi),最終正確實(shí)現(xiàn)了FPGA對SRAM的讀寫控制。
靜態(tài)時(shí)序約束的方式簡便快捷,但最重要的時(shí)必須保證約束內(nèi)容的正確性,約束的內(nèi)容越準(zhǔn)確,則分析的結(jié)果越趨近于實(shí)際值,例如:
1)以上約束時(shí)添加的數(shù)值實(shí)際上均為常溫常壓下的數(shù)據(jù),而在實(shí)際使用中考慮器件在高低溫條件下的延時(shí)可能變大,對SRAM器件資料進(jìn)行進(jìn)一步的解讀,在高溫或低溫下大部分的時(shí)序參數(shù)值會增大或減小10%,在進(jìn)行約束時(shí)也需要考慮FPGA產(chǎn)品的實(shí)際使用環(huán)境,從而考核出FPGA設(shè)計(jì)真正的余量;
2)3.2.2節(jié)中將地址約束為衍生時(shí)鐘,而實(shí)際上地址為多bit信號,可以通過set_max_delay 的約束方式找出延時(shí)最大和延時(shí)最小的地址線。
本文以SRAM讀、寫接口設(shè)計(jì)的時(shí)序驗(yàn)證為例,采用Prime Time對讀寫接口進(jìn)行時(shí)序分析,介紹了將輸入輸出關(guān)聯(lián)的特殊約束方式,將傳統(tǒng)的單向的時(shí)序檢查變?yōu)閿?shù)據(jù)環(huán)路控制的時(shí)序檢查,有效的提高設(shè)計(jì)及驗(yàn)證效率,該種方式同樣可推廣應(yīng)用于ROM、MRAM等類似接口芯片。