数组中的最小值
Minimum in array
我正在尝试构建一个作为输入的练习模块:
- clk,第一个
- 一个包含 3 个数字的数组,每个数字都是 4 位。
最终目的是return输出数组中的最小值,但我无法让它真正工作,我不明白为什么。
module minVal(
input logic rstN, clk,
input logic unsigned [2:0][3:0] resArray,
output logic [3:0] minVal
);
logic unsigned [3:0] currRes;
always_ff @(posedge clk, posedge rstN) begin
if(rstN == 1'b1) begin
currRes <= 4'b1111;
end
else begin
for(int i = 0; i < 3; i++) begin
if( resArray[i] < currRes) begin
currRes <= resArray[i];
minVal <= resArray[i];
end
end
end
end
endmodule
我写了下面的测试平台:
module minVal_tb();
logic rstN, clk;
logic unsigned [2:0][3:0] resArray;
logic [3:0] minVal;
minVal thisInst(.rstN(rstN), .clk(clk), .resArray(resArray), .minVal(minVal));
always begin
#20 clk = ~clk;
end
initial begin
clk = 1'b0;
rstN = 1'b1;
resArray[0] = 5;
resArray[1] = 1;
resArray[2] = 3;
#5 rstN = 1'b0;
end
endmodule
我希望在第一个时钟周期后立即输出 1,但我只在 2 个时钟周期后才得到它。为什么?
当您展开 for
循环时,它会是这样的:
always_ff @(posedge clk, posedge rstN) begin
if(rstN == 1'b1) begin
currRes <= 4'b1111;
end
else begin
if( resArray[0] < currRes) begin
currRes <= resArray[0];
minVal <= resArray[0];
end
if( resArray[1] < currRes) begin
currRes <= resArray[1];
minVal <= resArray[1];
end
if( resArray[2] < currRes) begin
currRes <= resArray[2];
minVal <= resArray[2];
end
end
end
您最终对同一个寄存器 (currRes
) 进行了多个非阻塞赋值。
重置后时钟的第一个姿势,所有 3 个 if
子句都为真,最后一个赋值获胜:
currRes <= resArray[2];
因此,currRes
被赋予值 3,而不是 1。
minVal
也是如此。
您需要对 3 个输入值进行排序,然后将这些值中的最小值与当前最小值进行比较。
我正在尝试构建一个作为输入的练习模块:
- clk,第一个
- 一个包含 3 个数字的数组,每个数字都是 4 位。
最终目的是return输出数组中的最小值,但我无法让它真正工作,我不明白为什么。
module minVal(
input logic rstN, clk,
input logic unsigned [2:0][3:0] resArray,
output logic [3:0] minVal
);
logic unsigned [3:0] currRes;
always_ff @(posedge clk, posedge rstN) begin
if(rstN == 1'b1) begin
currRes <= 4'b1111;
end
else begin
for(int i = 0; i < 3; i++) begin
if( resArray[i] < currRes) begin
currRes <= resArray[i];
minVal <= resArray[i];
end
end
end
end
endmodule
我写了下面的测试平台:
module minVal_tb();
logic rstN, clk;
logic unsigned [2:0][3:0] resArray;
logic [3:0] minVal;
minVal thisInst(.rstN(rstN), .clk(clk), .resArray(resArray), .minVal(minVal));
always begin
#20 clk = ~clk;
end
initial begin
clk = 1'b0;
rstN = 1'b1;
resArray[0] = 5;
resArray[1] = 1;
resArray[2] = 3;
#5 rstN = 1'b0;
end
endmodule
我希望在第一个时钟周期后立即输出 1,但我只在 2 个时钟周期后才得到它。为什么?
当您展开 for
循环时,它会是这样的:
always_ff @(posedge clk, posedge rstN) begin
if(rstN == 1'b1) begin
currRes <= 4'b1111;
end
else begin
if( resArray[0] < currRes) begin
currRes <= resArray[0];
minVal <= resArray[0];
end
if( resArray[1] < currRes) begin
currRes <= resArray[1];
minVal <= resArray[1];
end
if( resArray[2] < currRes) begin
currRes <= resArray[2];
minVal <= resArray[2];
end
end
end
您最终对同一个寄存器 (currRes
) 进行了多个非阻塞赋值。
重置后时钟的第一个姿势,所有 3 个 if
子句都为真,最后一个赋值获胜:
currRes <= resArray[2];
因此,currRes
被赋予值 3,而不是 1。
minVal
也是如此。
您需要对 3 个输入值进行排序,然后将这些值中的最小值与当前最小值进行比较。