Я думаю, что понял, почему это происходит, но я хотел бы подтвердить это и посмотреть, есть ли лучшее решение.
Рассмотрим следующий модуль, в котором есть функция, в которой значение по умолчанию для одного из параметров привязано к некоторому регистру внутри модуля:
module m;
reg a, b;
wire out;
function f1 (input x, input y = b);
f1 = x & y;
endfunction :f1
// ...
assign out = f1(a);
endmodule
Проблема, которую я вижу (которую было нелегко отследить), заключается в том, что в этом случае в списке конфиденциальности задания есть только a. Таким образом, если b изменится, а затем изменится a, out будет правильно обновлен. Однако если изменяется a, а затем изменяется b, так как b нет в списке чувствительности для назначения out, out не будет обновляться и будет по-прежнему установлено старое значение.
Есть ли предпочтительный способ добавить b в список чувствительности, чтобы out обновлялся при его изменении?
Я вижу несколько возможных вариантов:
- Просто явно добавьте второй аргумент:
f1(a, b)
- Используйте непрерывный блок присваивания
always_comb out = f1(a)
илиalways @(*) out=f1(a)
- Используйте явный список конфиденциальности
always @(a, b) out = f1(a)
Лично я думаю, что вариант 1 является лучшим (хотя он будет повторять необязательные параметры в каждом месте, где он вызывается), но мне любопытно, есть ли другие объяснения или лучшее решение.