• 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如下:

    1. #include "full_adder_driver.h"
    2. #include "full_adder_monitor.h"
    3. #include "full_adder2.h"
    4. int sc_main(int argc, char* argv[])
    5. {
    6. sc_signal <bool> t_a, t_b, t_cin, t_sum, t_cout;
    7. full_adder2 f1("FullAdderWithHalfAdder");
    8. f1(t_a, t_b, t_cin, t_sum, t_cout);
    9. driver d1("GenerateWaveforms");
    10. d1(t_a, t_b, t_cin);
    11. monitor mo1("MonitorWaveforms");
    12. mo1(t_a, t_b, t_cin, t_sum, t_cout);
    13. if(!mo1.outfile)
    14. {
    15. cerr << "ERROR: Unable to open output file," << "full_adder.out!\n";
    16. return(-2);
    17. }
    18. sc_trace_file *tf = sc_create_vcd_trace_file("full_adder");
    19. sc_trace(tf, t_a, "A");
    20. sc_trace(tf, t_b, "B");
    21. sc_trace(tf, t_cin, "CarryIn");
    22. sc_trace(tf, t_sum, "Sum");
    23. sc_trace(tf, t_cout, "CarryOut");
    24. sc_start(100, SC_NS);
    25. sc_close_vcd_trace_file(tf);
    26. return 0;
    27. }

    2,DUT函数模块

    全加器的设计模块文件full_adder2.h如下:

    1. #include "systemc.h"
    2. SC_MODULE(full_adder2){
    3. sc_in<bool> a, b, carry_in;
    4. sc_out<bool> sum, carry_out;
    5. void full_addr_prc();
    6. SC_CTOR(full_adder2){
    7. SC_METHOD(full_addr_prc);
    8. sensitive <

    3,Driver函数模块

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

    1. #include
    2. #include
    3. #include "systemc.h"
    4. SC_MODULE(driver){
    5. sc_out <bool> d_a, d_b, d_cin;
    6. ifstream infile;
    7. void driver_prc();
    8. SC_CTOR(driver){
    9. SC_THREAD(driver_prc);
    10. infile.open("../data/full_adder_driver_data.in"); //the data path is right when you are running exec program in 'build' folder.
    11. if(!infile){
    12. cerr << "in driver, Error: Unable to open vector file, full_adder_driver_data.in! \n";
    13. sc_stop();
    14. }
    15. }
    16. ~driver(){
    17. infile.close();
    18. }
    19. };
    20. void driver::driver_prc(){
    21. bool t_a, t_b, t_cin;
    22. while(infile >> t_a >> t_b >> t_cin){
    23. d_a.write(t_a);
    24. d_b.write(t_b);
    25. d_cin.write(t_cin);
    26. wait(5, SC_NS);
    27. }
    28. }

    激励数据文件full_adder_driver_data.in

    1. 1 1 0
    2. 1 0 1
    3. 0 1 0
    4. 0 1 1
    5. 1 0 0
    6. 1 0 1
    7. 1 1 0
    8. 1 1 1
    9. 1 1 0
    10. 1 0 1
    11. 1 0 0
    12. 0 1 1
    13. 0 1 0
    14. 0 0 1
    15. 0 0 0

    4,Monitor函数模块 

    监测模块文件full_adder_monitor.h如下:

    1. #include
    2. #include
    3. #include "systemc.h"
    4. SC_MODULE(monitor){
    5. sc_in<bool> m_a, m_b, m_cin, m_sum, m_cout;
    6. ofstream outfile;
    7. void monitor_prc();
    8. SC_CTOR(monitor){
    9. SC_METHOD(monitor_prc);
    10. sensitive << m_a << m_b << m_cin << m_sum << m_cout;
    11. outfile.open("full_adder.out"); //the out file can be find in your exec program folder path.
    12. }
    13. ~monitor(){
    14. outfile.close();
    15. }
    16. };
    17. void monitor::monitor_prc()
    18. {
    19. outfile << "At time: " << sc_time_stamp() <<"::";
    20. outfile <<"(a, b, carry_in): ";
    21. outfile << m_a << m_b << m_cin;
    22. outfile << " (sum, carry_out): " << m_sum << m_cout << "\n";
    23. }

     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下安装和打开波形文件:

    1. sudo apt-get install gtkwave
    2. gtkwave full_adder.vcd

  • 相关阅读:
    math_等比数列求和推导&等幂和差推导/两个n次方数之差/
    【推荐】Python常用的GUI框架!
    qt开发-09_分裂器
    rmq发送消息-服务端
    美团面试拷打:Redis 缓存穿透、缓存击穿、缓存雪崩区别和解决方案
    unordered_map详解
    【java|golang】1758. 生成交替二进制字符串的最少操作数
    2023年10月23日--10月29日(主攻光追视频教程)
    Shell 脚本学习
    Unity3D 检测鼠标位置的Sprite像素颜色
  • 原文地址:https://blog.csdn.net/u010420283/article/details/134221171