簡體   English   中英

使用觸發器運算符解析 verilog 網表上的塊和正則表達式

[英]using flip flop operator to parse a block and regex on a verilog netlist

我正在嘗試修改如下所示的 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 模塊內容添加注釋,但保持模塊語句和終端語句(輸入、輸出 inout)和 endmodule 語句不變。 我嘗試使用 perl 觸發器命令:

首先,我嘗試捕獲以 module 開頭並以 endmodule 結尾的塊。 然后我嘗試用正則表達式捕獲設備名稱。

我的問題是所需的設備名稱可以位於模塊語句中的任何位置 - 那么我如何注釋模塊內部的行呢?
我試過類似的東西:

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

這是我寫的完整代碼。 它有效,但可以改進。 例如,以“module”開頭的行可以擴展為幾行(可以是 2 行,可以是 100 行)但它總是以字符“;”結尾。

#!/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 ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM