<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用SystemC做RTL和C/C++的聯合仿真呢?

Hack電子 ? 來源:AMD開發者社區 ? 2023-12-13 10:13 ? 次閱讀

前言

FPGA開發者需要做RTL和C/C++聯合仿真的時候,一些常用的方法包括使用MicroBlaze軟核,或者使用QEMU仿真ZYNQ的PS部分。

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

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

簡介

SystemC基礎

SystemC是標準C/C++語言的延伸,即可以描述硬件,也具有C/C++的特性。這個特點讓SystemC特別適合做系統級別的設計、建模以及驗證。

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

信號,用來連接兩個或者多個模塊,提供了傳輸系統間傳輸與交流數據的通道。

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

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

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

在SystemC中實例化一個RTL的實體

在SystemC中實例化一個RTL的實體很直觀,你只需要為其RTL實體手寫一個對應的SystemC的外部模塊,之后這個模塊就可以在SystemC的環境被被其它類調用。

下面將舉例說明如果在SystemC中構建一個VHDL的實體

示例 VHDL的設計

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

對應的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對應的SystemC的模塊。

用SystemC設計BFMs

因為SytemC是通過時鐘驅動的, 在SystemC里面寫BFMs就變得很直接在SystemC中實現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中實現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;
}
}
}
}

系統設計框圖

完整的系統框圖如下所示。清楚的展示是SystemC /DUT之間的調用關系。

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

軟件需求

在教程中,需要以下設計工具

Vivado Design Suite

Modelsim/Questasim

預先編譯的Vivado IP的仿真庫

示例工程

打開Vivado,創建一個空的工程。

在Vivado里面,打開Create and Package New IP wizard,選擇Create a new AXI4 peripheral,之后create an AXI4 peripheral using the default template。

使用scgenmod指令創建SystemC的外部模塊。

重寫xil_io.c文件,其實現是通過上面介紹的SystemC完成BFMs的方法。

編譯,連接。最后運行vsim。

測試結果

以下是Questasim的仿真結果,通過打印的信息可以看到 RTL和C/C++的聯合仿真功能的運行。

#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語言
    +關注

    關注

    1

    文章

    113

    瀏覽量

    17834
  • RTL
    RTL
    +關注

    關注

    1

    文章

    382

    瀏覽量

    59187
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6886
  • Vivado
    +關注

    關注

    18

    文章

    791

    瀏覽量

    65388
  • BFM
    BFM
    +關注

    關注

    0

    文章

    3

    瀏覽量

    6642

原文標題:使用SystemC做RTL和C/C++ 的聯合仿真

文章出處:【微信號:Hack電子,微信公眾號:Hack電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    介紹一種通過SystemCRTL/C/C++聯合仿真的方法

    當FPGA開發者需要做RTL和C/C++聯合仿真的時候,一些常用的方法包括使用MicroBlaze軟核,或者使用QEMU仿真ZYNQ的PS部
    的頭像 發表于 12-13 10:11 ?491次閱讀
    介紹一種通過<b class='flag-5'>SystemC</b>做<b class='flag-5'>RTL</b>/C/<b class='flag-5'>C++</b><b class='flag-5'>聯合</b><b class='flag-5'>仿真</b>的方法

    為什么 C 語言沒有被 C++ 取代?

    C++
    電路設計
    發布于 :2022年12月28日 19:17:25

    C語言C++常見學習問題

    C++
    電路設計
    發布于 :2023年01月10日 14:07:23

    為什么 CC++ 還沒有被現在的時代淘汰? 易道云編程

    C++
    電路設計
    發布于 :2023年01月10日 15:52:37

    如何在ModelSim下用SystemC驗證?

    子,我們假如想做DVB-S2的LDPC,我們一定會先用C++(M atlab也可以)寫仿真程序,驗證算法的正確性。然后假設我們已經確定了目標ASIC的架構,打算用VerilogRTL
    發表于 03-01 11:30

    運行C/RTL協同仿真失敗

    對象。@ E [SIM-4] *** C / RTL協同仿真完成:FAIL ***命令'ap_source'返回錯誤碼你能告訴我怎么解決這個問題?謝謝,ZR以上來自于谷歌翻譯以下為原文Hello, I
    發表于 10-29 11:49

    如何去C++實現接口

    接口分為哪幾種?分別有什么作用?如何去C++實現接口?
    發表于 09-22 08:49

    C語言C++運用

    很多同學在大學都學過CC++,那么CC++就業怎么樣?薪資高嗎?小編今天就給大家詳細解讀一下。學c++ 好不好?
    發表于 11-25 10:47

    學習C++的方法以及C++的就業方向

    (語法)嵌入式技術:在硬件平臺移植操作系統嵌入式系統:軟件(嵌入式應用軟件)、操作系統(內核)、硬件C++的軟件應用到硬件中學習C++的方法課件:思維導圖教材:蘇嵌教材 + C++
    發表于 12-24 07:32

    ARM System C循環模型用戶指南

    ARM系統C周期模型直接從RTL代碼編譯而來。 SystemC模型包裝器以源代碼形式提供,以支持對任何符合SystemC 2.3.1標準的模擬器進行編譯。 您可以將這些模型直接集成到任
    發表于 08-12 07:02

    Cortex-A53 SystemC循環模型用戶指南

    本節介紹ARM Cortex?-A53系統C周期模型。 ARM系統C周期模型直接從RTL代碼編譯而來。 SystemC模型包裝器以源代碼形式提供,使您能夠為任何符合
    發表于 08-16 07:30

    Cortex-R8 SystemC循環模型用戶指南

    本節介紹ARM Cortex?-R8系統C周期模型。 ARM系統C周期模型直接從RTL代碼編譯而來。 SystemC模型包裝器以源代碼形式提供,使您能夠為任何符合
    發表于 08-16 06:47

    Cortex-R52 SystemC循環模型11.2版用戶指南

    本節介紹ARM Cortex?-R52系統C周期模型。 ARM系統C周期模型直接從RTL代碼編譯而來。 SystemC模型包裝器以源代碼形式提供,使您能夠為任何符合
    發表于 08-18 07:25

    C與VB語言聯合在proteus上仿真

    C與VB語言聯合在proteus上仿真
    發表于 10-07 06:03

    SystemC 的驗證方法和流程介紹

    SystemC 是由C++衍生而來,本質是在C++的基礎上添加了硬件擴展庫和仿真核,這使SystemC 可以在不同抽象級對復雜電子系統建模。
    發表于 07-19 11:55 ?4795次閱讀
    <b class='flag-5'>SystemC</b> 的驗證方法和流程介紹
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>