一 基本思想
通过脚本生成代码,主要用来解决多次重复例化或多次重复逻辑的情况,从而达到节约人力以及降低错误率的目的。
其基本思想为,想法获取不同的变量,并将其代入到固定的模板中。
二 表格生成法
通过表格收集不同的变量,可以更加直观、便捷,方便后期代码的迭代更新。
以寄存器表单生成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文件的全过程。