访问verilog中字节对齐内存中的字(32位)


module data_mem(
input clk,
input [31:0] addr,
input [31:0] wdata,
input wr_en,
input rd_en,
output [31:0] rdata
);
reg [7:0] Mem [255:0];
assign rdata = rd_en ? Mem[addr]:32'bxxxxxxxx; 
always @ (posedge clk) begin
if (wr_en) 
Mem[addr] <= wdata;
end
endmodule

当wr_en标志为1时,希望将4字节Mem[3:0]分配给wdata进行写入。更准确地说是Mem[addr+3:addr]。我该怎么做?

三个选项:

  1. 使用级联:{Mem[addr+3],Mem[addr+2],Mem[addr+1],Mem[addr]} <= wdata;

  2. 显式范围选择:

begin
Mem[addr+3] <= wdata[31:24];
// other assigments
Mem[addr] <= wdata[7:0];
end
  1. 或者您可以用+索引向量和数组:这允许for(i=0;i<4;i=i+1) Mem[addr+i] <= wdata[i*8 +: 8]

最新更新