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

    文章

    1156

    浏览量

    119263
  • PERL
    +关注

    关注

    0

    文章

    12

    浏览量

    10307
收藏 人收藏

    评论

    相关推荐

    你还不会gvim正则表达式?一文搞懂!

    gvim正则表达式常在命令行模式下使用,一般用于文本文件字符串的替换、删除等操作。
    的头像 发表于 01-19 16:47 315次阅读

    更快的tsv解析代码分享

    使用正则解析的正则表达式很简单, 这里直接给代码, 为了避免重复编译正则表达式和重新分配内存报错结果列表, 这里将她们作为参数传给解析函数.
    的头像 发表于 12-29 09:45 166次阅读
    更快的tsv解析代码分享

    GVIM正则表达式介绍和使用示例

    的Ken Thompson借用这个概念并将它应用到了文本编辑器中。后面正则表达式的说法进入到了大家常用的vi、vim、gvim当中。
    的头像 发表于 12-18 15:09 385次阅读
    GVIM<b class='flag-5'>正则表达式</b>介绍和使用示例

    linux正则表达式匹配字符串

    在Linux操作系统中,正则表达式是一种强大的模式匹配工具,它可以用于在文本中查找、替换和筛选特定的字符串。准确掌握正则表达式的语法和常见应用,对于Linux系统的管理员和开发人员来说
    的头像 发表于 11-23 10:26 331次阅读

    什么是正则表达式正则表达式如何工作?哪些语法规则适用正则表达式

    正则表达式又称规则表达式(Regular Expression,在代码中常简写为 regex、regexp 或 RE),是一种用于匹配、查找、替换文本的强大工具。它能够以特定的模式匹配字符串,从而
    的头像 发表于 11-03 14:41 564次阅读
    什么是<b class='flag-5'>正则表达式</b>?<b class='flag-5'>正则表达式</b>如何工作?哪些语法规则适用<b class='flag-5'>正则表达式</b>?

    Java Lambda表达式的新特性

    Java Lambda表达式是Java 8中最重要的新特性之一。 它们是一种可传递的匿名函数,可以作为参数传递给方法或存储在变量中,因此可以在需要的时候调用它们。 基础 1. 简介 Lambda
    的头像 发表于 09-30 10:29 2289次阅读

    怎么去选择使用gm的三种表达式呢?

    我们在写跨导gm的表达式时,知道gm有三种表达式表达式含有的变量其实只有三个,一个W/L,一个Vgs-Vth,还有一个Id。
    的头像 发表于 09-17 15:31 3078次阅读
    怎么去选择使用gm的三种<b class='flag-5'>表达式</b>呢?

    zabbix触发器表达式 基本RS触发器表达式 rs触发器的逻辑表达式

    zabbix触发器表达式 基本RS触发器表达式 rs触发器的逻辑表达式  Zabbix是一款开源的监控软件,它能通过监控指标来实时监测服务器和网络的运行状态,同时还能提供警报和报告等功能来帮助管理员
    的头像 发表于 08-24 15:50 1209次阅读

    如何使用lambda表达式提升开发效率?

    Java8 的一个大亮点是引入 Lambda 表达式,使用它设计的代码会更加简洁。当开发者在编写 Lambda 表达式时,也会随之被编译成一个函数式接口。
    发表于 08-24 10:25 171次阅读

    Python中的正则表达式

    哈喽大家好,我是了不起,今天给大家讲Python中的正则表达式 在Python中,正则表达式是一种强大的文本处理工具,它可以用来匹配、搜索、替换文本。正则表达式是一个特殊的字符序列,它可以描述一类
    的头像 发表于 06-21 16:52 709次阅读

    OpenHarmony中使用正则表达式

    本文主要介绍笔者在做开源鸿蒙应用开发时,ArkTs 中使用正则表达式处理像 string 等字符串对象。
    的头像 发表于 06-06 09:24 654次阅读

    一文详解Verilog表达式

    表达式由操作符和操作数构成,其目的是根据操作符的意义得到一个计算结果。表达式可以在出现数值的任何地方使用。
    的头像 发表于 05-29 16:23 1933次阅读
    一文详解Verilog<b class='flag-5'>表达式</b>

    shell脚本基础:正则表达式grep

    在Linux上有许多命令可以使用正则表达式,其中最常见的是grep命令和sed命令。正则表达式有多种类型,每种类型中可以使用的元字符类型不同。最常见的是基本正则表达式和扩展正则表达式
    的头像 发表于 05-29 09:29 770次阅读
    shell脚本基础:<b class='flag-5'>正则表达式</b>grep

    KiCad 7添加网络类(一):通配符与正则表达式

    的网络没有“通用”特征,那该怎么办呢?要么去修改原理图中网络的名称,要么就只能用土办法,挨个添加。如下图,因为没法批量匹配,只能一行行的网络添加到网络类。 灵活使用正则表达式,对于需要使用网络类
    发表于 05-24 14:41

    Linux入门之正则表达式

    正则表达式是用来表达字符串匹配模式的方法,利用正则表达式,可以让我们轻易地实现对目标字符串的**查找**、**删除**、**替换**等操作。 正则表达式并不复杂,它并不包含难以理
    的头像 发表于 05-12 15:31 564次阅读
    Linux入门之<b class='flag-5'>正则表达式</b>