SystemVerilog

SystemVerilog是一種在現代積體電路的設計及驗證流程中，由Verilog發展而來的硬體描述、硬體驗證統一語言，前一部分基本上是2005年版Verilog的擴充套件，而後一部分功能驗證特性則是一門面向物件程式設計語言。面向物件特性很好地彌補了傳統Verilog在晶片驗證領域的缺陷，改善了程式碼可重用性，同時可以讓驗證工程師在比暫存器傳輸級更高的抽象級別，以事務而非單個訊號作為監測物件，這些都大大提高了驗證平臺搭建的效率。SystemVerilog已經被採納為電氣電子工程師學會1800-2009標準，並獲得了主流電子設計自動化工具供應商的支援。雖無任一個模擬系統能聲稱自己完全支援SystemVerilog語言參考手冊裡介紹的所有語言結構，要改善測試平臺的互操作性相當困難，但推進跨平臺相容性的研究開發工作已在進行中。若干種驗證方法學相繼出現，以預定義類的形式對測試平臺模組進行標準化，如今最新基於SystemVerilog的驗證方法學為通用驗證方法學。此方法學主要包括開放原始碼的類庫以及支援可重用測試平臺、開發驗證IP核的預置格式。許多第三方提供商則開始推出基於SystemVerilog的驗證IP核。發展歷史.SystemVerilog的歷史可以追溯到2002年，當時一個被稱為“Superlog”的語言被捐贈給Accellera公司。而Synopsys公司捐贈的OpenVera後來發展成為SystemVerilog中硬體驗證語言子集。2005年，SystemVerilog獲批成為電氣電子工程師學會1800-2005標準。當時Verilog作為電氣電子工程師學會1364-2005標準尚獨立存在。2009年，SystemVerilog與的Verilog進行了合併，成為了新的電氣電子工程師學會1800-2009標準。現在的最新標準是電氣電子工程師學會1800-2017標準。設計特性.對於電路設計工程師來說，SystemVerilog中有大部分內容繼承自Verilog，但是也提供了一些增強或者改進的特性。下面的章節主要講述SystemVerilog的這些特性。新的資料型別.邏輯型變數.SystemVerilog定義了一種新的邏輯型變數。和Verilog中變數的宣告類似，以下程式碼描述了一個32位的邏輯型變數：logic [31:0] my_var;在傳統的Verilog中，變數主要分為線網型兩大型別。只有暫存器型變數才能夠在過程程式碼塊中被賦值，而線網型變數只能在過程程式碼塊之外被連續賦值。暫存器型變數的過程賦值和線網型變數的連續賦值使用了完全不同的語句結構。在Verilog中，二者的區分比較微妙，以至於有些專業的工程師也在設計中混淆二者。由於codice_4過程程式碼塊不僅可以描述時序邏輯電路，還可以透過將所有暫存器型的輸入變數新增到敏感列表來實現純組合邏輯電路，因此“暫存器型”這個帶有時序邏輯意義的術語本身也令人誤會。SystemVerilog增強了暫存器型變數的功能，它可以像Verilog中線網型變數一樣由線網。這種增強的變數型別被命名為“邏輯型”，從而避免“暫存器型”在字面上給人帶來的誤會。在大多數情況中，SystemVerilog中的codice_1可以替代Verilog中的codice_3和codice_2，但是如果某個某個變數具有多個驅動源，那麼就不能使用codice_1，而要使用嚴格的codice_2來定義它。多維壓縮陣列.這種結構將Verilog中與暫存器、儲存器相關的概念進行了合併和擴充套件。在Verilog中，變數名稱左邊的索引被用來表示二進位制變數的位寬，Verilog規定它只能是一維的。而這個陣列名稱右邊的索引用來表示以這種位寬變數組成陣列的元素個數，因為陣列可以是一維陣列、二維陣列或者多維陣列，因此這個索引可以是任意整數。在SystemVerilog中，如果在變數名稱左邊指定了由高至低的位寬。壓縮陣列本身可以是多維的，即變數名稱左邊可以具有多維索引。如果在變數名稱右邊指定了陣列尺寸，則稱之為“非壓縮陣列”。下面用示例程式碼表示了一個由二維壓縮陣列構成的一維非壓縮陣列：logic [1:0][2:0] my_pack[32];在上面的例子裡，非壓縮陣列陣列codice_11具有32個元素。這個非壓縮陣列每一個元素本身又是壓縮陣列，即2個位寬為3的邏輯型變數，因此非壓縮陣列的每一個元素包含六位二進位制數的資訊。A variable of packed array type maps 1:1 onto an integer arithmetic quantity.列舉.SystemVerilog引入了列舉型變數，它使用一系列有實際字面意義的名稱來代表若干變數。如果不進行專門的資料型別轉換，一個列舉型變數不能直接賦值給另一個列舉型的變數。過去在Verilog中描述有限狀態機常常使用引數，而在SystemVerilog中，使用列舉則更為方便。typedef enum logic [2:0] {RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW} color_t;color_t my_color = GREEN;initial $display("The color is %s", my_color.name());上面的例子使用了typedef來建立了一個新的資料型別名稱，從而可以用它來建立一系列列舉資料。列舉型別的資料型別，為位寬為3的邏輯型變數。3位二進位制數能夠逐一指代六種顏色。使用程式碼codice_14建立了一個新的codice_15型變數，其值初始化為六種顏色中的綠色。系統函式codice_16的作用與Verilog相同，其引數是codice_17所屬函式codice_18的返回值，即當前列舉值的ASCII值。其他新增的資料型別.除了基本的邏輯型變數。結構體和聯合體.這兩種資料型別和C語言中的結構體和聯合體類似。在SystemVerilog中，與這兩種資料型別相關的增強特性為壓縮屬性。壓縮屬性使得mapped 1:1 onto a packed array of bits，而標籤屬性允許跟蹤當前聯合體中實際被使用的成員。這些結構佔據了連續的儲存空間。typedef struct packed {bit [10:0] expo;bit sign;bit [51:0] mant;} FP;FP zero = 64'b0;條件、選擇語句的唯一性和優先性.當條件、選擇語句的路徑分支較為複雜時，設計人員稍不留意就可能造成程式碼所描述的行為違背設計人員預計的優先級別，或者被判斷的表示式同時滿足多個分支條件，從而在模擬過程中產生無規律結果。為此，SystemVerilog增強了條件、選擇語句的功能，允許設計人員為這分支流程的執行設定特別的約束。在多級條件、選擇語句中使用關鍵字codice_30，可以限定有且只有一個分支可能被執行到，否則將產生一個警告。而關鍵字codice_31則指出某些分支路徑具有更高的優先順序。過去，在傳統的Verilog中，要實現類似的功能，設計人員需要在可綜合程式碼中附帶一些特殊的註釋來通知邏輯綜合工具產生正確的分支邏輯電路。不過，註釋並非SystemVerilog程式碼的正式組成部分，它們只是在邏輯綜合過程被特定的工具讀取，而不嚴謹的註釋很可能造成綜合後電路與綜合前模擬結果不同的情況。過程程式碼.Verilog中的過程程式碼可以描述時序邏輯電路，也可以描述組合邏輯電路，這一點容易造成概念的混淆，如果程式碼不嚴謹，邏輯綜合很可能推斷出鎖存器，從而產生不符合預期的硬體模型。SystemVerilog除了繼續支援原來Verilog中的老式過程結構codice_4、codice_34，還在原有codice_4基礎上針對組合邏輯電路、觸發器、鎖存器設計了專用的codice_4結構。雖然它們顯得不夠通用，但是三類硬體模型的差異得到了明確地區分，避免使用老式codice_4時容易出現的鎖存器推斷：三種專用的codice_4結構在使用時會檢查設計程式碼是否符合對應硬體模型的特徵。如果設計人員在過程程式碼中描述了與對應硬體不符合的行為，那麼系統會發出警告。這是SystemVerilog種專用型過程結構的優越之處。下面的例子使用codice_38來描述組合邏輯電路。在SystemVerilog中無需像Verilog中描述組合邏輯電路那樣寫出敏感列表，codice_38會告訴邏輯綜合工具這是一個組合邏輯電路，因此係統會預設對所有輸入訊號的電平敏感。在表示組合邏輯電路的過程程式碼中，一般使用阻塞賦值。always_comb begintmp = b * b - 4 * a * c;no_root = (tmp  gnt;endpropertyassert_req_gnt: assert property (req_gnt) else $error("req not followed by gnt.");上面這個例子顯示了蘊含。這時，如果codice_78未滿足高電平的要求，則後面的codice_77無論是高電平還是低電平，整個斷言都預設為成功；但是如果codice_78為高電平，則系統會根據codice_77的邏輯值來決定斷言是否成功。除此之外，SystemVerilog還支援斷言覆蓋。功能覆蓋.在硬體驗證中，功能覆蓋是指驗證過程中對人工定義訊號事件的資料取樣和收集過程。功能覆蓋率在某種程度上反映了被測設計在所給輸入激勵下，其內部功能正確與否被檢測到的百分比。功能覆蓋率越高，一般代表測試越完備。注意功能覆蓋率和程式碼覆蓋率不同，後者只是測量被測設計的所有程式碼有多少在模擬過程中被執行過。功能覆蓋的目的是確保設計中的所有邊界情況都能夠被經歷。SystemVerilog覆蓋組則可以進一步獲取多個變數分別在某一範圍內統計資料。透過使用覆蓋組的codice_86方法，可以啟動該覆蓋率的統計。For example:class eth_frame;// Definitions as abovecovergroup cov;coverpoint dest {bins bcast[1] = {48'hFFFFFFFFFFFF};bins ucast[1] = default;coverpoint type {bins length[16] = { [0:1535] };bins typed[16] = { [1536:32767] };bins other[1] = default;psize: coverpoint payload.size {bins size[] = { 46, [47:63], 64, [65:511], [512:1023], [1024:1499], 1500 };sz_x_t: cross type, psize;endgroupendclass在這一例子中，驗證工程師重點關注廣播和單播幀的分佈以及負載大小。同步化.一個複雜的測試平臺往往是包含多個可重用驗證模組的環境，這些模組之間需要互相通訊。Verilog的事件，可以將符合其型別的物件“裝入”和“取出”信箱。而旗語則限定了對同一資源的訪問個數。其他與傳統Verilog類似概念的比較.除了前面提到的特性，SystemVerilog還在以下方面對傳統的Verilog進行了增強：