1. 程式人生 > 其它 >SV中的過程塊和方法

SV中的過程塊和方法

技術標籤:SystemVerilogsystemverilog

一、硬體過程塊

在SV中首先要搞清楚哪些語句應該放在“硬體世界”,哪些程式應該放在“軟體世界”。

  • 硬體世界:module、interface
  • 軟體世界:program、class

always

  • always是為了描述硬體的行為,可以描述時序電路、組合電路。所以只在module和interface中使用。
  • always中的@(event)敏感列表是為了模擬硬體訊號的觸發行為。

initial

  • initial非常符合軟體的執行方式,即只執行一次。
  • initial和always一樣,無法被延遲執行,即在模擬一開始的時候它們都會同時執行,在執行順序上沒有先後之分。
  • initial本身不可綜合,就是為了測試而生。
  • Verilog中所有測試語句都放在了initial中。
  • initial過程塊在SV中可以在module、interface、program中使用。

二、函式function

SV中function同C語言非常類似。可以在引數列表中指定input、output、inout、ref型別的引數,也可以返回數值或者是void沒有返回值。

function int double(input a);
	return 2*a;
endfunction

function的屬性

  • 預設資料型別為logic
  • 陣列可以作為形參傳遞
  • function可返回或不返回結果
  • 只有資料變數可以在形參列表中宣告為ref型別,線網型別不能被宣告為ref型別
  • 在使用ref時可以採用const方式保護源資料不被修改
  • 可指定引數的預設值

三、task任務

  • task無法通過return返回結果,只能通過output、inout或ref引數返回
  • task內可以置入耗時語句(@event、wait、event、#delay等),而function不能
  • 內建耗時語句時使用task,可能會用於耗時的訊號取樣或者驅動的場景;而非耗時方法定義時使用function,運用於純粹的數字或者邏輯運算
  • 如果呼叫function,function和task皆可對其呼叫,如果呼叫task,建議使用task呼叫,因為task有可能耗時

四、變數宣告週期

  • 可以將資料的宣告週期分為動態(automatic)和靜態(static)
  • 區域性變數生命週期同其所在域共存亡,屬於動態生命週期
  • 全域性變數伴隨著程式開始到結束,例如module中變數預設哦日全域性變數,屬於靜態生命週期
  • 如果資料變數被宣告為automatic,那麼在進入該程序/方法後,automatic變數會被建立,離開後會被銷燬,而static變數在模擬開始時即被建立,而在程序/方法執行過程中,自身不被銷燬,可以被多個程序/方法所共享
  • 在module、program、interface、task、function之外宣告的變數擁有static宣告週期,存在於整個模擬階段
  • 在module、interface和program內部宣告,且在task、process或function外部宣告的變數也是static變數,且作用域在該塊中
  • 在module、program、interface中定義的task、function預設都是static型別
  • 在過程塊中(task、function、process)定義的變數均跟隨它的作用域,即過程塊的型別,如果過程塊為static,則它們也預設為static