我是systemC的新手可能看起来很愚蠢,但我会很感激帮助。 在下面的代码中
aa
,而bb
在使用aa.read()
和bb.read()
读取时显示值0,应该是10和20 do_add()
,因为它对a
和b
以及a
敏感,b
是绑定到aa
和bb
信号,但它不会调用方法do_add()
。它是如何工作的,代码中是否有错误?编译代码:
g++ -I. -I$SYSTEMC_HOME/include -L. -L$SYSTEMC_HOME/lib-linux64 -Wl,-rpath=$SYSTEMC_HOME/lib-linux64 -o out adder.cpp -lsystemc -lm
./out
的
#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";
}
答案 0 :(得分:1)
这里有很多东西。首先,你从未真正开始模拟(参见函数sc_start
),即使你这样做也会立即退出,因为没有要处理的事件。最后,即使您修复了这些问题,您仍然会得到相同的结果,因为SystemC模拟硬件并在写入的同一个增量周期中读取端口将为您提供端口上的原始值而不是新写入的端口。硬件如何在零时间内改变信号的值?
我能给出的最好建议是查看下载SystemC的目录,然后您将看到PDF文档的目录。在我的SystemC上,它位于一个名为“docs”的目录中(根据你安装它的人和在哪里,它可能会有所不同)。如果您查看那里,您将找到“用户指南”和一些其他PDF文档。这些解释了SystemC的工作原理,并为您提供了可以根据自己的需要进行尝试和修改的示例。 “examples”文件夹中的SystemC源代码中也有一些示例。您可以尝试使用它们来感受它,也许只需剪切并粘贴一些代码并对其进行修改即可获得所需的代码。