使用触发器运算符解析 Verilog 网表上的块和正则表达式



我正在尝试修改如下所示的verilog网表:

module la_bla ( a b c d);
input a; 
output; 
inout c d;
uHBMN_1  X20 (.Z(en), .A(gg), .Q(qq), .EN(rr));
nch_mac  M20 (.G(en), .D(gg), .B(qq), .S(rr));
pch_mac_svt  M20 (.G(en), .D(gg), .B(qq), .S(rr));
endmodule 
module la_bla2 ( aw b2 c1 dt);
input aw;
output b2;
inout c1 dt;
HBMN_2  X21 (.Z(en), .A(gg), .Q(qq), .EN(rr));
HBMN_3  X21 (.Z(env), .A(ggg7), .Q(qq), .EN(rr));
HBMN_4  X21 (.Z(en5), .A(gg), .Q(qq8), .EN(rr));
HBMN_5  X21 (.Z(en1), .A(gg), .Q(qq), .EN(rr));
endmodule 
.
.
.
.
.

每次我发现一行以名为:"nch_mac"或pct_mac_svt的设备开头时,我都想在 ALL 模块内容中添加注释,但保持模块语句和终端语句(输入、输出输入(和结束模块语句不变。我尝试使用 perl 触发器命令:

首先,我尝试捕获以模块开头并以结束模块结束的块。然后我尝试使用正则表达式捕获设备名称。

我的问题是所需的设备名称可以位于模块语句中的任何位置 - 那么我如何注释模块中前面的行呢?
我尝试了类似的东西:

while<FILE>{
if(/module/i.../endmodule/i){
if($_ =~/nch_mac|pch_mac_svt){ $newline=~ s/$_///$_/} 

但这没有用。
我想得到:

module la_bla ( a b c d);
input a; 
output; 
inout c d;
//uHBMN_1  X20 (.Z(en), .A(gg), .Q(qq), .EN(rr));
//nch_mac  M20 (.G(en), .D(gg), .B(qq), .S(rr));
//pch_mac_svt  M20 (.G(en), .D(gg), .B(qq), .S(rr));
endmodule 
module la_bla2 ( aw b2 c1 dt);
input aw;
output b2;
inout c1 dt;
HBMN_2  X21 (.Z(en), .A(gg), .Q(qq), .EN(rr));
HBMN_3  X21 (.Z(env), .A(ggg7), .Q(qq), .EN(rr));
HBMN_4  X21 (.Z(en5), .A(gg), .Q(qq8), .EN(rr));
HBMN_5  X21 (.Z(en1), .A(gg), .Q(qq), .EN(rr));
endmodule 
.
.
.

有什么建议吗?

在决定如何打印之前,将行存储在数组中:

use warnings;
use strict;
my $flag = 1;
my @lines;
while (<DATA>) {
if (/(input|output|inout|bmodule)/) {
print;
$flag = 1;
}
elsif (/endmodule/) {
for my $line (@lines) {
$line = "//$line" unless $flag;
print $line
}
print;
@lines = ();
}
else {
push @lines, $_;
if (/nch_mac|pch_mac_svt/) {
$flag = 0;
}
}
}
__DATA__
module la_bla ( a b c d);
input a; 
output; 
inout c d;
uHBMN_1  X20 (.Z(en), .A(gg), .Q(qq), .EN(rr));
nch_mac  M20 (.G(en), .D(gg), .B(qq), .S(rr));
pch_mac_svt  M20 (.G(en), .D(gg), .B(qq), .S(rr));
endmodule 
module la_bla2 ( aw b2 c1 dt);
input aw;
output b2;
inout c1 dt;
HBMN_2  X21 (.Z(en), .A(gg), .Q(qq), .EN(rr));
HBMN_3  X21 (.Z(env), .A(ggg7), .Q(qq), .EN(rr));
HBMN_4  X21 (.Z(en5), .A(gg), .Q(qq8), .EN(rr));
HBMN_5  X21 (.Z(en1), .A(gg), .Q(qq), .EN(rr));
endmodule 

这是我的确切输出:

module la_bla ( a b c d);
input a; 
output; 
inout c d;
//
//uHBMN_1  X20 (.Z(en), .A(gg), .Q(qq), .EN(rr));
//nch_mac  M20 (.G(en), .D(gg), .B(qq), .S(rr));
//pch_mac_svt  M20 (.G(en), .D(gg), .B(qq), .S(rr));
endmodule 
module la_bla2 ( aw b2 c1 dt);
input aw;
output b2;
inout c1 dt;

HBMN_2  X21 (.Z(en), .A(gg), .Q(qq), .EN(rr));
HBMN_3  X21 (.Z(env), .A(ggg7), .Q(qq), .EN(rr));
HBMN_4  X21 (.Z(en5), .A(gg), .Q(qq8), .EN(rr));
HBMN_5  X21 (.Z(en1), .A(gg), .Q(qq), .EN(rr));
endmodule 

如果您输入的Verilog代码比这更复杂,请使用适当的解析器,例如Verilog-Perl

这是我编写的完整代码。 它有效,但可以改进。例如,以"模块"开头的行 可以扩展几行(可以是 2 行,可以是 100 行(,但它总是以 char ";" 结尾

#!/usr/intel/bin/perl -w
use strict;
use Data::Dumper;
use Getopt::Long;

my $verilog1=      "/p/ccd/wa/mlea/roodbridgetc/analog/roodbridgetc_9m1z1u/User_libs/libFlow/meny_lo   cal/noam_tc_phy_ana_top/verilog/netlist";
my $verilog2=  "/p/ccd/wa/mlea/roodbridgetc/analog/roodbridgetc_9m1z1u/User_libs/libFlow/meny_local/noam_tc_phy_ana_top/verilog/netlist2" ;

open(VERILOGA,"$verilog1") or die "Can't open original verilog file $verilog1 - $!n"; 
open(VERILOGAA,">$verilog2") or die "Can't open destination verilog file $verilog2 - $!n"; 

my $flag = 1;
my @lines =();
while (<VERILOGA>) {
if ($_ =~ /^input|^output|^inout|^module/) {
print VERILOGAA $_;
$flag = 1;
}
elsif($_ =~ /^//|timescale|^`include|^s*$/){print VERILOGAA $_ }  ## this is for general information lines in verilog netlist 
elsif($_ =~ /s+{?w+?([d+])?}?,?s?)?;?$/){print VERILOGAA $_ } ## this is for supporting the case that the "module line contain n  char or {} for bus or [*]
elsif($_ =~ /^s+)+?;$/){print VERILOGAA $_ }
elsif(/^endmodule/) {
for my $line (@lines) {
$line = "//$line" unless $flag;
print VERILOGAA $line;
}
print VERILOGAA $_;
@lines = ();
}
else{
push @lines, $_; 
if(/^nch_mac
|^nch_18_mac
|^nch_svt_mac
|^nch_ulvt_dnw_mac
|^nch_lvt_mac
|^pch_lvt_mac
|^pch_18_mac
|^pch_svt_mac
|^nch_18_mac
|^pch_ulvt_mac
|^nch_ulvt_mac
|^crtmom_wo_rf
|^cfmom_2t_p80
|^nch_gate_sw
|^rhim_m
|^rhim_rf
|^nch_svt_dnw_mac
|^pwdnw
|^nch_lvt_dnw_mac
|^pch_18ud12_mac
|^pch_18ud15_mac
|^nch_ulvt_dnw_mac
/gx){
$flag = 0;
}#if
}#else
}#while

close VERILOGA;
close ;

最新更新