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

    浏览量

    19294
  • RTL
    RTL
    +关注

    关注

    1

    文章

    393

    浏览量

    62400
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    7586
  • Vivado
    +关注

    关注

    19

    文章

    846

    浏览量

    70477
  • BFM
    BFM
    +关注

    关注

    0

    文章

    3

    浏览量

    6852

原文标题:使用SystemC做RTL和C/C++ 的联合仿真

文章出处:【微信号:Hack电子,微信公众号:Hack电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    适用于SystemC/C++验证的形式化解决方案

    虽然 SystemC/C++ 编程风格已使用多年,但最近出现了一些特定使用模式,它们推动工程团队采用共同的设计流程。这包括抽象算法设计代码用作高层次综合 (HLS) 工具的输入,虚拟平台模型用于早期软件测试,可配置的知识产权 (IP) 模块,等等。
    的头像 发表于 06-24 11:07 1028次阅读
    适用于<b class='flag-5'>SystemC</b>/<b class='flag-5'>C++</b>验证的形式化解决方案

    SystemC的随机验证过程是怎样的?

    SystemC是基于C++的系统级设计语言,兼具描述硬件电路模型和面向对象的抽象能力。
    的头像 发表于 08-07 09:43 2008次阅读
    <b class='flag-5'>SystemC</b>的随机验证过程是怎样的?

    介绍一种通过SystemCRTL/C/C++联合仿真的方法

    当FPGA开发者需要做RTLC/C++联合仿真的时候,一些常用的方法包括使用MicroBlaze软核,或者使用QEMU
    的头像 发表于 12-13 10:11 3499次阅读
    介绍一种通过<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'>联合</b><b class='flag-5'>仿真</b>的方法

    vcs和vivado联合仿真

    我们可能就需要用到vcs核vivado联合仿真。 1.Vivdao仿真库编译 打开vivado软件,点击Tools–&gt;Compile Simulation Libraries
    发表于 10-24 07:28

    如何在ModelSim下用SystemC验证?

    子,我们假如想做DVB-S2的LDPC,我们一定会先用C++(M atlab也可以)写仿真程序,验证算法的正确性。然后假设我们已经确定了目标ASIC的架构,打算用VerilogRTL
    发表于 03-01 11:30

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

    通过充分发挥仿真领域的热门软件Vega 在视景仿真方面和Borland C++ Builder编程语言在界面设计与程序控制方面的优势,本文以坦克红外跟踪仿真场景为例设计实现了在Borl
    发表于 01-18 13:38 21次下载

    用Visual C++数据库开发

    实验 用Visual C++数据库开发 一、实验目的1、了解数据库的访问方式,掌握ADO 方式访问数据库2、用 Visual C++制作简单的数据
    发表于 05-10 10:54 2652次阅读

    RTL8139C RTL8139C-LF RTL8139CL RTL8139CL-LF

    RTL8139C RTL8139C-LF RTL8139CL RTL8139CL-LF
    发表于 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 的验证方法和流程介绍

    SystemC 是由C++衍生而来,本质是在C++的基础上添加了硬件扩展库和仿真核,这使SystemC 可以在不同抽象级对复杂电子系统建模。
    发表于 07-19 11:55 5589次阅读
    <b class='flag-5'>SystemC</b> 的验证方法和流程介绍

    如何从C转向C++ Effective C++ PDF中文版教材免费下载

    对每个人来说,习惯 C++需要一些时间,对于已经熟悉C 的程序员来说,这个过程尤其令人苦恼。因为CC++的子集,所有的C 的技术都可以继
    发表于 01-10 16:48 0次下载

    基于C++的雷达仿真系统组件化建模

    基于C++的雷达仿真系统组件化建模
    发表于 06-30 16:22 25次下载

    IAR中使用C++开发语言,更加简单高效

    本文简要介绍了如何在IAR中配置C++开发环境,由于C++的封装支持,引入面向对象的开发思路可以使得用C++进行单片机获得更高的开发效率
    发表于 12-03 11:36 4次下载
    IAR中使用<b class='flag-5'>C++</b><b class='flag-5'>做</b>开发语言,更加简单高效

    浅谈C语言与C++的前世今生

    C++开发人员将有这些问题归咎于C,而C开发人员则认为C++过于疯狂。我觉得站在C的角度看C++
    发表于 05-26 09:27 834次阅读
    浅谈<b class='flag-5'>C</b>语言与<b class='flag-5'>C++</b>的前世今生

    C++之父新作带你勾勒现代C++地图

    为了帮助大家解决这些痛点问题,让大家领略现代C++之美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他亲自操刀写就了这本《C++之旅》!
    的头像 发表于 10-30 16:35 1662次阅读
    <b class='flag-5'>C++</b>之父新作带你勾勒现代<b class='flag-5'>C++</b>地图

    SystemC中的数据类型概念

    引起一个事件,要使用通知函数notify( ),语法如下: event_name. notify (参数); 或 notify (参数,event_name); SystemC中的数据类型 作为C++
    的头像 发表于 11-02 15:44 1791次阅读
    <b class='flag-5'>SystemC</b>中的数据类型概念