SystemC入门之测试平台编写完整示例:全加器

news2024/11/28 10:48:27

导读: 本文将完整演示基于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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javaee实验:搭建maven+spring boot开发环境,开发“Hello,Spring Boot”应用

目录 mavenspringboot实验目的实验内容环境的搭建 在开发中&#xff0c;maven和spring都是非常常用、非常重要的管理工具和框架&#xff0c;今天就在这里使用idea进行环境的搭建和创建第一个spring程序 maven 1.1maven是一个跨平台的项目管理工具&#xff08;主要管理jar包&am…

Dubbo捕获自定义异常

一.问题描述 Dubbo远程服务提供者抛出的自定义异常无法被消费方正常捕获&#xff0c;消费方捕获的自定义异常全部变成RuntimeException&#xff0c;使用起来很不方便。 二.原因分析 相关源码 /** Licensed to the Apache Software Foundation (ASF) under one or more* con…

[自学记录08*]LDR、HDR与ToneMapping

一、Dynamic Range—动态范围 Dynamic Range表示动态范围&#xff0c;检测DR&#xff0c;DR又分为LDR&#xff08;Low Dynamic Range&#xff09;和HDR&#xff08;High Dynamic Range&#xff09;。它们都是表示亮度值范围的一种方式&#xff0c;那么有什么区别呢。 1.LDR …

系列六、过滤器(二)#案例演示

一、案例演示 说明&#xff1a;如下案例通过springboot的方式演示Filter是如何使用的&#xff0c;以获取Controller中的请求参数为切入点进行演示 1.1、前置准备工作 1.1.1、pom <dependencies><!-- spring-boot --><dependency><groupId>org.spring…

晨控CK-GW08系列网关控制器与CODESYS软件MODBUSTCP通讯手册

晨控CK-GW08系列是一款支持标准工业通讯协议ModbusTCP的网关控制器,方便用户集成到PLC等控制系统中。系统还集成了8路读写接口&#xff0c;用户可通过通信接口使用Modbus TCP协议对8路读写接口所连接的读卡器进行相对独立的读写操作。 晨控CK-GW08系列网关控制器适用于本公司多…

高等数学教材重难点题型总结(十一)曲线积分与曲面积分

同济倒数第二章&#xff0c;论公式复杂程度排名第一&#xff0c;但其实做题难度并不会很高——核心的知识点在于&#xff1a;对弧长的曲线积分、对坐标的曲线积分、对面积的曲面积分、对坐标的曲面积分。想追求尽善尽美的要会使用高斯公式和格林公式&#xff0c;学有余力可以看…

AD9371 官方例程裸机SW 和 HDL配置概述(一)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

3 函数的升级-上

常量与宏回顾 C中的const常量可以替代常数定义&#xff0c;如: "Const int a 8; --> 等价于 #define a 8 " 宏在预编译阶段处理&#xff0c;而c const常量则在编译阶段处理&#xff0c;比宏 更为安全。 C中&#xff0c;我们可以用宏代码片段去实现某个函数&…

时序分解 | Matlab实现FEEMD快速集合经验模态分解时间序列信号分解

时序分解 | Matlab实现FEEMD快速集合经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现FEEMD快速集合经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现FEEMD快速集合经验模态分解时间序列信号分解 算法新颖小众&#xff0c…

企业级SpringBoot单体项目模板 —— 使用 AOP + JWT实现登陆鉴权

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;SpringBoot、企业级、项目模板☀️每日 一言&#xff1a;没学会走就学跑从来都不是问题&#xff0c;要问问自己是不是天才&#xff0c;如果不是&#xff0c;那就要一步步来 文章目录 使用JWT实现…

docker 常用

系统 Ubuntu 20.04 64位 安装文档 ubuntu&#xff1a;https://docs.docker.com/engine/install/ubuntu/ centos&#xff1a;https://docs.docker.com/engine/install/centos/ debian&#xff1a;https://docs.docker.com/engine/install/debian/ 常用命令 查看镜像 docke…

NeRF-SLAM部署运行(3060Ti)

记录在部署运行期间遇到的一些问题&#xff0c;分享给大家~ 一、环境 RTX 3060 Ti、8G显存、Ubuntu18.04 二、部署 1. 下载代码 git clone https://github.com/jrpowers/NeRF-SLAM.git --recurse-submodules git submodule update --init --recursive cd thirdparty/insta…

Nacos 的底层实现原理 注册中心的两种调用方式

目录 1. Nacos 的底层实现原理 1.1 配置中心自动刷新实现原理 1.2 注册中心底层实现原理 2. Nacos 注册中心的两种调用方式 2.1 RestTemplate Spring Cloud LoadBalancer 的调用方式 2.2 使用 OpenFeign Spring Cloud LoadBalancer 1. Nacos 的底层实现原理 1.1 配置中心…

Python测试之Pytest详解

概要 当涉及到python的测试框架时&#xff0c;pytest是一个功能强大且广泛应用的第三方库。它提供简洁而灵活的方式来编写和执行测试用例&#xff0c;并具有广泛的应用场景。下面是pytest的介绍和详细使用说明&#xff1a; pytest是一个用于python单元测试的框架&#xff0c;它…

node插件express(路由)的插件使用(二)——body-parser和ejs插件的基本使用

文章目录 前言一、express使用中间件body-parser获取请全体的数据1. 代码2. 效果 二、express使用ejs&#xff08;了解即可&#xff09;1.安装2.作用3.基本使用&#xff08;1&#xff09;代码&#xff08;2&#xff09;代码分析和效果 4.列表渲染&#xff08;1&#xff09;代码…

Canvas 实现进度条展示统计数据示例

canvas可以画柱状图&#xff0c;如下就是一个例子&#xff0c;主要用到了lineWidth&#xff0c;beginPath&#xff0c;lineCap等知识点。 效果图 源代码 <!DOCTYPE Html> <html> <head><title>Line Chart Demo</title><meta http-equiv&quo…

一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高

一.思路分析 这是一个简单的物理题目&#xff0c;解题思路比较明确。程序使用 for 循环来模拟球的下落和反弹过程&#xff0c;通过多次计算得到最终结果&#xff0c;最后使用 printf 函数将结果输出。 定义初始高度 height 和总共经过的米数 distance 的变量&#xff0c;初始化…

【密评】商用密码应用安全性评估从业人员考核题库(十九)

商用密码应用安全性评估从业人员考核题库&#xff08;十九&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 4501 判断题 依据《信息系统密码应用高风险判定指引》&#xff0c…

服务器感染了.locked勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 网络安全威胁的不断演变使得恶意软件如.locked勒索病毒成为当今数字时代的一大挑战。.locked勒索病毒能够加密您的文件&#xff0c;然后要求支付赎金以解锁它们。本文将深入探讨.locked勒索病毒的特点&#xff0c;以及如何应对感染&#xff0c;以及预防这种类…

数据可视化:动态柱状图

终于来到最后一个数据可视化的文章拿啦~~~ 在这里学习如何绘制动态柱状图 我先整个活 (๑′ᴗ‵๑)&#xff29; Lᵒᵛᵉᵧₒᵤ❤ 什么是pyecharts&#xff1f; 答&#xff1a; Python的Pyecharts软件包。它是一个用于Python数据可视化和图表绘制的库&#xff0c;可用于制作…