Email: bknpk@hotmail.com Phone: +972-54-7649119


V

 

perl script to parse a VR_AD file and generate mask statement.

  1. This script works on a VR_AD file and generates specman mask and compare statements. In my case on each RW register, the mask is set to enable (all bits set to 1).

  2. The input might look like:

    reg_def KUKU_REG {
      reg_fld KUKU_PAGE_1_A1 : uint(bits : 1) : R : 0x0000 : cov;
      reg_fld KUKUOWLEDGE_1_A1 : uint(bits : 1) : R : 0x0000 : cov;
      reg_fld KUKUTE_FAULT_A1 : uint(bits : 1) : R : 0x0000 : cov;
      reg_fld KUKURVED__012_012 : uint(bits : 1) : RW : 0x0000;
      reg_fld KUKUMETRIC_PAUSE_A1 : uint(bits : 1) : R : 0x0000 : cov;
      reg_fld KUKUE_A1 : uint(bits : 1) : R : 0x0000 : cov;
      reg_fld KUKU0BT4_A1 : uint(bits : 1) : R : 0x0000 : cov;
      reg_fld KUKU0BTX_FD_A1 : uint(bits : 1) : R : 0x0000 : cov;
      reg_fld KUKU0BTX_HD_A1 : uint(bits : 1) : R : 0x0000 : cov;
      reg_fld KUKUBT_FD_A1 : uint(bits : 1) : R : 0x0000 : cov;
      reg_fld KUKUBT_HD_A1 : uint(bits : 1) : R : 0x0000 : cov;
      reg_fld KUKUCTOR_FIELD_A1 : uint(bits : 5) : R : 0x0000 : cov;
    };


  3. The script is invoked from within vim by:
    %! perl ~/bin/vim_vr_ad_set_cmp_mask.pl


    The out put is:
    extend KUKU_REG vr_ad_reg {
      set_static_info() is {
        set_compare_mask(0x1000);
      };
    };


  4. The script is listed below:

    1. #!/bin/perl
    2. $reg_name="";
    3. while (<STDIN>) {
    4.    chomp($_);
    5.    if($_ =~ /^reg_def[ \s\t]*([A-Za-z][A-Za-z0-9_]*)[ \s\t]*{.*/) {
    6.      $reg_name=$1;
    7.      $pix=16; #new reg
    8.      $mask=0;
    9.    }
    10.    elsif($_ =~ /[ \s\t]*reg_fld[ \s\t].*uint\(bits[ \s\t]*:[ \s\t]*([0-9]*)\)/) {
    11.      #get reg_fields
    12.      $num_of_bits=$1;
    13.      $field_mask=0;
    14.      &bits_to_mask($field_mask, $num_of_bits);
    15.      if($_ =~ /:[ \s\t]*RW[ \s\t]*:/) {#set mask to enable
    16.        for($j=0; $j < $pix-$num_of_bits; $j++) {
    17.          $field_mask *= 2;
    18.        }
    19.        $mask += $field_mask;
    20.      }
    21.      $pix -= $num_of_bits;
    22.    }
    23.    else {
    24.      $ix=index($_, "};");
    25.      if($ix >= 0) {
    26.        $mask=sprintf("%04x", $mask);
    27.        &wr_reg($reg_name, $mask);
    28.        $reg_name="";
    29.      };
    30.    }
    31. }#while
    32. sub bits_to_mask {
    33.    #0 mask #1 num_of_bits
    34.    if($_[1] > 16) {die("more than 16 bits are not supported");}
    35.    $_[0]=1;
    36.    my $i;
    37.    for($i=1; $i < $_[1]; $i++) {
    38.      $_[0]=($_[0]*2) + 1;
    39.    }#for
    40. }
    41. sub wr_reg {
    42.    #0 reg name
    43.    #1 mask value in hex
    44.    print("extend $_[0] vr_ad_reg {\n");
    45.    print(" set_static_info() is {\n");
    46.    print(" set_compare_mask(0x$_[1]);\n");
    47.    print(" };\n");
    48.    print("};\n");
    49. }

  ...


Home

How to change the default bash internal field space separator.

A simple c-code program to read a memory array from verilog RTL, using VPI.






Search This Site


Feedback This Site




new pages on this site