Когда мы используем класс typedef xxxxx в uvm?

Я не знаком с увм, но пытаюсь понять и изучить.

Я нашел приведенный ниже код, когда опирался на UVM.

typedef class driver; 
typedef class monitor;   

class env; driver d0; 
monitor mon0;   
function init_drvr (); 
d0 = new (); // initialize endfunction   
function init_mon (); 
mon0 = new (); // initialize endfunction endclass
endfunction
endclass

Особенно

typedef class driver; 
typedef class monitor;   

Наверное, это похоже на объявление чего-то, но зачем там эти typedef?

Не могли бы вы сообщить мне, почему мы используем

typedef class driver; 

typedef class monitor;   

и как понять эту грамматику?


person IamUser    schedule 18.09.2018    source источник


Ответы (2)


Редко, когда вам понадобится typedef class name в SystemVerilog. Большинство языков программирования требуют, чтобы идентификаторы, используемые в качестве имен типов, были объявлены до того, как на них можно будет ссылаться синтаксически. Одно место, которое происходит, это если у вас есть циклические ссылки на классы

class X;
  Y has_a_Y;
endclass
class Y;
  X has_a_X;
endclass

Чтобы скомпилировать код для класса X, необходимо объявить класс Y. Если вы измените порядок компиляции классов, то X станет неизвестным. Поэтому мы используем то, что называется forward typedef.

typedef class Y;
class X;
  Y has_a_Y;
endclass

Теперь класс X компилируется до тех пор, пока класс Y определяется перед закрытием текущей области.

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

Иногда люди используют прямое определение типа даже при отсутствии циклических зависимостей, потому что они слишком ленивы, чтобы компилировать свой код в правильном порядке зависимостей.

person dave_59    schedule 18.09.2018

Это называется предварительное объявление и является функцией большинства компиляторов объектно-ориентированных языков. Он используется для объявления идентификатора, который еще не определен.

По сути, вы сообщаете компилятору, что существует класс с именами monitor и driver, который определен в другом месте области компиляции. Это будет решено во время выполнения.

Для получения дополнительной информации обратитесь к статье ниже: (это на C++, но концепция применима)

https://www.learncpp.com/cpp-tutorial/17-forward-declarations/

person noobuntu    schedule 18.09.2018