如何获取当前正在运行的模块的sc_module_name

时间:2013-08-06 10:55:40

标签: c++ systemc

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

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

4 个答案:

答案 0 :(得分:4)

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

使用sc_get_current_process_b获取当前正在执行的进程(SC线程或方法)。然后使用get_parent获取其父级,它将成为模块。然后使用basenamename获取其名称:

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

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

答案 1 :(得分:1)

您可以简单地使用name()

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

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

答案 2 :(得分:0)

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

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

包含_name后,您可以使用<string>执行各种操作。您可以使用string(),与+运算符连接等。

答案 3 :(得分:0)

此答案基于此post中的回复。

您可以简单地使用name()(所有sc_module的基类)提供的方法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