在写代码时,有一些重复代码,我们想简写这部分代码,以节省编码工作,然后使用预处理工具进行处理,得到最终的代码。
perl的EP3,就是这样的一个工具。
在 https://metacpan.org/search?q=ep3 网站上,有介绍这个工具,其实就是perl的一个插件。
可以对该插件进行封装,得到一个perl脚本,直接使用该perl脚本对文件进行预处理。
脚本名叫ep3,脚本代码如下:
使用也比较简单,直接
ep3 [option] 文件 > 输出文件
对于option选线,有以下的一些常用选项:
-
-noprotect: 对文件中的注释,不处理
-
-nocommon: 去除文件中的注释
-
-include: include其他文件
-
-includes: 指定输入文件中@include的搜索目录
-
-define: 定义宏, 如 -define use_fifo=1
下面,简单说下ep3命令的用法:
一、循环
如果,我们想要生成如下的信号,
我们可以这样写
@for , @endfor是ep3的指示符,表示循环,中间的@i@会被依次替换为0,1,2,3,4,5。
二、条件判断
想要根据传入的参数,决定生成的代码。
比如想根据传入的参数,WIDTH,决定count_reg信号的位宽是多少。可以这样编写代码:
执行命令 ep3 test.svp -define WIDTH=6 > test.sv
生成后的代码:
@WIDTH是ep3使用的宏名,可以通过@宏,进行定义,也可以在ep3的命令选项,-define 宏=宏参数 进行定义。
三、宏判断
可以使用宏判断,从而生成指定的代码。和条件判断类似
module test(clk, rst); @ifdef @USE_RAM ram ram_u1; @else fifo fifo_u1; @endif endmodule
宏判断的宏,不能通过ep3的-define参数,进行定义,必须要定义在文件中,然后使用@include方式引入。请见第四节,include。
ep3命令的-define参数,只会影响文件中的@if, @else if这些指示符。
生成后的代码如下:
四、include
可以包含其他文件中的内容,到本文件中。
如以下被包含的文件,使用@define,定义了一个ep3所使用的宏。
代码文件,使用@include, 包含文件,包含的文件内容,会被ep3处理,然后生成在这个位置。
转换后,代码变为以下:
五、perl_begin, perl_end
对于其他复杂预处理,可以使用@perl_begin,@perl_end。处于这2个之间的代码,可以使用perl脚本进行处理。
如以下代码:
处理之后:
对于直接输出文本,需要使用@>> 和 @<< 进行包含,表示这部分,不是perl执行代码。
以上,就是ep3命令的使用简单介绍,一般来说,以上的功能已经足够了,如果需要复杂的功能,就需要自己查阅相关资料,并且进行实验。