SystemVerilog(一):任務和函數

一、任務和函數

語句:時延語句:# 10  阻塞語句:@、wait

函數:不能使用時延語句和阻塞語句, 大部分不能調用任務。void函數可以被任何任務、函數調用。

子程序:任務和函數是兩種用來定義子程序的方式。若消耗仿真時間,使用任務。若不消耗仿真時間,使用函數。

sv給任務和函數增加了新的語義特性,對高級抽象建模十分重要。包括靜態和自動作用域、參數傳遞、線程、參數化函數。

二、作用域

1、形參和局部變量在Verilog、SV中放在靜態存儲區。 加automatic使用自動存儲。

2、靜態作用域:

     靜態作用域變量被綁定到應用程序的數據存儲區域(在這裏是指仿真器). 此存儲區域將被所有的線程所共享. 而另一方面對於自動變量,將映射到棧區存儲區, 對同一個函數進行多次調用,自動變量將映射到棧中互補相同的區域。

由C/C++編譯的程序佔用內存分爲 :靜態存儲區(靜態區、全局區)、堆區、棧區和代碼區。

靜態存儲區:內存在編譯(定義)時分配好,並一直保持不變,直至整個程序結束。存放靜態變量、全局變量和常量

棧區:執行函數時,局部變量的存儲單元在棧上創建,執行結束由編譯器自動釋放。棧內存分配運算內置於處理器的指令集中,效率很高,但分配的內存容量有限。存放函數返回值、參數,局部變量。典型的例子是函數形參,在函數定義時並不給行參分配存儲單元,只是在函數被調用時,才予以分配,調用函數完畢立即釋放。如果一個函數被多次調用時,則反覆地分配、釋放形參變量的存儲單元。

堆區:程序運行時申請任意大小內存,程序員決定在適當時候釋放內存。存放通過new和malloc函數分配得到的空間。

參考文獻:https://www.cnblogs.com/lesroad/p/10389971.html  靜態存儲區、堆、棧之間的區別 

參考文獻:https://blog.csdn.net/hairetz/article/details/4141043  堆和棧的區別(轉過無數次的文章)

一個變量屬於那種存儲方式可以從其生存期、作用域判斷。生存期和作用域時從時間和空間這兩個不同的角度來描述變量的特性。

變量的存儲方式可分爲:“靜態存儲”和“動態存儲”兩種。 前者對應靜態存儲區,後者對應堆和棧。

3、自動作用域(自動存儲)

因局部變量靜態存儲常見的兩個問題:多次調用阻塞時參數覆蓋、聲明和初始化未分離產生初始化漏洞。

SystemVerilog允許變量以自動作用域綁定。爲了在函數/任務中使用自動綁定功能,函數/任務需要聲明爲automatic. 另外,所有在program塊中聲明的函數/任務缺省都是自動作用域的。如果在自動作用域子程序中仍然需要使用靜態變量,那麼必須使用static關鍵字顯式聲明此變量。

1、自動存儲:在所屬函數被調用時自動產生,在該函數結束時消亡。自動變量是一個局部變量,作用域爲包含它的代碼塊,代碼塊是被包含在花括號中的一段代碼。自動變量通常存儲在棧中。

2、靜態存儲:靜態存儲是整個程序執行期間都存儲在的存儲方式。有兩種辦法使變量成爲靜態:一種是在函數外定義它;另一種是在聲明變量時使用static。

3、動態存儲:new和delete運算符提供動態存儲功能。動態存儲內存在堆中。

三、未待完續 

參考文獻:https://www.cnblogs.com/mollieee/archive/2011/05/19/2050892.html  

                  SystemVerilog——任務和函數(Tasks and Functions)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章