Модуль утверждения в тестовой среде UVM

Я написал испытательный стенд UVM, в котором есть 3 агента, и сейчас я пишу табло / средство проверки. Мне нужен модуль проверки для моих утверждений SystemVerilog, но этот модуль проверки должен знать конфигурацию регистра, которая выполняется из теста (и может быть случайной, определяемой во время run_phase теста).

Я не могу понять, как это будет работать? Если бы я должен был создать модуль проверки для своих утверждений и привязать его на верхнем уровне (tb_top) к dut, как этот модуль проверки узнает конфигурацию моего регистра?

Прочитав несколько статей, я решил, что могу написать свой модуль проверки в качестве интерфейса, установив его в tb_top. Но это даст доступ к переменным в моем интерфейсе к UVC. Как интерфейс обращается к переменным в UVC?

Любая помощь приветствуется. Я чувствую, что здесь не хватает чего-то ключевого, так как это, вероятно, делалось много раз раньше.

РЕДАКТИРОВАТЬ: Пожалуйста, не говорите мне, что мне нужно реализовать какой-то API для установки каждой отдельной настройки регистра из моих UVC? Я хочу просто получить дескриптор своего reg_block (или любой другой переменной конфигурации в моих агентах)


person noobuntu    schedule 14.10.2016    source источник
comment
Даже если у вас будет дескриптор reg_block, вы все равно не сможете использовать его в утверждениях (скорее всего), потому что вам не разрешено использовать объекты класса в утверждениях.   -  person Tudor Timi    schedule 15.10.2016
comment
@TudorTimi Да, в этом и заключается проблема. Единственное решение, которое я могу придумать, - это иметь отдельные биты в моем интерфейсе утверждения (модуле), а затем передавать их в мои UVC в качестве виртуального интерфейса. Затем каждый раз, когда я выполняю write_reg (например), я также устанавливаю бит - ›vif.my_reg_bit = value. Это может стать утомительным для большого количества регистров. По-другому это сделать? Трудно поверить, что я единственный, кто сталкивается с этой проблемой.   -  person noobuntu    schedule 15.10.2016
comment
Точно, ваше утверждение не может использовать данные класса. Одна вещь, которую вы можете сделать, это то, что вы можете писать утверждения регистров на основе вашей транзакции шины чтения / записи (вы будете выполнять некоторую транзакцию уровня шины red / write для обновления содержимого регистра, и вы можете записать те же условия, что и предыдущие в ваше утверждение).   -  person Karan Shah    schedule 17.10.2016
comment
@KaranShah ОК, значит, вы имеете в виду реализовать декодер для моего протокола чтения / записи регистров в моем модуле утверждения. Понятно! Но я думаю, что просто напишу это как бит со своего tb_top   -  person noobuntu    schedule 17.10.2016
comment
Возможно, вам не потребуется реализовывать декодер, поскольку я считаю, что вы можете написать соответствующую предшествующую последовательность, в зависимости от вашей автобусной транзакции.   -  person Karan Shah    schedule 17.10.2016


Ответы (2)


Похоже, вы хотите передать информацию с tb_top на UVC или наоборот. Эта информация будет использована вашим утверждением в tb_top и передана вашим UVC. Мое предложение, вы можете использовать uvm_resource_db или uvm_config_db.

Я могу думать о двух способах достижения этого общения.

Первый метод - это set конфигурация вашего tb_top, затем ваш UVC захватит этот дескриптор. С этого момента вы можете сообщить свой реестр или любую другую информацию, необходимую для вашего утверждения.

class my_tb_config extends uvm_object;
  // ...
endclass

module tb_top;
  my_tb_config tcfg;
  initial begin
    tcfg = new("tcfg");
    uvm_config_db#(my_tb_config)::set(uvm_root::get(), "*", "my_tb_config", tcfg);
    end
endmodule

// somewhere in your UVC
class my_uvc extends uvm_component;
  my_tb_config tcfg;
  function void build_phase(uvm_phase phase);
    // now both tb_top and your UVC point to the same config object
    void'(uvm_config_db#(my_tb_config)::get(this,"","my_tb_config", tcfg));
  endfunction
endclass

Другой способ - наоборот. Передайте вашу конфигурацию UVC вашему tb_top.

class my_other_uvc extends uvm_component;
  my_tb_config tcfg;
  function void build_phase(uvm_phase);
    tcfg = new("tcfg");
    uvm_resource_db#(my_tb_config)::set("*", "my_tb_config", tcfg);
  endfunction
endclass

// somewhere in your tb_top
module tb_top;
  my_tb_config tcfg;
  initial begin
    #1ps; // small delay, making sure resource is submitted
    void'(uvm_resource_db#(my_tb_config)::read_by_name("*","my_tb_config",tcfg);
    // Now both your tb_top and UVC share same object, so you can freely define your whatever communication between them
    end
endmodule
person AldoT    schedule 15.10.2016
comment
Это действительно не помогает моей проблеме. Ваше решение просто передает uvm_object через иерархию UVC. В контексте вашего примера моя проблема связана с доступом к переменным класса tcfg в моем модуле утверждения. Обратите внимание, что модуль утверждения - это просто модуль и не имеет возможности получить доступ к классам uvm. - person noobuntu; 17.10.2016
comment
Я понимаю. Я обычно использую этот способ для динамической проверки в верхней тестовой среде, но никогда не пробую использовать его для проверки утверждений. Если это так, то да, это действительно не помогает вашей проблеме. - person AldoT; 18.10.2016

Я придумал, как это сделать. Во-первых, я понял, что задал два отдельных вопроса:

1) Моему модулю проверки необходимо знать конфигурацию реестра, выполненную на основе теста.

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

tb.sv

module tb;
  dut my_dut( ... )

  interface my_checker (
    .input_registerA (tb.my_dut.my_sub_module.regA),
    .input_registerB (tb.my_dut.my_sub_module.regB),
    .input_registerC (tb.my_dut.my_other_sub_module.regC),
    ....
  )
endmodule

my_checker.sv

interface my_checker (
  input input_registerA,
  input input_registerB,
  input input_registerC,
  ....
);

  // Here I can write properties/assertions that are register-aware
endinterface

2) Как интерфейс обращается к переменным в UVC?

Это немного сложнее. Я хочу динамически обновлять свои контрольные переменные из uvm_sequence или uvm_monitor и т. Д.

Я прочитал этот документ Verilab, в котором четко описан способ сделать это: http://www.verilab.com/files/litterick_sva_encapsulation.pdf

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

Следует помнить, что экземпляр uvm_component, созданный в модуле проверки, расположен на верхнем уровне (uvm_root).

person noobuntu    schedule 17.11.2016