從今天開(kāi)始,我們介紹 Perl 在 ASIC 應(yīng)用中的高級(jí)篇。高級(jí)篇主要介紹正則表達(dá)式、module、package、面向?qū)ο?、進(jìn)程等。
正則表達(dá)式最常見(jiàn)的有兩個(gè)應(yīng)用,高級(jí)查找和替換。而替換的核心部分也是查找。
那么,我們?nèi)绾味x這個(gè)查找(或者說(shuō)叫匹配)的規(guī)則。匹配的基本語(yǔ)法是:
m/.../
匹配規(guī)則就寫(xiě)在 m 開(kāi)頭的兩個(gè)斜杠之間。
定義規(guī)則中的特殊字符稱為元字符。元字符有以下這些(只列了常用的,基本夠用了):
分類一:(轉(zhuǎn)義)
/ 反斜杠加接元字符表示轉(zhuǎn)義,比如 /+, /*, /?等,表示這些字符本身
/b 匹配單詞邊界
/B 非單詞邊界
/d 數(shù)字,就是 0-9 中的任一個(gè)字符
/D 非數(shù)字
/w 匹配大小寫(xiě)字母和下劃線
/W 非大小寫(xiě)字母和下劃線
/s 匹配空白字符,包括空格、制表符等
/S 非空白字符
/n 換行符,ASCII 的 0x0A
/t 制表符
/x /x 后接十六進(jìn)制數(shù),匹配這個(gè)數(shù)的 ASCII 符號(hào)
分類二:
^ 匹配開(kāi)頭
$ 匹配結(jié)尾
. 區(qū)配除換行符以外的所有字符
分類三:(匹配次數(shù))
* 匹配零次或多次
+ 匹配一次或多次
? 匹配零次或一次
分類四:括號(hào)(), [], {}
() 圓括號(hào)表示取值,把()里的值存到$1, $2, ... , $n 里
[] 表示多選一。如[abc]匹配 a 或 b 或 c。連續(xù)的字符可以簡(jiǎn)寫(xiě),如[a-z],[0-9]
[^] 表示[]里列出的其它字符
{n} 匹配 n 次
{n,m} 匹配 n 到 m 次
| 分組,如 m/bill|mike/,表示 bill 或 mike
? 當(dāng)?跟在*,+,?等后面時(shí),表示非貪婪模式。如,
my $test = "aaaaabb";
$test =~ m/a+?/;
匹配的結(jié)果是"a",而不是"aaaaa"
Perl 的綁定操作符
=~ 表示滿足匹配
!~ 表示不滿足匹配
如:
if($tc =~ m/^tc_/){ ... } 表示如果$tc 變量以 tc_ 開(kāi)頭,則執(zhí)行{}里的語(yǔ)句。
if($tc !~ m/^tc_/){ ... } 表示如果$tc 變量不以 tc_ 開(kāi)頭,則執(zhí)行{}里的語(yǔ)句。
正則表達(dá)式的匹配模式
i 忽略大小寫(xiě)
m 多行處理,即字符串中的換行符把字符串分為多行。匹配時(shí)不能越行
s 單行處理,在這個(gè)模式下,元字符 . 可以匹配換行符
x 允許正則表達(dá)式換行和加注釋,忽略空白字符
g 查到全局所有可能的匹配,即會(huì)匹配多次
e 用于替換,表示替換的新值要先計(jì)算,如
s/(ab+c)/&replace($1)/e
表示查換 ab+c,并把找到的結(jié)果傳給 replace()函數(shù),用函數(shù)的返回值來(lái)替換。這種方法可用于復(fù)雜的查找替換。這種用法,我在編輯 APR 的 IO 坐標(biāo)文件時(shí)實(shí)際用過(guò),比 GVIM 或者 Emacs 的列填充更強(qiáng)大。
下面舉幾個(gè)例子:
1. m/(output|input|inout)/s+wire|reg/s*(/[.*/])?(/w+),/ 腳本提取 RTL 端口定義
2. s//s*(/w+)/s*/.$1/t/t($1)/ 可用來(lái)模塊例化時(shí),自動(dòng)連接端口
3. my @testcase = `ls`;
foreach my $tc (@testcase){
if($tc =~ m/^tc_/){
... #查找目錄下的"tc_"開(kāi)頭所有的文件名,在寫(xiě)仿真腳本時(shí)常用到
}
}
4. if($pwd =~ m///(trunk|tags|release)$/){
... #通過(guò)腳本確認(rèn)當(dāng)前目錄是否是項(xiàng)目根目錄
}
Perl 正則表達(dá)式是非常博大精深的,需要在工作中慢慢積累。所以,今天的練習(xí)題多一點(diǎn),主要是想多提供一些實(shí)際使用場(chǎng)景,并自己動(dòng)手解決問(wèn)題。
練習(xí)題:
1. 用正則表達(dá)式從 RTL 里抓取所有寄存器的路徑。(用于自動(dòng)產(chǎn)生 UVM 寄存器模型)
2. 用正則表達(dá)式把門級(jí)網(wǎng)表拆分成多個(gè)僅包含單個(gè) module 的文件。
3. 用正則表達(dá)式把 PR 網(wǎng)表中大小寫(xiě)敏感的 net 改成大小寫(xiě)不敏感。(用于 calibre 做 LVS)
下一次,我們將開(kāi)始介紹 module。
審核編輯 黃宇
-
asic
+關(guān)注
關(guān)注
34文章
1247瀏覽量
122409 -
PERL
+關(guān)注
關(guān)注
0文章
14瀏覽量
10572
發(fā)布評(píng)論請(qǐng)先 登錄
labview如何使用VISA串口資源查找的正則表達(dá)式提取串口的資源名稱?
Cubeide1.18.1在線調(diào)試改變\"現(xiàn)場(chǎng)表達(dá)式\"中的值提示找不到地址,為什么?
干貨分享 | 零基礎(chǔ)上手!TSMaster圖形信號(hào)表達(dá)式實(shí)操指南

Cubeide1.18.1在線調(diào)試改變\"現(xiàn)場(chǎng)表達(dá)式\"中的值提示找不到地址,怎么解決?
Cubeide1.18.1在線調(diào)試改變\"現(xiàn)場(chǎng)表達(dá)式\"中的值提示找不到地址怎么解決?
Linux中文本處理命令的用法

Linux grep命令詳解
詳解nginx中的正則表達(dá)式

Verilog表達(dá)式的位寬確定規(guī)則

nginx中的正則表達(dá)式和location路徑匹配指南

求助,以下恒流源電路Io的計(jì)算表達(dá)式怎么計(jì)算?
TestStand表達(dá)式中常用的語(yǔ)法規(guī)則和運(yùn)算符使用

Java表達(dá)式引擎選型調(diào)研分析

評(píng)論