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

Writing The 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
  4. يطبّق reset لمدة 2 من وحدات time، ثم يحرّره
  5. يشغّل simulation لمدة 100 من وحدات time

يتم التحقق من simulation من خلال ما يطبعه، لذلك يجب أن تُنتج كتلة initial أيضًا هذه الأسطر بالضبط:

  1. اطبع Traffic Light Test باستخدام $display قبل إعداد clock و reset
  2. بعد 100 من وحدات time، اطبع Test complete باستخدام $display
  3. أنه simulation باستخدام $finish، الذي يضيف سطره الخاص إلى الإخراج

جرّب بنفسك

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

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

تدرّب بنفسك: مترجم Verilog عبر الإنترنت