0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Perl在ASIC中的应用—高级篇(1):正则表达式

454398 2023-02-03 15:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

从今天开始,我们介绍 Perl 在 ASIC 应用中的高级篇。高级篇主要介绍正则表达式、module、package、面向对象、进程等。

正则表达式最常见的有两个应用,高级查找和替换。而替换的核心部分也是查找。

那么,我们如何定义这个查找(或者说叫匹配)的规则。匹配的基本语法是:


m/.../


匹配规则就写在 m 开头的两个斜杠之间。

定义规则中的特殊字符称为元字符。元字符有以下这些(只列了常用的,基本够用了):


分类一:(转义)


/ 反斜杠加接元字符表示转义,比如 /+, /*, /?等,表示这些字符本身


/b 匹配单词边界


/B 非单词边界


/d 数字,就是 0-9 中的任一个字符


/D 非数字


/w 匹配大小写字母和下划线


/W 非大小写字母和下划线


/s 匹配空白字符,包括空格、制表符等


/S 非空白字符


/n 换行符,ASCII 的 0x0A


/t 制表符


/x /x 后接十六进制数,匹配这个数的 ASCII 符号

分类二:


^ 匹配开头


$ 匹配结尾


. 区配除换行符以外的所有字符

分类三:(匹配次数)


* 匹配零次或多次


+ 匹配一次或多次


? 匹配零次或一次

分类四:括号(), [], {}


() 圆括号表示取值,把()里的值存到$1, $2, ... , $n 里


[] 表示多选一。如[abc]匹配 a 或 b 或 c。连续的字符可以简写,如[a-z],[0-9]


[^] 表示[]里列出的其它字符


{n} 匹配 n 次


{n,m} 匹配 n 到 m 次


| 分组,如 m/bill|mike/,表示 bill 或 mike


? 当?跟在*,+,?等后面时,表示非贪婪模式。如,


my $test = "aaaaabb";


$test =~ m/a+?/;


匹配的结果是"a",而不是"aaaaa"



Perl 的绑定操作符


=~ 表示满足匹配


!~ 表示不满足匹配


如:


if($tc =~ m/^tc_/){ ... } 表示如果$tc 变量以 tc_ 开头,则执行{}里的语句。


if($tc !~ m/^tc_/){ ... } 表示如果$tc 变量不以 tc_ 开头,则执行{}里的语句。

正则表达式的匹配模式
i 忽略大小写


m 多行处理,即字符串中的换行符把字符串分为多行。匹配时不能越行


s 单行处理,在这个模式下,元字符 . 可以匹配换行符


x 允许正则表达式换行和加注释,忽略空白字符


g 查到全局所有可能的匹配,即会匹配多次


e 用于替换,表示替换的新值要先计算,如

s/(ab+c)/&replace($1)/e

表示查换 ab+c,并把找到的结果传给 replace()函数,用函数的返回值来替换。这种方法可用于复杂的查找替换。这种用法,我在编辑 APR 的 IO 坐标文件时实际用过,比 GVIM 或者 Emacs 的列填充更强大。

下面举几个例子:
1. m/(output|input|inout)/s+wire|reg/s*(/[.*/])?(/w+),/ 脚本提取 RTL 端口定义


2. s//s*(/w+)/s*/.$1/t/t($1)/ 可用来模块例化时,自动连接端口


3. my @testcase = `ls`;


foreach my $tc (@testcase){


if($tc =~ m/^tc_/){


... #查找目录下的"tc_"开头所有的文件名,在写仿真脚本时常用到


}


}

4. if($pwd =~ m///(trunk|tags|release)$/){


... #通过脚本确认当前目录是否是项目根目录


}

Perl 正则表达式是非常博大精深的,需要在工作中慢慢积累。所以,今天的练习题多一点,主要是想多提供一些实际使用场景,并自己动手解决问题。

练习题:
1. 用正则表达式从 RTL 里抓取所有寄存器的路径。(用于自动产生 UVM 寄存器模型)


2. 用正则表达式把门级网表拆分成多个仅包含单个 module 的文件。


3. 用正则表达式把 PR 网表中大小写敏感的 net 改成大小写不敏感。(用于 calibre 做 LVS)

下一次,我们将开始介绍 module。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • asic
    +关注

    关注

    34

    文章

    1269

    浏览量

    124057
  • PERL
    +关注

    关注

    0

    文章

    14

    浏览量

    10674
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    第4章 C语言基础以及流水灯的实现(4.5 4.6)

    (表达式)        {            循环体语句;        } C语言里,通常“表达式”符合条件叫做真,不符合条件,叫做假。比如前边i while(表达式)这个
    的头像 发表于 11-06 11:21 118次阅读

    inline ASM(内联汇编)的细节分享

    , \"r\"(_in1)被编号为2 \"r\"(_in2)被编号为2; 如果某个Input操作表达式使用数字0到9的一个数字(假设为1)作为它的操作约束,则等于向
    发表于 10-31 09:11

    I1电流计算对不对?怎么推导不出来I1表达式是图中那样

    I1电流计算对不对?怎么推导不出来I1表达式是图中那样
    发表于 09-28 18:01

    labview如何使用VISA串口资源查找的正则表达式提取串口的资源名称?

    如图,如何利用VISA资源查找的正则表达式从很多串口当中提取想要的目标串口(Quectel USB AT Port这个串口)?
    发表于 07-07 17:20

    基础3:掌握Python的条件语句与循环

    不同的条件执行不同的代码块。Python的条件语句主要使用if、elif(else if的缩写)和else关键字。 if语句 最简单的条件语句是if语句,它的工作方式如下: 复制代码 if 条件表达式
    发表于 07-03 16:13

    Cubeide1.18.1在线调试改变\"现场表达式\"的值提示找不到地址,为什么?

    Cubeide1.18.1在线调试时,\"现场表达式\"添加全局变量,然后改变其数值,Console窗口提示: Failed to read all registers
    发表于 06-12 06:50

    《ESP32S3 Arduino开发指南》第三章 C/C++语言基础

    for语句表达式情况具体执行流程:for语句被执行前,首先会执行表达式1,然后再检查表达式2的值:假如为假,不执行循环体,结束for语句
    发表于 06-10 09:20

    Cubeide1.18.1在线调试改变\"现场表达式\"的值提示找不到地址是怎么回事?

    Cubeide1.18.1在线调试时,\"现场表达式\"添加全局变量,然后改变其数值,Console窗口提示: Failed to read all registers
    发表于 06-10 08:26

    干货分享 | 零基础上手!TSMaster图形信号表达式实操指南

    TSMaster软件支持图形里面的信号表达式功能,主要用于多信号表达式运算和显示的场景。本文将以A2L的标定变量为例,介绍如何使用图形
    的头像 发表于 06-06 20:03 674次阅读
    干货分享 | 零基础上手!TSMaster图形信号<b class='flag-5'>表达式</b>实操指南

    Cubeide1.18.1在线调试改变\"现场表达式\"的值提示找不到地址,怎么解决?

    Cubeide1.18.1在线调试时,\"现场表达式\"添加全局变量,然后改变其数值,Console窗口提示: Failed to read all registers
    发表于 06-06 08:27

    Cubeide1.18.1在线调试改变\"现场表达式\"的值提示找不到地址怎么解决?

    Cubeide1.18.1在线调试时,\"现场表达式\"添加全局变量,然后改变其数值,Console窗口提示: Failed to read all registers
    发表于 04-27 06:18

    Linux中文本处理命令的用法

    Linux 三剑客是(grep,sed,awk)三者的简称,熟练使用这三个工具可以提升运维效率。Linux 三剑客以正则表达式作为基础,而在Linux系统,支持两种正则表达式,分别为“标准
    的头像 发表于 04-15 10:22 556次阅读
    Linux中文本处理命令的用法

    利用栈结构实现四则运算的巧妙方法

    上个视频写了个简易计算器,算个简单的加减乘除还行,但是如果来个混合运算,或者加个括号,这几行代码就差的太多了。 处理这种混合运算,不得不提到数据结构的栈。 我们平时写的这种表达式,叫做中缀表达式
    的头像 发表于 02-07 11:06 973次阅读

    卡诺图在数字电路的应用

    的简化和最小化 基本原理 卡诺图是一个方格状的表格,其行和列对应于输入信号的所有可能组合。对于n个变量的布尔表达式,卡诺图有2^n个格子。根据给定的布尔代数表达式,将每个组合的输出值填写到卡诺图的相应格子,对于输出为逻辑“
    的头像 发表于 01-14 17:08 2331次阅读

    Linux grep命令详解

    Linux grep命令是一种非常常用的文本搜索工具,它可以在给定的文件搜索匹配的字符串,并输出匹配的行。grep是全称“global search regular expression print”,可以识别正则表达式,并使用正则表
    的头像 发表于 12-25 09:39 1789次阅读