#system-verilog #system-verilog-assertions
Вопрос:
Можно ли передать сигнал свойству по ссылке? Например, я хочу создать свойство cover, чтобы зафиксировать изменение регистра, и повторно использовать это свойство для десятков различных регистров. Я бы хотел сделать что-то подобное:
property reg_change(int num_cycles, ref bit some_reg);
@(posedge CLK)
$changed(some_reg) |-> ##num_cycles $changed(some_reg);
endproperty
Reg1Change10Cycles_cp : cover property (reg_change(10, reg1);
Reg2Change10Cycles_cp : cover property (reg_change(10, reg2);
//...
Но я получаю ошибку компиляции при попытке использовать ‘ref’ в свойстве. Я не думаю, что могу просто использовать bit some_reg
, так как это будет передаваться по значению, и я никогда не увижу изменения some_reg. Есть ли в любом случае возможность добиться такого поведения без определения всего свойства в каждом свойстве обложки?
Ответ №1:
Нет никакого способа и никакой необходимости передавать формальные аргументы по ссылкам на свойства и последовательности. Формальные аргументы конструкций утверждений заменяются встроенными фактическими аргументами. Так что в некотором смысле они всегда являются ссылками. См. раздел 16.8 Объявление последовательностей в IEEE 1800-2017 SystemVerilog LRM. То же поведение аргумента применимо и к свойствам.
Кстати, вы должны оставить аргументы утверждения без типов, если только вам не нужны строгие правила ввода, чтобы ваше выражение утверждения оценивалось правильно.