import re导入正则表达式模块re,通过模块名re调用其中函数,如:
re.findall:在字符串中找出所有匹配的字符串
re.search:在字符串中搜索匹配正则表达式的子串
re.match:从字符串开始匹配正则表达式
re.split:使用正则表达式来分隔字符串
re.sub:使用正则表达式进行搜索替换
略去正则表达式介绍,逐行解释代码:
import re
# with语句用于打开文件,"r"表示只读,用于读取文件内容
# 将文件对象赋值给verilog_f变量,其可以用来引用该文件的对象,进行后续读取操作
# with语句会在结束后自动关闭文件
with open("w_ctl.v","r") as verilog_f:
lines=verilog_f.read() # 读取文件全部内容到lines变量中,read读取类型为str
# r表示原生字符串,\s匹配空格,+匹配前⼀个字符出现1次或者⽆限次,即⾄少有1次
# ?:表示一个非捕获性的匹配分组,不会把这部分匹配内容提取出来,即可以匹配一个xxx的字符串
# [\S+:\d+]中:\S+表示匹配⾮空⽩字符至少一次,\d+表示匹配数字至少一次即形如[aaa:111]的字符串
# 最后的?表示整个(?:[\S+:\d+])分组可选,可能出现0次或1次
# \s+空格至少一次,\w+匹配单词字符至少一次
# 读取到的数据内容是lines
# re.findall:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
intf_in=re.findall(r"input\s+(?:[\S+:\d+])?\s+(\w+)",lines)
# \S*?表示非贪婪,即匹配非空白字符最少次数,后面同上
intf_ou=re.findall(r"output\s+\S*?(?:[\S+:\d+])?\s+(\w+)",lines)
# 使用re.search找到模块名,并存在mod中
mod=re.search(r"module\s+(\w+)",lines)
# 打开tb文件,只写用于写入测试平台代码
with open("tb.v","w") as instance_f:
# 写入头部注释
instance_f.write("//this is auto-instance\n")
# 写入mod正则匹配第一个括号的匹配部分(\w+),再加一个tab键缩进和"U_"前缀,再写入(\w+)和(,换行
instance_f.write(mod.group(1)+"\tU_"+mod.group(1)+"(\n")
# 写入tab缩进和注释,下面写入输入
instance_f.write("\t//input signal\n")
# 遍历intf_in
for match_in in intf_in:
# 写入缩进,".match_in(match_in)," 并换行
instance_f.write("\t."+match_in+"("+match_in+"),\n")
# 写入tab缩进和注释,下面写入输出
instance_f.write("\t//output signal\n")
# 最后一个接口名最后没有逗号,要去掉进行单独处理
for match_ou in intf_ou[:-1]:
# 写入缩进,".match_ou(match_ou)," 并换行
instance_f.write("\t."+match_ou+"("+match_ou+"),\n")
# 单独处理最后一行,写入缩进, ".intf_ou[-1](intf_ou[-1]));" 并换行
instance_f.write("\t."+intf_ou[-1]+"("+intf_ou[-1]+"));\n")
比如rtl为:
module w_ctl(
parameter DW = 8,
paramater AW = 12
)(
input clk,
input rst_n,
input w_en,
input r_en,
input [AW-1:0] w_addr,
input [AW-1:0] r_addr,
output reg [DW-1:0] data_out,
output reg w_full,
output r_full
);
endmodule
经脚本后自动例化:
//this is auto-instance
w_ctl U_w_ctl(
//input signal
.clk(clk),
.rst_n(rst_n),
.w_en(w_en),
.r_en(r_en),
.w_addr(w_addr),
.r_addr(r_addr),
//output signal
.data_out(data_out),
.w_full(w_full),
.r_full(r_full));