接口的引入
真实的设计往往含有数百个端口信号,在verilog中需要数页代码来声明信号和端口,这些连接都很容易出错的,因为一个信号可能流经几个设计层次,它必须一遍一遍地被声明和连接。更糟糕的是如果想添加一个新的信号,它必须在多个文件中定义和连接。SV中引入接口可以解决此问题。
interface arb_if(input bit clk);
logic [1:0]grant,request;
logic rst;
endinterface //仲裁器的简单接口
module arb(arb_if arbif); //将接口连接到仲裁器,interface命名为arbif
...
assign arbif.grant<=2'b00; //注意连接接口信号,信号名为arbif.grant
...
endmodule
module test(arb_if arbif); //将接口连接到测试平台
...
endmoduole:test
module top; //顶层模块,例化模块与接口并进行连接
bit clk;
always #5 clk=~clk;
arb_if arbif(clk);
arb a1(arbif);
test t1(arbif);
endmodule:top
interface的基本作用是对各个模块做清晰有序的连接,因此interface可以看作一捆智能的集线束。值得注意的是,接口信号必须使用非阻塞赋值来驱动。
接口信号的方向
接口本身既要与DUT连接,也要与stimulator和monitor连接,不同对象的连接信号方向也是不同的。接口中声明的信号本身没有方向,为了限制不同对象对其信号的访问权限和方向,接口需要通过modport做进一步声明,来确定信号的连接方向。