【发布时间】:2023-03-24 01:03:01
【问题描述】:
如何在verilog或systemverilog中创建深度为2kb、宽度为32位的数据结构
【问题讨论】:
如何在verilog或systemverilog中创建深度为2kb、宽度为32位的数据结构
【问题讨论】:
如果你想要一个 4 字节字的 2KB 内存,你只需要这样声明:
reg [31:0] mem [0:511]; // Or use logic instead of reg for the type in SystemVerilog
这里的第一部分是类型和宽度(包括 31 到 0),然后是变量名 (mem),然后是内存大小(我假设您想要 KiB,而不仅仅是 KB,即 1024 而不是 100 )。
要访问内存中的一个字,只需使用mem[addr] 格式。如果您希望内存可以按字节寻址,则必须做更多的工作或以不同的方式声明内存。
【讨论】:
@Unn 的答案对于静态数据或路由信号是正确的,但它缺少完整内存的控制信号。
您需要将您的结构声明为reg [31:0] mem [511:0];(如 Unn 所述)。您还需要一些方法来更改数据。请注意,我翻转了内存大小的索引顺序(只是个人喜好)。
如果你所有的数据结构同时发生变化,你可以使用如下:
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 是内存“可写” - 断言它写入内存(在 1 和 3 中作为一个整体,或在 2 中按字)。mem_input 是输入(新值)到内存中。mem_addr 是要在 3 中更改的单词(0 到 511 之间的值)。
【讨论】:
mem <= mem; 行(通常最接近您所拥有的)是不需要的,并且可能会减慢模拟速度(除非可能发生或可能不会发生的良好优化),mem 无论如何都会保留它的值,不需要重新分配。
reg(没有任何其他逻辑)会让人记忆深刻。跨度>