一、input array被约束为ap_hsinput array约束为ap_hs接口为ap_vld ap_data ap_ack;当使用索引访问input array是无效的数组依据被弱化为握手端口。二、案例#include array_FIFO.hvoid array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {#pragma HLS INTERFACE ap_hs register portd_iint i;// Breaks FIFO interface d_o[3] d_i[2];For_Loop: for (i0;i4;i) {d_o[i] d_i[idx[i]];printf(idx[i]%d\n\r,idx[i]);}}上述代码中输入数组d_i别约束为ap_hs后idx[4]的索引就已经没有用了因为这个ap_hs是握手信号默认就是将输入数组的值按照顺序的传输。不管idx索引是顺序的还是倒序的还是乱序的都已经没有作用了。三、TB设计#include array_FIFO.hint main () {din_t d_i[4];dout_t d_o[4];didx_t idx[4];int i, retval0;FILE *fp;// Create input datafor (i0;i4;i) {d_i[i] i10;//idx[i] i;idx[i] 3-i;}// Call the function to operate on the dataarray_FIFO(d_o,d_i,idx);// Save the results to a filefpfopen(result.dat,w);fprintf(fp, Din Dout\n);for (i0;i4;i) {fprintf(fp, %d %d\n, d_i[i], d_o[i]);}fclose(fp);// Compare the results file with the golden resultsretval system(diff --brief -w result.dat result.golden.dat);// if (retval ! 0) {// printf(Test failed !!!\n);// retval1;// } else {// printf(Test passed !\n);// }// Return 0 if the test passes//return retval;return 0;}这个是testbench仿真你可以看到idx是倒序的。四、仿真结果可以看到C inputs里面只能看到d_i不能看到index了因为index已经无用所以被优化掉了。上述代码其实被优化为#include array_FIFO.hvoid array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {#pragma HLS INTERFACE ap_hs register portd_iint i;// Breaks FIFO interface d_o[3] d_i[2];For_Loop: for (i0;i4;i) {// d_o[i] d_i[idx[i]];d_o[i] d_i[i];printf(idx[i]%d\n\r,idx[i]);}}五、将ap_hs去掉可以看到idx和d_i;六、修改#include array_FIFO.hvoid array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {#pragma HLS INTERFACE ap_hs register portd_iint i;// Breaks FIFO interface d_o[3] d_i[2];For_Loop: for (i0;i4;i) {//d_o[i] d_i[idx[i]];d_o[i] d_i[0];printf(idx[i]%d\n\r,idx[i]);}}这个是不行的约束ap_hs表示你的数组要是顺序访问的。七、再修改#include array_FIFO.hvoid array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {#pragma HLS INTERFACE ap_hs register portd_iint i;// Breaks FIFO interface d_o[3] d_i[2];For_Loop: for (i0;i4;i) {//d_o[i] d_i[idx[i]];d_o[i] d_i[i];printf(idx[i]%d\n\r,idx[i]);}}这个和刚才用d_o[i] d_i[idx[i]];的仿真效果是一样的idx[i]被优化掉了。
array input高层次综合设-ap_hs
一、input array被约束为ap_hsinput array约束为ap_hs接口为ap_vld ap_data ap_ack;当使用索引访问input array是无效的数组依据被弱化为握手端口。二、案例#include array_FIFO.hvoid array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {#pragma HLS INTERFACE ap_hs register portd_iint i;// Breaks FIFO interface d_o[3] d_i[2];For_Loop: for (i0;i4;i) {d_o[i] d_i[idx[i]];printf(idx[i]%d\n\r,idx[i]);}}上述代码中输入数组d_i别约束为ap_hs后idx[4]的索引就已经没有用了因为这个ap_hs是握手信号默认就是将输入数组的值按照顺序的传输。不管idx索引是顺序的还是倒序的还是乱序的都已经没有作用了。三、TB设计#include array_FIFO.hint main () {din_t d_i[4];dout_t d_o[4];didx_t idx[4];int i, retval0;FILE *fp;// Create input datafor (i0;i4;i) {d_i[i] i10;//idx[i] i;idx[i] 3-i;}// Call the function to operate on the dataarray_FIFO(d_o,d_i,idx);// Save the results to a filefpfopen(result.dat,w);fprintf(fp, Din Dout\n);for (i0;i4;i) {fprintf(fp, %d %d\n, d_i[i], d_o[i]);}fclose(fp);// Compare the results file with the golden resultsretval system(diff --brief -w result.dat result.golden.dat);// if (retval ! 0) {// printf(Test failed !!!\n);// retval1;// } else {// printf(Test passed !\n);// }// Return 0 if the test passes//return retval;return 0;}这个是testbench仿真你可以看到idx是倒序的。四、仿真结果可以看到C inputs里面只能看到d_i不能看到index了因为index已经无用所以被优化掉了。上述代码其实被优化为#include array_FIFO.hvoid array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {#pragma HLS INTERFACE ap_hs register portd_iint i;// Breaks FIFO interface d_o[3] d_i[2];For_Loop: for (i0;i4;i) {// d_o[i] d_i[idx[i]];d_o[i] d_i[i];printf(idx[i]%d\n\r,idx[i]);}}五、将ap_hs去掉可以看到idx和d_i;六、修改#include array_FIFO.hvoid array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {#pragma HLS INTERFACE ap_hs register portd_iint i;// Breaks FIFO interface d_o[3] d_i[2];For_Loop: for (i0;i4;i) {//d_o[i] d_i[idx[i]];d_o[i] d_i[0];printf(idx[i]%d\n\r,idx[i]);}}这个是不行的约束ap_hs表示你的数组要是顺序访问的。七、再修改#include array_FIFO.hvoid array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {#pragma HLS INTERFACE ap_hs register portd_iint i;// Breaks FIFO interface d_o[3] d_i[2];For_Loop: for (i0;i4;i) {//d_o[i] d_i[idx[i]];d_o[i] d_i[i];printf(idx[i]%d\n\r,idx[i]);}}这个和刚才用d_o[i] d_i[idx[i]];的仿真效果是一样的idx[i]被优化掉了。