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

导读: 本文将完整演示基于systemC编写一个全加器的测试平台。具体内容包括:激励平台,监控平台,待测单元的编写,波形文件读取。

1,main函数模块

        搭建一个测试平台主要由:Driver, Monitor, DUT(design under test)几个模块,以及一个main文件来启动和连接它们。

        如下main函数,

1)首先声明了全加器需要的5个输入输出信号sc_signal 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  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 a, b, carry_in;
    sc_out sum, carry_out;

    void full_addr_prc();

    SC_CTOR(full_adder2){
    
    SC_METHOD(full_addr_prc);
    sensitive <

3,Driver函数模块

激励模块文件full_adder_driver.h如下:

#include 
#include 
#include "systemc.h"

SC_MODULE(driver){
    sc_out  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 
#include 
#include "systemc.h"

SC_MODULE(monitor){
    sc_in 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文件

SystemC入门之测试平台编写完整示例:全加器_第1张图片

SystemC入门之测试平台编写完整示例:全加器_第2张图片

注意点:

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

SystemC入门之测试平台编写完整示例:全加器_第3张图片

你可能感兴趣的:(SystemC入门(第2版),SystemC,full_adder,仿真测试平台,仿真波形记录,driver,monitor,gtkwave)