如何在verilog或systemverilog中创建深度为2kb且宽度为32位的数据结构
答案 0 :(得分:0)
如果你想要一个带有4个字节的2KB内存,你只需要声明它:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.46.0</version>
</dependency>
这里第一部分是类型和宽度(31到0,包括),然后是变量名称(reg [31:0] mem [0:511]; // Or use logic instead of reg for the type in SystemVerilog
),后跟内存大小(我假设你想要KiB,而不仅仅是KB,即1024不是100)。
要访问内存中的单词,只需使用mem
格式即可。如果你希望内存可以通过字节寻址,你将需要做更多的工作或以不同的方式声明内存。
答案 1 :(得分:0)
@ 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之间的值)。