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…...

凸优化理论学习三|凸优化问题(一)
系列文章目录 凸优化理论学习一|最优化及凸集的基本概念 凸优化理论学习二|凸函数及其相关概念 文章目录 系列文章目录一、优化问题(一)标准形式的优化问题(二)可行点和最优点(三)局部最优点(四…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...