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