link
我们知道,不论是哪一级的验证,最终都是通过 pin 连接到 DUT 上向其施加激励,对于 UVM 验证平台中,使用虚接口来实现 DUT 和验证平台的通信。
为了简化模块之间的连接和实现类和模块之间的通信,以实现测试平台的可重用性, SV 定义了接口的语法结构。总体来说,接口就是在 testbench 这边定义了访问的 DUT 的管脚的集合,通过对接口中管脚信号的操作,来实现对 DUT 的管脚的操作, 这样能够实现验证平台和待测模块的分离。
验证工程师和设计工程师只要定义好接口关系,就可以分别开展工作。同时如果设计管脚发生变化,无需改变 testbench 这边的虚接口,只需要在例化待测模块时,给接口绑定对应的待测接口即可。
Testbench 和 DUT 是通过接口进行数据交互的。接口仅仅是信号的一个集合,因此我们可以将 X_MAC 的所有信号定义为一个统一的接口,也可以将一个信号定义一个接口,这样对于 X_MAC 模块,就会有许许多多的接口。另外要注意的是,一个接口要对应一个 driver,因此,接口过多的话,就需要定义很多个 driver。
同样的,如果接口数量过少的话,就只需要定义较少的 driver。接口数量过多或过少,都不利于后期验证工作的开展。为了方面后续的工作,接口的个数合适为宜,总的原则是:
- 将相互关系紧密的信号放到同一个接口中。
- 要将同一个时钟周期的信号放到同一个接口中。
- 将和同一个模块连接的信号要放到同一个接口中。
上面的三点基本上表达的是同一个意思, 这样有利于后期方便激励。
在接口的定义中需要注意的一个问题是:对于同一个信号,其方向(input/output)对于 DUT 和对于 testbench 来说是相反的, 在接口中需要定义信号的方向是针对 testbench 的方向, 这一点需要注意。
下面是一个接口示例。
interface hello_if(input logic rxc,input logic txc);
logic [7:0] rxd_1;
logic [7:0] rxd_2<