Verilog是通过模块之间进行端口连接来完成模块间通信的。对于大型设计,通过端口进行连接将会让硬件集成变得乏味和容易出错。SV在Verilog语言基础上扩展了接口(interface) 。
接口
接口(interface)的特点:
- 接口提供了一种新型的面向抽象级建模的方式。
- 接口的使用可以简化建模和验证大型复杂的设计。
使用Verilog的模块端口与SV的接口之间的比较
要集成一个子系统,包括处理器单元、存储单元、测试单元的连接等
Verilog的方式
按照以下步骤进行:
- 逐一对每一个子模块进行端口声明。
- 在上层环境,需要声明非常多的线网用来在各个模块之间进行连接。
Verilog方式的缺点:
- 对于标准的总线端口也不得不在多个模块重复声明。
- 相应的通信协议也不得不在多个模块中重复定义。
- 在不同模块之间的连接可能会出现不匹配的信号声明和连接。
- 一个设计发生了变化,可能会影响多个模块的端口声明和连接。
Verilog代码:
可以看到需要声明许多对应的线网,利用这些线网与目标模块进行连接。而且还需要连接其余四个模块。
将这种场景扩展到数十甚至上百个模块,在系统层集成,可以看到顶层集成的工作量相当可观。
SV方式
SV添加了新的抽象端口类型interface。
interface允许多个信号被整合到一起用来表示一个单一的抽象端口。
使用SV接口更新的代码:
可以看到多个模块可以使用同一个interface,继而避免分散的多个端口信号连接。继而简化了连接,降低了端口连接不匹配的风险。
和之前Verilog代码做对比:
可以看到SV代码 ,集成部分得到了极大的简化。这是因为,把处理单元的数据总线、信号,在接口类型main_bus中,而处理器端口的声明也得到了简化。以至于在顶层连接时,可以通过接口的例化与处理器接口类型端口进行连接,简化了集成的过程。同时也让后期接口信号的维护变得更加方便。
接口特点:
- 接口不仅可以包含变量或者线网,还可以封装模块之间通信的协议。(不管变量还是函数都可以置于其中)
- 此外接口中还可以嵌入与协议有关的断言检查、功能覆盖率收集等模块。
接口与模块的定义有许多相似之处 :
- 接口的定义同模块定义类似。
- 接口也可以有端口,例如外部接入的时钟或者复位信号。
- 接口内部可以声明所有的变量或者线网类型。
接口和模块的区别:
- 接口不同于模块的地方在于,接口不允许包含设计层次,即接口无法例化模块,但是接口可以例化接口。
- 可以在接口声明modport来约束不同模块连接时的信号方向。
问题:为什么接口中的变量或者线网类型没有声明方向?
在与多个模块连接时,可以会被用作驱动或者负载,即用作不同的连接方向
接口的例化
接口的例化
- 接口的例化方式同模块例化一致。
- 模块的端口如果声明为input、output或者inout,那么在例化时可以不连接。
- 模块的端口如果声明为interface,那么在例化时则必须连接到一个接口实例,或者另外一个接口端口。
索引接口中的信号
如果一个模块拥有一个接口类型端口,那么要索引该接口中的信号,需要通过以下方式进行:
<接口名>.<接口内部信号名>
always @(posedge bus.clock, negedge bus.resetN)
...
·slave模块的多个端口,都被整合到main_bus中,在slave模块内部定义时,可以通过接口类型的端口bus去访问内部信号。这使得以往Verilog的端口声明代码得到了极大的简化,同时加强关联端口的内聚性。
modport
接口中的变量或者线网信号,对于连接到该接口的不同模块则可能具备着不同的连接方向。
接口引入了modport来作为moduleport的缩写,表示不同的模块看到同一组信号时的视角(连接方向)。
在接口中声明modport,需要指明modport中各个信号的方向。
示例:
- chip_bus中的各个信号如ready、data没有方向
- 两个单元模块slave和master中的连接又不相同
- 可以进一步声明modport master和modport slave。
- 保证接口内的信号,在连接不同模块时,通过与modport 对接,来避免方向接错的意外。
当一个模块在例化时,可以选择连接到interface端口中具体的某一个modport。
这种方式可以降低方向连接错误的可能,进而避免信号多驱动的情况。
验证中的应用
利用接口,也可以将测试平台同DUT连接在一起。
- 测试模块:testbench
- 待测设计模块: arbiter
测试模块通过接口像待测设计发送激励信号,通过接口监测待测设计的输出信号
接口的总结
- 接口提高了建模级别,接口对于设计复用非常有利。
- 接口减少了模块之间错误连接的可能性。
- 如果要添加新的信号,只需要在接口中声明,而不必在模块中声明。
- 由于接口将有关信号都集合在一起,因此在使用这些信号时需要添加接口实例名。
- 一种接口往往会将有关的信号集合在一起,对于拥有多组不相关信号的设计而言,它需要有多个接口才能完成与其它模块的连接。