我有一个很长的端口图,我想在其中替换一堆
SignalName[i],
和
.SignalName(SignalName[i]),
我想我可以用正则表达式轻松地做到这一点,但我一辈子都不知道怎么做。有任何想法吗?
假设 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。这将在标准输出上显示转换的结果,而无需实际更改文件
迟到了 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 (Cc Ca) 中展开 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