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