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

كتابة الـ Testbench

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

challenge icon

التحدي

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

ما يجب القيام به:

قم بإنشاء منصة اختبار (testbench) تقوم بما يلي:

  1. تعلن عن الإشارات (reg لكل من clk و reset، و wire لكل من red، و yellow، و green)
  2. تنشئ نسخة من وحدة traffic_light بالاسم uut
  3. تولد ساعة (clock) تتبدل كل وحدة زمنية واحدة (1 time unit)
  4. تطبق إشارة reset لمدة وحدتين زمنيتين (2 time units)، ثم تحررها
  5. تشغل المحاكاة لمدة 100 وحدة زمنية (100 time 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: clk و reset لـ reg قم بتعريف
  
  // TODO: red, yellow, green لـ wire قم بتعريف
  

  // TODO: uut باسم traffic_light قم بإنشاء نسخة من وحدة
  // red, yellow, green و reset و clk قم بتوصيل
  

  // TODO: قم بتوليد نبضات الساعة (تبديل كل وحدة زمنية واحدة)
  

  initial begin
    $display("Traffic Light Test");
    
    // TODO: إلى 0 clk قم بتهيئة
    
    // TODO: (reset=0 ثم ،لمدة وحدتين زمنيتين reset=1) reset قم بتطبيق
    
    
    // TODO: قم بتشغيل المحاكاة لمدة 100 وحدة زمنية
    
    
    $display("Test complete");
    $finish;
  end
endmodule

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