首页 > 解决方案 > 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_clktype 和SC_CTHREAD两者?我需要以某种方式将 clk 转换为 bool 吗?

标签: systemc

解决方案


是的,您可以同时使用它,因为sc_in_clk它只是sc_in<bool>. sc_in_clk这意味着无论您使用还是sc_in<bool>with都无关紧要SC_CTHREAD

从文档中:

typedef sc_in<bool> sc_in_clk;

提供typedef sc_in_clk是为了方便将时钟输入添加到模块并向后兼容早期版本的 SystemC。应用程序可以互换使用sc_in_clksc_in<bool>

我试图在我自己的环境(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();除了or之外,它是否包含任何形式的等待功能void wait(int);?因为一个时钟线程进程可能只调用这两种形式的等待。


推荐阅读