Systemverilog(Green Book)Chapter 3-Process Blocks and Methods

設計検証マシンを実行するには多くのコードを記述する必要があり、そのほとんどはタスクと関数で使用されます。Systemverilogはこの点に関して多くの改善を加え、C言語に近づけているため、特にパラメーター転送の処理において、コードの記述がより簡単になります。

  • Systemverilogでは、プロセスブロックとそのメソッドはドメインごとに分けられ、ハードウェアとソフトウェアの部分に分けられます

 関数パラメータタイプのテスト問題は次のとおりです。

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の3つのメンバー変数{cmd、addr、data}の最終的な値は何ですか?

{'h2、' h0、 'h0}

関数パラメーターにより、デフォルトの方向が入力されます。ここでは、trans変数は入力変数と見なされます。したがって、代入関数はop_copy関数を呼び出すことで実現され、出力値の方向が決まらないため、結果は0になります。

 

  • systemverilogでは、ライフサイクルを自動と静的に分けます。
  • 静的変数と動的変数のスコープ設計の問題は次のとおりです。

  • 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
    
    
    

    解決策:最初の関数で、自動として定義されている場合、その内容はすべて動的変数です。したがって、各呼び出しの後、元の値は0に復元されます。

    • 2番目の関数では、静的として定義されている場合、その内容はすべて静的変数です。したがって、呼び出しのたびに増加します。

    • 3番目の関数の場合、モジュール内のすべての関数はデフォルト静的関数であり、関数内の変数は静的変数ですただし、ほとんどの場合、モジュールの関数が動的な関数であることを望みます。これは、ソフトウェア要件により一致しています。

公開された14元の記事 ウォン称賛10 ビュー20000 +

おすすめ

転載: blog.csdn.net/Jay_who/article/details/105339446