2017-06-16 182 views
0

下面的Verilog代码使用多维寄存器阵列来存储数据。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_memwdata分配值的最后一个赋值语句会发生什么。括号内的部分(wptr[ASIZE-1:0])与ex_mem关联的部分返回并将ex_mem的哪个位置返回wdata得到存储?

+0

我不太清楚你不了解什么。 'wptr [ASIZE-1:0]'计算为'wptr'的'ASIZE'最低位,当解释为'ex_mem'中的位置时,'wdata'被存储到该位置。 – mkrieger1

回答

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

'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数组以写入您的数据。