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

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...

小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...