perl調試腳本
『壹』 Perl腳本在數字IC設計中有哪些應用
Perl腳本可以用於生成有規律的代碼,如SOC地址仲裁模塊verilog代碼、不同規格的CRC校驗verilog代碼、不同規格的FIFO代碼。
在晶元設計過程中,所用到的FIFO數量很多,大於100多個很常見,甚至大於500個都是存在的。而不同規格的FIFO基本都是用最基礎的RAM模塊來搭建實現的,如果依靠人工編寫,錯誤率高而且效率極其低下。因此,使用perl腳本編寫不同規格的FIFO代碼是可靠高效的方式。
快速生成testbench:在進行功能模擬的時候,需要編寫測試案例testbench,可以利用perl腳本快速生成測試案例的大部分代碼,手動添加少量verilog,即可快速完成testbench的編寫,有效減少工作量。
Verilog代碼自動對齊:verilog代碼在人工編寫時全靠手敲空格符會很累,並且效率低下,採用perl腳本一鍵對齊,效率高節省體力。
Mole例化連接:有些mole模塊的輸入輸出信號有上百條,依靠手動添加會很繁瑣,此時利用perl腳本生成例化模塊可以有效提高效率,降低錯誤率。
『貳』 為什麼perl腳本必須要加perl命令才能運行
加perl命令是為了讓該程序以perl環境運行。在windows下,如果你把.pl為後綴的默認打開方式為perl,就可以雙擊打開啦,不用輸入perl+程序名
『叄』 如何調試perl腳本
進入退出:
perl
-d debugtest用調試器載入perl程序運行,互動式界面
Loading
DB routines from perl5db.pl version 1.3
Editor
support available.
Enter
h or `h h' for help, or `perldoc
perldebug'
for more help.
main::(p4.pl:2): my($xx,$yy)=(1,1);
DB<1>
先是歡迎信息,顯示第一個可執行行:程序將要執行的當前行號。包名,文件名,文件中的行號。
提示符DB<n>
n為命令行號。h可看幫助,q退出調試器
l
預設顯示10行 再輸入l接著顯示10行
l
10 指定顯示第10行
l
8-10 指定顯示行的范圍
l
8+3 指定從哪行開始多少行。
l
subs 指定顯示函數,提供函數名。如果太長只顯示前幾行,用l接著顯示
-
顯示在當前行前面的行,再輸入-繼續向前
w
7 包含指定行的顯示窗口 windows可能不一樣
//
?? 從當前行搜索包含指定模式的行 /find/
//從前向後正向搜索,??從後向前逆向搜索 可忽略?? //中後面的? /。
S
列出所有函數,包名::函數
無參數的預設形式列出所有底層和繼承的函數,太多。加上搜索模式,指定當前程序包 S main可列出含main的函數
s 執行單條語句 顯示下一條要執行的語句。如果需要交互會等待輸入。
對於函數,僅僅是進入不執行,如果不進入函數內部,要跳過用n。不能進入系統內部的庫函數,只能進入自己定義的
n 執行一行程序,stepover 不進入函數。
f 執行當前函數剩下的語句,顯示跟隨函數的語句
step
out 舊命令,現在為切換文件名
回車
如果執行了s或n,以後只用回車重復執行上一個s或n的命令。
r 在函數中執行到函數外
b 10
在哪一行設置斷點。如果此行非執行語句,顯示不能設置斷點。如果一條語句有多行,則在第一行設置,其餘行不能設置。
b func在函數處設置斷點
b 10
($curdir eq
"") 當條件為真時中斷執行
c
執行到斷點或終止。繼續
c
12臨時斷點,只中斷一次,繼續執行在12行中斷。
L
列出所有斷點。列出前幾行,當前行,斷點。斷點條件。
B
10刪除斷點。不帶參數認為是下一行是斷點。
B *
刪除所有斷點。
X
var 不帶參數列出main包的所有變數,包括預定義的變數。指定變數不帶$,@。可能是符號表中的變數才行。現在與V同。
V
var 列出任何包的變數。只指定包名列出包的所有變數。指定包及變數為main
var。無::
S
列出所有可用的函數,包名::函數 無參數的預設形式列出所有底層和繼承的函數,太多。加上搜索模式,
指定當前程序包
S
main可列出含main的函數
p
expr
指印表達式值。把標准輸出重定向也會輸出到屏幕。
程序到達某一行時指定執行一條或多條語句。常見的行動作是顯示變數值或把含錯誤值的變數重置為指定的值
a
10 print ("curdir is $curdir\n") 多條語句在一行中用分號;分開,當要續行時用\ 執行完第10行執行指定的語句。
A
*刪除所有行動作
A 10刪除第10行的動作
>
print 在程序開始執行前執行語句。無參數形式刪除設置
<
print 在程序執行完成後執行語句。無參數形式刪除設置
跟蹤 顯示每一個執行行。
t
打開,關閉跟蹤。每執行顯示一行。
任何非調試命令的perl語句都可執行。分號可忽略。更改變數值。
H
列出從前命令
!
n 執行從前命令。忽略行號執行上一條命令
n=-2跳過2條命令。從當前H列表逆向跳過。
T
棧跟蹤。調用級
$
= &main::sub2('hi') from file debug1 line 7
$
= &main::sub1('hi') from file debug1 line 3
當前程序在第7行,在main包的sub2函數中,以hi為實際傳遞的參數。返回簡單變數,此函數由sub1調用。
=
別名 命令 給命令定義別名 =
pc print ("curdir is $curdir\n");別名存在%DB(%DB::alias)中。無參數列出定義的別名。輸入pc列印語句。
預定義別名:每次載入調試器自動定義別名。在.perldb中加入$DB'alias{"pc"} = 's/^pc/print
("curdir is $curdir\n");/';
錯誤檢查
Lint perl -MO=Lint,-u pl 編譯時檢查
perldiag錯誤信息
-w 重定義函數變數未使用
Use strict;
use diagnostics 警告信息。
命令行參數簡介
-c 語法檢查
-v版本
-w警告信息
-e執行單行程序
-s為程序提供命令行選項。perl -s prog.pl
-q =>$q=1作為選項。不出現在@ARGV中。否則不加-s,-q作為字元串存在@ARGV中。可賦值-abc="abc"
跟在程序名後帶-的是選項,不帶-的不是,不是選項的項後面的所有都不是選項。
-P先運行c預處理器,輸出再由perl執行
-I指定目錄中的包含文件
-n循環處理多個文件。不用while
-p讀文件行並顯示。同n,不用print自動顯示。
-i編輯文件,讀然後寫迴文件。
-a分割行到@F
-F分割模式,指定分割符
-0
指定輸入行結束符,用八進製表示
-1
指定輸出行結束符
-x從消息中抽取程序。忽略行,直到遇到#!..perl。到文件尾,ctrl-d
ctrl-z __END__時結束
-u產生coremp
-U可以執行不安全操作
-S從路徑中查找程序
-D設置調試標志
-T寫安全程序。從外部獲得的數據不能作為命令或修改文件系統
-d使用調試器
『肆』 誰幫我解釋下這個Perl腳本,越詳細越好
在指定目錄下,遍歷所有文件包括子目錄下文件,尋找關鍵詞,並列印出來!
指定目錄為第一個參數,關鍵詞為第二個,比如該腳本名為 find.pl
用法應該就是 find.pl<空格>目錄名<空格>文件名。 有段時間沒用perl了,大概說一下吧,不對的見諒阿。
#!/usr/bin/perl ##類unix系統下告知系統這是perl腳本 前提是需要文件為可執行
sub subdir { ##找到和這個 { 向對應的 } 這里是 過程 subdir 大體功能是把目錄存入數組@dir
##把文件存入數組@file
@tmp=(); ##聲明臨時數組@tmp
$rootdir=shift; ##從參數中讀取目錄名,就是subdir($ARGV[0])里的$ARGV[0].
opendir(DIR, $rootdir);##打開目錄
@tmp = readdir(DIR);##讀取目錄,把目錄下的文件和子目錄名字都讀進取。只是名字哦!
$start=@dir;#目錄數組的舊終點 ##設置標志位,用於在主程序中判斷目錄是否為空
for (local $i=2;$i<=@tmp-1;$i++) #從2開始是要跳過./和../目錄
{ ##開始對@tmp下的內容進行分類整理
if (-d $rootdir.'/'.$tmp[$i]) {push (@dir,$rootdir.'/'.$tmp[$i]);} #是目錄(文件夾)放進@dir數組
if (-f $rootdir.'/'.$tmp[$i]) {push (@file,$rootdir.'/'.$tmp[$i]);}##是文件,放進@file數組
}
$end=@dir;#目錄數組的新終點 ##設置另一個標志位,用途同$start。
closedir(DIR); #關閉句柄
@tmp=();# 臨時數組清空 ,為了後續讀取子目錄下的內容做准備。
#print $start."-";
#print $end."\n";
}
subdir($ARGV[0]); ##這里是主程序開始的地方,@ARGV數組包含環境變數,就是執行的時候
##跟在文件名後面的東西開始第一個就是$ARGV[0],第二個是ARGV[1],以此類推.....
#start=end說明經過上一條(下一條)命令,數組沒有變化(開始兼結尾)
if ($start ne $end) {for ($k=$start;$k<=$end-1;$k++){subdir($dir[$k]);}}
##上面這條的意思就是,如果該目錄下無子目錄那就算了,如果有,用subdir挨個處理子目錄
##個人認為這個寫的有問題,因為如果$ARGV[0]所指目錄包含2層以上(含兩層)子目錄的話,
##腳本就做不好完全的遍歷....具體改進方法可參考下面文件讀取時的做法..
#foreach $f (@file){
#chomp $f;
#print "$f\r\n";
#}
#exit;
foreach $f (@file){##此時@file數組中保存的全部都是文件名
chomp $f; ##除去文件名後的 換行符
open F,$f or next; ##打開文件句柄,打不開這個就去試試打開下一個.....
while(<F>){ ##讀取文件,一行一行來,讀取到EOF標志是while循環結束
if($_=~ m/$ARGV[1]/){ ##如果當前行中有和 $ARGV[1]中需要查詢字元一樣的字元
print "$f\r\n";last; ##列印出文件名
}
}
close F; ##關閉文件句柄
}
----------------------------------差不多就是這樣的了,perl用起來還是很方便的就是需要記的東西相對多點兒,而且一點不對,不好調試,這個腳本寫的不是很規范,雖然語法檢查沒問題。但是運行起來貌似有死循環,最後只好kill掉了..........目前只能看這么多了