如何在 Verilog 的 2D 网络中分配一行?

How to assign a row in 2D Net in Verilog?

我有一根 2D 线,我正在尝试将其中一行分配给相同长度的临时线。出于某种原因,在模拟中,临时电线不采用这些值。

generate
    for(i=16;i<64;i=i+1) begin
    assign temp[31:0] = w[i-15];
    assign s0 = {temp[6:0],temp[31:7]} ^ {temp[17:0],temp[31:18]} ^ {temp[2:0],temp[31:3]};
    assign s1 = {temp[16:0],temp[31:17]} ^ {temp[18:0],temp[31:19]} ^ {temp[9:0],temp[31:10]};
    assign out[i] = w[i-16] + s0 + w[i-7] + s1;
    end
endgenerate

这里,变量'temp'每次都期望取一行变量'w'的值,但是在仿真过程中,'temp'总是有 32'hzzzzz... 值。

这是完整的代码

module message_scheduler(chunk_512, out);
input [31:0]chunk_512[15:0];
output [31:0]out[63:0];
wire[31:0]w[63:0];
wire[31:0]temp,s0,s1;
genvar i;
generate
    for(i=0;i<16;i=i+1) begin
        assign w[i] = chunk_512[i];
    end
    for(i=16;i<64;i=i+1) begin
        assign w[i] = 32'b0;
    end
endgenerate
generate
    for(i=16;i<64;i=i+1) begin
    assign temp[31:0] = w[i-15];
    assign s0 = {temp[6:0],temp[31:7]} ^ {temp[17:0],temp[31:18]} ^ {temp[2:0],temp[31:3]};
    assign s1 = {temp[16:0],temp[31:17]} ^ {temp[18:0],temp[31:19]} ^ {temp[9:0],temp[31:10]};
    assign out[i] = w[i-16] + s0 + w[i-7] + s1;
    end
endgenerate   
endmodule

谁能帮我弄清楚我哪里出错了?

这些是我用来提供输入的命令

force -freeze {sim:/message_scheduler/chunk_512[1]} {32'b01101111001000000111011101101111}
    force -freeze {sim:/message_scheduler/chunk_512[2]} {32'b01110010011011000110010010000000}
    force -freeze {sim:/message_scheduler/chunk_512[0]} {32'b01101000011001010110110001101100}
    force -freeze {sim:/message_scheduler/chunk_512[3]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[4]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[5]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[6]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[7]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[8]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[9]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[10]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[11]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[12]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[13]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[14]} 32'b00000000000000000000000000000000
    force -freeze {sim:/message_scheduler/chunk_512[15]} 32'b00000000000000000000000001011000

我在编译你的模块时收到警告:

    assign temp[31:0] = chunk_512[i-15];
                                |
xmelab: *W,BNDMEM : Memory index out of declared bounds.

您声明 chunk_512 有 16 个位置 (0-15),但您正在尝试访问 16 个及以上的位置。这就是 temp 没有已知值的原因。

比如for循环到i=31时,31-15=16,所以[16]越界


此外,2D 端口要求您在模拟器中启用 SystemVerilog 功能。