一 基本思想

通过脚本生成代码,主要用来解决多次重复例化或多次重复逻辑的情况,从而达到节约人力以及降低错误率的目的。
其基本思想为,想法获取不同的变量,并将其代入到固定的模板中。

二 表格生成法

通过表格收集不同的变量,可以更加直观、便捷,方便后期代码的迭代更新。
以寄存器表单生成rtl代码为例,步骤如下:

1 创建xlsx表格

在表格中罗列出所需要关心的变量,如下表所示:

addr_offset

register_name

sw_attr

hw_attr

bit

field_name

bit_width

default

description

0x1000

reg_dummy

rw

r

27:0

reg_dummy_inst

28

100_0000

the register is an example

0x1000

reg_dummy

rw

r

3:0

reserve

4

reserve

reserve

接下来,我们就要使用脚本来获取这些变量。

2 python3脚本获取xlsx表格内容

使用python3处理xlsx表格,首先需要调用openpyxl或者xlrd模块,其使用方法与手动操作Excel文件一样,即先打开工作薄(workbook),再选择工作表(sheet),最后操作单元格(cell)。
具体代码如下:

import openpyxl
#1 选择工作薄
wb = openpyxl.load_workbook('example.xlsx')

#2 选择工作表
ws = wb['Sheet1'] #获取工作簿中表名为Sheet1的工作表对象

#操作工作表
max_row = ws.max_row #获取Sheet1工作表中行数
ws[f'B{1}'].value #获取工作表Sheet1中第1行,第B列中的数据

#3 操作单元格
ws[f'B{1}'] #获取工作表Sheet1中第1行,第B列中的单元格,注意不是数据

或者

import xlrd
#1 选择工作薄
wb = xlrd.open_workbook('example.xls') #假设该工作簿中共有2张工作表,分别命名为Sheet1和Sheet2
#or
wb = xlrd2.open_workbook('example.xlsx')

#2 选择工作表
s_names = wb.sheet_names() #获取工作簿中所有工作表的表名
print(s_names) #结果为['Sheet1','Sheet2']
all_sheets = wb.sheets() #获取工作簿中所有工作表对应的工作表对象
sheet_1 = wb.sheet_by_name('Sheet1') #获取工作簿中表名为Sheet1的工作表对象
sheet_2 = wb.sheet_by_index(1) #获取工作簿中第2张工作表对象

#操作工作表
sheet_1.nrows #获取工作表Sheet1中的行数
sheet_1.ncols #获取工作表Sheet1中的列数
sheet_1.row_values(1) #获取工作表Sheet1中第二行中的所有数据,结果以列表的形式返回
sheet_1.col_values(0) #获取工作表Sheet1中第一列中的所有数据,结果以列表的形式返回

#使用列获取的方式,获取整个Sheet1表格
for i in range(sheet_1.ncols):
	print(sheet_1.col_values(i))

#3 操作单元格
sheet_1.row(1) #获取工作表Sheet1中第二行中的所有单元格,注意不是数据,虽是列表,但类似于字典[text:'row1.value0',text:'row1.value1',...,text:'row1.value*']
sheet_1.col(0) #获取工作表Sheet1中第一列中的所有单元格,注意不是数据,虽是列表,但类似于字典[text:'col0.value0',text:'col0.value1',...,text:'col0.value*']
sheet_1.cell(1,0) #获取工作表Sheet1中第二行,第一列中的单元格
#单元格.value --可以获取指定单元格中的值

以上就是获取Excel文件内容的所有相关操作,总的来说比较简单,相比openpyxl,xlrd可以以行为单位或者以列为单位获取工作表中的内容。

3 python3脚本生成rtl代码

获取完所有变量后,就可以通过操作列表的方式,填如对应的变量,最后输出rtl文件。
举例说明如下:

# generate verilog RTL code
rtl_file = []
rtl_file.append("module example_top (\n")
rtl_file.append("intput		clk		,\n")
rtl_file.append("intput		rst_n	,\n")
...
rtl_file.append("output		Q		);\n")
... #main code
rtl_file.append("assign Q = %s;\n" %(sheet_1.cell(1,0).value)) #填入对应的变量

fp = open("example_top.v",'w') #创建文件名为example_top.v的rtl
#将列表rtl_file填入创建的文件中
for i in range(len(rtl_file)):
	fp.write(spec_file[i])
fp.close()
print("example_top.v is generated sucessfully!")

至此,就完成了使用表格产生rtl文件的全过程。