@E [SYNCHK-77] У верхней функции ‘method_coupling’ (src / method_coupling.cpp: 82) нет выходных данных. Возможные причины: 1) выходные параметры передаются по значению; (2) предполагаемые выходные данные (параметры или глобальные переменные) никогда не записываются; (3) Есть бесконечные петли.
Я получаю вышеупомянутую ошибку, когда я пытаюсь синтезировать блок SystemC, используя vivado HLS. К сожалению, я не могу найти документацию по этой ошибке, и я надеюсь, что кто-то может описать, что происходит.
Мой модуль следующий:
#include "systemc.h"
#define NUM_REGIONS 10
SC_MODULE(method_coupling){
sc_in<bool> en;
sc_in<bool> clock;
sc_in<bool> reset;
sc_in<double> a;
sc_in<double> in_0;
sc_in<double> in_1;
sc_out<double> out[NUM_REGIONS];
sc_out<bool> done;
sc_in<bool> valid_data0;
sc_in<bool> valid_data1;
double input_0[NUM_REGIONS][NUM_REGIONS];
double input_1[NUM_REGIONS][NUM_REGIONS];
sc_fifo<double> fifo_input_0;
sc_fifo<double> fifo_input_1;
float sum;
int flag;
void init_0(){
while(true){
wait();
if(valid_data0.read() == 1) fifo_input_0.write(in_0.read());
}
}
void init_1(){
while(true){
wait();
if(valid_data1.read() == 1) fifo_input_1.write(in_1.read());
}
}
void do_coupling() {
int i;
for(i=0;i<NUM_REGIONS;i++){
out[i].write(0);
}
flag = 0;
while(flag == 0){
wait();
if(reset.read() == 1){
int i;
for(i = 0 ; i < NUM_REGIONS; i++){
out[i].write(0);
}
done.write(0);
}
else if(en.read() == 1){
int i,j;
done.write(0);
for(i=0; i<NUM_REGIONS;i++){
for(j=0; j<NUM_REGIONS;j++){
if(!(input_0[i][j] = fifo_input_0.read())) cout << "fifo0 is empty" << endl;
if(!(input_1[i][j] = fifo_input_1.read())) cout << "fifo1 is empty" << endl;
}
}
for(i = 0 ; i < NUM_REGIONS; i++){
sum = 0;
for(j = 0; j < NUM_REGIONS; j++){
sum += input_0[i][j]*input_1[i][j];
wait();
}
out[i].write(a.read()*sum);
wait();
}
done.write(1);
flag = 1;
break;
}
}
}
SC_CTOR(method_coupling): fifo_input_0 ("fifo_input_0", NUM_REGIONS*NUM_REGIONS), fifo_input_1 ("fifo_input_1", NUM_REGIONS*NUM_REGIONS) {
SC_THREAD(do_coupling){
//for(int i= 0; i<NUM_REGIONS; i++){
// sensitive << out[i];
//}
sensitive << en << reset << done << clock.pos();
}
SC_THREAD(init_0){
sensitive << valid_data0 << clock.pos();
}
SC_THREAD(init_1){
sensitive << valid_data1 << clock.pos();
}
}
};
Я читаю данные в fifo (в частности, в два двойных массива 10×10), а затем использую сигнал разрешения, чтобы начать операцию умножения матриц. Когда умножить массивы 10х10, я поднимаю готовый сигнал в конце.
Я полностью вижу, как из-за ошибки можно предположить, что у меня бесконечные циклы while, поэтому теперь я использую цикл while (flag == 0) вместо цикла while true.
Я думаю, что вы должны пересмотреть свой код в первую очередь. Я не эксперт SystemC, но я думаю, что многое не может быть синтезировано. Например, вы не можете использовать SC_THREAD
в ЗОЖ для синтеза. Если вы ожидаете синтезировать свой код, вы должны кодировать его «аппаратным» способом.
Других решений пока нет …