使用模板工具构建uvm环境 ①
发布于 2022-06-03 20:02
我们
01
专用集成电路(ASIC)和片上系统(SoC)的复杂度和设计规模随着 IC 工艺的快速发展而日益增加。数字验证工作也变得日趋繁杂,难度越来越大。提高验证效率显得尤为重要。如使用先进的 EDA 工具或最新的验证方法学(UVM)。
然而,随着设计规模的不断增大,基于 UVM 的验证平台搭建代码工作量成倍增大,代码调试变得困难,验证平台的代码管理也越来越重要和复杂。
由于验证工程师经验和认知的不同,搭建环境的风格不太一致,所以在一个项目中常会出现不好管理,甚至前后不一又相互矛盾的UVM代码,这对整体环境的可扩展性和可复用性有很大的影响。
对于行业内一些具有成熟产品线的大厂来说,早已经形成了稳定的环境和标准的代码风格,对于验证环境后期的维护和使用带来极大便利,能够使验证工程师将更多的精力集中在业务上,对流片成功率有很大的帮助。
验证方法学通过集成历代验证方法学的长处,能够减少代码的风格或验证环境的不统一给实际生产项目带来的种种问题,所以一套高标准的UVM环境代码生成器足以解决以上问题,这对于项目的开发效率提高也是一件极有意义的事情。
02
[UVM验证环境特征的抽象]
一款集功能、扩展性、复用性为一身的代码生成器的构建一定是基于UVM验证环境且一定程度高于理论层次,所以需要将众多UVM验证环境的理论层次进行分析拆解,将一些通用和典型的部分进行抽象封装。
通过对一个典型的UVM验证环境的拆解可以将代码库分为用户自定义部分和UVM框架结构部分。用户自定义部分更多的是业务逻辑上的体现。UVM框架结构部分是system verilog对UVM的支撑代码,这部分代码基本已经在UVM验证方法学中被约束定义,可以理解为UVM验证环境的骨架。
[用户自定义部分的特征分析]
用户自定义部分往往来自于实际的使用需求。通常情况下分为两部分,一方面是对UVM环境组件结构的约束,另一方面是对环境组件属性的约束。
UVM环境组件结构的约束
根据环境结构的前期规划,来决定是否例化相关的组件,比如COV,SCB、寄存器模型等等。
根据功能的需求来决定环境中agent的个数,driver的类型等
根据需求选择tlm的port的类型,组件间的通信方式。
组件的继承关系
UVM环境组件结构的属性
自上而下的cfg不仅能够约束环境组件结构,也能满足随机化的约束需求。
transaction内定义的参数。
通过对uvm环境的特征分析来看,代码生成器的功能不能仅仅局限于修改project name,还需要更多的考虑用户自定义元素,以此来增加代码生成器的灵活性。根据用户自定义代码部分的需求,要求代码生成器至少能够具有以下的特性:
能够根据用户自定义的名称来替换的变量字段。这里的替换主要是指代码块名称的替换。
配置多个不同的agent,这要求有循环变量遍历用户提前定义好的参数。
某些代码块是否存在是需要用户自定义的,需要通过条件逻辑来判断是否生成。
标记可以包含用户自定义的代码片段
[代码生成器的输入]
当然,更深层次的用户需求往往来自于项目的实际情况,更多的需求就要求代码生成器的灵活性更强。这也需要用户提供更多的信息。
按照代码生成器提取用户信息的阶段可以分为两类方式:第一类为人机交互的方式,将用户自定义的信息通过命令行的方式输入。第二类为解析配置文件的方式,用户需要使用一些配置文件对变量、对代码进行约束,然后基于模板代码生成目标代码,这一方法能够使得代码具备一定的灵活性。除了用户定义的代码片段可能会引入的错误之外,我们原本生成的代码一定是完整的,可以使用生成的仿真脚本运行操作。
一款典型的代码生成器的广义上的流程如下:
解析命令行开关。如python中的argparse,用以解析命令行用户键入的信息。也可通过提前配置好的文件,由脚本自行解析。这两种方式就是pre和ing的区别。
解析通用的配置文件,设置内部变量,如env name, IP name 等等。
检查这些设置相互之间的约束
对于每个 interface/agent 解析配置文件并配置内部变量
检查这些设置的所有相互约束
根据代码模板和内部变量生成代码
根据代码模板和内部变量生成顶层代码
生成仿真脚本
03
就如同不同的验证人员对验证环境的搭建和对环境的扩展性以及复用性的理解不同一样,任何一种代码生成器都有各自的优势和不足、他们的出现一方面是基于创作者的目的,另一方面也是基于项目的需求。
所以本专题文章从缩短验证平台搭建的时间和提高代码后期的复用性这两个角度出发,讨论学习以下商业及开源的环境代码生成器,试图能够形成一套基于自己的理解的代码生成方案。
uvmgen,vcs自带的uvm环境生成工具,工具非常强大,环境也很稳定,有详细的文档资料。
openTian,Google开源RISC-V项目中的脚本工具。通过python的脚本代码能够于根据需要而进行修改,二次开发还是非常方便的,为自己开发脚本提供了一个不错的思路。
duolos,一个perl语言编写的商业开源脚本,该代码生成器能较快速高效搭建 UVM 验证平台,在大幅提高验证工作效率的同时保证了 UVM 代码设计的一致性。但是,在使用该代码生成器前,需要大量的配置工作,还需要用户自己提供一些和协议相关的底层驱动代码。
[本专栏内容的规划]
1、uvmgen的简单介绍和使用方法
2、基于uvmgen完成ubus项目的案例。
3、openTian脚本工具的简单介绍和使用方法。
4、基于opentian脚本定制自己的uvm环境的方法。
5、duole的简单介绍和使用方法。
6、基于duole脚本工具生成的环境。
7、环境的复用性和扩展性探讨与总结。
8、构建通用性更强的模板代码工具。
如果你也感兴趣,欢迎一起来讨论、分享。
参考文献:
1、https://blog.eetop.cn/blog-1561828-3571704.html
2、万军民. 基于 Java 的代码生成器的设计与实现[J]. 计算机工程, 2004, 30(s1):122-124.
3、张怡琳. 基于 UVM 可重用验证平台的研究[D]. 西安电子科技大学, 2015.
欢迎 | 佬龙有点飘
关于就业 | 与自我提升
共同成长
grow up together
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材