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