2014-02-03 6 views
1

Указатель для нашей среды проверки - это один класс для каждого файла.Поддерживает ли UVM вложенные/внутренние классы?

Иногда a uvm_object нужен только 1 другому 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

ответ

5

SystemVerilog имеет пакеты, который является предпочтительным механизмом «скрывать» объявление классов из других пакетов.

У вас возникнут проблемы с использованием макросов полей или всего остального, которые пытаются ссылаться на идентификаторы внутри внутреннего класса, которые определены с тем же именем как в глобальном uvm_pkg, так и во внешнем классе. Все методы uvm_report_... определены как из-за того, что uvm_component распространяется от uvm_report_object, а uvm_report_... находится в глобальном uvm_pkg.

У вас также будут проблемы с использованием фабрики с вложенными классами. Только внешний класс сможет предоставлять переопределения по типу, но переопределения на основе строк по имени являются глобальными. Поэтому, даже если вы вложили внутренний класс, области, отличные от внешнего класса, смогут предоставить его как переопределение по имени строки.

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 
+0

В моем случае мне нужна только автоматизация поля для методов 'print' и' sprint'. Полагаю, что я мог бы вручную выполнить обратный вызов do_print. –

+0

Как указывает Дэйв выше, вам будет лучше обслуживать, поставив эти два класса в пакет. Это также имеет то преимущество, что он более удобен в обслуживании, поскольку он является стандартным способом его выполнения. – nguthrie

1

в целом это действительно работа. однако есть ситуации, когда UVM использует ярлыки, которые конфликтуют с сценарием класса в классе. примеры

  • строка фабрика, основанная (inception_level_2 может быть зарегистрирован только один раз, несмотря на это обув: inception_level_2 и бла :: inception_level_2 будут разные классы)
  • поиск имен столкновений (здесь uvm_report_warning, который должен перейти uvm_pkg :: uvm_report_warning а не к охватывающему классу uvm_component :: uvm_report_warning) ... и т. д.