Menu
CoddyTech

编写测试平台

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 82 课,共 90 课。

challenge icon

挑战

在本课中,你将创建一个测试平台,验证红绿灯控制器是否正常工作。

要做什么:

创建一个测试平台,其中:

  1. 声明信号(clk 和 reset 使用 reg,red、yellow、green 使用 wire)
  2. 实例化 traffic_light 模块,并命名为 uut
  3. 生成一个每隔 1 个时间单位切换一次的时钟
  4. 施加复位 2 个时间单位,然后解除复位
  5. 运行仿真 100 个时间单位

仿真结果会根据打印内容进行检查,因此 initial 块还必须准确输出以下内容:

  1. 在设置时钟和复位之前,使用 $display 打印 Traffic Light Test
  2. 经过 100 个时间单位后,使用 $display 打印 Test complete
  3. 使用 $finish 结束仿真,它会在输出中另外添加一行

亲手试试

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;
  reg [5:0] counter;

  // 输出赋值
  always @(*) begin
    case (state)
      0: begin green = 1; yellow = 0; red = 0; end
      1: begin green = 0; yellow = 1; red = 0; end
      2: begin green = 0; yellow = 0; red = 1; end
      default: begin green = 0; yellow = 0; red = 1; end
    endcase
  end

  // 带计时功能的状态机
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;
      counter <= 0;
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            counter <= 10;
          end
          1: begin
            state <= 2;
            counter <= 40;
          end
          2: begin
            state <= 0;
            counter <= 30;
          end
        endcase
      end else begin
        counter <= counter - 1;
      end
    end
  end

endmodule

module testbench;
  // TODO: 为 clk 和 reset 声明 reg
  
  // TODO: 为 red、yellow 和 green 声明 wire
  

  // TODO: 实例化 traffic_light 模块,命名为 uut
  // 连接 clk、reset、red、yellow 和 green
  

  // TODO: 生成时钟(每隔 1 个时间单位翻转一次)
  

  initial begin
    $display("Traffic Light Test");
    
    // TODO: 将 clk 初始化为 0
    
    // TODO: 执行复位(reset=1 持续 2 个时间单位,然后 reset=0)
    
    
    // TODO: 运行仿真 100 个时间单位
    
    
    $display("Test complete");
    $finish;
  end
endmodule

基础知识中的所有课

自己练习: Verilog 在线编译器