如下所示,代码下面的verilog使用多维寄存器数组来存储数据。
parameter DSIZE = 8;
parameter ASIZE = 4;
input [DSIZE-1:0] wdata;
input wclk,wen;
reg [ASIZE:0] wptr;
parameter MEMDEPTH = 1<<ASIZE;
reg [DSIZE-1:0] ex_mem [0:MEMDEPTH-1];
always @(posedge wclk)
if (wen)
ex_mem[wptr[ASIZE-1:0]] <= wdata;
我无法正确理解在ex_mem
中为wdata
分配值的最后一个赋值语句中发生的情况。括号中的部分(wptr[ASIZE-1:0]
)与ex_mem
相关联的部分以及ex_mem
的{{1}}存储位置是什么?
答案 0 :(得分:1)
在代码中,ex_mem
是一个有16个(MEMDEPTH
)个插槽的内存。每个时隙有8个(DSIZE
)位。 16个时隙可由4(ASIZE
)位寻址,但wptr
由于某种原因是5位信号,因此其最高有效位(MSB)不用于寻址存储器。
ex_mem[wptr[ASIZE-1:0]] <= wdata;
由于wptr[ASIZE-1:0]
是一个4位信号(ASIZE=4
),上面的分配可能会写入ex_mem[0]
和ex_mem[15]
之间的一个广告位。
答案 1 :(得分:1)
'wptr'只是一维寄存器。
因此,首先,verilog从'wptr'事物中提取ex_mem的索引。它使用此范围来执行此操作:ASIZE-1:0。
如果ASIZE为4,如您的示例所示,它可以从那里采样0到15的值。例如,
reg [4:0] wptr = 0x1B;
wptr[3:0] will give you 'B' (11).
现在,此索引值将应用于ex_mem数组以写入数据。