当我创建sc_module
实例时,我给它一个字符串作为模块名称(sc_module_name
)。
如何获取当前正在运行的模块的名称?
答案 0 :(得分:4)
获取当前在systemc中运行的模块的名称:
使用sc_get_current_process_b
获取当前正在执行的进程(SC线程或方法)。然后使用get_parent
获取其父级,它将成为模块。然后使用basename
或name
获取其名称:
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