从零开始写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
分享数字集成电路设计中的经验和方法
分享让工作更轻松
领取专属 10元无门槛券
私享最新 技术干货