Menu
CoddyTech

Casex ו-Casez

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

לפעמים אכפת לך רק מסיביות מסוימות בערך, בעוד שאפשר להתעלם מסיביות אחרות. לדוגמה, במקודד עדיפויות, רוצים למצוא את סיבית ה־1 הראשונה בלי קשר לסיביות האחרות.

משפט case רגיל ידרוש ממך לציין כל צירוף אפשרי של סיביות ה״לא משנה״, דבר שאינו אפשרי באפיקים רחבים.

casez ו-casex פותרים את הבעיה הזאת בכך שהם מאפשרים לך לסמן ביטים מסוימים כ״לא משנה״ באמצעות ?, z או x.

Casez לעומת Casex לעומת Case רגיל

הצהרהביטים שלא אכפת לנו מהםמתאים במיוחד ל־
caseאיןהתאמה מדויקת
casezz או ?מקודדי עדיפות (מומלץ)
casexx, z או ?יש להימנע (מסתיר באגים)
  • casez מתעלם מביטים שהם z או ? (מומלץ)
  • casex מתעלם גם מביטי x, מה שעלול להסתיר שגיאות בסימולציה

השתמשו תמיד ב־casez, ולא ב־casex. casex מסוכן כי הוא מתעלם מערכי x (שלעיתים קרובות מציינים אוגרים שלא אותחלו או שגיאות סימולציה). casez הוא החלופה הבטוחה יותר, כי הוא אינו מתייחס ל־x כאל ערך שאין להתחשב בו.

דוגמה

casez (data)
  4'b???1: out = 0;   // Bit0 must be 1, others don't matter
  4'b??1?: out = 1;   // Bit1 must be 1, others don't matter
  4'b?1??: out = 2;   // Bit2 must be 1, others don't matter
  4'b1???: out = 3;   // Bit3 must be 1, others don't matter
endcase

? פירושו "לא משנה". הסיבית הזאת יכולה להיות 0, 1 או כל דבר אחר.

challenge icon

אתגר

מה לעשות:

הוסף את פקודת casez החסרה כדי שהמפענח הזה יעבוד.

איך זה עובד:

  • input = 4'b???1 → out = 4'b0001
  • input = 4'b??1? → out = 4'b0010
  • input = 4'b?1?? → out = 4'b0100
  • input = 4'b1??? → out = 4'b1000
  • ברירת מחדל → out = 4'b0000

נסו בעצמכם

module decoder (
  input [3:0] in,
  output reg [3:0] out
);
  
  always @(*) begin
    // TODO: הוסף משפט casez
    // in = 4'b???1 -> out = 4'b0001
    // in = 4'b??1? -> out = 4'b0010
    // in = 4'b?1?? -> out = 4'b0100
    // in = 4'b1??? -> out = 4'b1000
    // default -> out = 4'b0000
  end
  
endmodule
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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

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