2016-09-19 4 views
1

Рассмотрим следующий пример, где выход одного модуля (inner::out) предполагается управлять двумя выходами (outer::out и outer::out2) уровня верхней иерархии:Вождение sc_out из sc_signal

#include <systemc.h> 

SC_MODULE(inner) { 
    sc_out<bool> out; 

    SC_CTOR(inner) : out("out") { 
     SC_THREAD(doit); 
    }; 

    void doit() { 
     for (int i=0; i<10; ++i) { 
      out != out; 
      wait(10, SC_NS); 
     } 
    } 
}; 


SC_MODULE(outer) { 
    sc_out<bool> out, out2; 

    SC_CTOR(outer) : out("out"), out2("out2"), i("inner"), out_s("out_s") { 
     i.out(out_s); 

     out(out_s); 
     out2(out_s); 
    } 

    inner i; 

    sc_signal<bool> out_s; 
}; 


int sc_main(int argc, char **argv) { 
    outer o("outer"); 

    sc_start(1, SC_MS); 

    return 0; 
} 

https://www.edaplayground.com/x/5s2C#

При этом возникает следующая погрешность:

Error: (E115) sc_signal<T> cannot have more than one driver: 
signal `outer.out_s' (sc_signal) 
first driver `outer.inner.out' (sc_out) 
second driver `outer.out2' (sc_out) 
In file: ../../../../src/sysc/communication/sc_signal.cpp:73 

Похоже, что outer::out2 считается приводout_s вместо приводится в движение им. Есть ли что-то очевидное, что я не замечаю? Есть ли способ сделать эту работу без использования явного SC_METHOD, чувствительного к inner::out внутри outer?

ответ

1

Ваш дизайн описывает сигнал, управляемый тремя различными выходными портами - вы не хотите.

Вы можете использовать привязку порта к порту. Если вы не знакомы с концепцией, раздел 4.1.3 «Порт связывания и экспорта связывания» в SystemC LRM описывает это следующим образом:

When port A is bound to port B, and port B is bound to channel C, the effect shall be the same as if port A were bound directly to channel C. Wherever this standard refers to port A being bound to channel C, it shall be assumed this means that port A is bound either directly to channel C or to another port that is itself bound to channel C according to this very same rule. This same rule shall apply when binding exports.

С порта до порта привязки, вы можете связать inner::out напрямую как outer::out, так и outer::out2, без сигнала между ними. Например:

#include <systemc.h> 

SC_MODULE(inner) { 
    sc_port<sc_signal_inout_if<bool>, 2> out; 

    SC_CTOR(inner) : out("out") { 
     SC_THREAD(doit); 
    }; 

    void doit() { 
     for (int i=0; i<10; ++i) { 
      out[0]->write(!out[0]->read()); 
      out[1]->write(!out[1]->read()); 
      wait(10, SC_NS); 
     } 
    } 
}; 


SC_MODULE(outer) { 
    sc_out<bool> out, out2; 

    SC_CTOR(outer) : out("out"), out2("out2"), i("inner") { 
     i.out(out); 
     i.out(out2); 
    } 

    inner i; 
}; 


int sc_main(int argc, char **argv) { 
    outer o("outer"); 
    sc_signal<bool> out_s; 
    sc_signal<bool> out2_s; 

    o.out(out_s); 
    o.out2(out2_s); 

    sc_trace_file *tf = sc_create_vcd_trace_file("trace"); 
    sc_trace(tf, out_s, "out_s"); 
    sc_trace(tf, out2_s, "out2_s"); 

    sc_start(1, SC_MS); 

    sc_core::sc_close_vcd_trace_file(tf); 

    return 0; 
} 

Есть несколько вещей, чтобы отметить в приведенном выше коде:

  • inner::out объявлен как sc_port<sc_signal_inout_if<bool>, 2>, которая в основном такой же, как sc_out но позволяет порту быть связанный с двумя каналами. sc_out может быть привязан только к одному каналу.
  • При письме на номер inner::out вы должны указать связанный канал, по которому вы едете. Это делается с оператором [] - см. inner::doit() выше, где приводятся оба связанных канала.

При запуске, приведенный выше код создает файл trace.vcd, который показывает уровни на двух сигналов, out_s и out2_s, переключая.

Объяснив все это, я не уверен, что это действительно то, что вы хотите. Наличие выходного порта вентилятора, как это довольно необычно. Вам действительно нужны два выходных порта на outer?

+0

К сожалению, это не совсем то, что я хотел, так как мне нужно было изменить «внутреннее», чтобы отразить требования, предъявляемые к 'external'. Я надеялся, что существует способ подключения одного «sc_signal» к 'inner :: out' и диск двух выходов' outer' (так же, как вы можете, например, в VHDL). Тем не менее, похоже, что это просто недостаток SystemC. Что касается вашего вопроса, действительно ли это нужно: к сожалению, я занимаюсь совместимостью с моделью VHDL. – rainer

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