路科验证官网:路科验证 - 专注于数字芯片验证的系统思想和前沿工程领域
EETOP路科首页: EETOP - 路科验证 - IC验证培训
CSDN路科首页:CSDN - 路科验证 - IC验证培训
UVM鼓励工程师创建模块化、可复用的测试平台。UVM通过TLM接口,把一个组件及其他与之相连的组件隔离开来,以此实现模块化。只要transaction类型相同,模块化的功能允许sequence 连接到任何适配的driver上。也允许多种覆盖率收集器通过分析接口连接到monitor上。这种模块化的功能,使得搭建环境的工程师可以把库中的各种组件进行混合匹配,最终组合放到DUT的配置环境中。这对于验证工程师当然是非常有用的。
很多时候验证工程师需要很多环境,这些环境大体上很相似,只在一些小的方面稍有不同。每个环境有其特定的用途,同时他们的大多数组件都是完全相同的。那么,我们如何做到共享其通用的部分、定制其独特的部分呢?当然,这是OOP(面向对象编程)的基本特点,OOP语言实现这种功能并不难。但是,我们要说的是UVM,因为UVM又将这种实现方法进一步简化了。
一个经验浅的OOP程序员可能会直接在环境中实例化组件,如下:
Env的实例化也类似:
对于验证工程师,当testbench能正确运行transaction时,我们可能想要改变一些东西,比如看看当在transaction流里插入错误会发生什么。为了做到这一点,可以创建一个新的driver,派生my_driver类得到my_err_driver,并在环境中将其实例化。OOP能让我们实现这一点,派生my_env类,并如下图一样重载build_phase()方法。
这样的话,两个环境的不同之处仅仅是driver的类型。因为my_err_driver是从my_driver派生得到,所以他们有相同的接口,而且driver和squencer之间的连接也是相同的。所以我们就不用重复其他代码了。类似的,我们可以派生my_test,以使用新的env:
篇幅有限,路科原文链接如下: