为什么我的测试台不工作?
Why isn't my test bench working?
我决定在这个周末开始使用 Verilog。我对此很陌生,并不完全了解我在做什么。我从 PDF 教程中复制了这个加法器代码。问题是教程没有给 运行 任何测试代码。我试着自己写,但我得到的输出是 zzzz。我在想,也许它正试图在加法函数完成执行之前产生输出。
module addbit(a, b, ci, sum, co);
input a, b, ci;
output sum, co;
wire a, b, ci, sum, co;
assign {co, sum} = a + b + ci;
endmodule
module adder(result, carry, r1, r2, ci);
input [3:0] r1;
input [3:0] r2;
input ci;
output [3:0] result;
output carry;
wire [3:0] r1;
wire [3:0] r2;
wire ci;
wire [3:0] result;
wire carry;
wire c1, c2, c3;
addbit u0(r1[0], r2[0], ci, result[0], c1);
addbit u1(r1[1], r2[1], c1, result[0], c2);
addbit u2(r1[2], r2[2], c2, result[0], c3);
addbit u3(r1[3], r2[3], c3, result[0], carry);
endmodule
module test();
wire [3:0] a = 4'b1000;
wire [3:0] b = 4'b0100;
wire [3:0] result;
wire carry = 0;
wire ocarry;
adder x(result, ocarry, a, b, carry);
initial begin
$display("%b", result);
end
endmodule
the output I am getting is zzzz
你得到输出 zzzz
的原因是你的加法器电路(见下面 mcleod_ideafix 的评论)。
您可能想要将 a
和 b
的输入类型更改为 reg
类型,以便您可以在程序块内分配它们并为它们分配不同的值。
module test();
reg [3:0] a = 4'b1000;
reg [3:0] b = 4'b0100;
wire [3:0] result;
wire carry = 0;
wire ocarry;
adder x(result, ocarry, a, b, carry);
initial begin
$display("@ %0dns a: %0d b: %0d result: %0d", $time, a, b, result);
#1ns;
a = 5;
b = 6;
$display("@ %0dns a: %0d b: %0d result: %0d", $time, a, b, result);
end
endmodule
使用您发布的 RTL 和我在上面修改的测试台,它将产生一个输出:
@ 0ns a: 8 b: 4 result: X
@ 1ns a: 5 b: 6 result: X
你的加法器没有按预期的加法器电路工作。
为了进一步帮助您,我为您创建了一个加法器电路。
module adder(result, carry, r1, r2, ci);
input [3:0] r1;
input [3:0] r2;
input ci;
output [3:0] result;
output carry;
assign {carry, result} = r1 + r2 + ci;
endmodule
以及将输入初始化为 0 然后循环 10 次的工作测试台。在循环内部,我们创建了 1ns
的延迟,并将输入更改为从 0
到 15
的随机值。
module test();
reg [3:0] a;
reg [3:0] b;
wire [3:0] result;
wire carry = 0;
wire ocarry;
adder x(result, ocarry, a, b, carry);
initial begin
$monitor("@%0dns [a: %0d] + [b: %0d] = [result: %0d] [carry = %0d] [ocarry = %0d] ", $time, a, b, result, carry, ocarry);
end
initial begin
a = 0;
b = 0;
repeat (10) begin
#1ns;
a = $random % 'h10;
b = $random % 'h10;
end
end
endmodule
您可以在 edaplayground 中 运行 此代码并查看输出。
对于a
、b
、result
、carry
、ocarry
的每一次变化,都会执行这段代码。
$monitor("@%0dns [a: %0d] + [b: %0d] = [result: %0d] [carry = %0d] [ocarry = %0d] ", $time, a, b, result, carry, ocarry);
我决定在这个周末开始使用 Verilog。我对此很陌生,并不完全了解我在做什么。我从 PDF 教程中复制了这个加法器代码。问题是教程没有给 运行 任何测试代码。我试着自己写,但我得到的输出是 zzzz。我在想,也许它正试图在加法函数完成执行之前产生输出。
module addbit(a, b, ci, sum, co);
input a, b, ci;
output sum, co;
wire a, b, ci, sum, co;
assign {co, sum} = a + b + ci;
endmodule
module adder(result, carry, r1, r2, ci);
input [3:0] r1;
input [3:0] r2;
input ci;
output [3:0] result;
output carry;
wire [3:0] r1;
wire [3:0] r2;
wire ci;
wire [3:0] result;
wire carry;
wire c1, c2, c3;
addbit u0(r1[0], r2[0], ci, result[0], c1);
addbit u1(r1[1], r2[1], c1, result[0], c2);
addbit u2(r1[2], r2[2], c2, result[0], c3);
addbit u3(r1[3], r2[3], c3, result[0], carry);
endmodule
module test();
wire [3:0] a = 4'b1000;
wire [3:0] b = 4'b0100;
wire [3:0] result;
wire carry = 0;
wire ocarry;
adder x(result, ocarry, a, b, carry);
initial begin
$display("%b", result);
end
endmodule
the output I am getting is zzzz
你得到输出 zzzz
的原因是你的加法器电路(见下面 mcleod_ideafix 的评论)。
您可能想要将 a
和 b
的输入类型更改为 reg
类型,以便您可以在程序块内分配它们并为它们分配不同的值。
module test();
reg [3:0] a = 4'b1000;
reg [3:0] b = 4'b0100;
wire [3:0] result;
wire carry = 0;
wire ocarry;
adder x(result, ocarry, a, b, carry);
initial begin
$display("@ %0dns a: %0d b: %0d result: %0d", $time, a, b, result);
#1ns;
a = 5;
b = 6;
$display("@ %0dns a: %0d b: %0d result: %0d", $time, a, b, result);
end
endmodule
使用您发布的 RTL 和我在上面修改的测试台,它将产生一个输出:
@ 0ns a: 8 b: 4 result: X
@ 1ns a: 5 b: 6 result: X
你的加法器没有按预期的加法器电路工作。
为了进一步帮助您,我为您创建了一个加法器电路。
module adder(result, carry, r1, r2, ci);
input [3:0] r1;
input [3:0] r2;
input ci;
output [3:0] result;
output carry;
assign {carry, result} = r1 + r2 + ci;
endmodule
以及将输入初始化为 0 然后循环 10 次的工作测试台。在循环内部,我们创建了 1ns
的延迟,并将输入更改为从 0
到 15
的随机值。
module test();
reg [3:0] a;
reg [3:0] b;
wire [3:0] result;
wire carry = 0;
wire ocarry;
adder x(result, ocarry, a, b, carry);
initial begin
$monitor("@%0dns [a: %0d] + [b: %0d] = [result: %0d] [carry = %0d] [ocarry = %0d] ", $time, a, b, result, carry, ocarry);
end
initial begin
a = 0;
b = 0;
repeat (10) begin
#1ns;
a = $random % 'h10;
b = $random % 'h10;
end
end
endmodule
您可以在 edaplayground 中 运行 此代码并查看输出。
对于a
、b
、result
、carry
、ocarry
的每一次变化,都会执行这段代码。
$monitor("@%0dns [a: %0d] + [b: %0d] = [result: %0d] [carry = %0d] [ocarry = %0d] ", $time, a, b, result, carry, ocarry);