進程:
- 在定義fork...join塊的時候,將整個分叉封裝在一個begin..end塊中會引起整個塊作為單個進程執行,其中每條語句順序地執行;
- sv為下列進程產生一個執行線程:每一個initial塊,每一個always塊,fork...join(join_any,join_none)語句的每一個並行語句,每一個動態進程;每一個連續賦值也可以認為是它自己的線程;
- 在一個fork...join語句的關聯文中使用return語句是非法的,會導致錯誤,原因是與return語句匹配的進程與fork_join的進程屬於不同的進程;
- 在並發進程中務必使用自動變量來保存數值;
任務與函數;
- Verilog-2001具有靜態和自動的任務和函數。在一個模塊實例中,會為一個任務或函數的所有調用分配相同的存儲空間。自動的任務和函數則為每一個實例分配唯一的、棧式存儲空間;
- SV中無需一個begin...end塊或fork...join塊就可以在一個任務或函數中使用多條語句,默認順序執行;
- SV中任務或函數的形參聲明,缺省方向為input,缺省數據類型為logic;
- SV中的任務允許一個靜態任務中將特定的形式參數和本地變量聲明成自動的,或者,也允許在一個自動任務內將特定的形參和本地變量聲明成靜態的,若任務聲明成自動的,所有的形參和本地變量都被存儲在堆棧中;
- 在一個事件表達式中,一個過程連續賦值語句內的表達式中或者不在一個過程語句中的表達式中調用具有output、inout、ref形參的函數是非法的;在這些關聯文中將const ref作為函數參數是合法的;
- 過程語句通過以下語句引入:initial,final,always,always_comb,always_latch,always_ff,task,function;
- 在一個進程內部,SV具有以下控制流:選擇 循環及跳轉;任務與函數調用;順序和並行塊;時序控制;
類:
- 每一個類的實例的每一個變量都有它自己的拷貝,有時要求所有的實例共享變量的一個屬性,這此屬性使用關鍵字static產生;
- 一個靜態方法像一個常規的子例程一樣可以在類的外部被調用。一個靜態方法不能訪問非靜態成員(類屬性或方法),但它可以直接訪問靜態類屬性或調用同一個類的靜態方法。在一個靜態方法體內訪問非靜態成員或訪問特殊的this句柄是非法的;靜態方法不能是虛擬的;對於一個靜態類屬性,無需產生一個該類型的對象就可以直接使用;
- this關鍵字用來明確地引用當前實例的類屬性或類方法;super關鍵字在繼承類的內部使用,可以用來引用其父類的成員。
- 所有的類屬性和類方法都在類外可見,與SV變量一樣,類屬性可通過const聲明成只讀的,由於類屬性是動態的對象,類屬性允許兩種形式的只讀變量:全局變量和實例常量;
- 全局常量類屬性是那些在聲明中包含了初始值的常量類屬性,與const變量類似,也就是它們不能在除聲明之外的其它地方賦值;實例常量在聲明中不包含初始值,僅包含const限定符,這種類型的常量可以在運行時賦一個值,但賦值只能在對應的類構造器中完成一次;典型情況下,全局常量還被聲明成static,因為它們對於類的所有實例都是相同的,但一個實例常量不能聲明成static,因為它們在構造器中不接受所有的賦值;
- 類是一種數據類型,包含了數據以及對數據進行操作的子程序;
- 除線網類型外的任何數據都可以聲明成一個類屬性;
- 每一個類都有一個缺省的new方法,缺省構造器首先調用它的父類構造器(super.new()),然后繼續將對象的每一個成員初始化成它的初始值;
- 一個靜態方法不同於一個具有靜態生命周期的方法,前者指的是類內部的方法的生命周期,而后者指的是任務內部的參數和變量的生命周期。在類中有以下兩任務:static task foo();...endtask //具有自動變量生命周期的靜態類方法;task static bar();...endtask//具有靜態變量生命周期的非靜態方法;
- 缺省情況下,類方法的參數和變量具有自動的生命周期;
- 將一個子類變量賦值給層次樹中較高的類變量是合法的,將一個超類變量直接賦值給一個子類變量則是非法的,但如果超類句柄引用了指定子類的句柄,那將一個超類句柄賦值給一個子類變量則是合法的;
- 一個子類在實例化的時候會調用類方法new(),在函數中定義的任何代碼執行之前,new()執行的一個動作是調用其超類的new()方法,並且會沿着繼承樹按這咱方式一直向上調用,如果超類的初始化方法需要參數,比較通用的方法是使用super關鍵字調用超類構造器,即在子類的new函數的第一行將超類的new函數聲明全部照抄在第一行;