Я настраиваю новый код UVM и хочу сделать код OOMR в своем коде uvm. Нужно ли мне избегать концепции кода OOMR (Out Of Module Reference) в UVM? Если это не нужно, что я должен проверить до кода OOMR и после?
tb.top.env.dut.a = 1;
a = tb.top.env.dut.b
Если вы видите ссылку, там какое-то сообщение об ошибке после запуска.
a=u_sub.b;
|
ncvlog: *E,ILLHIN (add.sv,6|12): illegal location for a hierarchical name (in a package).
Чтобы предотвратить эту проблему, я думаю, что должен избегать такого стиля кода. Но я не уверен, что хорошо понимаю эту проблему.
Не уверен, но, насколько я знаю, некоторые инструменты EDA поддерживают эту проблему. Например, cadence($xm_mirror), Mentor, VCS...
Поэтому я хочу знать, нужно ли мне избегать этого стиля кода OOMR? или Должен ли я использовать только подсказки инструмента EDA. Как решить эту проблему, когда я получил аналогичную ошибку в огромных сложных кодах uvm?
@MatthewTaylor, но вы обнаружите, что не можете использовать (я бы назвал) иерархические ссылки Verilog в пакетах, которые я бы назвал OOMR. Да, это то, что я хочу знать. Что делать, если у меня возникла аналогичная проблема, что я должен проверить в первую очередь?
@MatthewTaylor Могу ли я использовать «интерфейс» для решения «иерархических ссылок Verilog» в пакетах с этой проблемой?
Использование иерархических ссылок Verilog или OOMR в пакете SystemVerilog является незаконным. Это связано с тем, что пакеты SystemVerilog компилируются первыми, а не остальной код SystemVerilog.
Как правило, вы будете помещать свои классы в пакет. Поэтому вам следует избегать использования Verilog Hierarchical References или OOMR в классах.
Очевидно, вы захотите подключить код класса к портам ИУ (например, драйверам и мониторам), а также, возможно, захотите проверить внутренние сигналы ИУ. Решение этих проблем различно для каждого случая.
Для подключения к портам DUT большинство людей используют SystemVerilog интерфейс. Вы создаете экземпляр интерфейса на том же уровне иерархии, что и DUT, и каким-то образом подключаете элементы интерфейса к DUT, например, используя иерархические ссылки Verilog или OOMR), например:
interface TB_hook (input bit clk);
logic Stim, Resp;
...
endinterface
module harness;
bit clk;
TB_hook DUT_intf (.clk);
Sys_Top DUT (
.clk (clk),
.Stim (DUT_intf.Stim),
.Resp (DUT_intf.Resp),
...
Затем в каком-то классе (драйвере, мониторе или агенте) вы можете использовать SystemVerilog виртуальный интерфейс для подключения к экземпляру интерфейса. Виртуальный интерфейс — это особый тип переменной SystemVerilog, которая может хранить иерархическую ссылку Verilog или OOMR на экземпляр интерфейса или модпорт. Поскольку вам нужно присвоить это значение во время выполнения, виртуальный интерфейс может быть скомпилирован в пакете (но код, который присваивает значение, не может быть в пакете), например:
class driver;
virtual TB_hook V;
task drive (input bit data);
V.Stim <= data;
Затем в каком-нибудь Verilog module
(вероятно, в модуле верхнего уровня) вы бы присвоили значение переменной виртуального интерфейса. Вы можете сделать это напрямую, например:
module TB_top;
top_env env;
...
initial begin
...
env.agent.driver.V = harness.DUT_intf;
но большинство людей будут использовать базу данных конфигурации UVM:
module TB_top;
top_env env;
...
initial begin
...
uvm_config_db #(virtual TB_hook)::set(null, "*", "DUT_intf", harness.DUT_intf);
class driver;
virtual TB_hook V;
...
function void connect_phase(uvm_phase phase);
...
ok = uvm_config_db#(virtual TB_hook)::get(this, "", "DUT_intf", V);
Вы можете улучшить эту технику, используя модпорты и/или блоки синхронизации.
Для проверки внутренних сигналов тестируемого устройства имеются средства, предоставляемые уровнем регистра UVM. Для этого есть набор функций/задач:
uvm_hdl_check_path
— проверяет, существует ли путь HDLuvm_hdl_deposit
— вносит значение в RTLuvm_hdl_force
— вставляет значение в RTLuvm_hdl_force_time
— форсирует значение на указанную продолжительностьuvm_hdl_release
— освобождает принудительное значениеuvm_hdl_release_and_read
— освобождает принудительное значение и считывает новое значениеuvm_hdl_read
– считывает значение RTL
Я не очень понимаю ваш вопрос. Вам не нужно избегать этого, нет, но вы обнаружите, что вы не можем используете (я бы назвал это) иерархические ссылки Verilog в пакетах (что ясно видно из сообщения об ошибке в вашем примере EDA Playground). Что ты спрашиваешь?