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 gtkwave

gtkwave full_adder.vcd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/116404.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx编译安装和配置

官网:http://nginx.org/ 这里以1.20.2为例 Nginx是C语言写的 如果Linux系统上没有安装C编译环境 先执行下面命令 yum install -y gcc automake autoconf libtool make 如果不确定 可以使用命令查看 命令格式 rpm -q xxx 例如 说明有C编译环境 安装前需要安装4个依赖包…

基因组WGD的鉴定与分化时间

1. WGD 简介 全基因组复制(Whole genome duplications, WGD)是生物进化的重要因素之一&#xff08;导致基因组扩增的因素包括全基因组复制和转座子TEs&#xff09;, 所以WGD分析也是基因组分析经常用到的一种分析方法。 古 WGD 检测有两种方法&#xff0c;一种是共线性分析&a…

Spring Boot创建多模块项目

创建一个普通的Spring Boot项目, 然后只留下 pom.xml 剩下的都删掉 删除多余标签 标识当前为父模块 创建子模块 删除子模块中多余标签 声明父模块 在父模块中声明子模块

体验SOLIDWORKS旋转反侧切除增强 硕迪科技

大家在设计中经常使用的旋转切除命令在solidworks2024版本中迎来了新的增强&#xff0c;添加了旋转反侧切除选项。在设计过程中不必修改复杂的草图即可切除掉我们不需要的部分。使设计工作更加方便快捷。 打开零部件后&#xff0c;点击键盘上的S键并输入旋转切除以搜索该命令&a…

[极客大挑战 2019]Knife 1(两种解法)

题目环境&#xff1a; 这道题主要考察中国菜刀和中国蚁剑的使用方法 以及对PHP一句话木马的理解 咱们先了解一下PHP一句话木马&#xff0c;好吗&#xff1f; **eval($_POST["Syc"]);** **eval是PHP代码执行函数&#xff0c;**把字符串按照 PHP 代码来执行。 $_POST P…

使用HttpClient库的爬虫程序

使用HttpClient库的爬虫程序&#xff0c;该爬虫使用C#来抓取内容。 using System; using System.Net.Http; using System.Threading.Tasks; ​ namespace CrawlerProgram {class Program{static void Main(string[] args){// 创建HttpClient对象using (HttpClient client new…

【蓝桥杯基础题】门牌制作

👑专栏内容:蓝桥杯刷题⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停目录 一、题目描述二、题目分析三、代码汇总1、C++代码2、Java 代码四、总结1、枚举思想2、取余判断每位数字一、题目描述 题目链接:门牌制作 小蓝要为一条街的住户制作门牌号。这条街一共…

Powercli批量修改分布式交换机端口组

背景 需求&#xff1a; 批量修改虚拟机的分布式端口组 解决方式一&#xff1a; 三条命令解决&#xff1a;先获取目标虚拟机、获取目标端口组、修改虚拟机端口组、检查虚拟机状态。 $vm Get-VM -Name <虚拟机名称> $portGroup Get-VirtualPortGroup -Name <端口…

视频编码转换技巧:视频批量转码H264转H265,高效且顺畅

随着数字媒体的广泛应用&#xff0c;视频编码转换已成为一种普遍的需求。不同的视频格式和编码标准使得在不同设备上播放视频成为可能&#xff0c;同时也带来了兼容性和传输效率的问题。本文讲解引用云炫AI智剪使视频编码转换技巧&#xff0c;即批量将H264编码转换为H265编码&a…

【CIO人物展】黄淮学院副CIO周鹏:构建数智化平台赋能学校高质量发展

周鹏 本文由黄淮学院副CIO周鹏投递并参与《2023中国数智化转型升级优秀CIO》榜单/奖项评选。丨推荐企业—锐捷网络 大数据产业创新服务媒体 ——聚焦数据 改变商业 黄淮学院是2004年经教育部批准成立的一所省属全日制普通本科高校。学校位于素有“豫州之腹地、天下之最中”之美…

关于ROS的网络通讯方式TCP/UDP

一、TCP与UDP TCP/IP协议族为传输层指明了两个协议&#xff1a;TCP和UDP&#xff0c;它们都是作为应同程序和网络操作的中介物。 **TCP&#xff08;Transmission Control Protocol&#xff09;协议全称是传输控制协议&#xff0c;是一种面向连接的、可靠的、基于字节流的传输…

蓝鹏测控测宽仪系列又添一员大将——双目测宽仪

轧钢过程中钢板的宽度是一个重要的参数&#xff0c;它直接决定了成材率。同时&#xff0c;随着高新科技越来越广泛的应用到工程实际中&#xff0c;许多控制系统需要钢板实时宽度值作为模型参数。 当前&#xff0c;相当一部分宽厚板厂还在采用人工检测的方法&#xff0c;检测环境…

LangChain+LLM实战---ChatGPT的工作原理

一个词一个词的输出 ChatGPT能够自动生成类似于人类书写的文本&#xff0c;这是非常了不起和出乎意料的。但它是如何做到的&#xff1f;为什么会有效果呢&#xff1f;我的目的在于大致概述ChatGPT内部发生了什么&#xff0c;然后探讨它为什么能够很好地生成我们认为有意义的文…

CSS必学:元素之间的空白与行内块的幽灵空白问题

作者:WangMin 格言:努力做好自己喜欢的每一件事 CSDN原创文章 博客地址 &#x1f449; WangMin 我们在开发的过程中&#xff0c;难免会出现一些难以预料的问题。那么其中&#xff0c;CSS空白现象就是非常常见的问题之一。虽然它已经被发现很久&#xff0c;但仍然有许多新手和经…

RabbitMQ 消息应答与发布

目录 一、消息应答 1、自动应答&#xff08;默认&#xff09; 2、手动消息应答的方法 ​编辑 3、消息重新入队 4、手动应答案列与效果演示 二、RabbitMQ持久化 1、队列持久化 2、消息持久化 三、不公平分发&#xff08;能者多劳&#xff0c;弱者少劳&#xff09; 1、…

Trajectory-guided Control Prediction for End-to-end Autonomous Driving论文学习

1. 解决了什么问题&#xff1f; 端到端自动驾驶方法直接将原始传感器数据映射为规划轨迹或控制信号&#xff0c;范式非常简洁&#xff0c;从理论上避免了多模块设计的错误叠加问题和繁琐的人为规则设计。当前的端到端自动驾驶方法主要有两条独立的研究路线&#xff0c;要么基于…

【leetcode】88. 合并两个有序数组(图解)

目录 1. 思路&#xff08;图解&#xff09;2. 代码 题目链接&#xff1a;leetcode 88. 合并两个有序数组 题目描述&#xff1a; 1. 思路&#xff08;图解&#xff09; 思路一&#xff1a;&#xff08;不满足题目要求&#xff09; 1. 创建一个大小为nums1和nums2长度之和的…

CrossOver软件2024最新版本下载

我们都明白快速运行&#xff1a;无须再独立运行一个Win电脑操作系统&#xff0c;进而解决双启动的繁杂和vm虚拟机的卡屏。习惯上来说极速运行&#xff1a;CrossOver能够让Win软件全速全状态运行&#xff0c;不会有丝毫的性能影响&#xff0c;让你在MAC系统中使用熟悉的Win应用。…

R语言爬虫代码模版:技术原理与实践应用

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

dji mini4pro 图片拷贝到电脑速度

环境 win电脑 amd3600 m.2固态硬盘 dp快充数据线 直接主机使用dp线连接无人机 9成是raw格式图片 一小部分是视频和全景图 TF卡信息: 闪迪 128GB 129元 闪迪 128GB TF(MicroSD) 存储卡U3 C10 V30 A2 4K 至尊超极速移动版 "TF卡至尊超极速" 理论读取200MB/s …