加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SV中的interface

(2014-07-03 18:50:47)
标签:

interface

systemverilog

分类: Verification

      

Interface在一个低的抽象级别,主要是一些Nets和Variables的组合,为他们提供端口,实现便捷的访问。

Interface在一个高的抽象级别,功能类似一个类的模板,可以parameter, constants, variables, functions and tasks。在task/function methods中,可以使用initial or always blocks来建立一些系统级的模型和testbench的应用。

Modport结构主要是提供一些额外的direction information,来使得信号的整理,使用更加方便。

 

Interface的定义:

Eg:   interface    identifier ;

                 ……

                 interface_items

                 ……

         Endinterface [  : identifier]

 

Interface 的例化,其中#(100)表示例化的interface中的第一个参数为100。整个语句共例化了11个interface,包括scalar1和10个向量组vector:

Eg:   myinterface   #(100)   scalar1 ,  vector[9:0] ;

 

只定义一些变量的连接关系时的简单用例,interface只是将module中要用到的一些变量整合好,方便之后模块的例化和调用。其中module  memMod和module  cpuMod模块的声明还可以使用generic  interface,如module  memMod(interface  a, input  bit  clk),在例化时用法相同,按名字或位置索引即可,如memMod     mem( .a(sb_intf),  .clk(clk));。

 Eg   interface    simple_bus;

                 Logic  req, gnt;

                 Logic  [7:0] addr, data;

                 Logic  [1:0] mode;

                 Logic  start, rdy;

        endinterface   simple_bus 

 

        module  memMod(Simple_bus  a, input  bit  clk);

        endmodule

 

        module  cpuMod(Simple_bus   b,  input  bit clk);

        endmodule

 

        module  top;

                     logic  clk = 0;

                     simple_bus_sb_intf();                                   //Instantiate   the    interface

                     memMod     mem(sb_intf,  clk);                 //Connect   the   interface   to  the  module 

                     cpuMod        cpu(.b(sb_intf),  .clk(clk));    // Either   by   position  or  by  name

        endmodule

 

 

 

 

对于变量定义在interface的port内还是item中,区别主要是port中的变量可以与外部建立连接。其中a, d, c可以从外部直接例化时赋值,d则相当于interface中的局部变量,私有。

Eg    interface   i1   (input a, output b, inout c);

                    Wire  d;

        Endinterface

 

Modport可以在interface中定义,来加上额外的direction information。Modport的作用就是把一组信号按不同模块的需要进行打包,然后使得模块方便调用。

Modport的定义:       interface    i2;

                                                  wire  a, b, c, d;

                                                  modport  master  (input a,b,  output c,d);

                                                  modport  slave (output a, b, input c, d);

                                    endinterface

modport在module中的例化,语法是interface_name.modport_name   reference_name:   

                                                                     module   (i2.master  i)

                                                                              ……

                                                                      endmodule

                                                                     

                                                                      module  top;

                                                                             i2  i;

                                                                             u1(.i(i.master));

                                                                      endmodule

 

在嵌套式的interface中,一个modport中变量的使用必须是统一的,另一层中的变量不可以直接不声明的直接拿来用,如下例中的错误用法。

Eg    interface    i;

                   wire   x, y;

                   interface   illegal_i;

                              wire  a, b, c, d;

                              modport  master(input  a, b, x,  output c,  d, y);   //x,  y必须自己申请

                              modport  slave(input  a,  b,  x,  output c,  d,  y);

                   endinterface  illegal_i

 

 

interface中clocking blocks的定义,定义好clocking之后,可以在modport中直接引用。

Eg  interface  A_Bus    (input  bit  clk);

                 wire   req, gnt;

                 wire   [7:0] addr, data;

 

                 clocking  sb  @(posedge clk)

                           input  gnt;

                           output  req,  addr;

                           inout  data;

                 endclocking

                

                 modport    DUT   (input clk,  req,  addr,

                                               output  gnt,  inout data);    //Device   under    test   modport

                 modport   STB  (clocking  sb);           //synchronous    testbench    modport

                

                 modport     TB  (input gnt,  output  req,  addr,  inout  data);  

      endinterface

例化时,A_Bus   b1(clk),A_Bus  b2(clk)。在调用clocking  sb中的参数时,必须加sb,如b1.sb.req  <=  1;

 

在interface中定义functions和tasks。当functions或者tasks需要在外部module中定义时,声明函数时,需要加关键字extern在interface中,或者export在modport中,并且函数必须定义为prototype型。在interface中定义函数时,声明也在interface中可以不加关键字,在modport中必须加import,各个参数和函数返回值都相同。

 

当需要在外部定义多个并发任务时,在interface中的定义为

extern  forkjoin  task  countSlaves();

 

通过对interface定义为虚接口,可以在functions,tasks和methods中直接使用。

 

在interface的module header和port connection中都没有定义nets和variables的方向,默认是inout /  ref。

 

19.7参数化的命令Interface.

Eg: interface   simple_bus    #(AWIDTH = 8, DWIDTH = 8)

                                                    (input bit clk);

 

博文主要来源:SystemVerilog 3.1 LRM 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有