思考空间
如果要修改hls_stream对应的FIFO的深度,该采用哪个directive?
可以用STREAM修改FIFO的深度。可以在GUI下操作,也可以直接使用如下Tcl命令完成设置。
set_directive_stream -depth 512 -dim 1 "top" idx_fifo
在使用Xilinx的IP Block Memory Generator时,会出现如图1所示界面,这里有一个所谓的“ByteWrite Enable”,它的具体含义是什么呢?
从字面上看,其含义是Byte写使能,也就是以8-bit为单位写入数据。举例说明:输入数据为32-bit,那么就需要4-bit Byte写使能信号,这个使能信号与输入数据各位的对应关系如图2所示。从图中不难看出,当we[3]有效时,只会将输入数据的高8-bit写入到目标地址;当we[0]有效时,只会将输入数据的低8-bit写入到目标地址。其实,也就是根据写使能来更新指定地址上原始数据的某些位。
这里我们看一个单端口RAM,输入/输出数据为32-bit,读优先。直接采用SystemVerilog代码,从代码角度深入理解Byte写使能的含义。具体代码如图3所示。
在代码的第17行,声明了一个数组,其深度为DEPTH,宽度为DATA_WIDTH,其实DATA_WIDTH就是Byte写使能的个数(NUM_COL)和COL_WIDTH(8-bit,对应一个Byte)的乘积。该数组的初始值为0。代码第23行至第32行是核心部分,通过for…generate语句将数据在Byte写使能的作用下写入相应的地址。
对上述代码进行仿真,结果如图4所示。输入地址在Byte写使能有效时始终为1,输入数据始终为11223344(十六进制)。由于是读优先,可以看到输出数据依次更新相应的Byte。
这里再给出一个仿真结果,大家可自行分析理解。
思考空间
代码第17行对RAM的初始化是否可综合?