SystemC学习使用记录
一、概述
对于复杂的片上系统,在进行RTL编码前,需进行深入的系统级仿真,以确认设计的体系结构是否恰当、总线是否能满足吞吐量和实现性要求以及存储器是否浪费,所进行的这些仿真要求在芯片的仿真模型上运行大量的软件,以覆盖所需的功能1。
SystemC的开发流程
sc源代码可以使用任何标准C++编译环境进行编译,生成可执行文件
运行可执行文件可以生成VCD格式的波形文件
使用综合工具(如Cynthesizer)可以将sc的RTL级描述综合为Verilog代码,也可以使用体系结构综合工具(如ESLFlex)总和为包括软件和硬件的片上系统。
建模精度
周期精确模型
仿真速度很慢,什么功能都可以模拟,但一般适合做硬件RTL验证。
非定时模型
仿真速度很快,但是包含信息较少,适合定义设计规范,也可以结合先进的综合工作用来做软件开发。
松散定时模型
既可以做软软件开发和软件性能评估,也可以做体系结构分析和硬件验证
系统级建模:C++和SystemC
SystemC首先是C++,任何C++的语法和库都可以用在SystemC中。
为什么使用SystemC而不是C++
原始的C++模型程序必须手工转换为Verilog/VHDL,而SystemC可以用于描述不同的抽象级别(系统级、寄存器传输级等)
二、语法
模块定义
SC_MODULE
SystemC库种定义的一个宏,用来定义一个新的C++结构体,类似硬件模块
SC_MODULE(sram8x256)
{
.....
}
SC_CTOR
构造函数,除了完成C++种所要求的基本功能外,构造函数还用于初始化进程的类型并创建进程的敏感表。
SC_CTOR(sram8x256)
{
......
}
端口和信号
SystemC专有数据类型
sc_int/sc_uint/sc_bigint/sc_biguint/
sc_bit:2值单bit数据类型
sc_logic:4值单bit数据类型
用户自定义数据结构类型
typedef struct _frame{
......
} frane;
抽象端口
class direct_if:public virtual sc_interface
{
.....
}
sc_in/sc_out/sc_inout/sc_signal
端口类型,端口使用的数据类型可以时C++的数据类型,也可以是SystemC专用数据类型。
sc_in_clk clk; //端口定义,特殊情况,时钟定义
sc_in<sc_uint<8>> wr_data; //端口定义
sc_signal<sc_logic> addr[16]; // 信号定义
信号赋值
通过read()和write()函数对信号读取和赋值
addr_o.write(addr_i.read()); //将addr_i的值赋给addr_o的值
敏感表
sensitive
sensitive为SC_METHOD和SC_THREAD进程设置敏感表
SC_METHOD(main);
sensitive<<clk_i.pos()<<rst_i.pos();
进程调用
SystemC中进程是一个基本执行单位,被调用来仿真目标系统的行为。
在SystemC中,进程不是层次化的,一个进程中不能包含或者直接调用其他进程,但进程可以调用非进程的函数和方法。
SC_METHOD
使用该进程调用方法,当敏感表有事件发生,该进程就会被调用。只有该类进程返回后仿真系统的事件才有可能前进,因此该类进程中不能使用wait()这样的语句。
SC_METHOD进程的敏感表在模块的构造函数内设定。
SC_THREAD
线程进程,该调用方式下线程能够被挂起和重新激活。线程进程使用wait()挂起,当敏感表中有时间发生,线程进程被重新激活运行到遇到新的wait()语句再重新挂起。当该进程一旦推出,将不能再次进入。
可以用来描述testbench的输入激励和输出捕获
SC_CTHREAD
钟控线程进程,继承于线程进程,只能再时钟的posedge或negaedge被触发或者激活,更接近于实际硬件的行为。
时序控制
wait()
用于SC_THREAD和SC_CTHREAD。用于将进程挂起等待下一个事件发生重新激活被挂起的进程。
wait(); //等待敏感表中有事件发生
wait(const sc_event& ); // 等待事件发生
wait(100, SC_NS); // 进程将被挂起100ns后激活
wait(100, SC_NS, e1); // 如果100ns内有事件e1发生,或者时间超过了100ns,进程将被激活
三、常用用法
仿真流程
顶层函数sc_main()
sc_main将设计中所有模块连接在一起,并引入时钟和波形跟踪。
int sc_main(int argc, char * argv[])
{
......
}
sc_start()
控制所有时钟的产生并在适当的时刻激活SystemC调度器。调度器控制整个仿真过程中的调度工作,包括激活进程,产生延迟、计算和更新变量和信号的值。
sc_start()只在sc_main()中调用。
sc_start(); // 没有参数,表示仿真一直进行直到遇到sc_stop()函数。
sc_start(1000); // 仿真持续1000个时间单位停止或者期间遇到sc_stop()停止
波形跟踪
SystemC可以将仿真结果保存为VCD格式
- 只有在整个仿真期间都存在的信号和变量才能被追踪,及模块中的信号和数据成员能被跟踪,函数的本地变量只有在被调用是才存在,所以不能跟踪
- 任何类型的信号和变量都可以被跟踪
int sc_main(int, char **)
{sc_in<int> datain;sc_trace_file * my_trace_file;my_trace_file = sc_create_vcd_trace_file("Wave"); // 产生一个Wave.vcd文件......sc_trace(my_trace_file, datain, "DataIn"); // 跟踪信号datain,datain在波形文件中被保存为DataIn......sc_close_vcd_trace_file(my_trace_file); // 关闭打开的波形文件......return 0;
}
信息打印
SystemC定义了几种打印等级,INFO和WARNING可直接打开,ERROR类型由SystemC仿真器抛出异常,用户定义的异常处理代码去处理,对于FATAL,则停止仿真。
SC_REPORT_INFO( msg_type, msg);
SC_REPORT_WARNING( msg_type, msg);
SC_REPORT_ERROR( msg_type, msg);
SC_REPORT_FATAL( msg_type, msg);
sc_asserrt( expr ); // 打印的等级严重程度为FATAL
set_actions
修改打印等级
时钟相位关系
sc_set_time_resolution()
sc_set_default_time_unit()
四、事务处理级建模(TLM)
事务指两个时间点内发生的不可分割的活动。可以是一次总线读或写事务
基本通道
基本通道不包含任何进程,也不对外展现任何可见结构,也不能调用其他基本通道。
sc_mutex
互斥通道
sc_mutex protect;
......
protect.lock();
......
protect.unlock();
sc_fifo < T >
已实现好的FIFO通道,T指存储的数据类型。
sc_fifo<packet> fifo2(4);
sc_semaphore
信号量,限制同时使用某共享资源的进程的数量。
分层通道
相比基本通道,分层通道包含进程,可以直接操作其他通道。
五、TLM2.0
TLM2.0是专门为建模存储器映射的片上总线而设计的SystemC模型库
事务对象是一个C++类,TLM2.0预定义了一个通用净核类和相应的基础协议,以进一步保障不同提供商提供的模型互联互通。
核心接口
事务发起者和目标模块必须遵守的接口标准,包含四种:阻塞、非阻塞传送接口、DMI和调试传送接口
阻塞传送接口
支持松散时间模型。发起者通过调用一个函数就可以完成一个非阻塞事务处理。
class ...
{public: virtual void b_transport(TRANS& trans, sc_core::sc_time& t)=0
}
b_transport(TRANS& trans, sc_core::sc_time& t)是欸阻塞事务处理接口的方法。trans是事务,t是双向时间参数。当发起者通过b_transport访问目标时,t为事务处理发起的时间;当目标返回时,t为事务处理结束时间。
非阻塞传送接口
非阻塞传送接口用于支持建模近似时间模型,该模型用于描述发起者和目标之间的事务处理过程的多相位的细节,每个相位都有一个明确的定时点。非阻塞接口有
tlm_phase是非阻塞传送接口模板类的缺省相位类型。tlm_phase的值有5个:UNINITIALIZED_PHASE=0, BEGIN_REQ=1, EDN_REQ, BEGIN_RESP, END_RESP。
事务定义
可以使用C++类来表示事务
class bus_payload // 定义
{public:unsigned int address;......
};bus_payload bp; // 例化
开源项目
NVDLA
虚拟仿真平台
NVDLA 加速器硬件架构
NVDLA Quick Start
参考文献
李挥,陈曦, SystemC电子系统级设计 ↩︎
相关文章:

SystemC学习使用记录
一、概述 对于复杂的片上系统,在进行RTL编码前,需进行深入的系统级仿真,以确认设计的体系结构是否恰当、总线是否能满足吞吐量和实现性要求以及存储器是否浪费,所进行的这些仿真要求在芯片的仿真模型上运行大量的软件,…...

Github20K星开源团队协作工具:Zulip
Zulip:让团队协作的每一次交流,都精准高效。- 精选真开源,释放新价值。 概览 随着远程工作的兴起和团队协作的需求不断增加,群组聊天软件成为了日常工作中不可或缺的一部分。Zulip 是github上一个开源的团队协作工具,…...
C语言基础-标准库函数
C语言的标准库函数是由C语言标准库(如C99、C11等)提供的一系列预定义函数,这些函数通常用于执行常见的编程任务,如字符串操作、内存管理、数学计算、文件操作等。通过使用标准库函数,程序员可以更加高效地编写C语言程序…...

「51媒体」家居生活发布会,展览展会有哪些媒体邀约资源
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 家居生活类媒体包括多种类型,包括门户网站家居生活消费频道,专业的家居消费生活门户,以及行业媒体,平面媒体,KOL和意见领袖。下…...
力扣刷题--数组--第五天
昨天做了几道关于双指针求解的算法题,今天继续看相关的题目。 844. 比较含退格的字符串 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 注意:如果对空…...

kafka学习笔记04(小滴课堂)
Kafka的producer生产者发送到Broker分区策略讲解 Kafka核心API模块-producer API讲解实战 代码: ProducerRecord介绍和key的作用 Kafka核心API模块-producerAPI回调函数实战 producer生产者发送指定分区实战 我们设置5个分区。 我们指定分区。 重新指定一个分区&am…...

三菱FX3U-4AD模拟量电压输入采集实例
硬件:PLC模块 FX3GA-24MT ;A/D模块FX3…...

OpenAI推出DALL·E 3识别器、媒体管理器
5月8日,OpenAI在官网宣布,将推出面向其文生图模型DALLE 3 的内容识别器,以及一个媒体管理器。 随着ChatGPT、DALLE 3等生成式AI产品被大量应用在实际业务中,人们越来越难分辨AI和人类创建内容的区别,这个识别器可以帮…...

Spring Boot 整合讯飞星火3.5通过接口Api接口实现聊天功能(首发)复制粘贴即可使用,后续更新WebSocket实现聊天功能
程序员必备网站: 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 1.pom.xml <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.72</version></dependency><depen…...
信息系统项目管理师——十大管理过程输入、工具和技术、输出(论文篇)一
一、项目整合管理 制定项目章程 在项目管理中,制定项目章程是一个关键的初始过程,它正式授权项目的开始并为项目设定高层次的方向。项目章程的编制涉及特定的输入、采用的工具和技术,以及产生的输出。以下是这些方面的详细说明:…...

Java——代码块
1、概念分类 使用 {} 定义的一段代码称为代码块,根据代码块定义的位置以及关键字,可分为以下四种 普通代码块静态代码块构造代码块同步代码块 2、普通代码块 定义在方法中的代码块,这种用法较少见: 3、构造代码块 构造块&…...

Ajax额
原生Ajax xml 已被json取代 http 请求方法urlhttp版本号 network 谷歌浏览器查看请求报文和响应报文 F12 network header里面有 请求头 响应头 点击view source 可以查看请求响应行 请求体在请求行头下面 get请求有url参数,请求体变为query String…...
5.15项目进度总结
今天完成了随机选人和实时显示的功能(还需要维护),使得程序可以对用户的操作进行实时的显示。 实时显示的思路:在登录后开一个线程用一个socket去链接服务端并查询需要实时的信息,同时服务端把这个socket记录下来&…...

POETIZE个人博客系统源码 | 最美博客
简介: POETIZE个人博客系统源码 | 最美博客 这是一个 SpringBoot Vue2 Vue3 的产物,支持移动端自适应,配有完备的前台和后台管理功能。 网站分两个模块: 博客系统:具有文章,表白墙,图片墙&…...

回复完成 输入框还显示值的问题
回复完成 输入框还显示值的问题 解决代码 先把id 值清空 再构建下这个输入框 $("#details_article_reply_content").val(""); // 清空textareavar editor editormd("article_details_reply", {width: "100%",height: "100%"…...

C语言----斐波那契数列(附源代码)
各位看官们好,当我写了上一篇博客杨辉三角后,有一些看官叫我讲一下斐波那契数列。对于这个大家应该是有了解的。最简单的规律就是f(n)f(n-2)f(n-1)。就是当前是前两项之和,然后下标1和0都是1.从第三项开始计算的。那么我们知道规律࿰…...

javax.net.ssl.SSLException: Received fatal alert: protocol_version已经解决
起因: 在帮别人讲解项目时,将项目的tomcat配置完,点击运行后,报错,信息如标题。 解决办法: 在csdn百度问题,得到的方法主要有几个: 1.jdk要配置在1.8以上; 2.数据库地…...

uniapp 实现下拉刷新 下滑更新
效果图 在app或者小程序中向下滑动 会出现刷新数据 ,而上拉到底 需要更新数据 功能实现 主要俩种方式 依赖生命周期 在page.json中开启 page.json "style" : {"navigationBarTitleText" : "小小练习","backgroundTextStyle": &qu…...

海豚调度器如何看工作流是在哪个worker节点执行
用海豚调度器,执行一个工作流时,有时成功,有时失败,怀疑跟worker节点环境配置不一样有关。要怎样看是在哪个worker节点执行,在 海豚调度器 Web UI 中,您可以查看任务实例,里面有一列显示host&a…...

凸优化理论学习三|凸优化问题(一)
系列文章目录 凸优化理论学习一|最优化及凸集的基本概念 凸优化理论学习二|凸函数及其相关概念 文章目录 系列文章目录一、优化问题(一)标准形式的优化问题(二)可行点和最优点(三)局部最优点(四…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...