UVM: недопустимая комбинация драйвера и предупреждения о процедурном назначении

У меня есть испытательный стенд UVM для небольшого блока в моем чипе. В нем есть агент с драйвером, который управляет данными в виртуальном интерфейсе, который выглядит примерно так:

interface my_if (input bit clk);

  logic [3:0] opcode;

  // Clocking block for the driver
  clocking drvClk @(posedge clk);
    output opcode;
  endclocking

  // Clocking block for the monitor      
  clocking monClk @(posedge clk);
    input opcode;
  endclocking

endinterface

Я использую этот интерфейс в своем драйвере следующим образом:

class my_driver extends uvm_driver #(my_tr);
  my_if vif;
  ...
  virtual task run_phase(uvm_phase phase);
    super.run_phase(phase);

    forever begin
      seq_item_port.get_next_item(req);

      // Drive the transaction onto the interface
      // and wait for next clock
      vif.opcode <= req.opcode;
      @(vif.drvClk);

      seq_item_port.item_done();
    end
  endtask
endclass

Насколько я могу судить, это рекомендуемый способ работы, и он хорошо работает. Проблема возникает, когда я интегрирую этот агент в тестовую среду более высокого уровня. В этом случае агент теперь пассивен, а драйвер не построен. Я назначаю значение кода операции интерфейсу, чтобы монитор мог его наблюдать. Вот фрагмент моего жгута проводов верхнего уровня:

module my_top();
  bit clk = 0;

  always #5 clk = !clk;

  // instantiate the interface
  my_if my_if_inst(.clk(clk));

  // instantiate my dut
  my_dut dut(...);

  // pull out the internal opcode signal and assign it
  // to the interface
  assign my_if_inst.opcode = dut.submodule.opcode;

  // Set the virtual interface inside the agent
  initial begin
    uvm_config_db#(virtual my_if)::set(uvm_root::get(),"uvm_test_top.tb.env.my_agent", "vif", my_if_inst);
  end 
endmodule

Когда я запускаю это в NC, я получаю предупреждение:

ncelab: *W,ICPAVW: Illegal combination of driver and procedural assignment to variable opcode detected (output clockvar found in clocking block)

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


person nguthrie    schedule 08.10.2013    source источник
comment
Мне довелось столкнуться с подобной проблемой. Удивительно, но у VCS не было проблем с компиляцией того же кода, что и у Incisive. @ dave_59 ответ точен. Есть переключатель переопределения в Incisive для этого, не знаю, почему   -  person Rajesh Shashi Kumar    schedule 02.07.2019


Ответы (1)


Легкий; сделайте код операции wire в вашем интерфейсе.

Относитесь к коду операции так же, как к двунаправленному сигналу. См. Мой документ DVCon по этому вопросу.

person dave_59    schedule 08.10.2013
comment
Что ж, это помогло. Я просто скопировал примеры, которые использовали «логику» для всего, и никогда не подвергал ее сомнению. Я предположил, что, поскольку я выполнял неблокирующее задание в драйвере, провод не был бы законным. В моей голове ‹= означает, что у вас должна быть логика или зарегестрироваться здесь !. Спасибо, что сделали мой первый опыт работы с stackoverflow быстрым! - person nguthrie; 08.10.2013
comment
Спасибо, Дэйв, документ имеет смысл. Однако у меня проблема в состоянии сброса, обычно драйвер записывается для управления сигналами интерфейса вместо сигналов блока синхронизации при сбросе. Как мне решить проблему сброса в драйвере? - person wisemonkey; 03.01.2015
comment
Я пытаюсь не объявлять _reg, а затем назначать signal = signal_reg, есть ли другой / лучший способ сделать это? (невозможно редактировать комментарий через 5 минут, поэтому новый комментарий) - person wisemonkey; 03.01.2015
comment
Нет необходимости передавать сигналы асинхронно для общего теста при сбросе. Вы можете создать специальный тестовый набор для обработки проблем с асинхронным временем. - person dave_59; 06.01.2015