Свойство SystemVerilog передается по ссылке

#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. То же поведение аргумента применимо и к свойствам.

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