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…...
凸优化理论学习三|凸优化问题(一)
系列文章目录 凸优化理论学习一|最优化及凸集的基本概念 凸优化理论学习二|凸函数及其相关概念 文章目录 系列文章目录一、优化问题(一)标准形式的优化问题(二)可行点和最优点(三)局部最优点(四…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
