2017-01-30 21 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; 
}; 

 Смежные вопросы

  • Нет связанных вопросов^_^