SystemVerilog验证测试平台编写指南
记录学习System verilog 以及UVM相关知识 与大家一起分享一同进步
SV中的接口interface
例4.3中的网单很简单,但是真实的设计往往含有数百个端口信号,需要数页代码来
声明信号和端口。所有的这些连接都是极易出错的。因为一个信号可能流经几个设计层次,它必须一遍又一遍地被声明和连接。最糟糕的是如果你想添加一个新的信号,它必须在多个文件中定义和连接。 Systemverilog接口可以解决这些问题。
逻辑设计如今已经变得更加复杂,即便是块之间的通信也必须分割成独立的实体。System Verilog使用接口为块之间的通信建模,接口可以看作一捆智能的连线。接口包含了连接、同步、甚至两个或者更多块之间的通信功能,它们连接了设计块和测试平台。
通过下面的例子我们可以学习如何定义一个接口,接口需要一个输入即为clk时钟源,定义了三个连接的端口,即grant,request,rst
其中logic可以看成是sv之中对reg 和wire的替代,它可以被编译器根据实际情况正确识别为reg或者wire型,但是在多驱动的情况下不能用logic必须用wire
下面的例子是通过接口定义模块,以及顶层代码的情况。
我们发现通过interface接口,我们将大大简化在端口处的代码量,并且不容易出错。
如果不能对符合 Verilog-2001的旧的源代码进行修改,将其中的端口改为接口,你可以将接口的信号直接连接到每个端口上。
使用 modport将接口中的信号分组
从上面的例子我们通过modport 将整个接口分成了三组TEST,DUT,MONITOR,分别用来连接对应的模块儿,这样的好处在于可以将一个含有相同端口的接口,通过改变其中端口方向,来适应多个模块儿,有利于代码复用。
使用时钟块控制同步信号的时序
接口块可以使用时钟块来指定同步信号相对于时钟的时序。一旦你定义了时钟块,测试平台就可以用@ arif.cb表达式等待时钟,而不需要描述确切的时钟信号和边沿。这样即使改变了时钟块中的时钟或者边沿,也不需要修改测试平台的代码。
虚接口
下面我们先看一下使用传统接口interface的例子,先给出连接模型
例10.5中的程序块仍然将4个Rx和4个Tx接口当作端口来传递,就像在例10.3中样,但不同的是它创建了一组虚接口vRx和vTx。这些接口就可以直接传递到驱动器类和监视器类的构造函数中去了。
也可以不使用虚接口数组变量,而直接在端口列表中使用接口数组。这些接口数组可以传递给构造函数,如例10.6中的测试程序所示。
使用XMR(跨模块引用)连接接口和测试程序
先看下面的例子时正常情况下DUT和测试平台相连接的代码
如果在设计中增加一个新的接口会引起什么变化呢?例10.10中的测试用具声明了个新总线并将它放置于端口列表中
在设计中增加一个新的接口意味着需要编辑已有的全部测试程序,这样新增的接口才能插人到测试用具中。怎样才能避免这种额外的工作量呢?可以通过避免使用端口连接来实现!
所以在SV中增添了使用XMR(跨模块引用)连接接口和测试程序
如果你的测试程序需要连接到测试用具中的物理接口上,那么可以使用程序块中的虚接口和跨模块引用(XMR, Cross Module Reference),如例10.12所示。必须使用虚接口,才能在顶层模块中将物理接口赋值给它
通过这样的方式,我们在改变代码时,只需要少量的更改就可以把但接口的程序改为双接口的程序了,这样就减少了重复性的工作。这种方法是VMM等验证方法学所推荐的,它可以增强测试代码的可重用性。在设计中增加了一个新的接口,虽然测试用具改变了,但是已有的测试程序却无需改变。