Systemverilog(綠皮書)第三章——過程塊和方法

在做設計驗證機需要寫很多的代碼,其中大部分在任務和函數中使用。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中的函數是動態函數,這樣更加符合軟件要求。

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