在對asic設(shè)計進行fpga原型驗證時,由于物理結(jié)構(gòu)不同,asic的代碼必須進行一定的轉(zhuǎn)換后才能作為fpga的輸入?,F(xiàn)代集成電路設(shè)計中,芯片的規(guī)模和復雜度正呈指數(shù)增加。尤其在asic設(shè)計流程中,驗證和調(diào)試所花的時間約占總工期的70%。為了縮短驗證周期,在傳統(tǒng)的仿真驗證的基礎(chǔ)上,涌現(xiàn)了許多新的驗證手段,如斷言驗證、覆蓋率驅(qū)動的驗證,以及廣泛應(yīng)用的基于現(xiàn)場可編程器件(fpga)的原型驗證技術(shù)。 采用fpga原型技術(shù)驗證asic設(shè)計,首先需要把asic設(shè)計轉(zhuǎn)化為fpga設(shè)計。但asic是基于標準單元庫,fpga則是基于查找表,asic和fpga物理結(jié)構(gòu)上的不同,決定了asic代碼需要一定的修改才能移植到fpga上。但應(yīng)該注意到這只是由于物理結(jié)構(gòu)不同而對代碼進行的轉(zhuǎn)換,并不改變其功能,因此對代碼的這種修改只能限制在一定范圍內(nèi)。 基本原理 代碼轉(zhuǎn)換的實現(xiàn) 結(jié)合同濟大學微電子中心的“32位高性能嵌入式cpu開發(fā)”項目,為了在流片之前確保功能的可靠性,對32位全定制高性能嵌入式cpu bc320進行了原型驗證。 設(shè)計采用memec design公司的ff1152開發(fā)板。該板使用了xilinx的virtex-ⅱ pro系列芯片中的xc2vp30。該fpga擁有30 816個邏輯單元,相當于有30多萬的asci門。另有2mb的片上block ram,644個i/o口。采用了xilinx的全自動、完整的集成設(shè)計環(huán)境ise 7.1i,進行fpga綜合使用的工具是synplify pro。 用bc320的asic rtl代碼作為fpga的輸入,具體的代碼轉(zhuǎn)換如下。
由于fpga的可編程特性,基于fpga的原型技術(shù)已經(jīng)被廣泛采用。和仿真軟件相比,fpga的硬件特性可以讓設(shè)計運行在較高的頻率上,加速仿真。另一方面,可以在asic芯片設(shè)計前期并行設(shè)計外圍電路及應(yīng)用軟件,縮短了芯片驗證周期。
fpga原型驗證和其他驗證方法是不同的,任何一種其他驗證方法都是asic驗證中的一個環(huán)節(jié),而fpga驗證卻是一個過程。由于fpga與asic在結(jié)構(gòu)、性能上各不相同,asic是基于標準單元庫,fpga用的是廠商提供的宏單元模塊,因此首先要進行寄存器傳輸級(rtl)代碼的修改。然后進行fpga器件映射,映射工具根據(jù)設(shè)置的約束條件對rtl代碼進行邏輯優(yōu)化,并針對選定的fpga器件的基本單元映射生成網(wǎng)表。接著進行布局布線,生成配置文件和時序報告等信息。當時序能滿足約束條件時,就可以利用配置文件進行下載。如果時序不能滿足約束,可通過軟件報告時序文件來確認關(guān)鍵路徑,進行時序優(yōu)化??梢酝ㄟ^修改約束條件,或者修改rtl代碼來滿足要求。
需要轉(zhuǎn)換的代碼
存儲單元
存儲單元是必須進行代碼轉(zhuǎn)換的,asic中的存儲單元通常用代工廠所提供的memory compiler來定制,它可以生成.gsp、.v等文件。.v文件只用來做功能仿真,通常不能綜合。而最后流片時,只需將標準提供給代工廠。如果直接將asic代碼中的存儲單元作為fpga的輸入,通常綜合器是綜合不出來的,即使能綜合出來,也要花費很長時間,并且資源消耗多、性能不好。而fpga廠商其實已經(jīng)提供了經(jīng)過驗證并優(yōu)化的存儲單元。因此存儲單元要進行代碼轉(zhuǎn)換。
時鐘單元
數(shù)字電路中,時鐘是整個電路最重要、最特殊的信號。在asic中,用布局布線工具來放置時鐘樹,利用代工廠提供的pll進行時鐘設(shè)計。fpga中通常已經(jīng)配置一定數(shù)量的pll宏單元,并有針對時鐘優(yōu)化的全局時鐘網(wǎng)絡(luò),一般是經(jīng)過fpga的特定全局時鐘管腳進入fpga內(nèi)部,后經(jīng)過全局時鐘buf適配到全局時鐘網(wǎng)絡(luò)的,這樣的時鐘網(wǎng)絡(luò)可以保證相同的時鐘沿到達芯片內(nèi)部每一個觸發(fā)器的延遲時間差異是可以忽略不計的。因此時鐘單元也是需要進行轉(zhuǎn)換的。
增加流水
由于實現(xiàn)結(jié)構(gòu)上的不同,fpga器件內(nèi)部的單元延時遠大于asic的基本門單元延時。導致在同樣設(shè)計的情況下,asic可以滿足其時序,而fpga有可能無法滿足。為了驗證的需要,修改asic代碼實現(xiàn)fpga原型時,對asic實現(xiàn)的流水結(jié)構(gòu)在fpga實現(xiàn)時需要適當增加流水。比如在一個很長的組合邏輯路徑中加入寄存器。如圖1所示。
圖1 增加流水
同步設(shè)計
在fpga設(shè)計中,同步設(shè)計是應(yīng)該遵循的重要原則。異步設(shè)計容易導致電路處于亞穩(wěn)態(tài),產(chǎn)生毛刺。當從asic設(shè)計轉(zhuǎn)向fpga設(shè)計時,應(yīng)該進行仔細的同步。具體體現(xiàn)在主時鐘選取、功能模塊的統(tǒng)一復位、同步時序電路設(shè)計。
在fpga設(shè)計中要使用時鐘使能代替門控時鐘。在asic的設(shè)計中,為了減少功耗,使用門控時鐘(clock gating),門控時鐘的結(jié)構(gòu)如圖2所示。當寫有效時,數(shù)據(jù)才寫進存儲器,那么只有寫有效時,寄存器才會發(fā)生翻轉(zhuǎn),這樣可以減少功耗。
圖2 門控時鐘示意圖
由于設(shè)計的異步特性,對于fpga來說,使用這種門控時鐘容易產(chǎn)生毛刺,導致數(shù)據(jù)不正確。所以在fpga設(shè)計中,使用有使能信號的電路來替換門控時鐘電路??梢栽诩拇嫫髑懊婕由蟤ux來實現(xiàn)時鐘使能信號,如圖3所示?,F(xiàn)在的fpga廠商則提供可以直接有使能,同步set和reset引腳的寄存器,如圖4所示。
圖3 用mux生成時鐘使能信號
圖4 fpga內(nèi)帶有時鐘使能的寄存器
充分利用fpga中已有的ip核
fpga廠商及第三方廠商已經(jīng)實現(xiàn)并優(yōu)化了很多典型的ip核,例如xilinx提供了基礎(chǔ)邏輯、總線接口與i/o、視頻與圖像處理、數(shù)字信號處理、存儲器接口、微處理器、控制器等大量ip核。在代碼轉(zhuǎn)換時可以充分利用這些資源,對代碼進行優(yōu)化來提高設(shè)計性能。如在fpga中使用srl實現(xiàn)移位寄存器,用三態(tài)buffer來替換三態(tài)總線和三態(tài)mux,改進算術(shù)單元和有限狀態(tài)機的編碼。
設(shè)計中用到了很多sram,例如icache中的sram。在fpga實現(xiàn)時根據(jù)所需ram的寬度、深度和功能來決定采用哪種單元來進行替換。xilinx提供了片外ram、block ram和lut ram。
ise提供了兩種具體的實現(xiàn)方法:ip生成器(core generator)和語言模板(language templates)。ip生成器是xilinx fpga設(shè)計中的一個重要設(shè)計輸入工具,它提供了大量xilinx和第三方公司設(shè)計的成熟高效ip核。
這里是用core generator來產(chǎn)生了名為塊存儲器(block memory)的單口存儲器模塊。core generator用圖形化設(shè)置參數(shù)的方式來提供塊存儲器,其界面如圖5所示。塊存儲器的大小根據(jù)向量的大小來制定,一個普通單元向量只需要4個512×32bit的塊存儲器就夠了。core generator產(chǎn)生塊存儲器時,除了參數(shù)設(shè)置外,還需要輸入一個為.coe的文件來初始化塊存儲器的內(nèi)容。core generator產(chǎn)生的文件同時考慮了后端執(zhí)行和仿真兩方面,主要有三個文件:file.v,file.mif,file.edn。其中.v文件為verilog格式的sram仿真模型; .mif文件為作為其初始化內(nèi)容,其內(nèi)容和.coe文件里的具體向量內(nèi)容是一致的;而實際后端文件為.edn,包含了塊存儲器的全部信息。
圖5 ip生成器的界面
language templates主要利用xilinx的塊存儲器元件庫,直接進行調(diào)用。xc2vp30內(nèi)部的單口塊存儲器型號主要有:16k×1bit、1k×16bit、2k×8bit、4k×4bit、512×32bit、8k×2bit??梢愿鶕?jù)自己的需要隨意調(diào)用這些模塊,在rtl代碼中實例化,并把sram初始值作為參數(shù)傳遞進去。這些模塊在synplify pro中根據(jù)選定的fpga型號被自動識別,然后綜合成統(tǒng)一的.edn文件,再進行后續(xù)操作。語言模板方式的靈活性比較強,可以設(shè)置多個不同位寬,不同深度的塊存儲器,仿真也比較方便,但是參數(shù)設(shè)定時,sram初始值的設(shè)置比較麻煩。
另外,xilinx提供工具data-mem,它可以每次只改變fpga中塊存儲器的內(nèi)容,而不需將整個設(shè)計重新翻譯、映射和布局布線,為大量的向量驗證節(jié)約了時間。
時鐘單元
在bc320設(shè)計中,cpu內(nèi)核通過sysad接口與外部sram連接。這些外部sram的時鐘和主時鐘是不一致的,在asic中,用一個pll來實現(xiàn)。這個pll模塊是無法用synplify pro綜合的,在fpga上必須將它用xilinx的數(shù)字時鐘管理模塊(dcm)來替換。同樣可以利用core generator和language templates這兩種方法。
利用core generator產(chǎn)生mydcm.v文件來代替原先的pllgs_500.v,代碼如下。第二段代碼是修改后的代碼。
module pllgs_500( pll_k,
pll_m,
pll_n,
pll_pd,
pll_tst,
reset,
xin,
clk_out,
tst_out);
module mydcm(clkin_in,
rst_in,
clkfx_out,
clkin_ibufg_out,
locked_out);
時鐘使能帶代替門控時鐘
把實現(xiàn)門控時鐘信號轉(zhuǎn)換成實現(xiàn)使能信號,例如信號pcepl,代碼如下。第二段代碼是修改后的代碼。
module(out,in,clk, pcepl);
……
always @ (clk or pcepl)
assign pceplv = pcepl & clk;
always @(posedge pceplv)
begin
out <= in;
end
endmodule
module(out,in,clk, pcepl);
……
always @(posedge clk)
begin
if (pcepl)
out <= in;
else
out <= out;
end
endmodule
外部器件配置單元和頂層封裝
在ff1152開發(fā)板上集成了很多接口和器件,在原型驗證時,可以充分利用這些接口和器件做為和設(shè)計的交互環(huán)境。這些接口和器件需要正確配置后才能正常工作,這部分配置工作可以用fpga實現(xiàn)。
設(shè)計增加了lcd接口單元、內(nèi)部記分牌(scoreboard)模塊和通用異步串行接收發(fā)送(uart)模塊。作為保存向量內(nèi)容的sram設(shè)定好后,可以用同樣的方法將寄存器參考值也保存在另外的塊存儲器中。然后運行cpu,將cpu實際產(chǎn)生的寄存器值和已保存過的參考值在記分牌模塊中進行實時比較,然后將結(jié)果輸出到lcd顯示屏上。
為了便于代碼的管理和維護,可以對原rtl代碼進行一定的封裝。將原asic流程的代碼單獨封裝在一個模塊中,再和fpga實現(xiàn)時添加的片外配置控制單元的代碼一起形成新的fpga實現(xiàn)頂層。
所以在asic代碼的基礎(chǔ)上增加了對這幾個器件完成配置工作的代碼部分。
為了原型系統(tǒng)獲得更高的性能,還可以對其他一些模塊的代碼進行適當?shù)母倪M,如算術(shù)單元和狀態(tài)機的編碼風格等。但對于全定制的cpu bc320,沒有必要修改算術(shù)單元模塊的代碼,關(guān)鍵是存儲模塊和時鐘單元。因此要根據(jù)自己的設(shè)計適當選擇要修改的代碼。
來源:零八我的愛0次