Verilog中模块与模块之间的通信是通过它们之间的端口连接来实现的。
一、接口的介绍:
1、提供了一种对抽象级建模的方式;
2、使用接口可以简化建模以及验证大型复杂的设计;
3、它和module非常像,比如定义变量、声明类型。
4、Interface允许将多个模块中的信号整合到一起用来表示一个单一的抽象端口,因此,多个模块就可以使用同一个interface,避免分散的多个端口信号连接。
二、接口的作用:
1、连接硬件和硬件,或者硬件与测试平台;
2、可以定义变量类型或者线网类型,构成组合逻辑或者时序逻辑;
3、可以封装模块之间通信的协议;
4、可以嵌入与协议有关的断言检查、功能覆盖率收集等模块;
接口interface与模块module的区别:
接口不允许包含设计层次,即接口无法例化模块,但接口可以例化接口;
模块可以例化模块和接口。
三、接口的例化:
接口的例化方式和模块的例化方式一致。
1、模块里的端口声明方向为input、output或者inout,在例化时不用连接这些端口
(本人理解:因为已经声明了方向,所以不需要连接。连接端口相当于指明方向。);
2、模块里的端口如果是抽象的,即是声明为interface,那么这些端口在例化时就必须连接到一个接口实例,或者另一个接口的端口。
(本人理解:interface里的端口是抽象的,没有声明方向,所以在例化时就必须连接到一个接口实例或者另一个接口的端口)
四、接口里端口的索引:
如果一个模块拥有一个接口类型的端口,那么如果要索引该接口中的信号(端口),就需要通过以下方式来:
<port_name>.<internal_interface_signal_name>
<接口类型的端口名>.<接口内部的信号名>
always @(posedge bus.clock, negedge bus.resetN)
...
五、modport:
1、它是module port的缩写,表示不同模块看到同一组信号时的视角或连接方向。
2、接口中的变量或者线网信号,对于连接到该接口的不同模块则可能具备不同的连接方向。
所以在接口中声明modport时,需要在modport中指明(约束)各个信号在不同模块里连接时的方向。
一句话:modport的作用就是把你所关心的信号规定上方向,但在modport里不能指明信号的宽度。
interface chip_bus(input logic clock, resetN);
logic interrupt_request, grant, ready;
logic [31:0] address;
wire [63:0] data;
//相同的信号,在不同的模块里的方向不一样;
//modport里面不能声明信号,它只是规定方向的。
modport master (input interrupt_request,
input address,
output grant, ready,
inout data,
input clock, resetN);
modport slave (output interrupt_request,
output address,
input grant, ready,
inout data,
input clock, resetN);
endinterface