2017-06-16 212 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數組以寫入您的數據。