前言
當(dāng)FPGA開發(fā)者需要做RTL和C/C++聯(lián)合仿真的時候,一些常用的方法包括使用MicroBlaze軟核,或者使用QEMU仿真ZYNQ的PS部分。
此教程介紹一種通過SystemC做RTL/C/C++聯(lián)合仿真的方法,所有的BFMs(Bus Function Module)都是通過SystemC完成。
文中所涉及的所有代碼均在Vivado和Modelsim/Questasim上做了驗證。
簡介
SystemC基礎(chǔ)
SystemC是標(biāo)準(zhǔn)C/C++語言的延伸,即可以描述硬件,也具有C/C++的特性。這個特點(diǎn)讓SystemC特別適合做系統(tǒng)級別的設(shè)計、建模以及驗證。
SystemC是周期精確的,其主要的組包括
信號,用來連接兩個或者多個模塊,提供了傳輸系統(tǒng)間傳輸與交流數(shù)據(jù)的通道。
模塊,類似VHDL里面的Entity和敏感列表。
主函數(shù)(sc_main),與C/C++一致,函數(shù)的入口。
在SystemC中實例化一個RTL的實體
在SystemC中實例化一個RTL的實體很直觀,你只需要為其RTL實體手寫一個對應(yīng)的SystemC的外部模塊,之后這個模塊就可以在SystemC的環(huán)境被被其它類調(diào)用。
下面將舉例說明如果在SystemC中構(gòu)建一個VHDL的實體
示例 VHDL的設(shè)計
entitycounteris port( clk:instd_logic; reset:instd_logic; count:std_logic_vector(7downto0) ); end; architecturertlofcounteris … endrtl;
對應(yīng)的SystemC模塊
classcounter:publicsc_foreign_module{
public:
sc_inclk;
sc_inreset;
sc_out>count;
counter(sc_module_namenm):sc_foreign_module(nm,"work.counter"),
clk("clk"),
reset("reset"),
count("count"){
}
};
需要注意的是,你還可以通過ModelSim/QuestaSim提供的scgenmod工具自動生成VHDL、Verilog對應(yīng)的SystemC的模塊。
用SystemC設(shè)計BFMs
因為SytemC是通過時鐘驅(qū)動的, 在SystemC里面寫B(tài)FMs就變得很直接在SystemC中實現(xiàn)AXI4-Lite的讀操作可以如下,
u32Xil_In32(UINTPTRAddr){ u32data; if(aresetn_i.read()==SC_LOGIC_0){ awaddr.write(0); awvalid.write(SC_LOGIC_0); wdata.write(0); wvalid.write(SC_LOGIC_0); bready.write(SC_LOGIC_1); araddr.write(0); arvalid.write(SC_LOGIC_0); rready.write(SC_LOGIC_1); } else{ sc_core::wait(aclk_i.posedge_event()); araddr.write(addr); arvalid.write(SC_LOGIC_1); uint32_tnum_clocks=0; while(arready.read()!=SC_LOGIC_1){ sc_core::wait(aclk_i.posedge_event()); num_clocks++; if(num_clocks==m_timeout_clks){ arvalid.write(SC_LOGIC_0); return-1; } } arvalid.write(SC_LOGIC_0); num_clocks=0; while(rvalid.read()!=SC_LOGIC_1){ sc_core::wait(aclk_i.posedge_event()); num_clocks++; if(num_clocks==m_timeout_clks){ return-1; } } data=rdata.read().to_uint(); } returndata; }
在SystemC中實現(xiàn)AXI4-Lite的寫操作可以如下
voidXil_Out32(UINTPTRAddr,u32Value){
if(aresetn_i.read()==SC_LOGIC_0){
awaddr.write(0);
awvalid.write(SC_LOGIC_0);
wdata.write(0);
wvalid.write(SC_LOGIC_0);
bready.write(SC_LOGIC_1);
araddr.write(0);
arvalid.write(SC_LOGIC_0);
rready.write(SC_LOGIC_1);
}
else{
sc_core::wait(aclk_i.posedge_event());
awaddr.write(Addr);
awvalid.write(SC_LOGIC_1);
wdata.write(Value);
wvalid.write(SC_LOGIC_1);
uint32_tnum_clocks=0;
boolm_awready=false;
boolm_wready=false;
while((!m_awready)||(!m_wready)){
sc_core::wait(aclk_i.posedge_event());
if(awready.read()==SC_LOGIC_1){
m_awready.write(true);
awvalid.write(SC_LOGIC_0);
}
if(wready.read()==SC_LOGIC_1){
m_wready.write(true);
wvalid.write(SC_LOGIC_0);
}
num_clocks++;
if(num_clocks==m_timeout_clks){
awvalid.write(SC_LOGIC_0);
wvalid.write(SC_LOGIC_0);
return;
}
}
num_clocks=0;
while(bvalid.read()!=SC_LOGIC_1){
sc_core::wait(aclk_i.posedge_event());
num_clocks++;
if(num_clocks==m_timeout_clks){
return;
}
}
}
}
系統(tǒng)設(shè)計框圖
完整的系統(tǒng)框圖如下所示。清楚的展示是SystemC /DUT之間的調(diào)用關(guān)系。

軟件需求
在教程中,需要以下設(shè)計工具
Vivado Design Suite
Modelsim/Questasim
預(yù)先編譯的Vivado IP的仿真庫
示例工程
打開Vivado,創(chuàng)建一個空的工程。
在Vivado里面,打開Create and Package New IP wizard,選擇Create a new AXI4 peripheral,之后create an AXI4 peripheral using the default template。
使用scgenmod指令創(chuàng)建SystemC的外部模塊。
重寫xil_io.c文件,其實現(xiàn)是通過上面介紹的SystemC完成BFMs的方法。
編譯,連接。最后運(yùn)行vsim。
測試結(jié)果
以下是Questasim的仿真結(jié)果,通過打印的信息可以看到 RTL和C/C++的聯(lián)合仿真功能的運(yùn)行。
#vsim-t1psxil_defaultlib.Envxil_defaultlib.glbl-onfinishstop-Lxpm-Lunisims_ver-Lsecureip-Lunimacro_ver-Lxil_defaultlib-lsimlog.txt-assertdebug #****************************** #*UserPeripheralSelfTest #****************************** #Userlogicslavemoduletest... # #-slaveregisterwrite/readpassed # #**Note:(vsim-6574)SystemCsimulationstoppedbyuser.
審核編輯:劉清
-
VHDL語言
+關(guān)注
關(guān)注
1文章
113瀏覽量
19402 -
RTL
+關(guān)注
關(guān)注
1文章
394瀏覽量
62658 -
C++語言
+關(guān)注
關(guān)注
0文章
147瀏覽量
7686 -
Vivado
+關(guān)注
關(guān)注
19文章
857瀏覽量
71115 -
BFM
+關(guān)注
關(guān)注
0文章
3瀏覽量
6884
原文標(biāo)題:使用SystemC做RTL和C/C++ 的聯(lián)合仿真
文章出處:【微信號:Hack電子,微信公眾號:Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
適用于SystemC/C++驗證的形式化解決方案
SystemC的隨機(jī)驗證過程是怎樣的?
介紹一種通過SystemC做RTL/C/C++聯(lián)合仿真的方法
vcs和vivado聯(lián)合仿真
如何在ModelSim下用SystemC的做驗證?
基于Borland C++ Builder的Vega仿真程序
用Visual C++做數(shù)據(jù)庫開發(fā)
RTL8139C RTL8139C-LF RTL8139CL RTL8139CL-LF
SystemC 的驗證方法和流程介紹
如何從C轉(zhuǎn)向C++ Effective C++ PDF中文版教材免費(fèi)下載
IAR中使用C++做開發(fā)語言,更加簡單高效
淺談C語言與C++的前世今生
C++之父新作帶你勾勒現(xiàn)代C++地圖
SystemC中的數(shù)據(jù)類型概念
如何使用SystemC做RTL和C/C++的聯(lián)合仿真呢?
評論