信管女生做网站开发,宁波网站设计服务,wordpress设置静态之后文章打不开,注册公司网站多少钱导读: 本文将完整演示基于systemC编写一个全加器的测试平台。具体内容包括#xff1a;激励平台#xff0c;监控平台#xff0c;待测单元的编写#xff0c;波形文件读取。 1#xff0c;main函数模块 搭建一个测试平台主要由#xff1a;Driver, Monitor, DUT(design under …导读: 本文将完整演示基于systemC编写一个全加器的测试平台。具体内容包括激励平台监控平台待测单元的编写波形文件读取。 1main函数模块 搭建一个测试平台主要由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_addermonitor, driver的3个实例并把它们各自需要的信号接口传给自己的实例。等于把信号接口都连接起来了。
3创建了波形记录文件的实例。在这里定义波形文件里会保存的信号名字。
4设定仿真时间开启仿真。 主函数main文件full_adder_main.cpp如下
#include full_adder_driver.h
#include full_adder_monitor.h
#include full_adder2.hint 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;}
2DUT函数模块
全加器的设计模块文件full_adder2.h如下
#include systemc.hSC_MODULE(full_adder2){sc_inbool a, b, carry_in;sc_outbool 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;}
3Driver函数模块
激励模块文件full_adder_driver.h如下
#include iostream
#include fstream
#include systemc.hSC_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 4Monitor函数模块
监测模块文件full_adder_monitor.h如下
#include iostream
#include fstream
#include systemc.hSC_MODULE(monitor){sc_inbool 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 gtkwavegtkwave full_adder.vcd