SC_CTHREAD中的时钟类型

时间:2018-06-20 13:45:50

标签: systemc

我了解到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吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以同时使用它们,因为sc_in_clk只是sc_in<bool>的typedef。这意味着您将sc_in_clksc_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函数?因为计时线程进程只能调用这两种等待形式。