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電子 ? 來源:Hack電子 ? 2023-12-13 10:11 ? 次閱讀

前言

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

教程介紹一種通過SystemC做RTL/C/C++聯(lián)合仿真的方法,所有的BFMs(Bus Function Module)都是通過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),用來連接兩個(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)用。

下面將舉例說明如果在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"){
}
};

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

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

因?yàn)镾ytemC是通過時(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ù)

示例工程

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

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

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

測(cè)試結(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.

審核編輯:湯梓紅

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

    關(guān)注

    1624

    文章

    21538

    瀏覽量

    600454
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    3992

    瀏覽量

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

    關(guān)注

    1

    文章

    384

    瀏覽量

    59619
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2090

    瀏覽量

    73404
  • systemc
    +關(guān)注

    關(guān)注

    2

    文章

    25

    瀏覽量

    14534
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用SystemCRTLC/C++聯(lián)合仿真呢?

    當(dāng)FPGA開發(fā)者需要做RTLC/C++聯(lián)合仿真的時(shí)候,些常用的
    的頭像 發(fā)表于 12-13 10:13 ?1046次閱讀
    如何使用<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)證?

    如何在ModelSim下編譯和仿真SystemC的設(shè)計(jì)?如何在ModelSim下用SystemC驗(yàn)證?SystemC作為
    發(fā)表于 03-01 11:30

    一種數(shù)?;旌蟂oC設(shè)計(jì)協(xié)同仿真的驗(yàn)證方法

    固網(wǎng)短信電話專用SoC芯片介紹一種數(shù)?;旌蟂oC設(shè)計(jì)協(xié)同仿真的驗(yàn)證方法
    發(fā)表于 04-23 06:06

    介紹一種通過Matlab腳本寫入C代碼的方法

    本文介紹一種通過Matlab腳本寫入C代碼的方法,以實(shí)現(xiàn)通過管理表格文件就可以生成具有
    發(fā)表于 08-17 07:58

    介紹一種嵌入式系統(tǒng)仿真方法

    /計(jì)數(shù)器等功能。本文介紹一種嵌入式系統(tǒng)仿真方法,通過一種特殊設(shè)計(jì)的指令集
    發(fā)表于 11-08 06:16

    學(xué)習(xí)C++方法以及C++的就業(yè)方向

    學(xué)習(xí)方向:嵌入式+人工智能嵌入式是門技術(shù)學(xué)習(xí)目標(biāo)1.嵌入式開發(fā)概述;(面向?qū)ο笤谇度胧介_發(fā)中角色)2.嵌入式Linux C++編程;(C++概述、C++學(xué)習(xí)
    發(fā)表于 12-24 07:32

    一種數(shù)?;旌蟂oC 設(shè)計(jì)協(xié)同仿真的驗(yàn)證方法

    數(shù)?;旌闲盘?hào)仿真已經(jīng)成為SoC芯片驗(yàn)證的重要環(huán)節(jié)。文章以款固網(wǎng)短信電話專用SoC芯片為例,介紹一種使用Synopsys公司的NanoSim-VCS協(xié)同
    發(fā)表于 05-15 15:41 ?19次下載

    一種數(shù)?;旌蟂oC 設(shè)計(jì)協(xié)同仿真的驗(yàn)證方法

    數(shù)?;旌闲盘?hào)仿真已經(jīng)成為SoC芯片驗(yàn)證的重要環(huán)節(jié)。文章以款固網(wǎng)短信電話專用SoC芯片為例,介紹一種使用Synopsys公司的NanoSim-VCS協(xié)同
    發(fā)表于 05-15 15:41 ?5次下載

    C++電子教案(PPT)

    C++語(yǔ)言是一種應(yīng)用較廣的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,其除了繼承了C語(yǔ)言全部的優(yōu)點(diǎn)和功能外,還支持面向?qū)ο蟪绦蛟O(shè)計(jì)。C++現(xiàn)在已成為介紹面向?qū)ο?/div>
    發(fā)表于 08-16 17:25 ?0次下載
    <b class='flag-5'>C++</b>電子教案(PPT)

    C++C/C++程序設(shè)計(jì)教程_C/C++概述

    C++基礎(chǔ)知識(shí),簡(jiǎn)要介紹C++些簡(jiǎn)單知識(shí),概念,函數(shù)
    發(fā)表于 12-25 10:15 ?0次下載

    C++內(nèi)存泄漏分析方法

    C++一種非常流行的計(jì)算機(jī)編程語(yǔ)言,在使用的過程中容易出現(xiàn)內(nèi)存泄漏問題,而該問題往往難以識(shí)別。給出了一種對(duì)C++內(nèi)存泄漏問題進(jìn)行分析的方法
    發(fā)表于 11-23 11:19 ?5次下載
    <b class='flag-5'>C++</b>內(nèi)存泄漏分析<b class='flag-5'>方法</b>

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

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

    VISUAL C++教程之VISUAL C++的安裝和使用方法

    本文檔的主要內(nèi)容詳細(xì)介紹的是VISUAL C++教程之VISUAL C++的安裝和使用方法資料免費(fèi)下載。
    發(fā)表于 12-27 16:32 ?19次下載
    VISUAL <b class='flag-5'>C++</b>教程之VISUAL <b class='flag-5'>C++</b>的安裝和使用<b class='flag-5'>方法</b>

    Visual C++教程之C++的基礎(chǔ)知識(shí)介紹

    本文檔的主要內(nèi)容詳細(xì)介紹的是Visual C++教程之C++的基礎(chǔ)知識(shí)介紹主要內(nèi)容包括了:1 類和對(duì)象,2 類的成員及特性,3 繼承和派生類
    發(fā)表于 02-15 15:59 ?9次下載
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的基礎(chǔ)知識(shí)<b class='flag-5'>介紹</b>

    使用網(wǎng)絡(luò)實(shí)例比較FPGA RTL與HLS C/C++的區(qū)別

    HLS的FPGA開發(fā)方法是只抽象出可以在C/C++環(huán)境中輕松表達(dá)的應(yīng)用部分。通過使用Vivado(Xilinx)或Intel(Quartus)工具,HLS工具流程基本上可用于任何Bit
    發(fā)表于 08-02 09:18 ?1667次閱讀
    使用網(wǎng)絡(luò)實(shí)例比較FPGA <b class='flag-5'>RTL</b>與HLS <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>的區(qū)別