我了解到SC_CTHREAD
仅适用于bool
,例如:
SC_MODULE(my_module){
sc_in<bool> clk;
// ...
void foo();
// ...
SC_CTOR(my_module){
SC_CTHREAD(foo, clk.pos());
}
}
但是,如果我的模块中有sc_in_clk clk
,例如本示例中的http://www.asic-world.com/systemc/process3.html,该怎么办?在进行这样的模拟之后,不会计算函数的结果,因此我使用的是SC_METHOD(foo); sensitive << clk.pos();
。
我的问题是:如何同时使用sc_in_clk
类型和SC_CTHREAD
?我需要以某种方式将clk转换为bool吗?
答案 0 :(得分:1)
是的,您可以同时使用它们,因为sc_in_clk
只是sc_in<bool>
的typedef。这意味着您将sc_in_clk
或sc_in<bool>
与SC_CTHREAD
一起使用都没有关系。
从文档中:
typedef sc_in<bool> sc_in_clk;
提供typedef sc_in_clk 是为了在向模块添加时钟输入时提供方便,并与SystemC的早期版本向后兼容。应用程序可以交替使用 sc_in_clk 或 sc_in
。
我试图在自己的环境(SystemC 2.3.2)中重现您的问题。根据您发布的摘录,我创建了这个小型SystemC程序:
#include <systemc.h>
SC_MODULE(my_module)
{
sc_in_clk clk;
void foo();
SC_CTOR(my_module)
{
SC_CTHREAD(foo, clk.pos());
}
};
void my_module::foo()
{
while(1)
{
cout << sc_time_stamp() << endl;
wait();
}
}
my_module *DUT;
int sc_main(int argc, char** argv){
sc_clock clk("clk", 10, SC_NS);
DUT = new my_module("my_module");
DUT->clk(clk);
sc_start(50, SC_NS);
return 0;
}
此代码可以正常工作,输出为:
0 s
10 ns
20 ns
30 ns
40 ns
您可以尝试将代码的结构与上面的程序的结构进行匹配,以查找代码中潜在的其他错误。
您的void foo()
的结构是什么?它是否包含void wait();
或void wait(int);
以外的任何形式的wait函数?因为计时线程进程只能调用这两种等待形式。