内容: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;
}测试平台输出:

——实操演示](https://img-blog.csdnimg.cn/direct/742f58c929d8415cb9830b0c829944e4.png)


















