как использовать assertoff из теста, чтобы отключить утверждение в стороннем объекте uvm

Я ищу способ отключить утверждение в боковом компоненте uvm для определенного теста. Ниже простой код представляет мою среду с комментариями по требованию. Я думал, что могу использовать $assertoff. Я могу модифицировать компонент uvm, если для этого требуются дополнительные инструменты.

    import uvm_pkg::*;
    `include "uvm_macros.svh"

    class tb_env extends uvm_component;

       `uvm_component_utils(tb_env)

       int exp_val = 0;
       int act_val = 0;

       function new(string name = "tb_env", uvm_component parent = null);
          super.new(name, parent);
       endfunction

       virtual task run_phase (uvm_phase phase);
         super.run_phase(phase);
         phase.raise_objection(this);
         #10us;
         ASRT: assert ( exp_val == act_val) else
           `uvm_error(get_name(), "Error");
         #10us;
         `uvm_info(get_name(), "Done env", UVM_LOW);
         phase.drop_objection(this);
       endtask : run_phase

    endclass

    program tb_run;

    initial
    begin
       tb_env env = new("env");

       // Requirement: Disable assertion env.ASRT with system call $assertoff(...)

       fork
         run_test();
         begin
          #5us;
          env.exp_val = 1;
         end
       join
    end

    endprogram

person albert waissman    schedule 21.12.2017    source источник


Ответы (3)


Да, вы можете использовать $assertoff для своих целей.

Вот ваш код без $assertoff.

class tb_env;
  int exp_val = 0;
  int act_val = 0;

  virtual task run_phase ();
    #10;
    ASRT: assert ( exp_val == act_val) else
      $error("Error");
  endtask : run_phase
endclass

program tb_run;
  tb_env env = new();

  initial
  begin      
     // $assertoff(0, env.run_phase.ASRT);

     fork
       env.run_phase();
       begin
         #5;
         env.exp_val = 1;
         $display("@%0t : exp_val - %0b, act_val - %0b", $time(), env.exp_val, env.act_val);
       end
     join
  end
endprogram

// Output -
@5 : exp_val - 1, act_val - 0
"a.sv", 7: $unit::\tb_env::run_phase .ASRT: started at 10s failed at 10s
        Offending '(this.exp_val == this.act_val)'
Error: "a.sv", 7: $unit.tb_env::run_phase.ASRT: at time 10
Error
$finish at simulation time                   10

А вот ваш код с $assertoff.

class tb_env;
  int exp_val = 0;
  int act_val = 0;

  virtual task run_phase ();
    #10;
    ASRT: assert ( exp_val == act_val) else
      $error("Error");
  endtask : run_phase
endclass

program tb_run;
  tb_env env = new();

  initial
  begin
     $assertoff(0, env.run_phase.ASRT);

     fork
       env.run_phase();
       begin
         #5;
         env.exp_val = 1;
         $display("@%0t : exp_val - %0b, act_val - %0b", $time(), env.exp_val, env.act_val);
       end
     join
  end
endprogram

// Output -
Stopping new assertion attempts at time 0s: level = 0 arg = $unit::\tb_env::run_phase .ASRT (from inst tb_run (a.sv:17))
@5 : exp_val - 1, act_val - 0
$finish at simulation time                   10
person Karan Shah    schedule 22.12.2017
comment
Похоже, код не работает в irun, но отлично работает с vcs. Может быть предпочтительнее использовать обобщенный подход, работающий на всех тренажерах. - person sharvil111; 23.12.2017
comment
Код работает и с irun. Это ссылка на edaplayground: edaplayground.com/x/33Pb. Вы можете попробовать, закомментировав и раскомментировав строку $assertoff, чтобы сравнить результаты. - person Karan Shah; 23.12.2017
comment
Не работает с кодом OP (на основе UVM). пример EDAPlayground. Ошибка запуска: Invalid assertion or scope name argument to $assertoff assertion control task. Хотя работает с vcs. - person sharvil111; 23.12.2017
comment
Я изменил свой код с помощью данного кода UVM. И это работает в моем случае. Пожалуйста, проверьте edaplayground.com/x/33Pb с помощью симулятора Incisive. - person Karan Shah; 24.12.2017

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

Для некоторых симуляторов $assertoff работает только с модулями, а не с классами, вы можете использовать некоторый защитный флаг, указывающий включение/отключение утверждения. Утверждение будет проверено, только если флаг установлен. Вы можете объявить этот флаг в любом месте базовых классов и использовать тот же флаг для включения/отключения утверждений из разных расширенных классов.

Можно также разработать обобщенный макрос для этого защитного флага. Следующий код отключает утверждения с помощью защиты. Если guard является статической переменной, то к ней также можно получить доступ через разрешение области видимости (::).

import uvm_pkg::*;
`include "uvm_macros.svh"

`define ASSERT(VAL,ERR) \
  assert(!assert_guard || (VAL))  else begin // If assert_guard=0, then assertion passes without checking other condition \
      `uvm_error(get_name(),ERR); \
end \

class tb_env extends uvm_component;
  `uvm_component_utils(tb_env)
  bit assert_guard;

  int exp_val = 0;
  int act_val = 0;

  function new(string name = "tb_env", uvm_component parent = null);
     super.new(name, parent);
     assert_guard = 1; // by default assertions are on
  endfunction

  virtual task run_phase (uvm_phase phase);
     super.run_phase(phase);
     phase.raise_objection(this);
     #10us;
     ASRT: `ASSERT( exp_val == act_val, "Error");       
     #10us;
     `uvm_info(get_name(), "Done env", UVM_LOW);
     phase.drop_objection(this);
  endtask : run_phase

endclass

module tb_run;
 initial begin
   tb_env env = new("env");
   env.assert_guard = 0;
   //tb_env::assert_guard = ; // If assert_guard was static
   //$assertoff(0,env.run_phase.ASRT); // Works only for VCS
   fork
     run_test();
     begin
      #5us;
      env.exp_val = 1;
     end
   join
 end
endmodule
// Output:
UVM_INFO @ 0: reporter [RNTST] Running test ...
UVM_INFO testbench.sv(31) @ 20000: env [env] Done env

В качестве альтернативного подхода можно также использовать оператор disable для отключения отложенного утверждения. Но в этом случае необходимо знать точное время, когда должно быть запущено утверждение. Дополнительные сведения см. в IEEE 1800-2012, раздел 16.4.4. информацию об этом подходе.

person sharvil111    schedule 23.12.2017

Системная задача $assertoff может отключать утверждения в определенных модулях, но не в определенных классах или объектах. Итак, вам придется сделать это вручную, изменив класс tb_env.

person Matthew Taylor    schedule 22.12.2017