当我创建一个实例时,如果sc_module
我给它一个字符串作为模块名称(sc_module_name
)。
如何获取当前正在运行的模块的名称?
获取当前在 systemc 中运行的模块的名称:
用于sc_get_current_process_b
获取当前正在执行的进程(SC 线程或方法)。然后用于get_parent
获取其父级,这将是模块。然后使用basename
orname
得到它的名字:
const char* name = sc_core::sc_get_current_process_b()->get_parent()->basename();
(为简洁起见,省略了错误处理)
您可以简单地使用 name()
我曾经用它来确定哪个实例在做什么。
如果这不起作用,那是因为您需要 SC_HAS_PROCESS 构造函数而不是 SC_CTOR
不要将内置宏用于构造函数。假设模块名称为“counter”,请使用以下内容:
counter(sc_module_name _name):sc_module(_name)
{
cout << "Creating object " << _name;
}
_name
你可以在包含之后做各种事情<string>
。您可以使用string()
, 与+
运算符连接等。
此答案基于此帖子中的回复。
您可以简单地使用(所有 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