1

我们验证环境的代码指南是每个文件一个类。

有时 auvm_object只有 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_component从 扩展而来uvm_report_object,并且uvm_report_...在全局 uvm_pkg 中。

使用带有嵌套类的工厂也会遇到问题。只有外部类能够按类型提供覆盖,但基于字符串的名称覆盖是全局的。因此,即使您嵌套了内部类,外部类以外的范围也将能够通过字符串名称将其作为覆盖提供。

于 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 回答
1

一般来说,它确实有效。但是,在某些情况下,UVM 使用的快捷方式与同类场景冲突。例子是

  • 基于字符串的工厂(inception_level_2 只能注册一次,尽管 foo:inception_level_2 和 bla::inception_level_2 将是不同的类)
  • 名称查找冲突(此处用于 uvm_report_warning 应该转到 uvm_pkg::uvm_report_warning 而不是封闭类 uvm_component::uvm_report_warning)...等
于 2015-12-09T10:15:56.010 回答