目录
0-需要环境
python 3.0 及以上(2.0可能可以)
1-生成程序
1.1-用于转换module port 到 testbench reg and wire
1.1.1-代码
#用于转换module port 到 testbench reg and wire
fir_space = 18
sec_space = 60
f_out = open('tb_reg_wire.txt', 'w+')
with open('module_port.txt', 'r') as f:
while True:
line_input = f.readline()
if not line_input:
break
line_tmp = line_input.split();
if line_tmp[0]=='module':
line_output = ''
for i in range(len(line_tmp)):
line_output += line_tmp[i]
line_output += ' '
print(line_output)
f_out.write('\n'+line_output)
elif line_tmp[0]=='input':
line_output = ''
for i in range(1,len(line_tmp)):
if len(line_tmp) == 3:
if i == 1:
line_output += 'reg'
line_output += ' '*(sec_space-len(line_output))
else:
line_output += line_tmp[i]
elif len(line_tmp) == 4:
if i == 1:
line_output += 'reg'
line_output += ' '*(fir_space-len(line_output))
elif i == 2:
line_output += line_tmp[i]
line_output += ' '*(sec_space-len(line_output))
else:
line_output += line_tmp[i]
else:#elif len(line_tmp) == 5
if i == 1:
line_output += 'reg'
line_output += ' '*4
elif i == 2:
line_output += line_tmp[i]
line_output += ' '*(fir_space-len(line_output))
elif i == 3:
line_output += line_tmp[i]
line_output += ' '*(sec_space-len(line_output))
else:
line_output += line_tmp[i]
if line_output[len(line_output)-1] == ',':
line_output = line_output[:len(line_output)-1] + ';'
else:
line_output += ';'
print(line_output)
f_out.write('\n'+line_output)
elif line_tmp[0]=='output':
line_output = ''
for i in range(1,len(line_tmp)):
if len(line_tmp) == 3:
if i == 1:
line_output += 'wire'
line_output += ' '*(sec_space-len(line_output))
else:
line_output += line_tmp[i]
elif len(line_tmp) == 4:
if i == 1:
line_output += 'wire'
line_output += ' '*(fir_space-len(line_output))
elif i == 2:
line_output += line_tmp[i]
line_output += ' '*(sec_space-len(line_output))
else:
line_output += line_tmp[i]
else:#elif len(line_tmp) == 5
if i == 1:
line_output += 'wire'
line_output += ' '*3
elif i == 2:
line_output += line_tmp[i]
line_output += ' '*(fir_space-len(line_output))
elif i == 3:
line_output += line_tmp[i]
line_output += ' '*(sec_space-len(line_output))
else:
line_output += line_tmp[i]
if line_output[len(line_output)-1] == ',':
line_output = line_output[:len(line_output)-1] + ';'
else:
line_output += ';'
print(line_output)
f_out.write('\n'+line_output)
else:
line_output = line_tmp[0]
print(line_output)
f_out.write('\n'+line_output)
f_out.close()
f.close()
1.1.2-效果演示
输入文本:
module conv_unit(
input wire clk,
input wire rst_n,
input wire enable,
input wire [`PRECISION*`MAX_KERNEL_NUMBER-1:0] din_weight,
input wire [`PRECISION*`MAX_KERNEL_NUMBER-1:0] din_fm,
input wire [`PRECISION-1:0] din_bias,
input wire bias_valid,
input wire fm_updata_valid,
input wire weight_updata_valid,
input wire [`MAX_KERNEL_NUMBER-1:0] data_bit_valid,
input wire [`MAX_ACC_BITWIDTH-1:0] acc_time,
input wire bias_or_not,
input wire [`MAX_ACC_BITWIDTH-1:0] gap_time,
output reg req_bias,
output wire signed [`PRECISION-1:0] dout,
output reg dout_valid
);
输出文本:
module conv_unit(
reg clk;
reg rst_n;
reg enable;
reg [`PRECISION*`MAX_KERNEL_NUMBER-1:0] din_weight;
reg [`PRECISION*`MAX_KERNEL_NUMBER-1:0] din_fm;
reg [`PRECISION-1:0] din_bias;
reg bias_valid;
reg fm_updata_valid;
reg weight_updata_valid;
reg [`MAX_KERNEL_NUMBER-1:0] data_bit_valid;
reg [`MAX_ACC_BITWIDTH-1:0] acc_time;
reg bias_or_not;
reg [`MAX_ACC_BITWIDTH-1:0] gap_time;
wire req_bias;
wire signed [`PRECISION-1:0] dout;
wire dout_valid;
);
1.2-用于例化端口
1.2.1-代码
#用于例化端口
fir_space = 18
sec_space = 60
f_out = open('tb_port.txt', 'w+')
with open('module_port.txt', 'r') as f:
while True:
line_input = f.readline()
if not line_input:
break
line_tmp = line_input.split();
if line_tmp[0]=='module':
line_output = line_tmp[len(line_tmp)-1]
line_output = line_output[:len(line_output)-1]+' '+line_output[:len(line_output)-1]+'_tb('
print(line_output)
f_out.write('\n'+line_output)
elif line_tmp[0]=='input':
line_output = line_tmp[len(line_tmp)-1]
if line_output[len(line_output)-1] == ',':
line_output = line_output[:len(line_output)-1]
line_output = '.'+line_output+'('+line_output+')'
print(line_output)
f_out.write('\n'+line_output)
elif line_tmp[0]=='output':
line_output = line_tmp[len(line_tmp)-1]
if line_output[len(line_output)-1] == ',':
line_output = line_output[:len(line_output)-1]
line_output = '.'+line_output+'('+line_output+')'
print(line_output)
f_out.write('\n'+line_output)
else:
line_output = line_tmp[0];
print(line_output)
f_out.write('\n'+line_output)
f_out.close()
f.close()
1.2.2-效果演示
输出文本:
conv_unit conv_unit_tb(
.clk(clk)
.rst_n(rst_n)
.enable(enable)
.din_weight(din_weight)
.din_fm(din_fm)
.din_bias(din_bias)
.bias_valid(bias_valid)
.fm_updata_valid(fm_updata_valid)
.weight_updata_valid(weight_updata_valid)
.data_bit_valid(data_bit_valid)
.acc_time(acc_time)
.bias_or_not(bias_or_not)
.gap_time(gap_time)
.req_bias(req_bias)
.dout(dout)
.dout_valid(dout_valid)
);