圖4 FPGA內(nèi)帶有時(shí)鐘使能的寄存器
充分利用FPGA中已有的IP核
FPGA廠商及第三方廠商已經(jīng)實(shí)現(xiàn)并優(yōu)化了很多典型的IP核,例如Xilinx提供了基礎(chǔ)邏輯、總線接口與I/O、視頻與圖像處理、數(shù)字信號(hào)處理、存儲(chǔ)器接口、微處理器、控制器等大量IP核。在代碼轉(zhuǎn)換時(shí)可以充分利用這些資源,對(duì)代碼進(jìn)行優(yōu)化來提高設(shè)計(jì)性能。如在FPGA中使用SRL實(shí)現(xiàn)移位寄存器,用三態(tài)Buffer來替換三態(tài)總線和三態(tài)MUX,改進(jìn)算術(shù)單元和有限狀態(tài)機(jī)的編碼。
代碼轉(zhuǎn)換的實(shí)現(xiàn)。
結(jié)合同濟(jì)大學(xué)微電子中心的“32位高性能嵌入式CPU開發(fā)”項(xiàng)目,為了在流片之前確保功能的可靠性,對(duì)32位全定制高性能嵌入式CPU bc320進(jìn)行了原型驗(yàn)證。
設(shè)計(jì)采用Memec Design公司的FF1152開發(fā)板。該板使用了Xilinx的Virtex-Ⅱ Pro系列芯片中的XC2VP30。該FPGA擁有30 816個(gè)邏輯單元,相當(dāng)于有30多萬的ASCI門。另有2Mb的片上Block RAM,644個(gè)I/O口。采用了Xilinx的全自動(dòng)、完整的集成設(shè)計(jì)環(huán)境ISE 7.1i,進(jìn)行FPGA綜合使用的工具是Synplify Pro。
用bc320的ASIC RTL代碼作為FPGA的輸入,具體的代碼轉(zhuǎn)換如下。
存儲(chǔ)單元
設(shè)計(jì)中用到了很多SRAM,例如Icache中的SRAM。在FPGA實(shí)現(xiàn)時(shí)根據(jù)所需RAM的寬度、深度和功能來決定采用哪種單元來進(jìn)行替換。Xilinx提供了片外RAM、Block RAM和LUT RAM。
ISE提供了兩種具體的實(shí)現(xiàn)方法:IP生成器(Core Generator)和語言模板(Language Templates)。IP生成器是Xilinx FPGA設(shè)計(jì)中的一個(gè)重要設(shè)計(jì)輸入工具,它提供了大量Xilinx和第三方公司設(shè)計(jì)的成熟高效IP核。
這里是用Core Generator來產(chǎn)生了名為塊存儲(chǔ)器(Block Memory)的單口存儲(chǔ)器模塊。Core Generator用圖形化設(shè)置參數(shù)的方式來提供塊存儲(chǔ)器,其界面如圖5所示。塊存儲(chǔ)器的大小根據(jù)向量的大小來制定,一個(gè)普通單元向量只需要4個(gè)512×32bit的塊存儲(chǔ)器就夠了。Core Generator產(chǎn)生塊存儲(chǔ)器時(shí),除了參數(shù)設(shè)置外,還需要輸入一個(gè)為.coe的文件來初始化塊存儲(chǔ)器的內(nèi)容。Core Generator產(chǎn)生的文件同時(shí)考慮了后端執(zhí)行和仿真兩方面,主要有三個(gè)文件:file.v,file.mif,file.edn。其中.v文件為Verilog格式的SRAM仿真模型; .mif文件為作為其初始化內(nèi)容,其內(nèi)容和.coe文件里的具體向量內(nèi)容是一致的;而實(shí)際后端文件為.edn,包含了塊存儲(chǔ)器的全部信息。

圖5 IP生成器的界面
Language Templates主要利用Xilinx的塊存儲(chǔ)器元件庫,直接進(jìn)行調(diào)用。XC2VP30內(nèi)部的單口塊存儲(chǔ)器型號(hào)主要有:16k×1bit、1k×16bit、2k×8bit、4k×4bit、512×32bit、8k×2bit。可以根據(jù)自己的需要隨意調(diào)用這些模塊,在RTL代碼中實(shí)例化,并把SRAM初始值作為參數(shù)傳遞進(jìn)去。這些模塊在Synplify Pro中根據(jù)選定的FPGA型號(hào)被自動(dòng)識(shí)別,然后綜合成統(tǒng)一的.edn文件,再進(jìn)行后續(xù)操作。語言模板方式的靈活性比較強(qiáng),可以設(shè)置多個(gè)不同位寬,不同深度的塊存儲(chǔ)器,仿真也比較方便,但是參數(shù)設(shè)定時(shí),SRAM初始值的設(shè)置比較麻煩。
另外,Xilinx提供工具Data2mem,它可以每次只改變FPGA中塊存儲(chǔ)器的內(nèi)容,而不需將整個(gè)設(shè)計(jì)重新翻譯、映射和布局布線,為大量的向量驗(yàn)證節(jié)約了時(shí)間。
時(shí)鐘單元
在bc320設(shè)計(jì)中,CPU內(nèi)核通過SYSAD接口與外部SRAM連接。這些外部SRAM的時(shí)鐘和主時(shí)鐘是不一致的,在ASIC中,用一個(gè)PLL來實(shí)現(xiàn)。這個(gè)PLL模塊是無法用Synplify Pro綜合的,在FPGA上必須將它用Xilinx的數(shù)字時(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);
時(shí)鐘使能帶代替門控時(shí)鐘
把實(shí)現(xiàn)門控時(shí)鐘信號(hào)轉(zhuǎn)換成實(shí)現(xiàn)使能信號(hào),例如信號(hào)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ā)板上集成了很多接口和器件,在原型驗(yàn)證時(shí),可以充分利用這些接口和器件做為和設(shè)計(jì)的交互環(huán)境。這些接口和器件需要正確配置后才能正常工作,這部分配置工作可以用FPGA實(shí)現(xiàn)。
設(shè)計(jì)增加了LCD接口單元、內(nèi)部記分牌(scoreboard)模塊和通用異步串行接收發(fā)送(UART)模塊。作為保存向量內(nèi)容的SRAM設(shè)定好后,可以用同樣的方法將寄存器參考值也保存在另外的塊存儲(chǔ)器中。然后運(yùn)行CPU,將CPU實(shí)際產(chǎn)生的寄存器值和已保存過的參考值在記分牌模塊中進(jìn)行實(shí)時(shí)比較,然后將結(jié)果輸出到LCD顯示屏上。
為了便于代碼的管理和維護(hù),可以對(duì)原RTL代碼進(jìn)行一定的封裝。將原ASIC流程的代碼單獨(dú)封裝在一個(gè)模塊中,再和FPGA實(shí)現(xiàn)時(shí)添加的片外配置控制單元的代碼一起形成新的FPGA實(shí)現(xiàn)頂層。所以在ASIC代碼的基礎(chǔ)上增加了對(duì)這幾個(gè)器件完成配置工作的代碼部分。
為了原型系統(tǒng)獲得更高的性能,還可以對(duì)其他一些模塊的代碼進(jìn)行適當(dāng)?shù)母倪M(jìn),如算術(shù)單元和狀態(tài)機(jī)的編碼風(fēng)格等。但對(duì)于全定制的cpu bc320,沒有必要修改算術(shù)單元模塊的代碼,關(guān)鍵是存儲(chǔ)模塊和時(shí)鐘單元。因此要根據(jù)自己的設(shè)計(jì)適當(dāng)選擇要修改的代碼。





