一、为什么使用接口
随着设计的日益复杂,设计中的不同功能的设计会被切割成不同的模块,模块与模块之间通信端口随着设计的复杂程度增加而变得很多,这个时候如果仍然采用每个端口——连接的方式,对代码的维护也变得很困难。
接口就起到一根粗电缆线作用,连接这设计与验证环境
二、测试平台testbench与DUT之间的通信
//子模块
module arbiter(
output logic [1:0] grant,
input logic [1:0] request,
input logic reset_n,
input logic clk);
...
endmodule
module test(
input logic [1:0] grant,
output logic [1:0] request,
output logic reset_n,
input logic clk
);
...
endmodule
//顶层模块
module top;
logic [1:0] grant,request;
logic clk, reset_n;
arbiter u0_arbiter(.grant(grant), .request(request), .reset(reset_n), .clk(clk));
test u0_test(.grant(grant), .request(request), .reset(reset_n), .clk(clk));
endmodule
使用接口的仲裁器
- 可以直接通过接口的例化名字来实现连接;
- 可以通过接口中定义的信号来实现连接;
//定义接口
interface arb_if (input bit clk);
logic [1:0] grant,request;
logic reset_n;
endinterface
//子模块
module arbiter(arb_if arbif);
...
endmodule
module test(arb_if arbif);
...
endmodule
//顶层模块
module top;
bit clk;
always #5 clk = ~clk;
arbit_if arbit(clk);//对接口进行实例化
arbiter u0_arbiter(.grant(arbif.grant), .request(arbif.request), .reset_n(arbif.reset_n), .clk(arbif.clk));//1.通过接口中定义的具体信号名实现连接
test u0_test(arbif);//2.通过接口实现模块连接
//两种方式效果一样
endmodule
三、modport
modport可以简单的理解为电线收纳盒。他可以将接口内的信号分组,并定义它们的方向。
//定义接口
interface arb_if (input bit clk);
logic [1:0] grant,request;
logic reset_n;
modport TEST (output request,rst, input grant,clk);
modport DUT (input request,rst,clk, output grant);
endinterface
//子模块
module arbiter(arb_if.DUT arbif);
...
endmodule
module test(arb_if.TEST arbif);
...
endmodule
//顶层模块
module top;
bit clk;
always #5 clk = ~clk;
arb_if arbit(clk);//对接口进行实例化
arbiter u0_arbiter(.arbit(arbit.DUT));//1.通过接口中定义的具体信号名实现连接
test u0_test(arbif.Test);//2.通过接口实现模块连接
//两种方式效果一样
endmodule