如何在verilog中创建深度为2kb,宽度为32位的数据结构?

时间:2015-09-18 11:25:43

标签: verilog system-verilog

如何在verilog或systemverilog中创建深度为2kb且宽度为32位的数据结构

2 个答案:

答案 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之间的值)。