首页 文章

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

提问于
浏览
0

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

2 回答

  • 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 是内存"write-enable" - 断言它写入内存(整体在1和3中,或每个单词在2中) .
    mem_input 是内存的输入(新值) .
    mem_addr 是要在3中更改的单词(0到511之间的值) .

  • 0

    如果你想要一个带有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] 格式 . 如果您希望内存按字节寻址,则必须执行更多工作或以不同方式声明内存 .

相关问题