在做設計驗證機需要寫很多的代碼,其中大部分在任務和函數中使用。systemverilog在這方面增加了很多改進,使其更加接近C語言,從而使代碼的編寫變得更加容易,尤其是在處理參數的傳遞上。
- 在Systemverilog中,過程塊和其方法通過域進行劃分,分爲硬件部分和軟件部分,具體的內容如下圖:
針對function參數類型設置考題如下:
typedef struct{
bit [1:0] cmd;
bit [7:0] addr;
bit [31:0] data;
} trans;
function automatic void op_copy(trans t,trans s);
t = s;
endfunction
initial begin
trans s;
trans t;
s.cmd = 'h1;
s.addr = 'h10;
s.data = 'h100;
op_copy(t,s);
t.cmd = 'h2;
end
問:t 中的三個成員變量{cmd,addr, data}最後的數值是多少?
{‘h2,'h0,'h0}
由於function的參數,默認的 方向都是input,這裏trans t 變量被看做是輸入型變量。因此, 通過調用op_copy函數來實現賦值的功能,由於方向出值的方向未被確定,結果爲0。
- 在systemverilog中,我們將生命週期分爲動態(automatic)和靜態(static)。
-
針對靜態變量和動態變量的作用域設計問題如下:
-
function automatic int auto_cnt(input a); int cnt = 0; cnt +=a; return cnt; endfunction function static int auto_cnt(input a); static int cnt = 0; cnt +=a; return cnt; endfunction function int auto_cnt(input a); static int cnt = 0; cnt +=a; return cnt; endfunction initial begin $display("@1 auto_cnt = %0d",auto_cnt(1)); $display("@2 auto_cnt = %0d",auto_cnt(1)); $display("@1 auto_cnt = %0d",static_cnt(1)); $display("@2 auto_cnt = %0d",static_cnt(1)); $display("@1 def_cnt = %0d",def_cnt (1)); $display("@2 def_cnt = %0d",def_cnt (1)); end
解: 對於第一個函數,定義爲automatic則其裏面的內容都是動態的變量。因此,每次調用之後,都會恢復原值0;
-
對於第二個函數,定義爲static則其裏面的內容都是靜態的變量。因此,每次調用之後,都會遞增;
-
對於第 個三函數,在module中 所有的函數,默認 情況下都是靜態函數,函數中的變量都是靜態 變量。但是,大多數情況下,我們希望module中的函數是動態函數,這樣更加符合軟件要求。
-