- PYNQ version & Board name & Tool Version
- Full details of the error message you see, or a detailed description of the problem you experience.
- Steps to reproduce the problem, and if needed: source code and bitstream or any relevant files
- Debug steps that you have taken to resolve the problem →
Hi to whom it may concern,
I am using a xc7z020clg400-1 to accomplish my project as a matrix calculation.
But for now, it is facing a transport problems as my following code.
This code model was original modified to transfer a float matrix, and i rewrite them to make it more accuracy.
I have tried my main calculator was able to print out the results as float type.
And here are the codes below:
test.cpp:
extern "C" {
void calculator(hls::stream<axis_t> &in, hls::stream<axis_t> &out) {
#pragma HLS INTERFACE s_axilite port = return bundle = control
#pragma HLS INTERFACE axis port = in
#pragma HLS INTERFACE axis port = out
DataType l_A[N2];
DataType l_C[N2];
#pragma HLS ARRAY_PARTITION variable = l_A dim = 1
#pragma HLS ARRAY_PARTITION variable = l_C dim = 1
int j_limit = 1024 / DataTypeSize;
int i_limit = 3;
converter_t converter;
load_A:
for (int i = 0; i <= i_limit; i++) {
axis_t temp = in.read();
for (int j = 0; j < j_limit; j++) {
int high = j * DataTypeSize + DataTypeSize - 1;
int low = j * DataTypeSize;
int index = i * 16 + j;
//converter.i = temp.data.range(high, low);
//l_A[index] = converter.d;
l_A[index] = temp.data.range(high, low);
}
}
main<DataType>(l_A, l_C);
writeC:
for (int i = 0; i <= i_limit; i++) {
axis_t temp;
for (int j = 0; j < j_limit; j++) {
int high = j * DataTypeSize + DataTypeSize - 1;
int low = j * DataTypeSize;
converter.d = l_C[ i * 16 + j ];
temp.data.range(high, low) = converter.i;
}
ap_uint<1> last = 0;
if (i == i_limit) {
last = 1;
}
temp.last = last;
temp.keep = -1; // enabling all bytes
out.write(temp);
}
}
}
here is the .h file:
#ifndef _MMULT_
#define _MMULT_
#include "ap_axi_sdata.h"
#include "ap_int.h"
#include <inttypes.h>
#define N 8
#define N2 64 // N*N
#define S4 6 //Column of A in Controller
#define S5 12 //Column of A in Controller *2
#define S6 2 //Line of B in Controller
#define DWIDTH 1024
typedef ap_axiu<DWIDTH, 0, 0, 0> axis_t;
typedef ap_uint<1024> uint1024_t;
typedef double DataType;
const int DataTypeSize = sizeof(DataType) * 8;
typedef ap_uint<DataTypeSize> DataTypeInt;
typedef union {
double d;
uint64_t i;
} converter_t;
converter_t converter;
template <typename T>
void main(T a[N2], T b[N2]);
#endif
And last here is my testbench:
#include "matmult.h"
//#include "test.cpp"
int main(void)
{
DataType matOp1[N2]={0};
DataType matMult_hw[N2]={1};
main <double>(matOp1, matMult_hw);
return 0;
}
If there is any possible error, please feel free to comment here.
Thank you for click in my topic!