测试台中的 uut 没有响应
No response from uut in testbench
我没有从测试台中的 uut 得到任何响应。模块 exp2_up_down_counter
在没有测试台的情况下工作正常,但在测试台中实例化时输出为 xxxx。
这里是加减计数器的主要模块:
`timescale 1ns/1ps
module exp2_up_down_counter (input clk, reset, mode, output reg [3:0] count);
always @(posedge clk)
if (reset == 1)
count <= 0; // reset the counter if reset is high
else if (mode == 1)
count <= count + 1; // works as up counter if mode pin is high
else
count <= count - 1; // works as down counter if mode pin is low
endmodule
没有测试平台的模拟:
加减计数器测试台
`timescale 1ns/1ps
module exp2_up_down_counter_tb;
reg clk, reset, mode;
wire [3:0] count;
exp2_up_down_counter uut(.clk(clk), .reset(reset), .mode(mode), .count(count));
initial begin
clk = 1'b0;
end
always @(*) #5 clk <= ~clk;
initial begin
// initializing the inputs
reset = 1;
mode = 0;
#5;
reset = 0;
#10
mode = 1;
#5000 $finish;
end
endmodule
用测试台模拟:
在exp2_up_down_counter
中,count
被声明为reg
。这意味着它的默认值为时间 0 的 X。由于 reset
信号与时钟同步,因此您需要等待时钟的第一个上升沿才能释放复位。目前,重置是在测试台中时钟的第一个位置释放的,这是一个竞争条件。因此,count
不会被赋值为 0,它会在整个模拟过程中保留 X 的值。
您需要延迟重置发布。例如,更改:
#5;
reset = 0;
至:
#15;
reset = 0;
但是,最好在测试平台中以与在设计中驱动信号相同的方式驱动同步输入:使用 @(posedge clk)
并使用非阻塞分配 (<=
):
initial begin
reset = 1;
mode = 0;
repeat (2) @(posedge clk);
reset <= 0;
repeat (1) @(posedge clk);
mode <= 1;
#5000 $finish;
end
此外,这是在测试台中驱动时钟的更标准方法:
always #5 clk = ~clk;
我没有从测试台中的 uut 得到任何响应。模块 exp2_up_down_counter
在没有测试台的情况下工作正常,但在测试台中实例化时输出为 xxxx。
这里是加减计数器的主要模块:
`timescale 1ns/1ps
module exp2_up_down_counter (input clk, reset, mode, output reg [3:0] count);
always @(posedge clk)
if (reset == 1)
count <= 0; // reset the counter if reset is high
else if (mode == 1)
count <= count + 1; // works as up counter if mode pin is high
else
count <= count - 1; // works as down counter if mode pin is low
endmodule
没有测试平台的模拟:
加减计数器测试台
`timescale 1ns/1ps
module exp2_up_down_counter_tb;
reg clk, reset, mode;
wire [3:0] count;
exp2_up_down_counter uut(.clk(clk), .reset(reset), .mode(mode), .count(count));
initial begin
clk = 1'b0;
end
always @(*) #5 clk <= ~clk;
initial begin
// initializing the inputs
reset = 1;
mode = 0;
#5;
reset = 0;
#10
mode = 1;
#5000 $finish;
end
endmodule
用测试台模拟:
在exp2_up_down_counter
中,count
被声明为reg
。这意味着它的默认值为时间 0 的 X。由于 reset
信号与时钟同步,因此您需要等待时钟的第一个上升沿才能释放复位。目前,重置是在测试台中时钟的第一个位置释放的,这是一个竞争条件。因此,count
不会被赋值为 0,它会在整个模拟过程中保留 X 的值。
您需要延迟重置发布。例如,更改:
#5;
reset = 0;
至:
#15;
reset = 0;
但是,最好在测试平台中以与在设计中驱动信号相同的方式驱动同步输入:使用 @(posedge clk)
并使用非阻塞分配 (<=
):
initial begin
reset = 1;
mode = 0;
repeat (2) @(posedge clk);
reset <= 0;
repeat (1) @(posedge clk);
mode <= 1;
#5000 $finish;
end
此外,这是在测试台中驱动时钟的更标准方法:
always #5 clk = ~clk;