SC_CTHREAD 中的时钟类型

Clock type in SC_CTHREAD

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

是的,您可以同时使用它们,因为 sc_in_clk 只是 sc_in<bool> 的类型定义。这意味着使用 sc_in_clksc_in<bool>SC_CTHREAD 无关紧要。

来自文档:

typedef sc_in<bool> sc_in_clk;

The typedef sc_in_clk is provided for convenience when adding clock inputs to a module and for backward compatibility with earlier versions of SystemC. An application may use sc_in_clk or sc_in< bool > interchangeably.

我试图在我自己的环境 (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。