SystemC入门之测试平台编写完整示例:带同步输出的多路选择器

内容:SystemC入门书中的简单测试平台编写示例。

模块文件编写

带锁存输出的4选1多路器模型。输出在信号clock的正跳变沿时刻被锁存。

sync_mux41.h文件

#include <systemc.h>

SC_MODULE(sync_mux41)
{
    sc_in<bool> clock, reset;
    sc_in<sc_uint<2>> sel;
    sc_in<sc_uint<4>> inp;
    sc_out<bool> out;

    void prc_sync_mux41();

    SC_CTOR(sync_mux41)
    {
        SC_METHOD(prc_sync_mux41);
        sensitive << clock.pos();
        sensitive << reset.neg();
    }

};

void sync_mux41::prc_sync_mux41()
{
    sc_uint<4> temp_inp;

    temp_inp =inp.read();

    if(reset ==0)
    {
        out =0;
    }
    else
    {
        if(sel.read()==0) 
        {
            out = temp_inp[0];
        }
        else if(sel.read()==1) 
        {
            out = temp_inp[1];
        }
        else if(sel.read()==2) 
        {
            out = temp_inp[2];
        }
        else 
        {
            out = temp_inp[3];
        }
        
    }

}

测试平台搭建

driver生成所有的可能的输入模式,每隔3ns向多路器施加其中一组输入模式。

sync_mux41_driver.h文件

#include <systemc.h>

SC_MODULE(driver)
{
    sc_out<bool> d_reset;
    sc_out<sc_uint<2> > d_sel;
    sc_out<sc_uint<4> > d_inp;

    void prc_driver();

    SC_CTOR(driver)
    {
        SC_THREAD(prc_driver);
    }
};

void driver::prc_driver()
{
    d_reset =0;
    wait(7, SC_NS);
    d_reset =1;

    for(int i=0; i<=15; i++)
    {
        d_inp =i;
        for(int j=0; j<=3; j++)
        {
            d_sel = j;
            wait(3, SC_NS);
        }
    }
}

只要多路器输入和输出端口的值发生任何改变,模块monitor将打印出所有输入端口和输出端口的值。

sync_mux41_monitor.h文件

#include <systemc.h>

SC_MODULE(monitor)
{
    sc_in<bool> m_clock, m_reset;
    sc_in<sc_uint <2> > m_sel;
    sc_in<sc_uint <4> > m_inp;
    sc_in<bool> m_out;

    void prc_monitor();

    SC_CTOR(monitor)
    {
        SC_METHOD(prc_monitor);
        sensitive << m_clock << m_reset << m_sel << m_inp << m_out;
    }

};

void monitor::prc_monitor()
{
    cout<<"At time "<<sc_simulation_time()<<"::";
    cout<<"(clock, reset, sel, inp): ";
    cout<<m_clock.read()<<","<<m_reset.read()<<","<<m_sel.read()<<","<<m_inp.read();
    cout<<" out:"<<m_out.read()<<"\n";
}

sc_main生成用vcd格式的仿真波形记录文件,让仿真连续运行100ns。

sync_mux41_main.cpp文件

#include "sync_mux41_driver.h"
#include "sync_mux41_monitor.h"
#include "sync_mux41.h"

const int CLOCK_PERIOD =2;

int sc_main(int argc, char* argv[])
{
    sc_signal<bool> t_reset;
    sc_signal<sc_uint<4> > t_inp;
    sc_signal<sc_uint<2> > t_sel;
    sc_signal<bool> t_out;

    sc_clock t_clock("clock", CLOCK_PERIOD);

    sync_mux41 m1("SyncMuxer4x1");
    m1(t_clock, t_reset, t_sel, t_inp, t_out);

    driver d1("GenerateWaveforms");
    d1(t_reset, t_sel, t_inp);

    monitor mo1("MonitorWaveforms");
    mo1(t_clock, t_reset, t_sel, t_inp, t_out);

    sc_trace_file *tf =sc_create_vcd_trace_file("sync_mux41");
    sc_trace(tf, t_clock, "clock");
    sc_trace(tf, t_reset, "reset");
    sc_trace(tf, t_inp, "input");
    sc_trace(tf, t_sel, "select");
    sc_trace(tf, t_out, "output");

    sc_start(100, SC_NS);

    sc_close_vcd_trace_file(tf);
    return 0;


}

测试平台输出:

最近更新

  1. TCP协议是安全的吗?

    2024-04-07 03:00:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-07 03:00:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-07 03:00:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-07 03:00:01       18 阅读

热门阅读

  1. 瘦身Spring Boot应用(thinJar)

    2024-04-07 03:00:01       29 阅读
  2. 如何简单理解Transformer架构

    2024-04-07 03:00:01       24 阅读
  3. .Linux基础正则表达式字符

    2024-04-07 03:00:01       21 阅读
  4. 电子电气架构——详解OTA系统的开发

    2024-04-07 03:00:01       25 阅读
  5. P4549 裴蜀定理

    2024-04-07 03:00:01       58 阅读
  6. 鸿蒙系统和安卓系统之间存在几个主要区别

    2024-04-07 03:00:01       46 阅读
  7. set容器

    2024-04-07 03:00:01       19 阅读
  8. 力扣经典150题第三题:删除有序数组中的重复项

    2024-04-07 03:00:01       23 阅读
  9. yolov8训练流程

    2024-04-07 03:00:01       31 阅读