1

検証環境のコード ガイドラインは、ファイルごとに 1 つのクラスです。

uvm_objectaは 1 つの other でのみ必要な場合があるuvm_componentため、オブジェクト指向の理論に従って、ネストされた/内部クラスを使用する必要があります。

ネストされたクラスは、SystemVerilog で完全にサポートされています。しかし、それらは UVM でサポートされていますか?

次のようなものをコンパイルすることは可能ですか:

class inception_level_1 extends uvm_test;

  `uvm_component_utils(inception_level_1)

  function new(string name = "inception_level_1", uvm_component parent = null);
    super.new(name, parent);
  endfunction

  class inception_level_2 extends uvm_object;

    int a;

    `uvm_object_utils_begin(inception_level_2)
      `uvm_field_int(a, UVM_DEFAULT)
    `uvm_object_utils_end

    function new(string name = "inception_level_2");
      super.new(name);
    endfunction

  endclass

endclass

現在、上記のコードではコンパイル エラーが発生します。

** Error: testbench.sv(20): (vlog-2889) Illegal to access non-static method 'uvm_report_warning' outside its class scope.

完全なコード例: http://www.edaplayground.com/x/3r8

4

3 に答える 3

5

SystemVerilog にはパッケージがあります。これは、他のパッケージからクラス宣言を「隠す」ための推奨メカニズムです。

フィールド マクロ、またはグローバル uvm_pkg と外部クラスの両方で同じ名前で定義されている内部クラス内から識別子を参照しようとするその他のものを使用すると、問題が発生します。は から拡張されているため、すべてのuvm_report_...メソッドは両方で定義されており、グローバル uvm_pkg にあります。uvm_componentuvm_report_objectuvm_report_...

また、ネストされたクラスでファクトリを使用すると問題が発生します。型によるオーバーライドを提供できるのは外側のクラスだけですが、名前による文字列ベースのオーバーライドはグローバルです。したがって、内部クラスをネストした場合でも、外部クラス以外のスコープは文字列名によるオーバーライドとして提供できます。

于 2014-02-04T04:24:57.210 に答える
2

コードを変更してフィールド マクロを削除すると、これが実行されます。したがって、フィールド オートメーション マクロをあきらめることができれば、これはサポートされているようです: http://www.edaplayground.com/x/i5

class inception_level_1 extends uvm_test;

  `uvm_component_utils(inception_level_1)

  function new(string name = "inception_level_1", uvm_component parent = null);
    super.new(name, parent);
  endfunction

  class inception_level_2 extends uvm_object;

    int a;

    `uvm_object_utils(inception_level_2)

    function new(string name = "inception_level_2");
      super.new(name);
    endfunction

  endclass

endclass
于 2014-02-04T02:48:03.760 に答える