寄存器设计验证在IC前端周期占据着相当的分量。如果能通过输入某种格式的文件,输出寄存器RTL, uvm register model, HTML描述,FW API...那对工作效率将是极大的提升。这里以uvm register model为例,介绍一种通过python模板制作代码生成器的方法,抛砖引玉。
输入格式选择
常用的寄存器输入格式有:tcl, excel, XML(IP_XACT). synopsys的ral gen一开始采用的就类似tcl的语法,处理起来很方便,然而写输入的人大概会很痛苦。不过最痛苦的莫过于直写XML,读起来头都要大两圈,通常会作为GUI工具的中间文件。为了使用者方便,这里选择了excel作为最终格式。
既然要用excel格式,那么需要使用第三方插件openpyxl处理excel文件,当然如果你习惯使用xlsxwriter, xlrd/xlwt也是一样的。
结构
寄存器在结构上自上而下依次为:block->register->field, 有两个明显的特点,每一层结构又带有该层特有的信息
每一层节点有1~N个子节点
这不就是颗多叉树么?实现的方式多种多样,可以用嵌套字典,也可以用class, 这里采用了后者。接下来构造这样的一棵树:
class RegisterNode(object):
def __init__(self, name='root'):
object.__setattr__(self, 'name', name)
object.__setattr__(self, 'items', {})
object.__setattr__(self, 'attrs', {})
为了未来使用的方便,将Node改造成可迭代的:
def __iter__(self):
return iter(self.items.items())
填充完__setitem__, __getitem__等一众方法之后,一颗寄存器树就做好了。
提取信息
我们的需求,无非是将文件从一种格式的文件映射