测试台中的 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;