Menu
CoddyTech

Memverifikasi Output

Termasuk bagian Dasar-Dasar dalam perjalanan Verilog di Coddy. Pelajaran 83 dari 90.

challenge icon

Tantangan

Dalam pelajaran ini, kamu akan menambahkan perintah untuk membuang bentuk gelombang dan memastikan pengontrol lampu lalu lintas berfungsi dengan benar.

Sampai sekarang, testbench tersembunyi dan ditambahkan ke modulmu. Pada langkah ini, testbench menjadi bagian dari file kamu: pertahankan modul traffic_light dari langkah sebelumnya (pengaturan waktu counter, tanpa input next) dan tambahkan modul testbench di bawahnya. Jika filemu belum memiliki module testbench, salin yang ini:

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

Yang harus dilakukan:

Perbarui testbench untuk:

  1. Tambahkan $dumpfile untuk membuat file bentuk gelombang bernama traffic.vcd
  2. Tambahkan $dumpvars untuk membuang semua sinyal di testbench
  3. Jalankan simulasi dan periksa outputnya

Pengujian membandingkan seluruh output simulator, jadi testbench harus mencetak persis seperti yang dicetak testbench di atas dan tidak mencetak apa pun lagi: header $display("Traffic Light Test"), satu baris $monitor untuk setiap perubahan lampu, clock yang berganti setiap satuan waktu, reset yang dilepas pada waktu 2, dan $finish setelah #90. Jangan tambahkan baris $display lain (jangan tulis "Test complete").

Output yang diharapkan (simulator menambahkan sendiri baris akhir $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

Coba sendiri

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // Status: 0=Hijau, 1=Kuning, 2=Merah
  reg [1:0] state;
  reg [5:0] counter;
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // Mulai dari merah
      counter <= 0;
    end else begin
      if (counter == 0) begin
        // Ubah status
        if (state == 0) begin  // Hijau -> Kuning
          state <= 1;
          counter <= 10;       // Kuning berlangsung selama 10 detik
        end else if (state == 1) begin  // Kuning -> Merah
          state <= 2;
          counter <= 40;       // Merah berlangsung selama 40 detik
        end else begin  // Merah -> Hijau
          state <= 0;
          counter <= 30;       // Hijau berlangsung selama 30 detik
        end
      end else begin
        counter <= counter - 1;
      end
    end
  end
  
  // Logika output
  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: Tambahkan $dumpfile untuk membuat "traffic.vcd"
    
    // TODO: Tambahkan $dumpvars untuk merekam semua sinyal (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
    
    

Semua pelajaran di Dasar-Dasar

Latihan sendiri: Compiler Verilog online