IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

这篇具有很好参考价值的文章主要介绍了IC验证——perl脚本ccode_standard——c代码寄存器配置标准化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 脚本名称

2 脚本路径

3 脚本参数说明

4 脚本操作说明

5 脚本代码


1 脚本名称

ccode_standard

2 脚本路径

/scripts/bin/ccode_standard

3 脚本参数说明

次序

参数名

说明

1

address

(./rfdig;.;..;./boot)

指定脚本执行路径(可以为脚本所在路径的任意相对路径)

help

脚本使用帮助,打印说明信息

2

all

运行脚本后,脚本会解析全部rbus.cfg,并对参数1指定的目录中的.c文件进行寄存器配置代码标准化修改

module_name_seca.cfg

运行脚本后,脚本会解析参数2指定的rbus.cfg,并对参数1指定的目录中的.c文件进行寄存器配置代码标准化修改

示例

命令:ccode_standard  help

输出ccode_standard使用帮助信息

命令:ccode_standard  ./rfdig  rfdig_seca.cfg

对当前路径下的rfdig文件夹及其子文件夹下所有的.c文件中,有关rfdig_seca.cfg中的寄存器配置代码进行标准化修改;

命令:ccode_standard  .  crg_seca.cfg

对当前路径下的所有文件夹及其子文件夹下的所有.c文件中,所有有关crg_seca.cfg中的寄存器配置代码进行标准化修改;

命令:ccode_standard  .  all

对当前路径下的所有文件夹及其子文件夹下的所有.c文件中,所有模块的寄存器配置代码进行标准化修改;

说明

配置文件module_name_seca.cfg是被验模块寄存器的详细配置文件;脚本索引该文件的具体路径为:

$PROJ_SRC/design/scripts/rbus_scripts/rbus_cfg/

使用该脚本前请先gen_rbus;

4 脚本操作说明

        该脚本用于将如下所示的代码标准化,加速ST用例调整,该脚本可以反复多次调用,不会产生异常问题:

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化,perl脚本,c语言,perl,IC验证,开源

  1. 使用脚本前,首先gen_rbus,source,产生脚本需要解析的rbus.cfg文件,以及环境变量$ENV{PROJ_SRC};
  2. IC验证——perl脚本ccode_standard——c代码寄存器配置标准化,perl脚本,c语言,perl,IC验证,开源
  3. 根据脚本存放路径,指定脚本工作目录,如下例所示,脚本存放于case目录,我想修改rfdig文件夹下的.c文件,参考rfdig_seca.cfg;执行:ccode_standard  ./rfdig  rfdig_seca.cfg  >  1.log
  4. IC验证——perl脚本ccode_standard——c代码寄存器配置标准化,perl脚本,c语言,perl,IC验证,开源
  5. IC验证——perl脚本ccode_standard——c代码寄存器配置标准化,perl脚本,c语言,perl,IC验证,开源
  6. 如图所示,脚本只替换了有关rfdig的寄存器,iomux,crg等没有替换:

  7. IC验证——perl脚本ccode_standard——c代码寄存器配置标准化,perl脚本,c语言,perl,IC验证,开源

  8. 如下例所示,脚本存放于case目录,我想修改rfdig/rfdig_tc017文件夹下的.c文件,参考所有rbus.cfg文件;
  9. 执行:ccode_standard  ./rfdig/rfdig_m33_tc017  all  >  1.log

  10. IC验证——perl脚本ccode_standard——c代码寄存器配置标准化,perl脚本,c语言,perl,IC验证,开源

  11. 如图所示,脚本不仅替换了有关rfdig的寄存器,iomux,crg等都有替换:

  12. IC验证——perl脚本ccode_standard——c代码寄存器配置标准化,perl脚本,c语言,perl,IC验证,开源

    IC验证——perl脚本ccode_standard——c代码寄存器配置标准化,perl脚本,c语言,perl,IC验证,开源文章来源地址https://www.toymoban.com/news/detail-799965.html

     

5 脚本代码

#! /usr/bin/perl -w

#==========================================================
# PERL MODULE 
#==========================================================

use Cwd;
use File::Path;
use File::Find;

#==========================================================
# PERL FUNCTION GetOptions (get command parameters)
#==========================================================
$g_work_dir  = $ARGV[0];
$g_seca_fl   = $ARGV[1];

#our $work_dir  = 'rfdig_m33_tc017';

#==========================================================
# SCRIPT MAIN  
#==========================================================

our @seca_fl_list;
our @seca_name;
our @seca_type;
our @seca_width;
our @seca_init_value;
our @seca_with_field;
our @seca_field_list_bgn;
our @seca_field_list_end;
our @seca_field_name;
our @seca_field_width;
our @seca_field_bgn_idx;
our @seca_field_end_idx;

our $ccode_standard_mark = 0;

Main();

sub RegMem{
    @seca_name           = ();
    @seca_type           = ();
    @seca_width          = ();
    @seca_init_value     = ();
    @seca_with_field     = ();
    @seca_field_list_bgn = ();
    @seca_field_list_end = ();
    @seca_field_name     = ();
    @seca_field_width    = ();
    @seca_field_bgn_idx  = ();
    @seca_field_end_idx  = ();
    if (open(SECA_ID,"$g_seca_fl") or die "cannot open $g_seca_fl, no such file") {
        @seca_array = <SECA_ID>;
        my $i       = 0;
        my $j       = 0;
        my $rbus_ok = 0;
    
        foreach $seca_line (@seca_array) {
            $seca_line =~ s/[\n\r]*//g;
            if ($seca_line =~ m/^\s*field_(\S+)\s+\[(\S+)\]\s*$/) {
                if($rbus_ok eq 1) {
                    $seca_with_field[$i-1]     = 1 ;
                    $seca_field_list_bgn[$i-1] = $j;
                    $rbus_ok                   = 0 ;
                }
                $seca_field_list_end[$i-1] = $j;
                my $field_name_tmp   = "\L$1";
                my $field_name_size  = push(@seca_field_name ,$field_name_tmp);
                my $field_port_tmp   = $2;
                if ($field_port_tmp =~ m/(\d+):(\d+)/) {
                    push(@seca_field_bgn_idx,int($2));
                    push(@seca_field_end_idx,int($1));
                    push(@seca_field_width,(int($1)-int($2)+1));
                } else {
                    push(@seca_field_bgn_idx,int($field_port_tmp));
                    push(@seca_field_end_idx,int($field_port_tmp));
                    push(@seca_field_width,1);
                }
                #print ("seca_with_field[",$i-1,"]     = ",$seca_with_field[$i-1]     ,"\n");
                #print ("seca_field_list_bgn[",$i-1,"] = ",$seca_field_list_bgn[$i-1] ,"\n");
                #print ("seca_field_list_end[",$i-1,"] = ",$seca_field_list_end[$i-1] ,"\n");
                #print ("seca_field_name[",$j,"]       = ",$seca_field_name[$j]       ,"\n");
                #print ("seca_field_width[",$j,"]      = ",$seca_field_width[$j]      ,"\n");
                #print ("seca_field_bgn_idx[",$j,"]    = ",$seca_field_bgn_idx[$j]    ,"\n");
                #print ("seca_field_end_idx[",$j,"]    = ",$seca_field_end_idx[$j]    ,"\n");
                $j = $j + 1;
            }
            if ($seca_line =~ m/^\s*rbus_(\S+)\s+(\S+)\s+(\w+)\s+(\d+)('\w+)\s+(\S+)\s*$/) {
                #print ("before match string: ",$`,     "\n");
                #print ("match string       : ",$&,     "\n");
                #print ("after  match string: ",$',     "\n");
                #print ("seca_postfix       : ",$1,     "\n");
                #print ("seca_type          : ",$2,     "\n");
                #print ("seca_scope         : ",$3,     "\n");
                #print ("seca_width         : ",int($4),"\n");
                #print ("seca_init_value    : ",$5,     "\n");
                #print ("seca_prefix        : ",$6,     "\n");
                #print ("seca_name          : ","$6_$1","\n");
                $seca_name[$i]             = "\L$6_$1";
                $seca_type[$i]             = $2;
                $seca_width[$i]            = int($4);
                $seca_init_value[$i]       = $5;

                $seca_with_field[$i] = 0;
                $i = $i+1;
                $rbus_ok = 1;
            }
        }
    }
}

sub GenMacroDefine{
    #print "c file is              : $_[0]\n";
    #print "c macro_define file is : $_[1]\n";
    $ccode_standard_mark = 0;
    open(ORIEN_FILE,">>$_[1]");
        if (open(SOURCE_FILE,"$_[0]")) {
            @context = <SOURCE_FILE>;
            foreach $line (@context) {
                for ( $i = 0; $i < @seca_name; $i = $i +1) {
                    if ($seca_with_field[$i] eq 1) {
                        if ($line =~ m/^\s*(\w+)\[($seca_name[$i])\]\s*=\s*0x(\w+)\s*;.*$/) {
                            $ccode_standard_mark = 1;
                            print ORIEN_FILE "\n"."//"."$line";
                            my $seca_field_list_num  = $seca_field_list_end[$i] - $seca_field_list_bgn[$i] + 1;
                            for ($j = 0; $j < $seca_field_list_num; $j = $j+1) {
                                my $seca_field_width_tmp = $seca_field_width[$seca_field_list_bgn[$i]+$j];
                                my $seca_field_name_tmp  = "$seca_name[$i]"."_"."$seca_field_name[$seca_field_list_bgn[$i]+$j]";
                                my $seca_field_mask_tmp  = "$seca_field_name_tmp"."_mask ((1<<$seca_field_width[$seca_field_list_bgn[$i]+$j])-1)";
                                my $seca_field_shift_tmp = "$seca_field_name_tmp"."_shift $seca_field_bgn_idx[$seca_field_list_bgn[$i]+$j]";
                                my $seca_field_bit_tmp   = "$seca_field_name_tmp"."_bit (1<<$seca_field_bgn_idx[$seca_field_list_bgn[$i]+$j])";
                                if($seca_field_width_tmp eq 1){
                                    print ORIEN_FILE "#define $seca_field_bit_tmp\n";
                                } else {
                                    print ORIEN_FILE "#define $seca_field_mask_tmp\n";
                                    print ORIEN_FILE "#define $seca_field_shift_tmp\n";
                                }
                            }
                        }
                    }
                }
            }
            close SOURCE_FILE;
        }
    close ORIEN_FILE;
    system ("awk '!a[\$0]++' $_[1] > $_[1]_tmp \&\& mv -f $_[1]_tmp $_[1]");
}

sub AddMacroDefine{
    #print "old c file is : $_[0]\n";
    #print "new c file is : $_[1]\n";
    #print "add   file is : $_[2]\n";
    my $add_ready = 0;
    open(ORIEN_FILE,">$_[1]");
        if (open(SOURCE_FILE,"$_[0]")) {
            @context = <SOURCE_FILE>;
            foreach $line (@context) {
                if($line =~ m/^#include \"$_[2]\"$/) {

                } else {
                    print ORIEN_FILE "$line";
                }
                if ($add_ready eq 0) {
                    if ($line =~ m/^\s*\#include\s*\"\S+_define.c\"\s*$/) {
                        print ORIEN_FILE "\#include "."\"$_[2]\"\n";
                        $add_ready = 1;
                    }
                }
            }
            close SOURCE_FILE;
        }
    close ORIEN_FILE;
}

sub GenSubContent{
    #print "old c file is : $_[0]\n";
    #print "new c file is : $_[1]\n";
    open(ORIEN_FILE,">>$_[1]");
        if (open(SOURCE_FILE,"$_[0]")) {
            @context = <SOURCE_FILE>;
            foreach $line (@context) {
                my $line_match = 0;
                for ( $i = 0; $i < @seca_name; $i = $i + 1) {
                    if ($seca_with_field[$i] eq 1) {
                        if ($line =~ m/^(\s*)(\w+\[$seca_name[$i]\])\s*=\s*0x(\w+)\s*;.*$/) {
                            my $reg_value = hex($3);
                            if ($reg_value != 0) {
                                $line_match = 1;
                                print ORIEN_FILE "//"."$line";
                                my $seca_field_list_num = $seca_field_list_end[$i] - $seca_field_list_bgn[$i] + 1;
                                for ($j = 0; $j < $seca_field_list_num; $j = $j+1) {
                                    my $seca_field_name_tmp    = "$seca_name[$i]"."_"."$seca_field_name[$seca_field_list_bgn[$i]+$j]";
                                    my $seca_field_mask_tmp    = "$seca_field_name_tmp"."_mask";
                                    my $seca_field_value       = (($reg_value) >> ($seca_field_bgn_idx[$seca_field_list_bgn[$i]+$j])) & 
                                                                 ((1<<$seca_field_width[$seca_field_list_bgn[$i]+$j])-1);
                                    my $seca_field_width_tmp   = $seca_field_width[$seca_field_list_bgn[$i]+$j];
                                    my $seca_field_shift_tmp   = "$seca_field_name_tmp"."_shift";
                                    my $seca_field_bit_tmp     = "$seca_field_name_tmp"."_bit";
                                    #print ("seca_field_mask_value = ",((1<<$seca_field_width[$seca_field_list_bgn[$i]+$j])-1),";");
                                    #print ("reg_value = ",$reg_value,";");
                                    #print ("seca_field_value = $seca_field_value\n");
                                    if($j eq 0){
                                      if ($j eq ($seca_field_list_num - 1)) {
                                        if($seca_field_width_tmp eq 1) {
                                          printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) ;\n","$1","$2 =","$seca_field_bit_tmp",$seca_field_value,"                     ");
                                        } else {
                                          printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) ;\n","$1","$2 =","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");
                                        }
                                      } else {
                                        if($seca_field_width_tmp eq 1) {
                                          printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) |\n","$1","$2 =","$seca_field_bit_tmp",$seca_field_value,"                     ");
                                        } else {
                                          printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) |\n","$1","$2 =","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");
                                        }
                                      }
                                    } elsif($j eq ($seca_field_list_num - 1)) {                                                                                              
                                      if($seca_field_width_tmp eq 1) {
                                        printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) ;\n","$1","    ","$seca_field_bit_tmp",$seca_field_value,"                     ");
                                      } else {
                                        printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) ;\n","$1","    ","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");
                                      }
                                    } else {                                                                                                                                 
                                      if($seca_field_width_tmp eq 1) {
                                        printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) |\n","$1","    ","$seca_field_bit_tmp",$seca_field_value,"                     ");
                                      } else {
                                        printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) |\n","$1","    ","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");
                                      }
                                    }
                                }
                            }
                        }
                    }
                }
                if ($line_match eq 0) {
                    print ORIEN_FILE "$line";
                }
            }
            close SOURCE_FILE;
        }
    close ORIEN_FILE;
}

sub CopyFile{
    #print "source file name is $_[0]\n";
    #print "orien  file name is $_[1]\n";
    open(ORIEN_FILE,">$_[1]");
        if (open(SOURCE_FILE,"$_[0]")) {
            @context = <SOURCE_FILE>;
            foreach $line (@context) {
                print ORIEN_FILE "$line";
            }
            close SOURCE_FILE;
        }
    close ORIEN_FILE;
}

sub FindConfigFile{
    if (-f $File::Find::name) {
        if ($_ =~ m/^(\w+_sec[a-z]\.cfg)$/) {
            #print "find file is $1 \n";
            push(@seca_fl_list,$1); 
        }
    }
}

sub FindWanted{
    if (-f $File::Find::name) {
        if ($_ =~ m/(\S+)\.c$/) {
            print "process file: $File::Find::name \n";
            GenMacroDefine("$_","$1"."_macro_define.h");
            unlink "$1"."_macro_define.h";
            if($ccode_standard_mark eq 1) {
                unlink "$_".".tmp";
                GenSubContent("$_","$_".".tmp");
                #AddMacroDefine("$_".".tmp","$_","$1"."_macro_define.h");
                system ("mv -f $_.tmp $_");
                unlink "$_".".tmp";
            }
        }
    }
}

sub Main{
    my $cur_dir  = getcwd;
    my $proj_src = $ENV{PROJ_SRC};
    my $seca_dir = "$ENV{PROJ_SRC}/design/scripts/rbus_scripts/rbus_cfg/";
    if($g_seca_fl eq "all") {
        chdir($seca_dir) or die "$seca_dir was not found!!! please gen_rbus firstly.";
        find(\&FindConfigFile,"$seca_dir");
    } else {
        push(@seca_fl_list,$g_seca_fl);
    }
    #for ($i = 0; $i < @seca_fl_list; $i = $i+1) {
    #    print "seca_fl_list[$i] = $seca_fl_list[$i] \n";
    #}
    for ($z = 0; $z < @seca_fl_list; $z = $z + 1) {
        print "read config_file : $seca_fl_list[$z]\n";
        $g_seca_fl = "$seca_dir"."$seca_fl_list[$z]";
        RegMem();
        chdir($cur_dir) or die "$cur_dir does not exist!!!";
        find(\&FindWanted,"$cur_dir/$g_work_dir");
    }
}

到了这里,关于IC验证——perl脚本ccode_standard——c代码寄存器配置标准化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA/数字IC】Multiport RAM,多读多写寄存器-——基于FPGA BRAM的多端口地址查找表与FPGA BRAM的资源分析

    目录 背景 手写Multiport Ram Multiport RAM 代码方案 资源评估 Multiport RAM 资源利用的优化 资源评估 防止读写冲突的组合逻辑设计(写优先) 仿真和时序 单口写数据 单端口读数据 多口读相同数据 多口同时读不同数据 背景         在多端口交换机的设计中,交换机的每个端口

    2024年04月26日
    浏览(31)
  • 04 4bit移位寄存器设计与功能验证(附源码)

    写在前面,4位右移移位寄存器,顾名思义使用四个触发器级联,从一次输入到输出,只移动了3位,而不是4位。比如输入是1101,输出时为0001,而不是0000。 虚拟机:VMware -14.0.0.24051 环 境:ubuntu 18.04.1 脚 本:makefile(点击直达) 应用工具:vcs 和 verdi 行为级描述 结构级描述

    2024年02月05日
    浏览(63)
  • Git Bash环境下用perl脚本获取uuid值

    在Linux环境下,比如在ubuntu就直接有uuidgen命令直接获取uuid值。在Windows环境下常用的git bash中没有对应的命令,略有不便。这里用脚本写一个uuidgen,模拟Linux环境下的uuidgen命令。 脚本命名为uuidgen,放在 git bash home目录下的bin子目录。然后直接输入uuidgen就能获取了,和ubuntu环境

    2024年02月04日
    浏览(36)
  • 【效率提升-Perl脚本】根据Verilog文件自动生成tb文件

    在数字IC设计过程中,根据顶层生成testbench时存在很多重复性工作,因此为了提高工作效率,特地开发此脚本。 相应的python脚本见链接: 【效率提升—Python脚本】根据Verilog文件自动生成tb文件 学习更多IC知识,请关注

    2024年02月13日
    浏览(34)
  • perl脚本语言学习1——基础篇:变量、数组、哈希数组、循环、文件、函数

    2023.3.18 今天下载虚拟机把电脑磁盘内容弄到乱七八糟,难受 发现每次学习遇到一个坎,感觉面前是一座大山,越过去之后又对前途充满了希望 perl:practical extraction report language 实用提取和报表语言 从字面上看主要与文本处理相关 变量定义: my 存储 数字、字符、字符

    2024年02月12日
    浏览(59)
  • 【数字IC验证进阶】SoC系统验证和IP模块验证的区别及侧重点分析

    芯片验证其实有很多种,现在分工也很细了,包括ip验证和Soc验证等等,像现在还不是很热门的dft,formal,都是。偏的不讲,就说ip和soc。 很多小公司做的都是soc,因为简单,有钱买IP就行。去了就是soc验证 ,个别小公司,会自己开发一些自己的ip, 挂到soc中去 ,也会涉及到

    2024年02月07日
    浏览(26)
  • IC验证工程师工作一周年的体会

    转眼之间自己已经工作一周年了,作为一名验证工程师,这一年里面感觉自己虽然有了一定的成长,但是成长的还是比较缓慢的,接下来从个人的角度说说我现在对从IC验证的一些体会。 一.要养成良好的工作习惯 (1)自己在工作中发现很多时候都是可以偷懒的,有时候写几

    2024年02月08日
    浏览(72)
  • 数字IC验证——PSS可移植测试用例

    PSS是Accellera组织定义的测试用例生成规范,其思想是定义一个抽象模型,EDA工具可以从中生成适用于每个设计层次结构和每个验证平台的测试,即PSS定义了统一的测试场景,而场景的使用可以横跨不同验证层次和配置。 这种特性决定了PSS本身是不可执行的,用户需要EDA工具分

    2024年02月10日
    浏览(22)
  • perl脚本调用openssh不能正确执行(ctl_dir /root/.libnet-openssh-perl/ is not secure)的原因排查

    在使用perl脚本的时候,通过Net::OpenSSH去获取执行节点的信息是一种常用的方法。在某个环境中,执行命令的时候出错,下面展示一下相关的代码 在这段代码执行的时候,直接返回“fail: cann’t access by ssh” 通过手动的方式进行验证,在当前节点通过ssh方式是可以正常登录指定

    2024年02月14日
    浏览(31)
  • IIS perl python cbrother php脚本语言配置及简单测试样例程序

    上篇笔记写了 IIS 配置 CGI, IIS CGI配置和CGI程序FreeBasic, VB6, VC 简单样例_Mongnewer的博客-CSDN博客 这篇在IIS上配置一些脚本语言。为了操作方便,每种语言在站点下分设文件夹。 1. IIS perl配置 Perl CGI方式是曾经流行的做法。先下载一个开源的 Perl.exe 解释器,在免费的 sambar 服务器

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包