Menu
Coddy logo textTech

Çıktıyı Doğrulama

Coddy'nin Verilog Journey'sinin Temel Bilgiler bölümünün bir parçası. Ders 83 / 90.

challenge icon

Görev

Bu derste dalga biçimi dökümü komutları ekleyecek ve trafik ışığı denetleyicisinin doğru çalıştığını doğrulayacaksınız.

Şimdiye kadar testbench gizliydi ve modülünüze ekleniyordu. Bu adımda testbench sizin dosyanızın bir parçasıdır: önceki adımdaki traffic_light modülünü (sayaç zamanlaması, next girişi yok) koruyun ve altına bir testbench modülü ekleyin. Dosyanızda henüz module testbench yoksa bunu kopyalayın:

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

Yapılacaklar:

Testbench'i şu şekilde güncelleyin:

  1. traffic.vcd adlı bir dalga biçimi dosyası oluşturmak için $dumpfile ekleyin
  2. testbench içindeki tüm sinyalleri dökmek için $dumpvars ekleyin
  3. Simülasyonu çalıştırın ve çıktıyı kontrol edin

Test, simülatörün tüm çıktısını karşılaştırır; bu nedenle testbench, yukarıdaki testbench'in yazdırdığı çıktının aynısını ve başka hiçbir şeyi yazdırmamalıdır: $display("Traffic Light Test") başlığı, ışıklardaki her değişiklik için bir $monitor satırı, her zaman biriminde değişen bir saat, 2. zamanda serbest bırakılan reset ve #90 sonrasında $finish. Başka $display satırları eklemeyin ("Test complete" yok).

Beklenen çıktı (simülatör son olarak kendi başına $finish called at 92 satırını ekler):

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

Kendin dene

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // Durumlar: 0=Yeşil, 1=Sarı, 2=Kırmızı
  reg [1:0] state;
  reg [5:0] counter;
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // Kırmızıda başla
      counter <= 0;
    end else begin
      if (counter == 0) begin
        // Durumu değiştir
        if (state == 0) begin  // Yeşil -> Sarı
          state <= 1;
          counter <= 10;       // Sarı 10 saniye sürer
        end else if (state == 1) begin  // Sarı -> Kırmızı
          state <= 2;
          counter <= 40;       // Kırmızı 40 saniye sürer
        end else begin  // Kırmızı -> Yeşil
          state <= 0;
          counter <= 30;       // Yeşil 30 saniye sürer
        end
      end else begin
        counter <= counter - 1;
      end
    end
  end
  
  // Çıkış mantığı
  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: "traffic.vcd" oluşturmak için $dumpfile ekle
    
    // TODO: Tüm sinyalleri dökmek için $dumpvars ekle (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
    
    

Temel Bilgiler bölümündeki tüm dersler

Kendi başına pratik yap: Online Verilog derleyicisi