我们在进行模块与模块之间的连接时,需要将信号与端口进行连接,所有的这些连接都是极易出错的,因为一个信号可能流经几个设计层次,它必须一遍一遍地被声明和连接。最糟糕的是如果你将添加一个新的信号,它必须在多个文件中定义和连接。使用System Verilog接口可以解决这些的问题。
例:仲裁器的简单接口
interface arb_if(input bit clk);
logic [1:0] grant, request;
logic rst;
endinterface
使用了简单接口的仲裁器
module arb(arb_if arbif);
...
always @(posedge arbif.clk or posedge arbif.rst)begin//arbif.clk arbif.rst
...
end
endmodule
使用简单仲裁器接口的测试平台
module test(arb_if arbif);
...
initial begin
@(posedge arbif.clk);
...
end
将所有快都在top模块中例化和连接
module top;
bit clk;
always #5 clk = ~clk;
arb_if arbif(clk);
arb a1(arbif);
test t1(arbif);
endmodule
显然,接口使得连接变得更加简洁而不易出错。如果你希望在一个接口中放入一个新的信号,你只需要在接口中放入一个新的信号,你只需要在接口定义和实际使用这个接口的模块中做修改。你不需要改变其他任何模块,例如在top模块,信号只是穿过该模块,而不进行任何操作。这种特性极大地降低了连线出错的几率。
注意:使用接口时需要确保在你的模块和程序块之外声明接口变量。有些编译器可能不支持在模块中定义接口。即使允许,那么接口就只是所在模块的局部变量,所以对设计的其他部分来说是不可见的。