SystemC:read()和write()到端口不起作用

时间:2017-03-21 20:02:16

标签: c++ linux systemc

我是systemC的新手可能看起来很愚蠢,但我会很感激帮助。 在下面的代码中

  1. 在main函数中:write()到aa,而bb在使用aa.read()bb.read()读取时显示值0,应该是10和20
  2. 我认为它应该在加法器模块中输入方法do_add(),因为它对ab以及a敏感,b是绑定到aabb信号,但它不会调用方法do_add()。它是如何工作的,代码中是否有错误?
  3. 编译代码:

    1. g++ -I. -I$SYSTEMC_HOME/include -L. -L$SYSTEMC_HOME/lib-linux64 -Wl,-rpath=$SYSTEMC_HOME/lib-linux64 -o out adder.cpp -lsystemc -lm
    2. ./out
    3. #include "systemc.h"
      
      #define WIDTH  32
      
      SC_MODULE(adder) {
          sc_in<sc_uint<WIDTH> > a, b;  
          sc_out<sc_uint<WIDTH> > sum;
      
          void do_add() {
              // cout<<"hello"<<endl;
              // cout<<a.read()<<b.read()<<"\n";
              sum.write(a.read() + b.read());
              // cout<<sum.read()<<endl;
          }
      
          SC_CTOR(adder) {
              SC_METHOD(do_add);   
              sensitive << a << b; 
          }
      };
      
      int sc_main(int argc, char* argv[]) {
          sc_signal<sc_uint<WIDTH> >aa,bb;
      
          adder add("Adder");
          add.a(aa);
          add.b(bb);
      
          aa.write(10);
          bb.write(20);
      
          cout<<aa.read()<<bb.read()<<"\n";
      }
      

1 个答案:

答案 0 :(得分:1)

这里有很多东西。首先,你从未真正开始模拟(参见函数sc_start),即使你这样做也会立即退出,因为没有要处理的事件。最后,即使您修复了这些问题,您仍然会得到相同的结果,因为SystemC模拟硬件并在写入的同一个增量周期中读取端口将为您提供端口上的原始值而不是新写入的端口。硬件如何在零时间内改变信号的值?

我能给出的最好建议是查看下载SystemC的目录,然后您将看到PDF文档的目录。在我的SystemC上,它位于一个名为“docs”的目录中(根据你安装它的人和在哪里,它可能会有所不同)。如果您查看那里,您将找到“用户指南”和一些其他PDF文档。这些解释了SystemC的工作原理,并为您提供了可以根据自己的需要进行尝试和修改的示例。 “examples”文件夹中的SystemC源代码中也有一些示例。您可以尝试使用它们来感受它,也许只需剪切并粘贴一些代码并对其进行修改即可获得所需的代码。