如何在 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 功能。
我有一根 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 功能。