欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

interface(接口)

程序员文章站 2022-04-25 15:53:43
...

interface能干什么?

  1. 接口可用于设计也可以用于验证。
  2. 接口将driverdut区分开,在TB中统一去管理。
    3.interface类型可定义端口类型(input和output),定义双向信号,可使用initial和always,使用functiontask,跟module使用性质很像。

interface定义(interface可做远远不止这些):
注意: 可以不定义端口信号,全都放到变量列表中。

interface  vif(input bit clk)      //定义端口输入信号
    logic[1:0]  a, b;              //定义变量信号
    logic rst;
endinface

硬件module 或者软件 testbench 中传入interface:

module arb(vif if);                 //作为参数 传入interface
     always @(*);
        if(if.rst)
            if.a <=  2'b00;
    .......
endmodule

以上定义完后,可在top层中对interface,dut,testbench进行例化:

module top;
     bit clk;
     always #5 clk = ~clk;          //产生时钟
     vif if(clk);                  //给interface传入时钟
    arb(if);                       //给dut传入interface
    test(if);                      //给test传入时钟interface

接口中的时钟

由于testbench中在时钟上升或下降沿沿采用时有延迟,那么可以定义一个clocking时钟块。代码如下:

clocking bus @(posedge clock1);           //clock1 时钟上升沿
    default  input #10ns  output #2ns;    //input信号在时钟上升沿之前的10ns进行采样,所有output信号在上升沿的之后延迟2ns进行驱动
    input data, ready, enable;          
    output negedge ack;                   //不指定则在时钟的上升沿后的2ns进行驱动,现在指定时时钟的下降沿进行驱动
    input #1step addr;                    //不指定时则在时钟上升沿之前的10ns进行采用,现在是指定在clock的上升沿的#1step时间段内采样
endclocking

例子(1):

interface(接口)
例子(2):对于input采样信号

module clocking1;
   bit vld, grt, clk;

   clocking ck @(posedge clk);
     default input #3ns output #3ns;
     input  vld;
     output grt;
   endclocking

   initial forever #5ns clk <= !clk;

   initial begin:drv_vld
     $display("$%0t vld is assigned %d", $time, vld);
     #3ns  vld=1; $display("$%0t vld is assigned %d", $time, vld);
     #10ns vld=0; $display("$%0t vld is assigned %d", $time, vld);
     #8ns  vld=1; $display("$%0t vld is assigned %d", $time, vld);
   end
 
   initial begin:drv_grt
      @ck  ck.grt <= 1; $display("$%0t grt is assigned %d", $time);   //在时钟上升沿使用clocking块进行驱动数据
   end

   initial forever
     @ck $display("$%0t vld is sampled as %d at sampled time $%0t", $time, vld, $time);   //在时钟的上升沿,直接去进行采样。
   initial forever
     @ck $display("$%0t ck.vld is sampled as %d at sampled time $%0t", $time, ck.vld, $time-3);  //在时钟上升沿使用clocking块进行采样。
   initial forever
     @grt $display("$%0t grt is sampled as %d at sampled time $%0t", $time, grt)    //对grt信号进行采样。

endmodule
相关标签: 验证