Menu
Coddy logo textTech

Writing The Testbench

Часть раздела Основы путешествия по Verilog на Coddy. Урок 82 из 90.

challenge icon

Задание

В этом уроке вы создадите testbench, чтобы проверить, что контроллер Traffic Light работает корректно.

Что нужно сделать:

Создайте testbench, который:

  1. Объявляет сигналы (reg для clk и reset, wire для red, yellow, green)
  2. Создаёт экземпляр модуля traffic_light с именем uut
  3. Генерирует тактовый сигнал, который переключается через каждые 1 time unit
  4. Применяет reset в течение 2 time units, затем отключает его
  5. Запускает simulation в течение 100 time units

Simulation проверяется по выводимому результату, поэтому блок initial также должен вывести в точности следующие строки:

  1. Вывести Traffic Light Test с помощью $display до настройки clk и reset
  2. После 100 time units вывести Test complete с помощью $display
  3. Завершить simulation с помощью $finish, который добавляет собственную строку в Output

Попробуйте сами

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: Объявите reg для clk и reset
  
  // TODO: Объявите wire для red, yellow, green
  

  // TODO: Создайте экземпляр модуля traffic_light с именем uut
  // Подключите clk, reset, red, yellow, green
  

  // TODO: Сгенерируйте тактовый сигнал (переключайте каждые 1 единицу времени)
  

  initial begin
    $display("Traffic Light Test");
    
    // TODO: Инициализируйте clk значением 0
    
    // TODO: Примените reset (reset=1 на 2 единицы времени, затем reset=0)
    
    
    // TODO: Запустите симуляцию на 100 единиц времени
    
    
    $display("Test complete");
    $finish;
  end
endmodule

Все уроки раздела Основы

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog