Как импортировать макросы SystemVerilog? - PullRequest
1 голос
/ 29 февраля 2012

Я занимаюсь разработкой SystemVerilog монитора, который расширяет ovm_monitor , и я хотел бы знать, как импортировать используемые мной макросы ovm. Я использую:

`ovm_component_utils_begin
`ovm_field_string
`ovm_component_utils_end

Я попробовал следующее в верхней части моего файла, оба из которых не компилируются:

import ovm_pkg::ovm_monitor;
import ovm_pkg::ovm_macros;

и

import ovm_pkg::ovm_monitor;
`include "ovm_macros.svh"

Ошибка компиляции VCS:

Error-[SE] Syntax error
  Following verilog source has syntax error :
  "my_monitor.svh", 58 (expanding macro): token is '#'
  `ovm_component_utils_begin(my_monitor)
                                        ^

Следующее работает, но я считаю плохой практикой использовать * в операторе импорта:

import ovm_pkg::*

Ответы [ 4 ]

2 голосов
/ 28 июня 2012

Импорт с * на самом деле является лучшей практикой.

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

Пользователям OVM или UVM предписано никогда не определять какие-либо пользовательские классы или макросы, используя префикс «ovm_», поскольку в будущих версиях OVM могут добавляться дополнительные ovm_classes или `ovm_macros, поэтому импорт пакетов OVM с помощью * безопасен.

Если вы должны были импортировать два пакета с * и если оба пакета имели одно и то же имя функции, то если ваш код не использует эту функцию, проблем нет. Если вашему коду действительно требуется эта функция, добавьте к ней префикс pkg2 :: function_name, что опять же является наилучшей практикой.

С уважением - Клифф Каммингс - Verilog & SystemVerilog Guru

1 голос
/ 17 мая 2013

Это должен быть комментарий к ответу Adam12, но я не могу добавлять комментарии.

@ Виктор Любославский, Если вы не хотите использовать import ovm_pkg::*, вам придется взглянуть на расширение макросаили расширенный код, созданный макросом, и import необходимые идентификаторы, например ovm_component_registry, ovm_object, OVM_CHECK_FIELDS (на основе ответа Адама12).

Однако в будущем ovm_component_utils_*или ovm_field_* макросы могут измениться, чтобы включить больше идентификаторов OVM, и вам придется изменить код, затем import эти дополнительные идентификаторы.

1 голос
/ 02 марта 2012

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

class top extends blah;



   typedef ovm_component_registry #(top,"top") type_id; 
           ^
   static function type_id get_type(); 
     return type_id::get(); 
   endfunction  

   const static string type_name = "top"; 
   virtual function string get_type_name (); 
     return type_name; 
   endfunction  

   static bit m_fields_checked = 0; 
   function void m_field_automation (ovm_object tmp_data__=null, 
                                     int what__=0, 
                                     string str__=""); 
   begin 
     top local_data__; /* Used for copy and compare */ 
     string string_aa_key; /* Used for associative array lookups */ 
     /* Check the fields if not already checked */ 
     if(what__ == OVM_CHECK_FIELDS) begin 
       if(! top::m_fields_checked) 
         top::m_fields_checked=1; 
       else 
         return; 
     end 
     /* Type is verified by ovm_object::compare() */ 
     super.m_field_automation(tmp_data__, what__, str__); 
     if(tmp_data__ != null) 
       /* Allow objects in same hierarchy to be copied/compared */ 
       if(!$cast(local_data__, tmp_data__)) return; 
     if(what__ == OVM_CHECK_FIELDS) begin 
       m_field_array.delete(); 
     end 

     end 
   endfunction(top)


endclass
0 голосов
/ 01 марта 2012

К сожалению, выбор импорта ovm_pkg :: * невелик.OVM не полностью квалифицирует все свои имена внутренним именем пакета, поэтому почти невозможно получить код для компиляции без него.

...