首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SystemC HLS综合误差

SystemC HLS综合误差
EN

Stack Overflow用户
提问于 2014-03-20 01:03:30
回答 1查看 1.4K关注 0票数 0

@ESYNCHK-77顶部函数'method_coupling‘(src/method_coupling.cpp:82)没有输出。可能的原因是:(1)输出参数通过值传递;(2)从未写入预期输出(参数或全局变量);(3)存在无限循环。

当我试图使用vivado HLS合成一个SystemC块时,我收到了上述错误。不幸的是,我找不到关于这个错误的任何文档,我希望有人能够描述正在发生的事情。

我的模块如下:

代码语言:javascript
运行
复制
#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数组被乘以时,我会在最后发出一个end信号。

我完全可以看到错误是如何暗示我有无限while循环的,因此我现在使用while (标志== 0)而不是while循环。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-20 22:36:46

我认为你必须先检查你的代码。我不是SystemC专家,但我认为有很多东西是不能合成的。例如,您不能在HLS中使用SC_THREAD进行合成。如果你期望合成你的代码,你应该用一种“硬件”的方式对它进行编码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22521451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档