5

当我创建一个实例时,如果sc_module我给它一个字符串作为模块名称(sc_module_name)。

如何获取当前正在运行的模块的名称?

4

4 回答 4

5

获取当前在 systemc 中运行的模块的名称:

用于sc_get_current_process_b获取当前正在执行的进程(SC 线程或方法)。然后用于get_parent获取其父级,这将是模块。然后使用basenameorname得到它的名字:

const char* name = sc_core::sc_get_current_process_b()->get_parent()->basename();

(为简洁起见,省略了错误处理)

于 2013-08-08T10:32:42.017 回答
1

您可以简单地使用 name()

我曾经用它来确定哪个实例在做什么。

如果这不起作用,那是因为您需要 SC_HAS_PROCESS 构造函数而不是 SC_CTOR

于 2020-05-09T10:46:00.717 回答
0

不要将内置宏用于构造函数。假设模块名称为“counter”,请使用以下内容:

counter(sc_module_name _name):sc_module(_name)
{
    cout << "Creating object " << _name;
}

_name你可以在包含之后做各种事情<string>。您可以使用string(), 与+运算符连接等。

于 2013-08-08T10:02:21.073 回答
0

此答案基于此帖子中的回复。

您可以简单地使用(所有 sc_module 的基类)name()提供的方法sc_object来获取此模块的分层名称。

例如,我有一个tb_adder包含一个Adder作为子模块的测试台。然后在sc_main()函数中(或任何可以访问模块的地方),我可以使用name()方法来获取每个模块的名称。

源代码:

#include <systemc>
#include <iostream>


SC_MODULE(Adder) {
    sc_core::sc_in<bool>             clock;
    // more ports definition here

    void do_work() {
        /*do some work here */
    }

    SC_CTOR(Adder) {
        SC_CTHREAD(do_work, clock.pos());
    }
};

SC_MODULE(tb_adder) {
    sc_core::sc_in<bool> clock;

    Adder *dut;

    SC_CTOR(tb_adder) {
        dut = new Adder("adder");
        dut->clock(clock);
    }
};

int sc_main(int argc, char* argv[]) {

    sc_core::sc_clock clock ("my_clock", 1, 0.5);

    tb_adder tb("tb_adder");
    tb.clock(clock);

    std::cout << "The name of the tb is: " << tb.name() << std::endl;
    std::cout << "The name of the adder is: " << tb.dut->name() << std::endl;

    return 0;
}

输出:

The name of the tb is: cool_tb_adder
The name of the adder is: cool_tb_adder.fun_adder
于 2018-10-13T14:46:46.813 回答