Leb*_*ner -3 verilog comparator
我是一个verilog的新手.
我做了很多研究,最后编写了这段代码,但似乎无法正常工作.
任何人都可以帮我解决吗?
module comparator();
reg[3:0] a, b;
wire[1:0] equal, lower, greater;
if (a<b) begin
equal = 0;
lower = 1;
greater = 0;
end
else if (a==b) begin
equal = 1;
lower = 0;
greater = 0;
end
else begin
equal = 0;
lower = 0;
greater = 1;
end;
initial begin
$monitor($time,
"a=%b, b=%b, greater=%b, equals=%b, lower=%b",
a, b, greater, equal, lower);
a=9; b=10;
#100 $display ("\n", $time, "\n");
end
endmodule
Run Code Online (Sandbox Code Playgroud)
行为程序必须包含在一个always块中,如下所示:此外,您的模块需要输入和输出.更正确的版本是这样的:
module comparator (
input wire [3:0] a,
input wire [3:0] b,
output reg equal,
output reg lower,
output reg greater
);
always @* begin
if (a<b) begin
equal = 0;
lower = 1;
greater = 0;
end
else if (a==b) begin
equal = 1;
lower = 0;
greater = 0;
end
else begin
equal = 0;
lower = 0;
greater = 1;
end
end
endmodule
Run Code Online (Sandbox Code Playgroud)
我建议阅读一些关于使用Verilog进行行为建模的教程,因为你错过了很多要点:
always @*模型组合逻辑最重要的是:如何编写测试平台.测试平台被编写为没有输入和输出的模块),实例化您的UUT(被测单元),提供输入,读取输出并检查它们是否有效.
module testcomp;
reg [3:0] a, b;
wire eq, lw, gr;
comparator uut (
.a(a),
.b(b),
.equal(eq),
.lower(lw),
.greater(gr)
);
initial begin
a = 0;
repeat (16) begin
b = 0;
repeat (16) begin
#10;
$display ("TESTING %d and %d yields eq=%d lw=%d gr=%d", a, b, eq, lw, gr);
if (a==b && eq!=1'b1 && gr!=1'b0 && lw!=1'b0) begin
$display ("ERROR!");
$finish;
end
if (a>b && eq!=1'b0 && gr!=1'b1 && lw!=1'b0) begin
$display ("ERROR!");
$finish;
end
if (a<b && eq!=1'b1 && gr!=1'b0 && lw!=1'b1) begin
$display ("ERROR!");
$finish;
end
b = b + 1;
end
a = a + 1;
end
$display ("PASSED!");
$finish;
end
endmodule
Run Code Online (Sandbox Code Playgroud)
您可以使用以下链接在EDAPlayGround上播放此示例:http://www.edaplayground.com/x/CPq