Динамический контроль

SystemVerilog включает системные вызовы для контроля проверки выполнения утверждений в процессе симуляции. Они позволяют остановить ($assertoff), перезапустить ($asserton), отменить ($assertkill) проверку утверждений. Динамический контроль может использоваться для того, чтобы отключить проверку утверждений во время сброса. Пример:

				
module device2_control();
    initial begin : disable_assertions_during_reset
        @(posedge tb_top.input_intf.reset) //active high reset
        $assertoff(0, tb_top.slave);
        @(negedge tb_top.input_intf.reset)
        $asserton(0, tb_top.slave);
    end
endmodule : device2_control


module tb_top();
...
//Объявление модуля device2
device2 slave (
    .clk(clock),
    .rst(input_intf.reset),
    .CMD(input_intf.command),
    ...
);
//Объявление модуля device2_control
device2_control device2_control_inst();
...
endmodule : tb_top		

В этом примере проверка утверждений отключается на время сброса. Для этого вызывается системный вызов $assertoff. Первым параметром в него передается количество уровней иерархии ниже того модуля, в котором мы хотим отключить проверку утверждений. В нашем случае таких уровней 0. Вторым параметром передается имя экземпляра модуля для отключения проверки утверждений. Т.к. контроль проверки выполнения утверждений находится в отдельном модуле, то приходится писать полный иерархический путь (tb_top.slave). Вместо имени модуля можно передавать имена утверждений. Остальные системные вызовы ($asserton и $assertkill) используют те же параметры.

Статический контроль

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

					
`ifdef CMD_ACCEPT
    assert property (@(posedge Clk)
        (CMD != `IDLE) |-> ##[1:3] CMD_ACCEPT);
`endif 			

Проверка выполнения утверждения будет выполняться, только если в данной реализации протокола передачи сигнал CMD_ACCEPT используется. Другой способ статического контроля – это использование конструкции generate. Здесь утверждения компилируются, но не рассматриваются до этапа elaboration (завершения обработки во время трансляции):

					
 generate
    if (cmd_accept_on) begin
        assert property (@(posedge Clk)
            (CMD != `IDLE) |-> ##[1:3] CMD_ACCEPT);
    end
endgenerate

//cmd_accept_on может быть параметром или константой 			

Статический контроль утверждений используется для повышения скорости симуляции, т.к. позволяет использовать только необходимые в данной реализации утверждения.

Сообщения

Нарушение утверждения сопровождается автоматическим выводом симулятором сообщения об ошибке. Если требуется вывести дополнительное сообщение, то используются следующие системные вызовы:

  • $info (информационное сообщение);
  • $warning (предупреждение);
  • $error (сообщение об ошибке);
  • $fatal (сообщение о сбое или отказе в работе).

Утверждение может содержать сообщения для случаев успешного и неудачного выполнения:

					
assert property (@(posedge Clk)
(CMD != `IDLE) |-> ##[1:3] CMD_ACCEPT)
    $info("CMD_ACCEPT arrived in time");
else
    $error("CMD_ACCEPT did not arrive in time"); 		

Системные функции языка SystemVerilog утверждений

SystemVerilog поддерживает набор системных функций, которые реализуют ряд операций над сигналом или вектором и могут использоваться в утверждениях:

  • $rose – возвращает ‘1’, если сигнал или самый младший бит вектора перешел из ‘0’ в ‘1’ в промежутке времени между текущим и предыдущим тактом;
  • $fell - возвращает ‘1’, если сигнал или самый младший бит вектора перешел из ‘1’ в ‘0’ в промежутке времени между текущим и предыдущим тактом;
  • $stable - возвращает ‘1’, если значение сигнала или вектора не изменилось по сравнению с предыдущим тактом;
  • $past – возвращает значение сигнала или вектора, которое было на предыдущем такте;
  • $onehot - возвращает ‘1’, если только один бит вектора в ‘1’;
  • $onehot0 - возвращает ‘1’, если только один бит вектора в ‘0’;
  • $isunknown - возвращает ‘1’, если значение сигнала или вектора равно ‘X’ или ‘Z’;
  • $countones – возвращает количество ‘1’ в векторе (значения ‘X’ и ‘Z’ не считаются).