Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

كتابة الـ Testbench

جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 82 من 90.

challenge icon

التحدي

في هذا الدرس، ستنشئ منصة اختبار (testbench) للتحقق من أن وحدة التحكم في الإشارة الضوئية تعمل بشكل صحيح.

المطلوب عمله:

أنشئ منصة اختبار تقوم بما يلي:

  1. تعلن عن الإشارات (reg لـ clk و reset، و wire لـ red و yellow و green)
  2. تقوم بإنشاء نموذج (instantiate) من وحدة traffic_light باسم uut
  3. تولد إشارة الساعة clock بحيث تتغير كل 1 وحدة زمنية unit
  4. تطبق إعادة الضبط reset لمدة 2 وحدة units زمنية، ثم تحررها
  5. تشغل المحاكاة simulation لمدة 100 وحدة units زمنية

جرّب بنفسك

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 لمدة وحدتين زمنيتين، ثم reset=0)
    
    
    // TODO: شغّل المحاكاة لمدة 100 وحدة زمنية
    
    
    $display("Test complete");
    $finish;
  end
endmodule

جميع دروس الأساسيات