
1.设计一scalar标量核心代码#include array_FIFO.h//void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {//void array_FIFO (dout_t d_o[4], din_t *d_i, didx_t idx[4]) {void array_FIFO (dout_t d_o[4], din_t d_i, didx_t idx[4]) {//#pragma HLS INTERFACE axis register both portd_i#pragma HLS INTERFACE axis portd_i//#pragma HLS INTERFACE s_axilite register depth4 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];d_o[i] d_i;}}2.设计二scalar标量核心代码修改版-加了volatile修饰#include array_FIFO.h//void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {//void array_FIFO (dout_t d_o[4], din_t *d_i, didx_t idx[4]) {void array_FIFO (dout_t d_o[4], volatile din_t d_i, didx_t idx[4]) {//#pragma HLS INTERFACE axis register both portd_i#pragma HLS INTERFACE axis portd_i//#pragma HLS INTERFACE s_axilite register depth4 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];d_o[i] d_i;}}上述两种设计方式最终都完成了c综合c仿真rtl仿真但是也只是能完成而已功能完全不对为什么两种代码的rtl仿真情况可以看到Tvalid是有问题的只是在clock的低电平阶段才是拉高的并且只有半个clock拉高后续压根没有拉高。这个是为什么因为你将标量作为约束AXIS接口这个valid到底怎么产生HLS综合工具压根不知道。为什么因为你的标量在TB接口是随时都可以修改的。你的变量可能十个clock不变可能每个clock都变那么综合工具是怎么来翻译你这个valid如果说每个clock都valid那么你一个数据被重复传输了多次如果说你只有data改变了valid有效但是综合工具不知道你什么时候改变了。3.总结将input scalar标量作为axis接口约束是一个非常糟糕的设计虽然综合工具让你通过了。但是你的功能是完全错误的。AXI4-Stream 协议需要处理“数据流”而标量是“单个值”二者在硬件语义和时序要求上根本不兼容。