| ||
XVM
对于上面的两种方法,都有一些不足,例如UMV-ML尽管照顾了多种语言和方法学的交互,然而确为此不得不将C作为中间的数据中转站,这也使得语言之间的资源开销较大;而对于OVM兼容层的思想,由于需要OVM原生的方法行为与UVM对应的方法并不是严格一致的,这就增加了后期在OVM兼容层上调试OVM代码的难度,同时在OVM兼容层的照顾下,仍然需要修改一部分已经废止掉的OVM代码使其与UVM代码习惯保持一致。
在这个背景下,同样来自于Intel公司的Mohamed Elmalaki提出了XVM的理念,并且成功在项目中应用。该思想也借鉴了UVM-ML,并且由于照顾的只是OVM与UVM的兼容,因此并不需要额外依靠C来做数据转换适配,而是通过开发一个小型的数据适配包XVM来实现OVM与UVM真正地在仿真环境中并存,进行真•混合仿真。虽然XVM的包暂时没有被开源出来,但路桑希望通过分享这一思想,使得读者有实践经验可以参考,并考虑将这一思想运用到自己所处的OVM、UVM混合仿真中去。
首先来看一看,OVM与UVM的组件如何实现共存呢?下面是一个例子,该环境的顶层是OVM,而例化了一个UVM的组件在其中。XVM的核心思想是,“尘归尘,土归土”,OVM与UVM的组件在例化中,应该属于不同的层次结构。下面的ovm scoreboard的顶层是soc_env(OVM),而uvm monitor尽管也在soc_env中例化,但它无法挂靠在一个OVM组件上,因此它选择了全局的静态变量xvm_pkg::xvm_uvm_parent。
这种方式使得OVM与UVM的组件看似共存在一个顶层下面(OVM顶层或者UVM顶层),但实际上它们无法保持混合的结构方式,即OVM组件无法将UVM环境作为自己的parent,UVM组件也无法将OVM环境作为自己的parent。因此上面例码中的xvm_pkg::xvm_uvm_parent的定义如下:
在解决了组件层次的问题之后再来考虑如何开始仿真的问题。XVM提供的开始仿真的方式可以完成下面要素:
启动UVM的phase调度器(scheduler)。
启动OVM的phase调度器。
同步OVM与UVM之间的phase。
我们在之前的《UVM世界观篇》中就介绍了UVM的各个phase,而这些phase与OVM的phase通过XVM实现了同步。XVM实现的同步时两种方法学调度器之间的同步。
在保证了OVM与UVM之间的phase同步,使得它们都在同一起跑线出发之后,还需要考虑OVM与UVM组件之间的通信问题。读者已经知道OVM与UVM的组件不能直接相见,隔窗而望的同时还要保持克制,以免发生意外。因此,XVM也提供了中间的TLM缓冲通道,该缓冲通道可以实现从OVM到XVM到UVM,或者从UVM到XVM到OVM的数据传输。
下面的例码即是利用XVM的缓冲桥,实现不同方法学组件之间的通信:
因此从上述对XVM的主要实现来看,它通过数据中转同步的方式(基于SV),实现了OVM与UVM的混合仿真:
通过OVM与UVM的独立顶层,实现了双方的组件互补依赖,各自保持独立的层次关系。
保证OVM与UVM环境在各个phase阶段的同步。
通过中间数据缓存区,实现了OVM与UVM组件的数据同步。
到此,我们已将SV和UVM相关的高级话题介绍完毕,尽管还有不少的遗珠可以考虑为路粉们做介绍,然而顾及到二八原则,我们在本书的第一版中主要以满足UVM的新手和日常实际问题为主。本书的十八掌经历了一年三个月,也就可以打完收工告一段落了。手机阅读不便于记笔记、做练习,路粉们也可以期待本书的早日出版,尽早结束每周的追新。而对于本书的内容,路桑仍不免对其不完美的地方惴惴不安,因此也在编校第一版的同时下了决心,伴随着功能验证技术的日新月异,我们本书的内容也会做出后续的更新,比如说第二版。至于十八掌后还有没有十九章,想有还是会有的,路桑也会精心策划我们后续的章节,并作为本书第二版的内容基础。
谢谢你对路科验证的关注,也欢迎你分享和转发真正的技术价值,你的支持是我们保持前行的动力。