今天想试试用perl脚本来帮我写一点简单的程序片段,发现perl跟tcl很像,非常简单易学,从安装,看说明文档到搞定我的需求十来分钟就完事了233
想做的事情是把下面的代码片段拓展成46份,编号按顺序顺延下去。当然要完成在状态机里变着取数的操作其实完全不需要用死写代码的笨办法,直接搞个计数器就行,但我只是想给自己一个理由学下perl,所以干就完事了。
ASSIGNMENT_1:
begin
a <= 64'h7FF0000000000000;
b <= 64'h3FF0000000000000;
end
a和b是存在两个txt里的数据,我要让脚本帮我从txt中读取数据,然后自动写赋值语句,那么首先要完成读取操作,代码如下,所做的是把
open (RFILE_a,"a_input.txt") || die "cannot open file:$!n";
my @array_a = <RFILE_a>;
#print "@arrayn";
#//chomp数组不是这么用的
#for $i (@array_a) {
# chomp @array_a[$i];
#};
chomp(@array_a);
close RFILE_a;
用上print "@arrayn"这一句后,测试的效果是下面这样。
![7d15c4eb7e06133cbd4d743463eb8839.png](https://img-blog.csdnimg.cn/img_convert/7d15c4eb7e06133cbd4d743463eb8839.png)
特别值得一提的是chomp这个函数,可以自动把数组里每个元素最后的换行符去掉,很方便。
接下来是要把需要按顺序变化的变量做成一个数组,代码如下
array_num = (1..45);
@change_array_num = (3..47);
#//构造ASSIGNMENT数组
$assignment = "ASSIGNMENT_";
for ($i = 1;$i <=45;$i++){
$assignment_num[$i] = $assignment.$i;
};
#print "@assignment_num";
最后是写上生成赋值语句的代码
open (WFILE,">>output.txt") || die "cannot open file:$!n";
print WFILE "nnn";
for ($i = 1;$i <=45;$i++) {
print WFILE "@assignment_num[$i]:nbeginna <= 64'h@array_a[$i];nb <= 64'h@array_b[$i];nendn";
#print WFILE "if( ini_wait_one_sec == CYCLE_ONE_SEC - 1) beginn";
#print WFILE "state_ini <= @assignment_num[$i+1];n";
#print WFILE "end else beginn";
#print WFILE "state_ini <= @assignment_num[$i];nendnendn";
};
close WFILE;
唯一要提一下的是open函数里面的> 和>>的区别,>是清除这个文本里原有的内容再写入,>>是在原有的文本内容后面写入。
另外值得一提的是for $i (@array_a)这种循环表达,这样的表达$i这个变量里存的是(@array_a)这个数组里的每一个元素,所以如果我们要让$i是变化的数字,那么还是老老实实用for ($i = 1;$i <=45;$i++) 。下面是用代码测一下$i的内容。
#//测试一下for $i 里的$i是数字还是元素,答案是元素
#for $i (@array_a) {
# print "$i";
#};
这么一通简单的操作之后,就可以在我们生成的output.txt里面看到我们要的代码
![0c072838f04c74becd2f3aac9bee4c64.png](https://img-blog.csdnimg.cn/img_convert/0c072838f04c74becd2f3aac9bee4c64.png)
还用perl做了点别的,这里记录一下方便以后自己翻。
open (RFILE_a,"a_input.txt") || die "cannot open file:$!n";
my @array_a = <RFILE_a>;
#print "@arrayn";
#//chomp数组不是这么用的
#for $i (@array_a) {
# chomp @array_a[$i];
#};
chomp(@array_a);
close RFILE_a;
open (RFILE_b,"b_input.txt") || die "cannot open file:$!n";
my @array_b = <RFILE_b>;
#print "@arrayn";
chomp(@array_b);
close RFILE_b;
@array_num = (1..45);
@change_array_num = (3..47);
#//构造ASSIGNMENT数组
$assignment = "ASSIGNMENT_";
for ($i = 1;$i <=45;$i++){
$assignment_num[$i] = $assignment.$i;
};
#print "@assignment_num";
#生成localparam
open (WFILE,">output.txt") || die "cannot open file:$!n";
for ($i = 1;$i <=45;$i++) {
#print WFILE "localparam ASSIGNMEMT_@array_num[$i]=($i+2)n";
print WFILE "localparam @assignment_num[$i]=@change_array_num[$i-1];n";
};
close WFILE;
#//测试一下for $i 里的$i是数字还是元素,答案是元素
#for $i (@array_a) {
# print "$i";
#};
#//生成赋值
open (WFILE,">>output.txt") || die "cannot open file:$!n";
print WFILE "nnn";
for ($i = 1;$i <=45;$i++) {
print WFILE "@assignment_num[$i]:nbeginna <= 64'h@array_a[$i];nb <= 64'h@array_b[$i];nendn";
#print WFILE "if( ini_wait_one_sec == CYCLE_ONE_SEC - 1) beginn";
#print WFILE "state_ini <= @assignment_num[$i+1];n";
#print WFILE "end else beginn";
#print WFILE "state_ini <= @assignment_num[$i];nendnendn";
};
close WFILE;
#//调整计数器和状态机状态
open (WFILE,">>output.txt") || die "cannot open file:$!n";
print WFILE "nnn";
for ($i = 1;$i <=45;$i++) {
#print WFILE "else if (state_ini == @assignment_num[$i] && ini_wait_one_sec == CYCLE_ONE_SEC - 1)nini_wait_one_sec <= 32'd0;n";
print WFILE "else if (state_ini == @assignment_num[$i] && ini_wait_one_sec == CYCLE_ONE_SEC - 1) beginn";
print WFILE "ini_wait_one_sec <= 32'd0;n";
print WFILE "state_ini <= @assignment_num[$i+1];n";
print WFILE "endn";
};
close WFILE;