2016-10-10 61 views
0

我想打印sc_signal连接到的sc_module的名称。SystemC - 如何获取sc_signal连接的模块名称?

如何从“sig_out”中获取以下代码中的模块名称“module_a”?

#include "systemc.h" 

class sig_if : virtual public sc_interface 
{ 
}; 

class my_sig : public sc_module, public sig_if 
{ 
public: 
    my_sig(sc_module_name nm) : sc_module(nm) 
    { 
    } 
}; 

SC_MODULE(test_module) 
{ 
    sc_port<sig_if> out; 

    SC_CTOR(test_module) 
    { 
    } 
}; 

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

    test_module module_a("module_a"); 
    my_sig sig_out("sig_out"); 

    module_a.out(sig_out); 
    // std::cout << sig_out.get_parent() << std::endl; 

    sc_start(); 
    return 0; 
} 

回答

0

你可以在my_sig类中重写sc_interface::register_port()保存到绑定端口的参考。绑定端口的父节点是包含该端口的模块。

#include <iostream> 
#include <cassert> 
#include "systemc.h" 

class sig_if : virtual public sc_interface 
{ 
}; 

class my_sig : public sc_module, public sig_if 
{ 
public: 
    my_sig(sc_module_name nm) : sc_module(nm), bound_port(NULL) 
    { 
    } 

    void register_port(sc_port_base& port, const char*) { 
     bound_port = &port; 
    } 

    sc_object* get_bound_module() const { 
     assert(bound_port); 
     return bound_port->get_parent_object(); 
    }; 

    sc_port_base* bound_port; 
}; 

SC_MODULE(test_module) 
{ 
    sc_port<sig_if> out; 

    SC_CTOR(test_module) 
    { 
    } 
}; 

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

    test_module module_a("module_a"); 
    my_sig sig_out("sig_out"); 

    module_a.out(sig_out); 

    sc_start(0, SC_NS); 

    std::cout << sig_out.get_bound_module()->name() << std::endl; 

    return 0; 
} 

以上代码打印的名称为module_a。请注意0​​只能在细化后才能调用,也就是sc_start()被调用后,因为sc_interface::register_port()只在调用过程中被调用。