2017-01-30 6 views
0

Ich versuche, eine Art von SystemC-Port in ein anderes zu konvertieren:SystemC-Port Conversion

aus:

sc_port<sc_fifo_out_if<Type> > 

zu:

sc_export<tlm::tlm_analysis_if<Type> > 

ich diese Klasse mit einem Gewinde verwendet zu konvertieren zwischen den Typen.

class port_converter : public sc_core::sc_module{ 
public: 
    sc_port<sc_fifo_in_if<Type> > in_converter; 
    sc_port<tlm::tlm_analysis_if<Type> > out_converter; 

    // c'tor 
    SC_HAS_PROCESS(port_converter); 
    port_converter(sc_module_name nm) : 
     sc_module(nm), in_converter("in"), out_converter("out") { 
     SC_THREAD(main_action); 
    } 

    // main action 
    void main_action() { 
     while (1){ 
      out_converter->write(in_converter->read()); 
     } 
    } 
}; 

The solution diagram

Gibt es einen einfacheren Weg zwischen diesen Arten von Ports zu konvertieren?

Antwort

0

Die Schnittstellen sc_fifo_out_if und tlm_analysis_if sind nicht vollständig kompatibel. Also hier ist wahrscheinlich das Beste, was Sie bekommen können. Die Simulation wird mit einem Fehler beendet, wenn jemand versucht, eine inkompatible Methode zu verwenden.

Update: Ich bin mir nicht sicher, ob tlm_analysis_if eine nicht blockierende Operation garantiert.

template <typename T> 
struct my_converter : sc_fifo_out_if<T>, sc_core::sc_module { 

    sc_export<sc_fifo_out_if<T>>   in{"in"}; 
    sc_port<tlm::tlm_analysis_if<T>>  out{"out"}; 

    my_converter(sc_core::sc_module_name){ 
     in.bind(*this); 
    } 

    bool nb_write(const T &t) override { 
     out->write(t); 
    } 

    const sc_event &data_read_event() const override { 
     SC_REPORT_ERROR("my_converter", "data_read_event not supported!!"); 
     return m_data_read_event; 
    } 

    void write(const T &t) override { 
     nb_write(t); 
    } 

    int num_free() const override { 
     SC_REPORT_ERROR("my_converter", "num_free not supported!!"); 
     return 1; 
    } 

private: 
    sc_event m_data_read_event; // this even will never happen; 
};