从 verilog/System Verilog 文件中提取模块名称和实例名称

从 verilog/System Verilog 文件中提取模块名称和实例名称

我有一个 verilog/System Verilog 文件,我只想从中提取 module_name 和 instance_name。

来自以下单行:

module_name #(.ANY_PARAMETER(.ANY_PARAMETER),.ANY_PARAMETER_1(.ANY_PARAMETER_1)) instance_name (.any_connection(any_connection));

输出应该只是:

模块名称 实例名称

我怎样才能做到这一点?

答案1

我们需要recursive regex处理这种平衡+嵌套大括号的情况。

我们首先制作一个正则表达式$r,它以括号“(”开始,然后查找非括号内容(可能因为 * 而不存在),然后再次递归非括号内容,最后是平衡右括号。

$ perl -lne '
    $r = qr/\( [^()]* (?:(??{ $r }) [^()]*)* \)/x;
    print $1 =~ y/\t #//dr while /\G([^()]*) $r/xg;
' file.sv

结果:

module_name
instance_name

答案2

命令 。

awk '{for(i=1;i<=NF;i++){if (($i ~ /module/)||($i ~ /instance/)) print $i}}' filename

输出

module_name
instance_name

答案3

您的文件似乎遵循以下规则:

  • 每行恰好包含三个空格。
  • 模块名称是第一个空格之前的名称。
  • 实例名称是第二个和第三个空格之间的任何名称。

如果这是不正确的,请编辑您的问题以提供更好的解释和更好的示例。

sed

用一个sed substitute ( s) 命令来匹配整行,其中一个捕获组从行的开头向上穿过第一个空格,第二个捕获组从第二个空格运行到第三个空格(不包括端点)。然后输出捕获的两个字符串:

sed 's/^\([^ ]* \)[^ ]* \([^ ]*\) .*/\1\2/'

PS 如果实际上有超过三个空格,并且实例名称在倒数第二个和最后一个之间,则改为:

sed 's/^\([^ ]* \).* \([^ ]*\) .*/\1\2/'

pcregrep

相同的逻辑,不同的工具:

pcregrep -o1 -o2 '^([^ ]* )[^ ]* ([^ ]*) .*'

-o1 -o2相当于\1\2.

同样的后记也适用。

相关内容