SystemVerilog 2.1 Interface介绍
SystemVerilog在Verilog语言基础上扩展了"接口” (interface) 结构,接口给模型提供了一种新的方式,通过使用接口可以简化大型复杂设计的建模和验证。
接口是把模块信号封装起来的方法,所有相关的信号都封装起来形成interface block,因此接口可以在其他项目中复用。并且在其他验证组件中链接到DUT会更简单。
例子
APB信号封装在以下的interface中。
interface apb_if (input pclk);
logic[31:0] paddr;
logic[31:0] pwdata;
logic[31:0] prdata;
logic penable;
logic pwrite;
logic psel;
endinterface
为什么信号类型是logic?
logic是新的数据类型,让你可以通过assign来驱动信号。在verilog中,我们只能在procedural block中驱动reg类型,在assign中驱动wire。
连接到DUT的信号需要支持4值逻辑,因此X/Z信号可以被采集。如果这些信号连接到bit类型信号,X/Z信号将会被采集为0,信号的X/Z状态会丢失。
怎么定义port方向?
interface信号可以被于不同的验证组件,包括DUT中,modport可以用来定义信号方向。不同modport定义可以传递到不同的验证组件,因此对于不同的验证组件可以定义不同的输入-输出方向。
interface mybus (input clk);
logic[7:0] data;
logic enable;
modport TB (input data, clk, output enable);
modport DUT (output data, input enable, clk);
endinterface
interface怎么连接到DUT?
DUT在top testbench中被例化,因此interface对象应该在TOP层创建,之后传递到DUT。确保正确的modport连接到DUT是极其重要的。
module dut (mybus busIF);
always @(posedge busIF.clk)
if(busIF.enable)
busIF.data <= busIF.data+1;
else
busIF.data <= 0;
endmodule
module tb_top;
bit clk;
//create clock
always #10 clk = ~clk;
//create an interface object
myBus busIF (clk);
// Instantiate the DUT, pass modport DUT of busIF
dut dut0 (busIF.DUT);
//Testbench code
initial begin
busIF.enable <=0;
#10 busIF.enable <= 1;
#40 busIF.enable <= 0;
#20 busIF.enable <= 1;
#100 $finish;
end
endmodule
interface的优点?
interface可以包含task, function, parameter, variables, functional coverage和assertions。它可以让我们监控和记录transactions通过模块的接口。
//before interface
dut dut0 (.data (data),
.enable (enable),
//any other signals
);
//with interface - higher level of abstraction possible
dut dut0 (busIF.DUT);
How to parameterize an interface?
interface mybus #(parameter D_WIDTH=32) (input clk);
logic [D_WIDTH-1:0] data;
logic enable;
endinterface
clocking block是什么?
时钟块内指定的信号将相对于该时钟进行采样/驱动。一个接口中可以有多个时钟块。注意,这是针对test bench相关信号的。您需要控制TB驱动器和DUT信号采样的时间。解决竞争条件的一部分,但不是全部。您还可以参数化某些值。
interface my_int (input bit clk);
//reset of interface
clocking cb_clk@(posedge clk);
default input #3ns output #2ns;
input enable;
output data;
endclocking
endinterface
上述例子中,我们指定默认情况下,输入应该在clk上升沿3ns采样,输出应该在clk上升沿2ns驱动,即规定信号的建立时间和保持时间。