条件 A>B>C 没有得到正确的输出
Condition A>B>C not getting the right output
我制作了一个程序,能够比较 3 个输入以获得最大值 (F)
问题是我无法获得问题的预期输出。
期望值:
A B C F
001(1) 111(9) 100(4) 111(9)
001(1) 001(1) 001(1) 000
实际输出:
module InputComparator(A,B,C,F);
input [2:0]A;
input [2:0]B;
input [2:0]C;
output reg [2:0]F;
always @* begin
if (A>B>C) begin
F = A;
end
else if (A>B<C) begin
F = B;
end
else if (A<B<C) begin
F = C;
end
else begin
F = 3'b000;
end
end
endmodule
module testbench;
reg [2:0] A;
reg [2:0] B;
reg [2:0] C;
wire [2:0]F;
InputComparator test(A,B,C,F);
initial
begin
$display("--------------------------------------------------------");
$display("3 Input Comparator");
$display("--------------------------------------------------------");
$display("Time\tA\tB\tC\tF");
$display("--------------------------------------------------------");
$monitor("%g\t%b\t%b\t%b\t%b",$time,A,B,C,F);
A=3'b000; B=3'b000; C=3'b000;
#1 A=3'b101; B=3'b101; C=3'b101;
#1 A=3'b001; B=3'b111; C=3'b100;
#1 A=3'b110; B=3'b001; C=3'b101;
#1 A=3'b001; B=3'b100; C=3'b101;
#1$display("--------------------------------------------------------");
#1$display("--------------------------------------------------------");
#9 $finish;
end
endmodule
您不应该尝试像这样链接比较运算符:A>B>C
。这并不像你认为的那样,这是一个常见的陷阱(见下面的解释)。您必须将每个比较分开:
module InputComparator(A,B,C,F);
input [2:0]A;
input [2:0]B;
input [2:0]C;
output reg [2:0]F;
always @* begin
if ((A>B) && (A>C)) begin
F = A;
end
else if ((B>A) && (B>C)) begin
F = B;
end
else if ((C>A) && (C>B)) begin
F = C;
end
else begin
F = 3'b000;
end
end
endmodule
我得到了这个正确的输出:
--------------------------------------------------------
3 Input Comparator
--------------------------------------------------------
Time A B C F
--------------------------------------------------------
0 000 000 000 000
1 101 101 101 000
2 001 111 100 111
3 110 001 101 110
4 001 100 101 101
--------------------------------------------------------
--------------------------------------------------------
Verilog 将 (A>B>C)
解释为 ( (A>B) > C )
。它首先计算 (A>B)
,解析为 0 或 1。假设它解析为 1。因此,我们剩下 (1 > C)
,这显然不是您想要的。
我制作了一个程序,能够比较 3 个输入以获得最大值 (F) 问题是我无法获得问题的预期输出。 期望值:
A B C F
001(1) 111(9) 100(4) 111(9)
001(1) 001(1) 001(1) 000
实际输出:
module InputComparator(A,B,C,F);
input [2:0]A;
input [2:0]B;
input [2:0]C;
output reg [2:0]F;
always @* begin
if (A>B>C) begin
F = A;
end
else if (A>B<C) begin
F = B;
end
else if (A<B<C) begin
F = C;
end
else begin
F = 3'b000;
end
end
endmodule
module testbench;
reg [2:0] A;
reg [2:0] B;
reg [2:0] C;
wire [2:0]F;
InputComparator test(A,B,C,F);
initial
begin
$display("--------------------------------------------------------");
$display("3 Input Comparator");
$display("--------------------------------------------------------");
$display("Time\tA\tB\tC\tF");
$display("--------------------------------------------------------");
$monitor("%g\t%b\t%b\t%b\t%b",$time,A,B,C,F);
A=3'b000; B=3'b000; C=3'b000;
#1 A=3'b101; B=3'b101; C=3'b101;
#1 A=3'b001; B=3'b111; C=3'b100;
#1 A=3'b110; B=3'b001; C=3'b101;
#1 A=3'b001; B=3'b100; C=3'b101;
#1$display("--------------------------------------------------------");
#1$display("--------------------------------------------------------");
#9 $finish;
end
endmodule
您不应该尝试像这样链接比较运算符:A>B>C
。这并不像你认为的那样,这是一个常见的陷阱(见下面的解释)。您必须将每个比较分开:
module InputComparator(A,B,C,F);
input [2:0]A;
input [2:0]B;
input [2:0]C;
output reg [2:0]F;
always @* begin
if ((A>B) && (A>C)) begin
F = A;
end
else if ((B>A) && (B>C)) begin
F = B;
end
else if ((C>A) && (C>B)) begin
F = C;
end
else begin
F = 3'b000;
end
end
endmodule
我得到了这个正确的输出:
--------------------------------------------------------
3 Input Comparator
--------------------------------------------------------
Time A B C F
--------------------------------------------------------
0 000 000 000 000
1 101 101 101 000
2 001 111 100 111
3 110 001 101 110
4 001 100 101 101
--------------------------------------------------------
--------------------------------------------------------
Verilog 将 (A>B>C)
解释为 ( (A>B) > C )
。它首先计算 (A>B)
,解析为 0 或 1。假设它解析为 1。因此,我们剩下 (1 > C)
,这显然不是您想要的。