如何在verilog或systemverilog中创建深度为2kb,宽度为32位的数据结构
@Unn的答案对于静态数据或路由信号是正确的,但它缺少完整内存的控制信号 .
您需要将结构声明为 reg [31:0] mem [511:0]; (如Unn所述) . 您还需要一些方法来更改数据 . 请注意,我翻转了内存大小的索引顺序(只是个人偏好) .
reg [31:0] mem [511:0];
如果所有数据结构同时更改,则可以使用以下命令:
reg [31:0] mem [511:0]; reg [31:0] mem_input [511:0]; wire mem_we; integer i; always @(posedge clk) begin mem <= mem_we ? mem_input : mem ; end
如果您只想更改部分数据,一个选项是允许每个时钟周期更改每个32位字 . 这将需要更多路由,但允许并行更改数据 . 在这种情况下,您需要以下内容:
reg [31:0] mem [511:0]; reg [31:0] mem_input [511:0]; wire [511:0] mem_we; integer i; always @(posedge clk) begin for (i=0; i<512; i=i+1) mem[i] <= mem_we[i] ? mem_input [i] : mem [i]; end
另一种选择是使用寻址来改变值 . 您一次只能更改一个32位字,但您可以节省路由 .
reg [31:0] mem [511:0]; reg [31:0] mem_input; wire [8:0] mem_addr; wire mem_we; integer i; always @(posedge clk) begin mem <= mem; if (mem_we) mem[mem_addr] <= mem_input; end
mem_we 是内存"write-enable" - 断言它写入内存(整体在1和3中,或每个单词在2中) .mem_input 是内存的输入(新值) .mem_addr 是要在3中更改的单词(0到511之间的值) .
mem_we
mem_input
mem_addr
如果你想要一个带有4个字节的2KB内存,你只需要声明它:
reg [31:0] mem [0:511]; // Or use logic instead of reg for the type in SystemVerilog
这里的第一部分是类型和宽度(31到0,包括 endpoints ),然后是变量名称( mem ),后跟内存大小(我假设您想要KiB,而不仅仅是KB,即1024不是100) .
mem
要访问内存中的单词,只需使用 mem[addr] 格式 . 如果您希望内存按字节寻址,则必须执行更多工作或以不同方式声明内存 .
mem[addr]
2 回答
@Unn的答案对于静态数据或路由信号是正确的,但它缺少完整内存的控制信号 .
您需要将结构声明为
reg [31:0] mem [511:0];
(如Unn所述) . 您还需要一些方法来更改数据 . 请注意,我翻转了内存大小的索引顺序(只是个人偏好) .如果所有数据结构同时更改,则可以使用以下命令:
如果您只想更改部分数据,一个选项是允许每个时钟周期更改每个32位字 . 这将需要更多路由,但允许并行更改数据 . 在这种情况下,您需要以下内容:
另一种选择是使用寻址来改变值 . 您一次只能更改一个32位字,但您可以节省路由 .
mem_we
是内存"write-enable" - 断言它写入内存(整体在1和3中,或每个单词在2中) .mem_input
是内存的输入(新值) .mem_addr
是要在3中更改的单词(0到511之间的值) .如果你想要一个带有4个字节的2KB内存,你只需要声明它:
reg [31:0] mem [0:511]; // Or use logic instead of reg for the type in SystemVerilog
这里的第一部分是类型和宽度(31到0,包括 endpoints ),然后是变量名称(
mem
),后跟内存大小(我假设您想要KiB,而不仅仅是KB,即1024不是100) .要访问内存中的单词,只需使用
mem[addr]
格式 . 如果您希望内存按字节寻址,则必须执行更多工作或以不同方式声明内存 .