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掉了..........目前只能看这么多了