SystemC入门完整编写示例:全加器测试平台
导读: 本文将完整演示基于systemC编写一个全加器的测试平台。具体内容包括:激励平台,监控平台,待测单元的编写,波形文件读取。
1,main函数模块
搭建一个测试平台主要由:Driver, Monitor, DUT(design under test)几个模块,以及一个main文件来启动和连接它们。
如下main函数,
1)首先声明了全加器需要的5个输入输出信号sc_signal <bool> t_a, t_b, t_cin, t_sum, t_cout。
这些信号是把Driver, Monitor, full_adder几个模块连起来的重要接口,比如driver把数据不断的传给t_a, t_b, t_cin,然后full_adder对这3个信号敏感,产生结果信号传给t_sum, t_cout,而monitor对所有的5个信号都敏感,不断监控它们的变化情况;
2)创建了full_adder,monitor, driver的3个实例,并把它们各自需要的信号接口传给自己的实例。等于把信号接口都连接起来了。
3)创建了波形记录文件的实例。在这里定义波形文件里会保存的信号名字。
4)设定仿真时间,开启仿真。
主函数main文件full_adder_main.cpp如下:
#include "full_adder_driver.h"
#include "full_adder_monitor.h"
#include "full_adder2.h"int sc_main(int argc, char* argv[])
{sc_signal <bool> t_a, t_b, t_cin, t_sum, t_cout;full_adder2 f1("FullAdderWithHalfAdder");f1(t_a, t_b, t_cin, t_sum, t_cout);driver d1("GenerateWaveforms");d1(t_a, t_b, t_cin);monitor mo1("MonitorWaveforms");mo1(t_a, t_b, t_cin, t_sum, t_cout);if(!mo1.outfile){cerr << "ERROR: Unable to open output file," << "full_adder.out!\n";return(-2);}sc_trace_file *tf = sc_create_vcd_trace_file("full_adder");sc_trace(tf, t_a, "A");sc_trace(tf, t_b, "B");sc_trace(tf, t_cin, "CarryIn");sc_trace(tf, t_sum, "Sum");sc_trace(tf, t_cout, "CarryOut");sc_start(100, SC_NS);sc_close_vcd_trace_file(tf);return 0;}
2,DUT函数模块
全加器的设计模块文件full_adder2.h如下:
#include "systemc.h"SC_MODULE(full_adder2){sc_in<bool> a, b, carry_in;sc_out<bool> sum, carry_out;void full_addr_prc();SC_CTOR(full_adder2){SC_METHOD(full_addr_prc);sensitive <<a <<b <<carry_in;}};void full_adder2::full_addr_prc()
{sum = a^b^carry_in;carry_out = a & carry_in | b & carry_in | a &b;}
3,Driver函数模块
激励模块文件full_adder_driver.h如下:
#include <iostream>
#include <fstream>
#include "systemc.h"SC_MODULE(driver){sc_out <bool> d_a, d_b, d_cin;ifstream infile;void driver_prc();SC_CTOR(driver){SC_THREAD(driver_prc);infile.open("../data/full_adder_driver_data.in"); //the data path is right when you are running exec program in 'build' folder.if(!infile){cerr << "in driver, Error: Unable to open vector file, full_adder_driver_data.in! \n";sc_stop();}}~driver(){infile.close();}};void driver::driver_prc(){bool t_a, t_b, t_cin;while(infile >> t_a >> t_b >> t_cin){d_a.write(t_a);d_b.write(t_b);d_cin.write(t_cin);wait(5, SC_NS);}}
激励数据文件full_adder_driver_data.in
1 1 0
1 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
1 1 0
1 0 1
1 0 0
0 1 1
0 1 0
0 0 1
0 0 0
4,Monitor函数模块
监测模块文件full_adder_monitor.h如下:
#include <iostream>
#include <fstream>
#include "systemc.h"SC_MODULE(monitor){sc_in<bool> m_a, m_b, m_cin, m_sum, m_cout;ofstream outfile;void monitor_prc();SC_CTOR(monitor){SC_METHOD(monitor_prc);sensitive << m_a << m_b << m_cin << m_sum << m_cout;outfile.open("full_adder.out"); //the out file can be find in your exec program folder path.}~monitor(){outfile.close();}};void monitor::monitor_prc()
{outfile << "At time: " << sc_time_stamp() <<"::";outfile <<"(a, b, carry_in): ";outfile << m_a << m_b << m_cin;outfile << " (sum, carry_out): " << m_sum << m_cout << "\n";}
5,测试程序执行演示
1,需要你自己提前配置好SystemC的相关库。
2,将上面4个文件写好,并编译通过,生成一个可执行文件。
3,执行文件,生成full_adder.vcd和输出full_adder.out文件
注意点:
1, 在driver模块中,SC_THREAD(driver_prc)这里要用SC_THREAD,而不能用SC_METHOD,因为里面有while语句,需要程序能够挂起,如果用SC_METHOD则monitor只能执行一次。
2,如果激励数据从文件中读取,需要注意文件路径是否正确。比如main函数里定义了full_adder.out是在执行程序的路径,在driver文件里定义了激励输入文件的路径("../data/full_adder_driver_data.in"),需要确认自己的路径是否正确。
6,仿真波形记录文件读取
可以通过安装gtkwave来查看生成的波形文件,如下是linux下安装和打开波形文件:
sudo apt-get install gtkwavegtkwave full_adder.vcd
相关文章:

SystemC入门完整编写示例:全加器测试平台
导读: 本文将完整演示基于systemC编写一个全加器的测试平台。具体内容包括:激励平台,监控平台,待测单元的编写,波形文件读取。 1,main函数模块 搭建一个测试平台主要由:Driver, Monitor, DUT(design under …...

动手学深度学习:2.线性回归pytorch实现
动手学深度学习:2.线性回归pytorch实现 1.手动构造数据集2.小批量读取数据集3.定义模型和损失函数4.初始化模型参数5.小批量随机梯度下降优化算法6.训练完整代码Q&A 1.手动构造数据集 import torch from torch.utils import data from d2l import torch as d2l…...

重要的linux指令
系统管理命令 切换用户 su 用户名管理员身份运行 sudo 命令实时显示进程信息(linux下任务管理器) top查看进程信息(ps) ps -efps -ef | grep 进程名 ps -aux | grep 进程名参数说明e 显示所有进程f 全格式a 显示所有程序u 以用户为主的格式来显示程序状况x 显示无控制终端…...

delphi7安装并使用皮肤控件
1、下载控件 我已经上传到云盘,存储位置 2、下载后并解压。 3、打开dephi7,File-Open,打开路径D:\LC\Desktop\vclskin2_XiaZaiBa\d7, 然后将 D:\LC\Desktop\vclskin2_XiaZaiBa\d7文件夹中所有后缀.dcu的文件复制粘贴到delphi安装路…...

安徽省黄山景区免9天门票为哪般?
今日浑浑噩噩地睡了大半天,强撑起身子写网文......可是,题材不好选,本“人民体验官”只得推广人民日报官方微博文化产品《这两个月“黄山每周三免门票”》。 图:来源“人民体验官”推广平台 因年事渐高,又有未愈的呼吸…...

MFC 窗体插入图片
1.制作BMP图像1.bmp 放到res文件夹下,资源视图界面导入res文件夹下的1.bmp 2.添加控件 控件类型修改为Bitmap 图像,选择IDB_BITMAP1 3.效果...

关于中间件技术
中间件是一种独立的系统软件或服务程序,可以帮助分布式应用软件在不同的技术之间共享资源。中间件可以: 1、负责客户机与服务器之间的连接和通信,以及客户机与应用层之间的高效率通信机制。 2、提供应用的负载均衡和高可用性、安全机制与管…...

机器学习中的嵌入:释放表征的威力
简介 机器学习通过使计算机能够从数据学习和做出预测来彻底改变了人工智能领域。机器学习的一个关键方面是数据的表示,因为表示形式的选择极大地影响了算法的性能和有效性。嵌入已成为机器学习中的一种强大技术,提供了一种捕获和编码数据点之间复杂关系的…...

【Midjourney入门教程3】写好prompt常用的参数
文章目录 1、图片描述词(图片链接)文字描述词后缀参数2、权重划分3、后缀参数版本选择:--v版本风格:--style长宽比:--ar多样性: --c二次元化:--niji排除内容:--no--stylize--seed--tile、--q 4、…...

01-单节点部署clickhouse及简单使用
1、下载rpm安装包: 官网:https://packages.clickhouse.com/rpm/stable/ clickhouse19.4版本之后只需下载3个rpm安装包,上传到节点目录即可 2、rpm包安装: 安装顺序为conmon->server->client 执行 rpm -ivh ./clickhouse-…...

项目实战:展示第一页数据
1、在FruitDao接口中添加查询第一页数据和查询总记录条数 package com.csdn.fruit.dao; import com.csdn.fruit.pojo.Fruit; import java.util.List; //dao :Data Access Object 数据访问对象 //接口设计 public interface FruitDao {void addFruit(Fruit fruit);vo…...

c#中使用METest单元测试
METest是一个用于测试C#代码的单元测试框架。单元测试是一种软件测试方法,用于验证代码的各个单元(函数、方法、类等)是否按照预期工作。METest提供了一种简单而强大的方式来编写和运行单元测试。 TestMethod:这是一个特性&#…...

七月论文审稿GPT第二版:从Meta Nougat、GPT4审稿到Mistral、LLaMA LongLora
前言 如此前这篇文章《学术论文GPT的源码解读与微调:从chatpaper、gpt_academic到七月论文审稿GPT》中的第三部分所述,对于论文的摘要/总结、对话、翻译、语法检查而言,市面上的学术论文GPT的效果虽暂未有多好,可至少还过得去&am…...

社群团购对接合作,你有研究过社群团购平台的选品吗?
社群团购对接合作,你有研究过社群团购平台的选品吗? 社群团购选品是非常重要的一项工作,一个好的社群团购平台选品逻辑包含了:用户定位,时节性,产品性价比,售后率。用户定位在选品过程中非常重要…...

VSCode 如何设置背景图片
VSCode 设置背景图片 1.打开应用商店,搜索 background ,选择第一个,点击安装。 2. 安装完成后点击设置,点击扩展设置。 3.点击在 settings.json 中编辑。 4.将原代码注释后,加入以下代码。 // { // "workben…...

【数据结构】单向链表的增删查改以及指定pos位置的插入删除
目录 单向链表的概念及结构 尾插 头插 尾删 编辑 头删 查找 在pos位置前插 在pos位置后插 删除pos位置 删除pos的后一个位置 总结 代码 单向链表的概念及结构 概念:链表是一种 物理存储结构上非连续 、非顺序的存储结构,数据元素的 逻辑顺序 是…...

PageRank算法c++实现
首先用邻接矩阵A表示从页面j到页面i的概率,然后根据公式生成转移概率矩阵 M(1-d)*Qd*A 常量矩阵Q(qi,j),qi,j1/n 给定点击概率d,等级值初始向量R0,迭代终止条件e; 计算Ri1M*R…...

超低价:阿里云双11服务器优惠价格表_87元一年起
2023阿里云双十一优惠活动已经开启了,轻量2核2G服务器3M带宽优惠价87元一年、2核4G4M带宽优惠价165元一年,云服务器ECS经济型e实例2核2G3M固定带宽优惠价格99元一年,还有2核4G、2核8G、4核8G、4核16G、8核32G等配置报价,云服务器e…...

docker的安装Centos8
在CentOS 7中,可以使用yum安装Docker。Docker官方提供了一个yum源,可以用于安装Docker。以下是安装Docker的步骤: 卸载旧版本的Docker(如果有) 如果你之前安装过Docker,需要先卸载旧版本的Docker。执行以…...

Android.mk文件制定了链接库,但是出现ld Error
问题描述 Android.mk文件中,指定了库: LOCAL_LDLIBS : -lmylib LOCAL_LDFLAGS -L$(MYLIB_DIR)/lib出现ld: error: undefined symbol: my_function,于是查看so里面是否有my_function函数: nm -D libmylib.so | grep my_functio…...

10.MySQL事务(上)
个人主页:Lei宝啊 愿所有美好如期而遇 目录 前言: 是什么? 为什么? 怎么做? 前言: 本篇文章将会说明什么是事务,为什么会出现事务?事务是怎么做的? 是什么? 我…...

nexus搭建npm私有镜像
假设有一个nexus服务,地址为: http://10.10.33.50:8081/ 创建存储空间 登录后创建存储空间,选择存储类型为File,并设置空间名称为 npm-private 创建仓库类型 2.1 创建hosted类型仓库 创建一个名为 npm-hosted 的本地类型仓库 2.…...

智能化的宠物喂食器解决方案
随着经济条件的不断改善,越来越多的家庭开始追求生活的便捷享受,于是喂食器开始走进千家万户,喂食器主要由储存食物的蓄食箱和传送食物的滑道构成,在外部框架的支撑下,一台喂食器才能正常进行工作,而宠物喂…...

java配置GDAL
<gdal.version>3.7.0</gdal.version><!-- gdal--><dependency><groupId>org.gdal</groupId><artifactId>gdal</artifactId><version>${gdal.version}</version></dependency> GDAL环境安装 downlo…...

采购对接门禁系统采购进厂 空车出厂
本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:山JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文…...

服务器经常被攻击的原因
很多中小型企业都是选择虚拟主机服务器,是把一个服务器分成很多个给很多企业一起共用,可能同一个 IP服务器上就有很多个不同企业的网站,这个时候如果跟你同一个IP服务器的网站遭到DDoS攻击,就很有可能会影响到你的网站也无法正常访…...

子女购买房屋,父母出资的如果父母有关借贷的举证不充分则应认定该出资为赠与行为
现实生活中,由于父母与子女不和、子女离婚时父母为保全自己的出资等原因还经常会出现父母请求返还出资的情形。从司法实践反馈情况来看,父母请求返还出资所主张的基础法律关系往往为借贷而非赠与。基干父母子女之间密切的人身财产关系,父母出…...

【腾讯云HAI域探秘】速通腾讯云HAI
速览HAI 产品简介 腾讯云高性能应用服务(Hyper Application lnventor,HA),是一款面向 Al、科学计算的 GPU 应用服务产品,为开发者量身打造的澎湃算力平台。无需复杂配置,便可享受即开即用的GPU云服务体验。在 HA] 中,…...

R语言爬虫代码模版:技术原理与实践应用
目录 一、爬虫技术原理 二、R语言爬虫代码模板 三、实践应用与拓展 四、注意事项 总结 随着互联网的发展,网络爬虫已经成为获取网络数据的重要手段。R语言作为一门强大的数据分析工具,结合爬虫技术,可以让我们轻松地获取并分析网络数据。…...

行业观察:数字化企业需要什么样的数据中心
伴随着数字经济在中国乃至全球的高速发展,数字化转型已经成为广大企业的必经之路。而作为数字经济的核心基础设施,数据中心充当了接收、处理、存储与转发数据流的“中枢大脑”,对驱动数字经济发展和企业数字化转型起到了极为关键的重要作用。…...