Menu
Coddy logo textTech

כתיבת סביבת הבדיקה

חלק מהיחידה יסודות במסלול ה-Verilog של Coddy. שיעור 82 מתוך 90.

challenge icon

אתגר

בשיעור הזה תיצור ספסל בדיקה כדי לוודא שבקר הרמזור פועל כהלכה.

מה לעשות:

צור ספסל בדיקה ש:

  1. מצהיר על אותות (reg עבור clk ו-reset, wire עבור red, yellow, green)
  2. יוצר מופע של המודול traffic_light בשם uut
  3. יוצר שעון שמחליף מצב בכל יחידת זמן אחת
  4. מפעיל איפוס למשך 2 יחידות זמן, ואז משחרר אותו
  5. מריץ את הסימולציה למשך 100 יחידות זמן

הסימולציה נבדקת לפי מה שהיא מדפיסה, ולכן גם בלוק initial צריך להפיק בדיוק את השורות האלה:

  1. הדפס Traffic Light Test באמצעות $display לפני הגדרת השעון והאיפוס
  2. לאחר 100 יחידות הזמן, הדפס Test complete באמצעות $display
  3. סיים את הסימולציה באמצעות $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: ליצור אות שעון (להחליף את ערכו כל יחידת זמן אחת)
  

  initial begin
    $display("Traffic Light Test");
    
    // TODO: לאתחל את clk ל-0
    
    // TODO: להפעיל reset (reset=1 למשך 2 יחידות זמן, ואז reset=0)
    
    
    // TODO: להריץ סימולציה למשך 100 יחידות זמן
    
    
    $display("Test complete");
    $finish;
  end
endmodule

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: קומפיילר Verilog אונליין