Как инициализировать имя порта systemc, который является массивом?
Я хотел инициализировать имя порта. Порт является массивом, и мой код не работает.
SC_MODULE(example) {
sc_clock clk;
sc_signal<bool> mysignals[2];
public:
SC_CTOR(example)
:clk("clk"),
mysignals[0]("mysignals[0]"), // won't work
mysignals[1]("mysignals[1]") // won't work
{}
~example() {
}
};
Код ниже будет работать, давая clk
с именем "clk". тем не мение clk
порт не является массивом:
SC_MODULE(example) {
sc_clock clk;
public:
SC_CTOR(example)
:clk("clk")
{}
~example() {
}
};
Как мне назвать массив портов?
ОБНОВИТЬ:
Попробовал предложенный комментарий. Все еще не будет работать:
#include "systemc.h"
SC_MODULE(example) {
sc_clock clk;
sc_signal<bool> mysignals[2];
public:
SC_CTOR(example)
:clk("clk"),
mysignals{"mysig1", "mysig2"}
{}
~example() {
}
};
int sc_main(int argc, char* argv[]) {
example hello("HELLO");
return(0);
}
Составлено с:
g++ -I. -I<SYSTEMC LIB>/include -L. -L<SYSTEMC LIB>/lib-linux64 -o sim example.cpp -lsystemc -lm -std=c++0x
Ошибка:
example.cpp: в конструкторе 'example::example(sc_core::sc_module_name)': example.cpp:11: ошибка: неверный инициализатор массива
3 ответа
Как только я отправил ответ, я вспомнил вариант 3! Используйте sc_vector. Например:
SC_MODULE(M){
static const int SIZE = 4;
typedef sc_uint<16> DataType;
typedef sc_in<DataType> PortType;
typedef sc_vector<PortType> PortVectorType;
PortVectorType port_vec;
SC_CTOR(M) : port_vec("my_port", SIZE){
for(int i = 0; i < SIZE; ++i)
cout << port_vec[i].basename() << '\n';
}
};
int sc_main(int, char**){
M("m");
return 0;
}
Создает следующий вывод my_port_0 my_port_1 my_port_2 my_port_3
Два варианта: 1) Создать массив сигналов и дать systemc присваивать им имена 2) Массив указателей сигналов называть по мере их построения
Пример кода:
SC_MODULE (М) {
static const int SIZE = 4;
sc_signal<bool> S[SIZE]; //array of signals let sc name them
sc_signal<bool>* P[SIZE]; //array of pointers name on create
SC_CTOR(M){
for(int i = 0; i < SIZE; ++i) //new the signals and give them a name
P[i] = new sc_signal<bool>(("my_sig_" + to_string(i)).c_str());
}
};
int sc_main (int, char **) {
M m("m");
for(int i = 0; i < M::SIZE; ++i){
cout << "S[" << i << "].name = " << m.S[i].basename() << '\n';
cout << "P[" << i << "].name = " << m.P[i]->basename() << '\n';
}
return 0;
}
Производит следующий вывод на моей машине
P[0].name = signal_0
P[0].name = my_sig_0
S[1].name = signal_1
P[1].name = my_sig_1
S[0].name = signal_0
P[0].name = my_sig_0
S[1].name = signal_1
P[1].name = my_sig_1
S[2].name = signal_2
P[2].name = my_sig_2
S[3].name = signal_3
P[3].name = my_sig_3
с С++17 также работает:
sc_signal<bool> mysignals[2] {sc_signal<bool>{"sig1"},sc_signal<bool>{"sig2"}};
см. также: C++ copy elision / RVO - оптимизация возвращаемого значения