使用正则表达式进行Verilog端口映射

时间:2010-04-16 12:55:24

标签: regex verilog

我有一个非常长的端口映射,我想要替换一堆

SignalName[i],

.SignalName(SignalName[i]),

我想我可以用正则表达式轻松地做到这一点,但我不能为我的生活弄清楚如何。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

假设SignalData是包含您的端口映射信息的文件,以下内容将按您的要求执行。

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

在sed中代表替换,第一对//之间的正则表达式用于匹配每一行。如果找到匹配,则表示直到下一个/之间的表达式以替换匹配的表达式。

正则表达式的解释

\([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。这将显示stdout转换的结果,而不实际更改文件

答案 1 :(得分:1)

迟到3年,但我强烈推荐emacs的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

当您在emacs(C-c C-a)中展开AUTO时,您会得到:

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

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

endmodule

您可以使用简化的正则表达式和lisp方程扩展它,以进行复杂的连接。将一堆模块连接在一起或通过层次结构更改信号名称时,可节省大量时间。

此处有更多信息: http://www.veripool.org/wiki/verilog-mode/Verilog-mode_veritedium