SystemVerilog基础知识 2.1 interface介绍

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驱动,即规定信号的建立时间和保持时间。

猜你喜欢

转载自blog.csdn.net/jihanjihan/article/details/128567184
今日推荐