使用 Verilog 的 Mux 4x1 测试平台
Testbench of a Mux 4x1 using Verilog
我正在尝试使用测试台来测试 4X1 Mux 的某些功能 [a、b、c、d 是输入,z 是输出,s 是 select 行]。这是我的代码:
module testbench_MUX();
reg a,b,c,d;
reg [1:0] s;
wire z ;
MUX4_1 mux(.a(a) ,.b(b),.c(c),.d(d), .s(s),.z(z));
initial begin
$dumpfile("dump.vcd");
$dumpvars;
end
initial begin // {
a='b0;b='b1 ;c='b0 ;d='b1 ;s='d0;#15
if(z==0) $display("time : %0t Test # 1 : passed",$time);
a='b0;b='b1 ;c='b0 ;d='b1 ;s='d1;#15
if(z==1) $display("Test # 2 : passed");
a='b0;b='b0 ;c='b1 ;d='b1 ;s='d1; #15
if(z==0) $display("Test # 3 : passed");
a='b1;b='b0 ;c='b0 ;d='b0 ;s='d1; #15
if(z==0) $display("Test # 4 : passed");
$finish;
end // }
波形如下:
内核显示测试1已经通过,意思是z=0:
# KERNEL: time : 15Test # 1 : passed
但是,从15ns时刻的波形可以看出(仿真时标为1ns/1ns),z=1。 if
语句为什么会执行?
MUX 设计代码:
module MUX4_1(
input a,b,c,d,
input [1:0] s,
output reg z
);
always @ (*) begin
if ( s==0)
z=a;
else if ( s==1)
z=b;
else if ( s==2)
z=c;
else if (s==3)
z=d;
else
z=a;
end
endmodule: MUX4_1
您有竞争条件。在时间 15,您更改 s
输入,这会导致 z
输出从 0 变为 1。同时您对 z
输出进行采样(if(z=0)
).模拟器在 0.
处看到 z
您应该延迟更改输入的时间,以便在知道输出稳定时对输出进行采样。例如:
initial begin
a='b0; b='b1 ; c='b0 ; d='b1 ;s='d0;
#15
if(z==0) $display("time : %0t Test # 1 : passed",$time);
#1;
a='b0;b='b1 ;c='b0 ;d='b1 ;s='d1;
在这种情况下,z
会在第15次检查,然后s
会在第16次发生变化。
我正在尝试使用测试台来测试 4X1 Mux 的某些功能 [a、b、c、d 是输入,z 是输出,s 是 select 行]。这是我的代码:
module testbench_MUX();
reg a,b,c,d;
reg [1:0] s;
wire z ;
MUX4_1 mux(.a(a) ,.b(b),.c(c),.d(d), .s(s),.z(z));
initial begin
$dumpfile("dump.vcd");
$dumpvars;
end
initial begin // {
a='b0;b='b1 ;c='b0 ;d='b1 ;s='d0;#15
if(z==0) $display("time : %0t Test # 1 : passed",$time);
a='b0;b='b1 ;c='b0 ;d='b1 ;s='d1;#15
if(z==1) $display("Test # 2 : passed");
a='b0;b='b0 ;c='b1 ;d='b1 ;s='d1; #15
if(z==0) $display("Test # 3 : passed");
a='b1;b='b0 ;c='b0 ;d='b0 ;s='d1; #15
if(z==0) $display("Test # 4 : passed");
$finish;
end // }
波形如下:
内核显示测试1已经通过,意思是z=0:
# KERNEL: time : 15Test # 1 : passed
但是,从15ns时刻的波形可以看出(仿真时标为1ns/1ns),z=1。 if
语句为什么会执行?
MUX 设计代码:
module MUX4_1(
input a,b,c,d,
input [1:0] s,
output reg z
);
always @ (*) begin
if ( s==0)
z=a;
else if ( s==1)
z=b;
else if ( s==2)
z=c;
else if (s==3)
z=d;
else
z=a;
end
endmodule: MUX4_1
您有竞争条件。在时间 15,您更改 s
输入,这会导致 z
输出从 0 变为 1。同时您对 z
输出进行采样(if(z=0)
).模拟器在 0.
z
您应该延迟更改输入的时间,以便在知道输出稳定时对输出进行采样。例如:
initial begin
a='b0; b='b1 ; c='b0 ; d='b1 ;s='d0;
#15
if(z==0) $display("time : %0t Test # 1 : passed",$time);
#1;
a='b0;b='b1 ;c='b0 ;d='b1 ;s='d1;
在这种情况下,z
会在第15次检查,然后s
会在第16次发生变化。