Обычная практика автоматического создания экземпляра модуля verilog с подстановочным знаком:
/* sub AUTO_TEMPLATE (
.\(rg_.*\) (\1_@),
); */
sub sub
(/*AUTOINST*/);
Подстановочный знак в приведенном выше примере говорит: «Для любого имени порта, начинающегося с rg_
, добавьте номер экземпляра. Обратите внимание, что это будет применяться как к входным, так и к выходным портам.
Есть ли способ добавить какую-то директиву, чтобы приведенный выше шаблон применялся только к выводам? Я нашел что-то похожее здесь, но не могу понять этого.
Это должно работать:
/* sub AUTO_TEMPLATE (
.\(rg_.*\) (@"(if (equal vl-dir \\"input\\") \\"\1\\" \\"\1_@\\")"[]),
); */
Если направление порта (vl-dir
) является входным, будет выбрано \1
, в противном случае — \1_@
. Обратите внимание, что кавычки должны быть \\"
. []
предназначен для автоматической обработки ширины шины.
Другие примеры @""
, vl-dir
и другие полезные советы доступны https://veripool.org/verilog-mode/help/
В вашем вопросе не упоминаются другие условия. Простая стратегия — создать дополнительные правила шаблонов с более высоким приоритетом сопоставления. В худшем случае у вас может быть более сложная функция Lisp для обработки других условий шаблона.
Привет, Грег, твой ответ подразумевает
if true "1" else '1_@'
. Я не хотел выполнять частьelse
, так как позже появятся другие условия шаблона. Но кажется, что безelse
выходные данные привязаны, а не шаблонизированы на основе других условий. Можно ли как-то достичь своей первоначальной цели безelse
? Также не могу понять, как добавить в оператор два условия: input и +width==1. Это не работает:(@"(if ((& (equal vl-dir \\"input\\") (equal vl-width 1))) \\"sync_\1\\")"),