zoukankan      html  css  js  c++  java
  • systemverilog学习(2)interface

    本节主要内容:testbench与design的连接,verilog连接testbench与design的方法,SV的interface,stimulus timing,clocking blocks,timing region,program block。(感觉很抽象)

    一:design与testbench的连接

      

    1:连接符号

      .*

      .name(wire_name)  :verilog中使用方法

      interface

    2:verilog连接方式

      

    3:sv连接方式

      (1).*   通配符,对相同名字自动匹配

        要求:有相同的名字,位宽相同

        例如:

         

       (2).name

         相同名字与相同位宽,可以直接使用.name;括号内可省略

       (3)interface

        当名字不同时,上述方法不方便;而且若使用verilog方法,每个端口都要写,在复杂设计中很冗余;在sv里我们引入interface的概念

    二:interface

      

     1:定义

      新的端口类型,将多种信号group一起,信息封装,重用。声明一次即可

    2:使用

      

      在interface里面声明信号,clk是外部输入的信号,内部信号为logic信号,为异步信号;

      在top层内例化,如上图,现例化arbif这个interface,在使用该interface;

      arbif.clk可访问里面的clk的信号;

    3:interface可用于设计

    4:interface-modport

      提供了另外一种interface信号,是modport的简写;一个interface里面可有多种modport的定义

      例如:modport TEST (output request,reset,

                 input grant,clk );

       

      设计中使用modport:module arb(arb_if.DUV arbif);

    5:总结

     可以包含function;不仅仅是线的集合;在系统集成上较方便;可加上协议检查;

     不包含hierarchy结构(不能再interface里面声明一个module)

    三:stimulus Timing & Clocking Blocks

      在design与testbench之间易产生竞争冒险的情况,例如不满足Tsetup的要求;可以通过提前驱动信号,滞后采样信号(同步)来避免。

    1:在interface里面建模,在适当时间驱动,采样信号;驱动信号不能太晚,采样信号不能太早;

      testbench与design要分离开;

      一般驱动在时钟沿前,采样在时钟沿后;

    2:Clocking Block模块

      为避免竞争冒险,interface里面使用clocking block模块;

      **cb(clocking block简称以下)模块里的任何信号的驱动与采样都使用了同步的思想;

      **cb模块只能用于验证,不能用于设计

      **一个interface里面可包含多个cb模块

    3:实现机理

      使用cb,默认有 default input #1step output #0;(skew)

    4:skew

      input skew在时钟沿前有延时,output skew在时钟沿后有延迟

     5:cb模块的使用(伪代码)

      interface arb_if(input bit clk)

       clocking cb @(posedge clk)

         output request;

         input grant;

       endclocking  //cb里面的信号都是同步信号

      modport TEST(clocking cb,output reset) //表示使用cb里面的同步信号

      endinterface

    //使用cb信号

      arb_if arbif;//声明一个interface

      arbit.cb.request <= 2'b01; //驱动一个信号使用非阻塞赋值;采样一个信号用阻塞赋值

    6:同步到信号

      @arbif.cb.grant; @(posedge arbif.cb.grant); ##2 arbif.cb.request <= 0(等待2个时钟周期);

     7:驱动信号非阻塞,采样信号阻塞

      

    四:Timing Region

      

     1:包含

      active region:design区,design区可分为四个区(RTL的四个Time Region)

      observed region:assertion区

      reactive region:testbench区

      postpone:sample区,采样所有设计的信号

    2:interface采样区是在postpone,在时钟沿后采样时钟前的数据

      

      波形如下图:

      

    3:interface驱动,在时钟沿前驱动,时钟沿后得到信号的值

       

      输出波形,这也就是非阻塞赋值的原因

      

    五:program block

      将OOP与DUT通过interface连接起来;在program里面可以跑设计。

     1:类似于module,可包含代码,变量等;

      没有hierarchy结构

     2:例子

      

     3:总结

      不能有module hierarchy,可以有class hierarchy;

      代码在initial块中执行,不能在always块;

      在reactive区执行

    六:一个完整的testbench模板

      顶层设计:

        

      子模块:

        

     说明:

      top层在active区执行,program在reactive区执行,这样可以避免race。

        

      

       

     

  • 相关阅读:
    鼠标移上与移出事件
    最小高度 最大高度
    鼠标移上改变光标
    设置圆角
    iframe 子窗口获取父窗口元素 父窗口获取子窗口元素
    parent
    禁用滚动条
    mysql--user表
    mysql客户端连不上数据库
    linux下安装MySQL
  • 原文地址:https://www.cnblogs.com/xh13dream/p/9016356.html
Copyright © 2011-2022 走看看