VIVADO HLS:How 声明二维数组的任意精度(或位精确)整数数据类型?
VIVADO HLS:How to declare arbitrary precision (or bit-accurate) integer data types for 2D array?
我在 Vivado HLS 中使用更大尺寸的矩阵。与正常"int"一样,它占用大量内存space并降低硬件速度。
因此,为了获得更好的优化和性能,最好使用任意精度(或位精确)整数数据类型。我看过VIVADO用户指南,我不清楚。但是,我不知道如何为二维数组初始化“ap_int.h”或“ap_cin.h”。谁能告诉我如何为下面的源代码应用 “ap_int.h”或“ap_cin.h”。
#define ROWS 102 //k
#define COLS 204
void GeneratorM(int msg[ROWS], int dout[COLS])
{
#pragma HLS INTERFACE s_axilite port=msg bundle=a
#pragma HLS INTERFACE s_axilite port=dout bundle=a
#pragma HLS INTERFACE s_axilite port=return bundle=a
int Generator[ROWS][COLS]= {0};
int G[ROWS][COLS] = {0};
int i,j,k,r,c,n;
k = ROWS;
r = ROWS;
c = COLS;
n = COLS;
static int H[ROWS][COLS];
int Codeword[COLS]= {0};
int s = 0;
for (i=0;i<k;i++)
for(j=0;j<k;j++)
if(i == j)
G[i][j] = 1;
for(i=0;i<r;i++)
for(j=0;j<k;j++)
G[j][k+i] = H[i][j];
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
Generator[i][j]=G[i][j];
}
for(j=0;j<n;j++)
{
for(i=0;i<k;i++)
{
s = s + msg[i]*Generator[i][j];
}
Codeword[j] = s % 2;
s = 0;
}
for(i=0;i<n;i++)
{
dout[i]=Codeword[i];
}
}
- ap_int.h 适用于 C++
- ap_cint.h 仅适用于 C
- According to ug902 - 高级综合 C 库,您可以将任意整数精度类型与 C 或 C++ 一起使用。 (请参阅第 208 页。)
基于 C 的 10 位整数示例:
#include <ap_cint.h>
int10 foo;
基于 C++ 的 10 位 int 示例:
#include <ap_int.h>
ap_int<10> foo;
重写您的示例以在 C 语言中使用大小为 10 位的任意精度整数数据类型看起来像这样并且它很好地符合 HLS :)
#include <ap_cint.h>
#define ROWS 102 //k
#define COLS 204
typedef int10 arbitraryInt;
void GeneratorM(int msg[ROWS], int dout[COLS])
{
#pragma HLS INTERFACE s_axilite port=msg bundle=a
#pragma HLS INTERFACE s_axilite port=dout bundle=a
#pragma HLS INTERFACE s_axilite port=return bundle=a
arbitraryInt Generator[ROWS][COLS]= {0};
arbitraryInt G[ROWS][COLS] = {0};
arbitraryInt i,j,k,r,c,n;
k = ROWS;
r = ROWS;
c = COLS;
n = COLS;
static arbitraryInt H[ROWS][COLS];
arbitraryInt Codeword[COLS]= {0};
arbitraryInt s = 0;
for (i=0;i<k;i++)
for(j=0;j<k;j++)
if(i == j)
G[i][j] = 1;
for(i=0;i<r;i++)
for(j=0;j<k;j++)
G[j][k+i] = H[i][j];
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
Generator[i][j]=G[i][j];
}
for(j=0;j<n;j++)
{
for(i=0;i<k;i++)
{
s = s + msg[i]*Generator[i][j];
}
Codeword[j] = s % 2;
s = 0;
}
for(i=0;i<n;i++)
{
dout[i]=Codeword[i];
}
}
我在 Vivado HLS 中使用更大尺寸的矩阵。与正常"int"一样,它占用大量内存space并降低硬件速度。
因此,为了获得更好的优化和性能,最好使用任意精度(或位精确)整数数据类型。我看过VIVADO用户指南,我不清楚。但是,我不知道如何为二维数组初始化“ap_int.h”或“ap_cin.h”。谁能告诉我如何为下面的源代码应用 “ap_int.h”或“ap_cin.h”。
#define ROWS 102 //k
#define COLS 204
void GeneratorM(int msg[ROWS], int dout[COLS])
{
#pragma HLS INTERFACE s_axilite port=msg bundle=a
#pragma HLS INTERFACE s_axilite port=dout bundle=a
#pragma HLS INTERFACE s_axilite port=return bundle=a
int Generator[ROWS][COLS]= {0};
int G[ROWS][COLS] = {0};
int i,j,k,r,c,n;
k = ROWS;
r = ROWS;
c = COLS;
n = COLS;
static int H[ROWS][COLS];
int Codeword[COLS]= {0};
int s = 0;
for (i=0;i<k;i++)
for(j=0;j<k;j++)
if(i == j)
G[i][j] = 1;
for(i=0;i<r;i++)
for(j=0;j<k;j++)
G[j][k+i] = H[i][j];
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
Generator[i][j]=G[i][j];
}
for(j=0;j<n;j++)
{
for(i=0;i<k;i++)
{
s = s + msg[i]*Generator[i][j];
}
Codeword[j] = s % 2;
s = 0;
}
for(i=0;i<n;i++)
{
dout[i]=Codeword[i];
}
}
- ap_int.h 适用于 C++
- ap_cint.h 仅适用于 C
- According to ug902 - 高级综合 C 库,您可以将任意整数精度类型与 C 或 C++ 一起使用。 (请参阅第 208 页。)
基于 C 的 10 位整数示例:
#include <ap_cint.h>
int10 foo;
基于 C++ 的 10 位 int 示例:
#include <ap_int.h>
ap_int<10> foo;
重写您的示例以在 C 语言中使用大小为 10 位的任意精度整数数据类型看起来像这样并且它很好地符合 HLS :)
#include <ap_cint.h>
#define ROWS 102 //k
#define COLS 204
typedef int10 arbitraryInt;
void GeneratorM(int msg[ROWS], int dout[COLS])
{
#pragma HLS INTERFACE s_axilite port=msg bundle=a
#pragma HLS INTERFACE s_axilite port=dout bundle=a
#pragma HLS INTERFACE s_axilite port=return bundle=a
arbitraryInt Generator[ROWS][COLS]= {0};
arbitraryInt G[ROWS][COLS] = {0};
arbitraryInt i,j,k,r,c,n;
k = ROWS;
r = ROWS;
c = COLS;
n = COLS;
static arbitraryInt H[ROWS][COLS];
arbitraryInt Codeword[COLS]= {0};
arbitraryInt s = 0;
for (i=0;i<k;i++)
for(j=0;j<k;j++)
if(i == j)
G[i][j] = 1;
for(i=0;i<r;i++)
for(j=0;j<k;j++)
G[j][k+i] = H[i][j];
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
Generator[i][j]=G[i][j];
}
for(j=0;j<n;j++)
{
for(i=0;i<k;i++)
{
s = s + msg[i]*Generator[i][j];
}
Codeword[j] = s % 2;
s = 0;
}
for(i=0;i<n;i++)
{
dout[i]=Codeword[i];
}
}