verilog中的多维数组值赋值

时间:2017-06-16 10:37:57

标签: 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_mem中为wdata分配值的最后一个赋值语句中发生的情况。括号中的部分(wptr[ASIZE-1:0])与ex_mem相关联的部分以及ex_mem的{​​{1}}存储位置是什么?

2 个答案:

答案 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数组以写入数据。