半加法器:
`timescale = 1ns/100ps //timescale ratio //actual HDL
module half_add(a,b,sum, carry);
input a,b;
output sum, carry;
wire sum, carry;
and(sum,a,b);
xor(carry,a,b);
endmodule
试验台:
module half_addTB;
reg a,b;
wire carry, sum;
//instantiation
half_add half_add1(
.a(a),.b(b),.carry(carry),.sum(sum));
//port assignments with 10ns delays
initial begin
#10 a = 0; b= 0;
#10 b = 1;
#10 a = 1;
#10 b = 0;
end
endmodule
代码编译很好......但是当我尝试模拟它时,我的所有值都处于z状态......我不明白为什么......
答案 0 :(得分:2)
您无法从模块内驱动模块的输入。
只是在另一个没有任何输入的模块/程序(例如“half_add_tb”)中实例化你的“half_add”模块。然后添加两个本地regs“a”和“b”,并从你编写的那个初始块中驱动那些 - 而不是在“half_add_tb”模块中。
然后只需将“half_add”实例的输入“a”和“b”连接到本地“a”和“b”regs。
答案 1 :(得分:1)
您需要在testharness中实例化您的设计然后驱动输入。
//Half Adder
module half_add(a, b, sum, carry);
input a,b;
output sum, carry;
wire sum, carry; //Outputs are wires by default this is not required
and(sum, a, b);
xor(carry,a, b);
endmodule
module testharness();
//create test signals
reg a; //1 bit reg (regs driven from always and initial blocks)
reg b;
wire sum; // 1 bit wires for outputs to drive
wire carry;
//instantiate DUT (Device under test)
half_add half_add_1(
.a ( a ),
.b ( b ),
.sum ( sum ),
.carry ( carry)
);
//begin testbench
initial begin
#100 $finish;
end
initial begin
#10 a = 0; b= 0;
#10 b = 1;
#10 a = 1;
#10 b = 0;
end
endmodule
注意:如果你的模拟器支持verilog-2001,你的端口列表可以更容易阅读和更紧凑:
//Half Adder
module half_add(
input a,
input b,
output wire sum,
output wire carry
//for regs :
// output reg [WIDTH-1:0] out_reg
//multi-bit wires :
// output [WIDTH-1:0] out_wire
);
and(sum, a, b);
xor(carry,a, b);
endmodule