Menu
CoddyTech

Xác minh đầu ra

Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 83 trên 90.

challenge icon

Thử thách

Trong bài học này, bạn sẽ thêm các lệnh ghi lại dạng sóng và xác minh bộ điều khiển đèn giao thông hoạt động chính xác.

Cho đến nay, testbench bị ẩn và được thêm vào module của bạn. Ở bước này, testbench nằm trong chính tệp của bạn: giữ lại module traffic_light từ bước trước (định thời bộ đếm, không có đầu vào next) và thêm module testbench bên dưới. Nếu tệp của bạn chưa có module testbench, hãy sao chép đoạn này:

module testbench;
  reg clk, reset;
  wire red, yellow, green;
  traffic_light uut (
    .clk(clk),
    .reset(reset),
    .red(red),
    .yellow(yellow),
    .green(green)
  );
  always #1 clk = ~clk;
  initial begin
    // TODO: Add $dumpfile to create "traffic.vcd"
    // TODO: Add $dumpvars to dump all signals (0, testbench)
    $display("Traffic Light Test");
    $monitor("Time %0t: red=%b, yellow=%b, green=%b", $time, red, yellow, green);
    clk = 0;
    reset = 1;
    #2 reset = 0;
    #90;
    $finish;
  end
endmodule

Cần làm:

Cập nhật testbench để:

  1. Thêm $dumpfile để tạo tệp dạng sóng có tên traffic.vcd
  2. Thêm $dumpvars để ghi lại tất cả tín hiệu trong testbench
  3. Chạy mô phỏng và kiểm tra đầu ra

Bài kiểm tra so sánh toàn bộ đầu ra của trình mô phỏng, vì vậy testbench phải in chính xác những gì testbench ở trên in ra và không thêm gì khác: dòng tiêu đề $display("Traffic Light Test"), một dòng $monitor mỗi khi đèn đổi trạng thái, xung nhịp chuyển đổi sau mỗi đơn vị thời gian, reset được nhả ở thời điểm 2 và $finish sau #90. Không thêm dòng $display nào khác (không có "Test complete").

Đầu ra dự kiến (trình mô phỏng tự thêm dòng cuối $finish called at 92):

VCD info: dumpfile traffic.vcd opened for output.
Traffic Light Test
Time 0: red=1, yellow=0, green=0
Time 3: red=0, yellow=0, green=1
Time 65: red=0, yellow=1, green=0
Time 87: red=1, yellow=0, green=0

Tự làm thử

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // Các trạng thái: 0=xanh lá, 1=vàng, 2=đỏ
  reg [1:0] state;
  reg [5:0] counter;
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // Bắt đầu ở đèn đỏ
      counter <= 0;
    end else begin
      if (counter == 0) begin
        // Chuyển trạng thái
        if (state == 0) begin  // Xanh lá -> vàng
          state <= 1;
          counter <= 10;       // Đèn vàng kéo dài 10 giây
        end else if (state == 1) begin  // Vàng -> đỏ
          state <= 2;
          counter <= 40;       // Đèn đỏ kéo dài 40 giây
        end else begin  // Đỏ -> xanh lá
          state <= 0;
          counter <= 30;       // Đèn xanh lá kéo dài 30 giây
        end
      end else begin
        counter <= counter - 1;
      end
    end
  end
  
  // Logic đầu ra
  always @(*) begin
    red = (state == 2);
    yellow = (state == 1);
    green = (state == 0);
  end
  
endmodule

module testbench;
  reg clk, reset;
  wire red, yellow, green;
  
  traffic_light uut (
    .clk(clk),
    .reset(reset),
    .red(red),
    .yellow(yellow),
    .green(green)
  );
  
  always #1 clk = ~clk;
  
  initial begin
    // TODO: Thêm $dumpfile để tạo "traffic.vcd"
    
    // TODO: Thêm $dumpvars để ghi lại tất cả tín hiệu (0, testbench)
    
    $display("Traffic Light Test");
    $monitor("Time %0t: red=%b, yellow=%b, green=%b", $time, red, yellow, green);
    
    clk = 0;
    reset = 1;
    #2 reset = 0;
    
    #90;
    $finish;
  end
endmodule
    
    

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Verilog online