Использование регулярных выражений для сопоставления портов Verilog - PullRequest
2 голосов
/ 16 апреля 2010

У меня очень длинная карта портов, где я хочу заменить группу

SignalName[i],

с

.SignalName(SignalName[i]),

Я думаю, что я могу легко сделать это с помощью регулярных выражений, но я не могу понять, как это происходит. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 16 апреля 2010

Предполагая, что SignalData - это файл, содержащий информацию о вашей карте портов, следующее будет делать то, что вы хотите.

sed -si 's/\([a-zA-Z]\+\)\(\[[^\]]*\]\)/\.\1(\1\2)/g' SignalData

В sed s означает подстановку, регулярное выражение между первой парой // используется для сопоставления с каждой строкой. Если совпадение найдено, выражение между до / делается для замены того, что было найдено.

Объяснение регулярного выражения

\([a-zA-Z]\+\) - Matches a series of alphabets (like SignalName) and captures it into
\1. If you want only the SignalName string to match, replace [a-zA-Z]\+ with SignalName.
\(\[[^\]]*\]\) - Matches the [some character] part and captures it into \2

Наконец, мы используем эти захваченные строки для построения желаемой строки.

Если вы хотите поэкспериментировать с этим перед запуском своего файла, используйте sed -s вместо sed -si. Это покажет результаты преобразования на стандартный вывод, фактически не изменяя файл

1 голос
/ 01 декабря 2013

Перезвон в 3 года с опозданием, но я настоятельно рекомендую режим e-macs для verilog Это упрощает этот вид операций для создания экземпляров модулей. Например, если у вас есть такой модуль:

module submodule(
  input [1:0] ina,
  input inb,
  input inc,
  output outa);

  /*some stuff*/

endmodule

Вы можете создать это, используя режим verilog:

module mymodule(
  /*AUTOOUTPUT*/
  /*AUTOINPUT*/);

  submodule submod(/*AUTOINST*/);

endmodule

Когда вы расширяете AUTO в emacs (C-c C-a), вы получаете это:

module mymodule(
  input [1:0] ina,
  input inb,
  input inc,
  output outa);

  submodule submod(
    .ina    (ina),
    .inb    (inb),
    .inc    (inc),
    .outa   (outa));

endmodule

Вы можете расширить это с помощью упрощенных регулярных выражений и уравнений Лиспа для создания сложных связей. Экономит массу времени при соединении нескольких модулей или изменении имен сигналов в иерархии.

Более подробная информация здесь: http://www.veripool.org/wiki/verilog-mode/Verilog-mode_veritedium

...