一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用SystemC做RTL和C/C++的聯(lián)合仿真呢?

Hack電子 ? 來(lái)源:AMD開(kāi)發(fā)者社區(qū) ? 2023-12-13 10:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

當(dāng)FPGA開(kāi)發(fā)者需要做RTL和C/C++聯(lián)合仿真的時(shí)候,一些常用的方法包括使用MicroBlaze軟核,或者使用QEMU仿真ZYNQ的PS部分。

教程介紹一種通過(guò)SystemC做RTL/C/C++聯(lián)合仿真的方法,所有的BFMs(Bus Function Module)都是通過(guò)SystemC完成。

文中所涉及的所有代碼均在Vivado和Modelsim/Questasim上做了驗(yàn)證。

簡(jiǎn)介

SystemC基礎(chǔ)

SystemC是標(biāo)準(zhǔn)C/C++語(yǔ)言的延伸,即可以描述硬件,也具有C/C++的特性。這個(gè)特點(diǎn)讓SystemC特別適合做系統(tǒng)級(jí)別的設(shè)計(jì)、建模以及驗(yàn)證。

SystemC是周期精確的,其主要的組包括

信號(hào),用來(lái)連接兩個(gè)或者多個(gè)模塊,提供了傳輸系統(tǒng)間傳輸與交流數(shù)據(jù)的通道。

端口,模塊的輸入、輸出接口。

模塊,類似VHDL里面的Entity和敏感列表。

主函數(shù)(sc_main),與C/C++一致,函數(shù)的入口。

在SystemC中實(shí)例化一個(gè)RTL的實(shí)體

在SystemC中實(shí)例化一個(gè)RTL的實(shí)體很直觀,你只需要為其RTL實(shí)體手寫一個(gè)對(duì)應(yīng)的SystemC的外部模塊,之后這個(gè)模塊就可以在SystemC的環(huán)境被被其它類調(diào)用。

下面將舉例說(shuō)明如果在SystemC中構(gòu)建一個(gè)VHDL的實(shí)體

示例 VHDL的設(shè)計(jì)

entitycounteris
port(
clk:instd_logic;
reset:instd_logic;
count:std_logic_vector(7downto0)
);
end;
architecturertlofcounteris
…
endrtl;

對(duì)應(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"){
}
};

需要注意的是,你還可以通過(guò)ModelSim/QuestaSim提供的scgenmod工具自動(dòng)生成VHDL、Verilog對(duì)應(yīng)的SystemC的模塊。

用SystemC設(shè)計(jì)BFMs

因?yàn)镾ytemC是通過(guò)時(shí)鐘驅(qū)動(dòng)的, 在SystemC里面寫B(tài)FMs就變得很直接在SystemC中實(shí)現(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中實(shí)現(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è)計(jì)框圖

完整的系統(tǒng)框圖如下所示。清楚的展示是SystemC /DUT之間的調(diào)用關(guān)系。

674e08e8-995c-11ee-8b88-92fbcf53809c.png

軟件需求

在教程中,需要以下設(shè)計(jì)工具

Vivado Design Suite

Modelsim/Questasim

預(yù)先編譯的Vivado IP的仿真庫(kù)

示例工程

打開(kāi)Vivado,創(chuàng)建一個(gè)空的工程。

在Vivado里面,打開(kāi)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文件,其實(shí)現(xiàn)是通過(guò)上面介紹的SystemC完成BFMs的方法。

編譯,連接。最后運(yùn)行vsim。

測(cè)試結(jié)果

以下是Questasim的仿真結(jié)果,通過(guò)打印的信息可以看到 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.






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • VHDL語(yǔ)言
    +關(guān)注

    關(guān)注

    1

    文章

    113

    瀏覽量

    18695
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    389

    瀏覽量

    61126
  • C++語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7300
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    835

    瀏覽量

    68784
  • BFM
    BFM
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    6778

原文標(biāo)題:使用SystemC做RTL和C/C++ 的聯(lián)合仿真

文章出處:【微信號(hào):Hack電子,微信公眾號(hào):Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    適用于SystemC/C++驗(yàn)證的形式化解決方案

    雖然 SystemC/C++ 編程風(fēng)格已使用多年,但最近出現(xiàn)了一些特定使用模式,它們推動(dòng)工程團(tuán)隊(duì)采用共同的設(shè)計(jì)流程。這包括抽象算法設(shè)計(jì)代碼用作高層次綜合 (HLS) 工具的輸入,虛擬平臺(tái)模型用于早期軟件測(cè)試,可配置的知識(shí)產(chǎn)權(quán) (IP) 模塊,等等。
    的頭像 發(fā)表于 06-24 11:07 ?528次閱讀
    適用于<b class='flag-5'>SystemC</b>/<b class='flag-5'>C++</b>驗(yàn)證的形式化解決方案

    C語(yǔ)言與C++的區(qū)別

    在很大程度上,C++C的超集,這意味著一個(gè)有效的C程序也是一個(gè)有效的C++程序。
    發(fā)表于 09-16 10:20 ?1315次閱讀

    SystemC的隨機(jī)驗(yàn)證過(guò)程是怎樣的?

    SystemC是基于C++的系統(tǒng)級(jí)設(shè)計(jì)語(yǔ)言,兼具描述硬件電路模型和面向?qū)ο蟮某橄竽芰Α?/div>
    的頭像 發(fā)表于 08-07 09:43 ?1530次閱讀
    <b class='flag-5'>SystemC</b>的隨機(jī)驗(yàn)證過(guò)程是怎樣的?

    介紹一種通過(guò)SystemCRTL/C/C++聯(lián)合仿真的方法

    當(dāng)FPGA開(kāi)發(fā)者需要做RTLC/C++聯(lián)合仿真的時(shí)候,一些常用的方法包括使用MicroBlaze軟核,或者使用QEMU
    的頭像 發(fā)表于 12-13 10:11 ?3036次閱讀
    介紹一種通過(guò)<b class='flag-5'>SystemC</b><b class='flag-5'>做</b><b class='flag-5'>RTL</b>/<b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>聯(lián)合</b><b class='flag-5'>仿真</b>的方法

    如何在ModelSim下用SystemC驗(yàn)證?

    子,我們假如想做DVB-S2的LDPC,我們一定會(huì)先用C++(M atlab也可以)寫仿真程序,驗(yàn)證算法的正確性。然后假設(shè)我們已經(jīng)確定了目標(biāo)ASIC的架構(gòu),打算用VerilogRTL
    發(fā)表于 03-01 11:30

    基于Borland C++ Builder的Vega仿真程序

    通過(guò)充分發(fā)揮仿真領(lǐng)域的熱門軟件Vega 在視景仿真方面和Borland C++ Builder編程語(yǔ)言在界面設(shè)計(jì)與程序控制方面的優(yōu)勢(shì),本文以坦克紅外跟蹤仿真場(chǎng)景為例設(shè)計(jì)實(shí)現(xiàn)了在Borl
    發(fā)表于 01-18 13:38 ?21次下載

    用Visual C++數(shù)據(jù)庫(kù)開(kāi)發(fā)

    實(shí)驗(yàn) 用Visual C++數(shù)據(jù)庫(kù)開(kāi)發(fā) 一、實(shí)驗(yàn)?zāi)康?、了解數(shù)據(jù)庫(kù)的訪問(wèn)方式,掌握ADO 方式訪問(wèn)數(shù)據(jù)庫(kù)2、用 Visual C++制作簡(jiǎn)單的數(shù)據(jù)
    發(fā)表于 05-10 10:54 ?2551次閱讀

    RTL8139C RTL8139C-LF RTL8139CL RTL8139CL-LF

    RTL8139C RTL8139C-LF RTL8139CL RTL8139CL-LF
    發(fā)表于 10-25 14:48 ?23次下載
    <b class='flag-5'>RTL8139C</b> <b class='flag-5'>RTL8139C</b>-LF <b class='flag-5'>RTL</b>8139CL <b class='flag-5'>RTL</b>8139CL-LF

    SystemC 的驗(yàn)證方法和流程介紹

    SystemC 是由C++衍生而來(lái),本質(zhì)是在C++的基礎(chǔ)上添加了硬件擴(kuò)展庫(kù)和仿真核,這使SystemC 可以在不同抽象級(jí)對(duì)復(fù)雜電子系統(tǒng)建模。
    發(fā)表于 07-19 11:55 ?5405次閱讀
    <b class='flag-5'>SystemC</b> 的驗(yàn)證方法和流程介紹

    如何從C轉(zhuǎn)向C++ Effective C++ PDF中文版教材免費(fèi)下載

    對(duì)每個(gè)人來(lái)說(shuō),習(xí)慣 C++需要一些時(shí)間,對(duì)于已經(jīng)熟悉C 的程序員來(lái)說(shuō),這個(gè)過(guò)程尤其令人苦惱。因?yàn)?b class='flag-5'>C 是C++的子集,所有的C 的技術(shù)都可以繼
    發(fā)表于 01-10 16:48 ?0次下載

    基于C++的雷達(dá)仿真系統(tǒng)組件化建模

    基于C++的雷達(dá)仿真系統(tǒng)組件化建模
    發(fā)表于 06-30 16:22 ?25次下載

    IAR中使用C++開(kāi)發(fā)語(yǔ)言,更加簡(jiǎn)單高效

    本文簡(jiǎn)要介紹了如何在IAR中配置C++開(kāi)發(fā)環(huán)境,由于C++的封裝支持,引入面向?qū)ο蟮拈_(kāi)發(fā)思路可以使得用C++進(jìn)行單片機(jī)獲得更高的開(kāi)發(fā)效率
    發(fā)表于 12-03 11:36 ?4次下載
    IAR中使用<b class='flag-5'>C++</b><b class='flag-5'>做</b>開(kāi)發(fā)語(yǔ)言,更加簡(jiǎn)單高效

    淺談C語(yǔ)言與C++的前世今生

    C++開(kāi)發(fā)人員將有這些問(wèn)題歸咎于C,而C開(kāi)發(fā)人員則認(rèn)為C++過(guò)于瘋狂。我覺(jué)得站在C的角度看C++
    發(fā)表于 05-26 09:27 ?686次閱讀
    淺談<b class='flag-5'>C</b>語(yǔ)言與<b class='flag-5'>C++</b>的前世今生

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點(diǎn)問(wèn)題,讓大家領(lǐng)略現(xiàn)代C++之美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《C++之旅》!
    的頭像 發(fā)表于 10-30 16:35 ?1296次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖

    SystemC中的數(shù)據(jù)類型概念

    引起一個(gè)事件,要使用通知函數(shù)notify( ),語(yǔ)法如下: event_name. notify (參數(shù)); 或 notify (參數(shù),event_name); SystemC中的數(shù)據(jù)類型 作為C++
    的頭像 發(fā)表于 11-02 15:44 ?1439次閱讀
    <b class='flag-5'>SystemC</b>中的數(shù)據(jù)類型概念