2016-10-10 60 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()只在調用過程中被調用。