自动生成UVM的方法:介绍python的Mako模块

从零开始写UVM环境还是比较痛苦的,

一是,底层相同的代码太多,等同于苦力劳动;

二是,需要注意的细节也很多,容易出错。

手工解决方案

那么有没有解决方法呢?有。

第一步,复制一份之前项目上的UVM环境,删除特殊的代码,只留下通用的部分。

第二步,对agent做查找替换,比如把interface、transaction、agent等名字替换成新的(agent里包括driver、monitor、sequencer、config class、agent、package)。

第三步,对env做查找替换,比如修改agent的例化、各种port连接、scoreboard等。

对于熟练的IC验证工程师,添加一个新agent到环境至少需要1~N个小时,对于不熟练的需要一周。

用脚本来提高效率

我们发现其实这些都是有规则可寻、重复性的劳动,最好交给脚本去做。

思路:

写查找替换脚本。vim/perl/python/... 各显神通,读入sv代码,正则匹配替换。而需要添加agent时,修改env略显麻烦,因为要插入代码。当然这也难不倒各位大神,数百行脚本不在话下。

从软件编程借鉴经验

在网页编程中,特别是服务器端的脚本语言,比如ASP、JSP、PHP、Nodejs等,通常都是在HTML语言中嵌入脚本语言。

比如,我们要在一个网页上显示一个访问量的计数器。其实99.9%的HTML代码都不用动,只需要动态替换掉计数值即可。以php为例,代码如下:

那么我们的sv代码是不是也可以嵌入脚本呢?

使用模板来进一步提升效率

介绍一款模板语言——Mako。先上一段代码:

没错,Mako是就用python写的一个模板库。

1. 我们只需要从uvm代码中把变化的部分提取出来,例如agent名字,用$来代替。

2. 当脚本运行时,agent名字通过render()函数传进去,进行替换。

Mako模板也支持对文件及目录的批量操作,这对我们自动生成uvm帮助极大。

Mako模板的语法规则

一:简单变量替换 $

二:写for循环

%百分号开头的行,可以嵌入python代码。如下图,for i in itf表示把itf列表每一个interface都声明一遍。最后需要endfor与for相呼应,来确定for的主体部分。

这种方法可以用在build_phase从uvm_config_db中获取interface,如下:

一个Mako脚本的例子

我们写一个agent driver的Mako模板,如下:

原先目录结构:

./template_agent

./template_agent/template_driver.svh

./auto_gen.py

auto_gen.py的部分脚本如下:

json格式的配置文件如下:

运行脚本:python auto_gen.py,将读取配置文件,并生成i2c_driver.svh。

生成后的目录结构:

./template_agent

./template_agent/template_driver.svh

./i2c_agent

./i2c_agent/i2c_driver.svh

./auto_gen.py

最终结果如下:

开源uvm agent模板及自动生成脚本

我把uvm agent模板及自动生成的脚本开源了,方便大家学习。

https://github.com/chenfengrugao/uvm_auto

使用方法(提前安装好python3、和Mako、json库):

总结

今天介绍了UVM自动生成的脚本写作思路,及实践。其实,软件的很多思想都值得借鉴,比如uvm的工厂模式就是一种软件编程思维。

并开源了agent自动生成的模板及脚本。如果大家有好的想法,可以在后面留言,或者直接改进这个粗糙的自动生成器,期待你的代码。

欢迎关注ExASIC

分享数字集成电路设计中的经验和方法

分享让工作更轻松

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180828G0FD8I00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励