随着IC设计复杂度的提升,模块间互联变得复杂,SV引入接口,表明一捆连线的结构。html
Systemverilog语法标准,新引入一个重要的数据类型:interface。异步
interface主要做用有两个:一是简化模块之间的链接;二是实现类和模块之间的通讯;函数
接口(interface)为硬件模块的端口提供了一个标准化的封装方式。
用interface来封装接口的信号和功能。
interface的定义是独立于模块的,经过关键字interface和endinterface关键词来定义。
注意:
interface里面能够带时钟、断言、任务(task)、函数(function)等定义。
一个interface 也能够有input,output或是inout端口。
当interface例化时,只有当变量或是线网声明在一个interface的端口列表中才能经过名字或是位置来互连。
interface是可综合的。
一种新加的和interface有关系的构造体是Modport 。
它提供了module的interface端口和在特定的module中控制task和function使用的方向性信息。这些端口的方向能够在module中能够看到。
接口使用无信号的链接方式。
Modport将接口中信号分组并指定方向。就像下图中的黑色矩形块里面同样,黑盒,咱们从外面看并不关心Modport的定义,只须要考虑clk。
interface membus(input logic clk, output wor status);
logic mrdy;
logic wen;
logic ren;
logic [7:0] addr;
logic [7:0] c2m_data;
logic [7:0] m2c_data;
task reply_read(input logic [7:0] data, integer delay);
#delay;
@(negedge clk)
mrdy=1'b0;
m2c_data=data;
@(negedge clk)
mrdy=1'b1;
endtask
//Task和function能够定义在interface中,从而容许构造更抽象级的模型
task read_memory(input logic [7:0] raddr, output logic [7:0] data);
@(posedge clk);
ren=1'b0;
addr=raddr;
@(negedge mrdy);
@(posedge clk);
data=m2c_data;
ren=1'b1;
endtask
modport master(output wen, ren, addr, c2m_data, input mrdy, m2c_data, status, read_memory);
modport slave(input wen, ren, addr, c2m_data, output mrdy, m2c_data, status, reply_read);
//控制task和function使用的方向性信息,以便在下面的module中使用
endinterface
总的来讲,interface指明了TB和DUT之间的链接信号,clocking规定了信号之间的时序关系,而modport则明确了站在不一样的角度对应信号的输入输出方向。经过虚拟接口的定义将以上内容封装起来。url
接口interface与module,program同样,都是层次化结构,主要用来完成设计module和验证program之间的链接。interface中有两个重要的功能块clocking block和modport。spa
clocking block,用来对同步信号进行采样和驱动,能够避免设计和验证的竞争。clocking block须要指定一个时间,一般是posedge或negedge,同时还能够为块中信号设置创建保持时间,在默认创建保持时间均为1ns。设计
以下面的例子所示:htm
...blog
clocking msclk_cb @(posedge clk); //clocking block块定义接口
default intput #setup output #holdtime; //输入创建时间,输出保持时间设定get
intput xxxxx;
output xxxx;
...
endclocking
...
modport block,对于同一个接口,不一样的事物处理器可能会有不一样的视角,好比对driver而言是输出的信号,在driver_monitor看来则是输入信号,因此能够引入modport来声明端口模块。
默认状况下interface的全部信号都是异步的
能够经过clocking block定义一组信号与时钟同步
modport定义与test的链接。
关于interface的实例化:
1,在moule中,能够直接实例化,
即my_if input_if;
2,在class中,须要使用virtual interface来实例化。
即 class my_driver extends uvm_driver
virtual my_if vif;
XXXXX;
endclass