学习记录12(virtual interface)

interface 封装了module的端口(ports)、方向(modports)、同步关系( clocking block)、以及function和task。

1.virtual interface作用是什么?
interface是一种静态的硬件结构,简化了模块之间的连接,无法在program ,class中进行实例化,为了解决这个问题, System Verilog引入了virtual interface的概念,使用virtual interface是为了消除绝对路径,尽可能的减少验证代码的大面积修改,将测试平台(TB)与被测设计(DUT)解耦,使得验证组件更加独立和灵活。

2.interface为什么在class/program无法实例化?
由于class/program是软件世界的结构,而接口的实例化是硬件的实例化,与软件世界不兼容,因此需要通过虚接口来实现在仿真的任何阶段都能动态的实例化class和program,正因为它是句柄而非静态实例,所以可以在 class 中声明、赋值和传递,从而连接软件验证环境与硬件被测设计 。

virtual interface的本质是指针,是指向实际interface的指针,即virtual interface是可以在class中实例化的数据类型,使用virtual interface可与被测设计(DUT)进行间接地通信(virtual interface在TB的不同位置操纵一组虚拟信号,而不是直接操纵实际的信号),而无需使用层次结构引用。

在测试平台使用virtual interface时需要满足:
1)实例化接口必须正确连接到DUT。
image
顶层模块必须放的是实际的接口而不能是虚接口,因为如果是虚接口就没有实际的连接对象,这是不合法的。

理解:顶层设计放“实体插座(Interface Instance)”;验证类里放“指向插座的纸条(Virtual Interface)”。顶层如果出现 virtual 关键字,编译器会直接报错。顶层模块中绝对不能直接声明虚接口变量,因为 virtual 关键字只允许出现在 class、program、interface 的内部声明中,绝不允许出现在 module 的声明列表里。顶层是纯硬件域,不接受这种“软件指针”。

2)必须在类中声明virtual interface句柄,并且有相应的驱动。
image
注意在驱动器里声明的transation tr句柄与后面的transation不一样,这是给一个指针告诉驱动器驱动什么并非继承关系。
randomize知识(主要在最后一段代码中):https://www.cnblogs.com/Alfred-HOO/articles/16485194.html
与DUT接触的信号线的赋值都采用非阻塞赋值,原因是DUT中存在时序逻辑,需要通过非阻塞赋值方式赋值。

3)必须将virtual interface指向实例化interface。虚接口(Virtual Interface)就像一个“遥控器”,本身没有任何信号线,你必须把它绑定到真实的、物理存在的接口实例(Interface Instance)上,才能用它来驱动或采样信号。
image

动态数组必须使用 virtual interface 的原因:virtual interface 本质上是一个句柄(指针),而普通的 interface 实例化后是一个静态的硬件实体 ,在 SV中,只有句柄类型才能被声明为动态数组。如果尝试将接口实例声明为动态数组,编译器会报错。

动态数组扩展:https://www.cnblogs.com/Alfred-HOO/articles/19824268

posted on 2026-07-22 12:21  tuck0603  阅读(23)  评论(0)    收藏  举报

导航