2017-01-30 8 views
0

나는 다른에 SystemC를 포트의 한 유형으로 변환하는 것을 시도하고있다 :SystemC를 포트 변환

에서 :

sc_port<sc_fifo_out_if<Type> > 

에 :

sc_export<tlm::tlm_analysis_if<Type> > 

내가 변환하는 스레드와이 클래스를 사용 유형들 사이.

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

포트 이러한 유형의 사이의 변환을 할 수있는 간단한 방법이 있나요?

답변

0

인터페이스 sc_fifo_out_if 및 tlm_analysis_if는 완전히 호환되지 않습니다. 그래서 여기에 아마도 당신이 얻을 수있는 최선입니다. 누군가가 호환되지 않는 방법을 사용하려고하면 시뮬레이션이 오류와 함께 중단됩니다.

업데이트 : tlm_analysis_if가 비 차단 동작을 보장하는지 잘 모르겠습니다.

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; 
};