SystemVerilog

**SystemVerilog** (בעברית: **סיסטם-וֵרִילוֹג**; תרגום: **מערכת ורילוג** (הלחם מילים של אימות - Verification ולוגיקה - Logic); מסומנת בקיצור **SV**) היא שפה משולבת לתיאור חומרה (HDL - Hardware Description Language) ולאימות חומרה (HVL - Hardware Verification Language). השפה משמשת למידול, תכנון, סימולציה, בדיקה ומימוש של מעגלים משולבים (IC), מערכות על גבי שבב (SoC) ורכיבי FPGA.

השפה מוגדרת תחת התקן הבינלאומי **IEEE 1800**. ייחודה של SystemVerilog טמון בהיותה שפה "היברידית" המאחדת תחת מעטפת תחבירית אחת שני עולמות הנדסיים: עולם **תכנון החומרה**, המבוסס על מקביליות, תזמון ושערים לוגיים, ועולם **אימות החומרה** (Verification), המבוסס על עקרונות תכנות מונחה-עצמים (OOP) ופיתוח תוכנה מתקדם.

כיום, SystemVerilog היא השפה הדומיננטית ביותר בתעשיית המוליכים למחצה העולמית, והחליפה במידה רבה את השימוש הנפרד בשפות Verilog (לתכנון) ושפות ייעודיות לבדיקה (כמו 'e' או Vera).

## היסטוריה והתפתחות
הצורך ב-SystemVerilog נולד בסוף שנות ה-90 בעקבות "משבר האימות" (Verification Gap). בעוד שמורכבות השבבים גדלה באופן מעריכי (בהתאם לחוק מור), שפת Verilog המקורית (תקן IEEE 1364) התמקדה בתיאור החומרה בלבד והתקשתה לספק מענה יעיל לבדיקת מערכות מורכבות המכילות מיליוני טרנזיסטורים.

### אבני דרך עיקריות

# **הבסיס (Verilog):** השפה נבנתה כהרחבה (Superset) לשפת Verilog-2001. כל קוד Verilog תקני הוא גם קוד SystemVerilog תקני.
# **תרומת Superlog ו-OpenVera (2002):** הבסיס לתוספות השפה הגיע משתי תרומות עיקריות לארגון התקינה **Accellera**:
#* חברת הסטארט-אפ **Co-Design Automation** תרמה את שפת **Superlog**, שהרחיבה את Verilog ביכולות מערכתיות ותחביריות (RTL).
#* חברת **Synopsys** תרמה את שפת **OpenVera** ואת מנגנוני ה-Assertions שלה, שהיוו את הבסיס ליכולות האימות (Verification) המתקדמות בשפה.
# **תקינה ראשונית (IEEE 1800-2005):** בשנת 2005 אימץ ארגון IEEE את המפרט של Accellera כתקן רשמי. בשלב זה SystemVerilog הייתה תוספת ל-Verilog ולא החליפה אותה.
# **איחוד התקנים (2009):** בשנת 2009 מוזג תקן Verilog הישן (1364) באופן מלא לתוך תקן SystemVerilog (1800). צעד זה קבע כי SystemVerilog היא השפה האחת והיחידה, המכילה את Verilog כתת-קבוצה.
# **עדכונים שוטפים:** התקן מתעדכן אחת למספר שנים. הגרסאות הבולטות הן 2012, 2017, והגרסה העדכנית ביותר **IEEE 1800-2023** (שוחררה בתחילת 2024), אשר הוסיפה שיפורים במנגנוני ה-Covergroups, טיפול במחרוזות ויכולות הצפנה.

## שיפורים בשפת התכנון (Design Features / RTL)
חלק זה של השפה ("Synthesizable Subset") מיועד לתיאור המעגל הלוגי שיהפוך בסופו של דבר לסיליקון. השיפורים נועדו להקטין את כמות הקוד (Verbosity), לשפר את הקריאות ולמנוע טעויות סינתזה.

### טיפוסי נתונים חדשים
ב-Verilog הייתה הפרדה מבלבלת בין `wire` (קו חיבור) ל-`reg` (אוגר פרוצדורלי, שלא בהכרח שומר ערך).

* **<code>logic</code>**: טיפוס יחיד המטפל ברוב המקרים. כלי הסינתזה מסיקים מההקשר האם לייצר "חוט" או "דלגלג" (Flip-Flop). הטיפוס הוא בעל 4 מצבים (0, 1, X, Z).
* **טיפוסי 2-מצבים**: נוספו טיפוסים הלקוחים משפת C כגון `int`, `byte`, `bit`. טיפוסים אלו אינם תומכים במצבי אי-ודאות (X) או נתק (Z), ולכן השימוש בהם משפר את ביצועי הסימולציה.

### בלוקים פרוצדורליים מפורשים
השימוש בבלוק `always` הכללי ב-Verilog היה מקור לטעויות רבות (כגון יצירת Latches לא רצויים). SystemVerilog מגדירה את כוונת המתכנן במפורש:

* **<code>always_comb</code>**: ללוגיקה צירופית. הבלוק מעדכן אוטומטית את רשימת הרגישות (Sensitivity List) ומבטיח שלא ייווצר זיכרון בטעות.
* **<code>always_ff</code>**: ללוגיקה סדרתית (דלגלגים). מחייב שימוש בשעון.
* **<code>always_latch</code>**: ליצירת נעלים (Latches) באופן מכוון.

### מבני נתונים וממשקים

* **ממשקים (<code>interface</code>):** יכולת להגדיר "צרור" של אותות (כגון Bus נתונים, כתובות ובקרה) כאובייקט אחד. השימוש בממשקים חוסך כתיבה של רשימות פורטים ארוכות ומונע טעויות בחיבור בין מודולים.
* **מבנים (<code>struct</code>) וטיפוסי מניה (<code>enum</code>):** מאפשרים אריזת מידע והגדרת מכונות מצבים (FSM) עם שמות משמעותיים במקום מספרים, מה שמקל על ניפוי שגיאות (Debug).

## יכולות אימות חומרה (Verification Features)
זהו החידוש המהפכני ביותר בשפה. SystemVerilog מספקת ארגז כלים שלם לבדיקת שבבים, המייתר את הצורך בשפות חיצוניות. קוד זה רץ בסימולציה בלבד ואינו הופך לחומרה.

### תכנות מונחה עצמים (OOP)
SystemVerilog תומכת בפרדיגמת ה-OOP באופן מלא:

* **Classes (מחלקות):** יצירת אובייקטים דינמיים המנוהלים על ידי מנגנון איסוף זבל (Garbage Collection).
* **ירושה (Inheritance) ופולימורפיזם:** יכולת להרחיב מחלקות קיימות ולדרוס פונקציות, מה שמאפשר שימוש חוזר בקוד (Reuse).

### אקראיות מבוקרת (Constrained Randomization)
במערכות מורכבות, לא ניתן לבדוק ידנית את כל הצירופים האפשריים. ב-SystemVerilog מגדירים משתנים כאקראיים (`rand`) ומצמידים להם **אילוצים** (`constraint`). לדוגמה: "הגרל פקודה למעבד, אך וודא שהכתובת זוגית והמידע אינו אפס". מנוע הסימולציה (Constraint Solver) פותר את מערכת האילוצים ומייצר תרחישי בדיקה אוטומטיים, המגלים מקרי קצה שהמתכנן האנושי לא צפה.

### כיסוי פונקציונלי (Functional Coverage)
כלי מדידה המאפשר לענות על השאלה "מתי סיימנו לבדוק?". המהנדס מגדיר **קבוצות כיסוי** (`covergroup`) ונקודות דיגום, והסימולטור מפיק דו"ח המראה איזה אחוז מהמצבים האפשריים (למשל: תור מלא, התנגשות בזיכרון) אכן התרחש בפועל בזמן הריצה.

### טענות (Assertions - SVA)
**SystemVerilog Assertions (SVA)** היא שפה דקלרטיבית בתוך SV, המשמשת לאימות פרוטוקולים ותזמון. באמצעות פקודות כמו `assert property`, ניתן להגדיר כללים התלויים בזמן (Temporal Logic). לדוגמה: "אם האות Request עולה, חובה ש-Grant יעלה תוך 2 עד 5 מחזורי שעון".

## ממשק לתכנות ישיר (DPI)
ה-**Direct Programming Interface (DPI)** מאפשר לקרוא לפונקציות הכתובות בשפת C או C++ ישירות מתוך קוד SystemVerilog, ולהפך. מנגנון זה משמש בעיקר לחיבור מודלי ייחוס (Reference Models) הכתובים בתוכנה אל תוך סביבת הסימולציה של החומרה.

## מתודולוגיות אימות (UVM)
על בסיס יכולות ה-OOP של SystemVerilog, פותחה מתודולוגיית ה-**UVM** (ראשי תיבות: Universal Verification Methodology). זוהי ספריית מחלקות סטנדרטית המספקת שלד (Framework) אחיד לבניית סביבות בדיקה. ה-UVM הפכה לסטנדרט התעשייתי לפיתוח סביבות וריפיקציה מודולריות.

## דוגמאות קוד

### 1. תכנון חומרה (RTL): מכונת מצבים (FSM)
דוגמה לשימוש ב-`enum`, `logic` ובבלוקים `always_ff` ו-`always_comb` (פרקטיקה מומלצת להפרדת הלוגיקה הצירופית מהסדרתית)
```systemverilog
module traffic_light_controller (
    input  logic clk,
    input  logic rst_n,      // איפוס אסינכרוני (פעיל נמוך)
    output logic [1:0] light // יציאה: 00=ירוק, 01=כחול, 10=אדום
);

    // הגדרת המצבים בשמות משמעותיים
    typedef enum logic [1:0] {GREENRED, BLUE, RED} state_t;
    state_t current_state, next_state;

    // לוגיקה סדרתית (Sequential) - דלגלגים
    always_ff @(posedge clk or negedge rst_n) begin
        if (!rst_n) 
            current_state <= RED;
        else 
            current_state <= next_state;
    end

    // לוגיקה צירופית (Combinational) - חישוב המצב הבא
    always_comb begin
        next_state = current_state; // ערך ברירת מחדל למניעת Latch
        
        unique case (current_state) // unique מנחה את הסינתזה לבצע אופטימיזציה
            GREEN: next_state = RED;
            RED:   next_state = BLUE;
            BLUE:  next_state = GREEN;
        endcase
    end

    // המרת המצב ליציאה
    assign light = current_state; 

endmodule
```


### 2. אימות (Verification) מחלקה עם אקראיות

```systemverilog
class DataPacket;
    // משתנים אקראיים
    rand bit [7:0] header;
    rand bit [7:0] payload[]; // מערך דינמי
    rand int       delay;

    // אילוץ: אורך המידע בין 1 ל-100
    constraint c_payload_size {
        payload.size() inside {[1:100]};
    }

    // אילוץ: ה-header חייב להיות זוגי וגדול מ-10
    constraint c_header_valid {
        header > 10;
        header % 2 == 0;
    }

    // פונקציה להדפסת המידע
    function void print();
        $display("Packet: Header=%h Size=%0d Delay=%0d", header, payload.size(), delay);
    endfunction
endclass

module tb_top;
    initial begin
        DataPacket pkt = new();
        
        repeat (5) begin
            // הגרלת ערכים העומדים באילוצים
            if (!pkt.randomize()) 
                $error("Randomization failed!");
            else 
                pkt.print();
        end
    end
endmodule
```


## השוואה מול שפות אחרות

## קישורים חיצוניים
* אתר ארגון Accellera - האחראי על פיתוח תקני UVM וקידום השפה.
* תקן IEEE 1800 - העמוד הרשמי של התקן באתר IEEE.
* SystemVerilog Tutorial - מדריך לימודי מקיף (באנגלית).

קטגוריה:תכנות
קטגוריה:חומרה