Ошибка синтеза SystemC HLS

0

@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 (в частности, два десятикратных массива 10x10), а затем я использую сигнал разрешения, чтобы начать операцию умножения матрицы. Когда массивы 10x10 были умножены, я делаю сигнал в конце.

Я могу полностью понять, как ошибка говорит о том, что у меня бесконечные циклы while, поэтому я теперь использую while (флаг == 0) вместо цикла while.

  • 1
    Вы уверены, что инструменту нравится SC_THREAD? Я использую альтернативный инструмент, и мне приходится использовать конструкции SC_CTHREAD для моих подобных вещей.
  • 0
    Когда я переключаюсь на SC_CTHREAD, моя симуляция терпит неудачу. Должен ли я изменить использование CTHREADS?
Теги:
fpga
synthesis
systemc

1 ответ

2
Лучший ответ

Я думаю, вам нужно сначала просмотреть свой код. Я не эксперт SystemC, но я думаю, что многие вещи не синтезируются. Например, вы не можете использовать SC_THREAD в HLS для синтеза. Если вы хотите синтезировать свой код, вы должны кодировать его "аппаратным" способом.

  • 0
    Спасибо, я не знал, что SC_THREAD не был синтезируемым. Я изменю свою реализацию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню