北方工業(yè)大學(xué) 江雪穎
電子科技大學(xué) 楊 洺 廖永波
北方工業(yè)大學(xué) 鞠家欣 王 宇 王彥虎
軟件仿真是根據(jù)一定的算法規(guī)則進(jìn)行的,當(dāng)硬件加速器加入到這個(gè)仿真過程中后,硬件加速器必須遵循該規(guī)則才能保證整個(gè)仿真系統(tǒng)正常運(yùn)行。這就需要對(duì)軟硬件之間的同步機(jī)理進(jìn)行研究。軟硬件之間的同步過程基本遵循以下原則:仿真開始后,軟件仿真器將探測軟件側(cè)的DUT模塊的輸入端口是否有值發(fā)生變化。如果變化,則調(diào)用VPI函數(shù)[1-2],將輸入端口的值傳輸?shù)接布?cè)FPGA中的實(shí)際DUT邏輯電路的輸入寄存器緩存,并觸發(fā)DUT時(shí)鐘進(jìn)行輸出邏輯值的計(jì)算。當(dāng)FPGA側(cè)完成計(jì)算后,軟件仿真器通過OCB總線將輸出值讀從硬件側(cè)讀回來,并設(shè)置仿真器中DUT模塊的相應(yīng)輸出驅(qū)動(dòng)值,從而利用FPGA來完成相同的仿真計(jì)算任務(wù)。
軟件仿真器和硬件加速器的同步發(fā)生在DUT的輸入端口有值發(fā)生變化之時(shí)。首先討論用戶的設(shè)計(jì)完全在軟件仿真器中仿真的情況。此時(shí)軟件仿真器將根據(jù)設(shè)計(jì)的結(jié)構(gòu)和此時(shí)的輸入端口值,來計(jì)算并得到該模塊此時(shí)的輸出端口值,并且在仿真器中更新相應(yīng)的輸出端口值,以驅(qū)動(dòng)后續(xù)電路。該過程如圖1所示。DUT的端口數(shù)據(jù)計(jì)算經(jīng)過了3個(gè)過程,分別由圖中的1、2、3標(biāo)識(shí)。1過程為CPU將DUT的輸入端口值從內(nèi)存的數(shù)據(jù)結(jié)構(gòu)中讀出到CPU內(nèi)部。2過程為CPU根據(jù)DUT的邏輯結(jié)構(gòu)進(jìn)行值的計(jì)算和傳播,并得到該仿真時(shí)刻DUT的輸出端口值。3過程為CPU將輸出端口值寫回到設(shè)計(jì)在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)的相應(yīng)位置。
硬件加速平臺(tái)的引入,實(shí)際是利用硬件加速器的并行邏輯計(jì)算能力來輔助CPU來完成邏輯值的計(jì)算工作。圖2所示為硬件加速平臺(tái)中數(shù)據(jù)的傳播過程。該數(shù)據(jù)流向與圖1所示極為相似,也分為3個(gè)過程。1過程為CPU將DUT的輸出端口值從內(nèi)存相應(yīng)數(shù)據(jù)結(jié)構(gòu)中讀出,并通過OCB總線寫入到FPGA中實(shí)際DUT模塊邏輯的輸入驅(qū)動(dòng)寄存器。2過程為FPGA利用綜合得到的DUT實(shí)際邏輯電路和輸入端口值進(jìn)行值的計(jì)算和傳播,以得到當(dāng)前仿真時(shí)刻DUT的輸出端口值。3過程為CPU通過OCB總線將FPGA計(jì)算得到的DUT的輸出端口值讀出,并寫入到設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中的相應(yīng)位置。
圖1 軟件仿真器對(duì)DUT邏輯進(jìn)行計(jì)算的數(shù)據(jù)流向圖
圖2 硬件加速平臺(tái)對(duì)DUT邏輯進(jìn)行計(jì)算的數(shù)據(jù)流向圖
硬件加速平臺(tái)的主要工作是對(duì)用戶設(shè)計(jì)編譯和分析,根據(jù)用戶的配置信息將設(shè)計(jì)分拆成軟件側(cè)部分和硬件側(cè)部分。然后第三方的軟件仿真器和FPGA就可以分別讀取軟硬件側(cè)的設(shè)計(jì),進(jìn)行協(xié)同仿真。為了驗(yàn)證該平臺(tái)是否可以正確的編譯用戶的設(shè)計(jì)和進(jìn)行協(xié)同仿真,用一個(gè)帶RAM仿真模型的OpenRisc1200的最小系統(tǒng)來作為驗(yàn)證實(shí)例[3-7]。
如圖3所示,OpenRisc通過總線連接到一個(gè)雙口RAM。這個(gè)雙口RAM是一個(gè)RTL的仿真模型,通過Verilog的$readmem函數(shù)讀取要執(zhí)行的程序的機(jī)器碼。仿真開始時(shí),OpenRisc1200通過指令總線從RAM里面讀取程序指令,進(jìn)行相關(guān)計(jì)算。而計(jì)算中產(chǎn)生的臨時(shí)數(shù)據(jù)和最終結(jié)果則通過數(shù)據(jù)總線寫回到RAM仿真模型中。
本例將利用OpenRisc1200運(yùn)行一個(gè)計(jì)算PI的程序,并且將計(jì)算結(jié)果通過數(shù)據(jù)總線寫到RAM的仿真模型中。該RAM將探測到寫入的數(shù)據(jù),并且將數(shù)據(jù)通過Verilog的$display函數(shù)打印到軟件仿真器的控制臺(tái)上。
圖3 OpenRisc1200最小仿真系統(tǒng)
在配置的最后一步,編譯程序?qū)⒋蛴〕鏊械呐渲眯畔?。用戶可以在開始協(xié)同仿真之前對(duì)硬件加速平臺(tái)的配置信息做一次檢查。如果有錯(cuò)誤的配置,將可以返回進(jìn)行修改。如圖4所示。
如果檢查完畢確認(rèn)沒有問題,用戶可以點(diǎn)擊CoSim自動(dòng)開始協(xié)同仿真?;蛘唿c(diǎn)擊Finish輸出參數(shù)文件和軟硬件側(cè)代碼,而不自動(dòng)調(diào)用綜合和仿真程序。
在OpenRisc1200上運(yùn)行了一個(gè)計(jì)算PI的程序,該程序被編譯成機(jī)器碼后[8-10],在仿真0時(shí)刻,通過Verilog的$readmem函數(shù)在軟件側(cè)被RAM仿真模型讀取。仿真開時(shí)后,OpenRisc1200從RAM中讀取指令,進(jìn)行相應(yīng)的計(jì)算和數(shù)據(jù)的暫存操作。計(jì)算結(jié)束后,OpenRisc1200將計(jì)算得到的PI的每一位,通過數(shù)據(jù)總線寫入到RAM仿真模型的指定位置。RAM仿真模型將探測這些位置的總線寫操作,并通過Verilog的$display函數(shù)將寫入的值打印到軟件仿真器的控制臺(tái)上。可以通過觀測寫入到RAM這些位置的值是否正確,來驗(yàn)證硬件加速平臺(tái)的可靠性。設(shè)定計(jì)算結(jié)果精確到PI小數(shù)點(diǎn)后10位后停止仿真。仿真結(jié)果如圖5所示。
圖4 硬件加速平臺(tái)配置檢查
圖5 OpenRisc仿真模型在硬件加速平臺(tái)中的仿真結(jié)果
如圖5所示,PI的各個(gè)位全部由Open-Risc1200正確的計(jì)算出來,可以說明硬件加速平臺(tái)的編譯軟件正確的將OpenRisc1200和RAM仿真模型進(jìn)行了劃分,而軟件仿真器和FPGA的同步機(jī)制也保證了協(xié)同仿真的正確進(jìn)行,即FPGA中的OpenRisc1200對(duì)軟件仿真器中的RAM仿真模型進(jìn)行了正確的讀寫,而FPGA中的總線控制器和軟件仿真器中RAM的總線接口電路也完全同步正確。
[1]Saifhashemi,A.;Pedram,H.Verilog HDL,powered by PLI:a suitable framework for describing and modeling asynchronous circuits at all levels of abstraction.2003:330-333.
[2]VPI User Guide and Reference.Cadence Design Systems.March 2003.
[3]倪繼利,陳曦,李揮.CPU源代碼分析與芯片設(shè)計(jì)及Linux移植[M].電子工業(yè)出版社,2007年4月.
[4]Damjan L.OpenRISC 1200 IP Core Specification.OpenCores Group.2001.
[5]WISHBONE System-on-Chip Interconnection Architecture for Portable IP Cores.OpenCores Group.2002.
[6]OpenRISC 30 Architecture Manual.OpenCores Group.2006.
[7]Basic Custom OpenRISC System Hardware Tutorial.Altera Corporation.2003.
[8]Executable and Linkable Format(ELF)Specification.Tool Interface Standards.1999.
[9]Richard M.S.Using the GNU Compiler Collection.USA,GNU Press.2003.
[10]John R.L.Linkers & Loaders.USA.Morgan Kaufmann Publishers.2000.