7. Дополнительные конструкции языка SVA
Динамический контроль
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’ не считаются).

Комментарии (0)