[彩虹糖带你入门UVM] 第1节 验证组件之接口

​  这一篇我们主要会介绍一个非常重要的概念interface, interface作为SV中唯一的硬件和软件环境的媒介交互,它的地位不可取代哦。另外,interface连接了我们生产彩虹糖的验证平台和我们的糖果爱好者,没有它我们也不可能吃到好吃的彩虹糖。

上一篇短文主要介绍了彩虹糖验证平台中的transactionsequence以下是上一篇短文中主要介绍的一些类。

  • transaction

classjelly_bean_transaction extends uvm_sequence_item;

classsugar_free_jelly_bean_transaction extends jelly_bean _transaction;

  • sequence

classone_jelly_bean_sequence extends uvm_sequence#(jelly_bean_transaction );

classsame_flavored_jelly_beans_sequence extends uvm_sequence#(jelly_bean_transaction );

classgift_boxed_jelly_beans_sequence extends uvm_sequence#(jelly_bean_transaction );

 

一、接口(interface)

我们首先会对interface做一个大概的介绍。jelly_bean_if(我们彩虹糖验证平台中的接口)的主要作用就是来连接我们的验证组件和我们的待测设计(DUT)。

jelly_bean_if内的主要代码如下图所示。总体上来说jelly_bean_if内包含的大部分的信号都是从jelly_bean_transaction中提取出来的。

图1.jelly_bean_if

相应信号的时序信息是由时钟块(clockingblock)来定义的。master_cb时钟块是从主控总线(bus-master)的角度来定义时序的,而slave_cb时钟块是从受控总线(bus-slave)的角度来定义时序的。

该接口还定义了一些modport列表,规定了interface中一些信号的方向。总计有4个modport列表。如下所示。DUT使用的是异步的modport(master_mp和slave_mp),测试平台使用的是异步的modport(master_sync_mp和slave_sync_mp)。

表1.modport列表

名称 端口方向 时序信息 使用位置
master_mp 从Master输出 异步 DUT
slave_mp 从Slave输出 异步 DUT
master_sync_mp 从Master输出 使用master_cb同步 Testbench
slave_sync_mp 从Slave输出 使用slave_cb同步 Testbench

 二、DUT

下面的代码描述的是一个简单的DUT也就是我们的彩虹糖评测员,会反馈彩虹可口程度的jelly_bean_taster.第一行使用了我们上面定义的接口jelly_bean_if来作为module的端口信号,slave_mp这个modport来定义信号的输入输出方向。从代码中可以看出,彩虹糖评测员只会给酸巧克力口味的彩虹糖差评,其他口味的都是好评。也就是当从interface输入给DUT的flavor信号是巧克力口味,并且sour信号是1的情况下,jelly_bean_taster的输出taste会输出YUCKY值,其他情况都是YUMMY值。

图2.jelly_bean_taster

当然,我们也不一定需要在module定义的时候指定modport,也可以在例化module并进行连接的时候指定modport信息。

图3. 在例化的时候指定modport

我们也可以同时在定义和例化module的时候指定modport,但是前提是这两个modport得完全一样。如果在interface中没有定义任何modport来指定信号的方向,那么这些信号默认就是inout类型的方向。

  • 总结interface,clocking, modport, 采样以及驱动
  • interface
  1. interface的创建使用关键词interface/endinterface。在interface的端口列表中只需要定义时钟、复位等公共信号,或者不定义任何端口信号,转而在变量列表中定义各个需要跟DUT和TB连接的logic变量。为了简单易用,我们推荐使用logic来定义变量。例如在jelly_bean_if中我们只定义了clk这一个端口信号“input bit clk”. 在变量列表中定义了TB和DUT要交互的一些信号例如flavor,taste, color等信号。
  2. interface在例化时,同module的例化方式一样。对于有对应interface的DUT和TB组件(例如stimulator),在其例化时,也只需要传递匹配的interface变量名即可完成interface的变量传递。例如我们只需要在图3的moduleTOP中将jelly_bean_if例化成jb_slave_if,然后将jb_slave_if.slave_mp传递给例化的DUT即可完成连接interface与DUT的连接。如下图也是一种连接方式。
  3. interface中可以声明一些modport来将信号分组,并定义一些信号的方向信息。可以定义一些时钟块(clockingblock)来做一些同步的驱动和采样。
  • modport
  1. 使用modport来规定interface中定义的信号的方向。比如jelly_bean_if中master_mp将flavor,color定义为output,而在slave_mp中又将其定义为input。这两个moport的使用场景不一样,对于master生产彩虹糖的一方来说,会口味以及颜色等信息是作为输出来表明彩虹糖的属性。对于slave接受并评估彩虹糖可口程度的一方来说,需要口味和颜色这一些信息作为输入,这样才能评估生产出来的彩虹糖是否符合要求。
  •  时钟块(clocking block)
  1. interface中可以使用时钟块来指定一些同步信号相对于时钟的时序,使得我们可以在TB中使用和DUT相同的时钟来进行同步的驱动和采样。可以很大程度上避免DUT和TB的竞争状态。
  2. clocking在声明完名字之后,应该伴随着定义默认的采样事件,即“defaultinput/output event”。如果没有定义,则会默认地在clocking采样事件前的1step对TB输入进行采样,在采样事件后的#0对TB输出进行驱动。在jelly_bean_if中master_cb定义了在clk上升沿前1个step采样DUT输入给彩虹糖测试平台的taste信号的值,在当前clk上升沿后的1ns驱动给DUT的输出flavor,color等信号。
  • 采样和驱动
  1. 一般来说时钟块只在TB中使用,用来做一些同步的驱动和采样,因为这也代表着一种对时序信息的模拟。而不在DUT的端口上使用时钟块,因为design内部自己会定义好同步异步的时序信息。
  2. TB中使用clocking对input进行采样,对output进行驱动的,相对于clock的关系大致如下

  3. 对于驱动和采样,我们设计了一个更加详细的例子来说明这个问题。

具体的波形图如下所示

TB通过时钟块去采样DUT的output的值来作为TB的input,如sig1到sig3所示:

  • sig1是TB通过时钟块采样到的信号值。
  • sig2是TB时钟块的定义的input的信号值。
  • sig3是DUT输出的值。

TB通过时钟块去驱动TB的output去作为DUT的input,如sig4到sig6所示:

  • sig4是TB内部产生的激励,通过时钟块驱动给DUT
  • sig5是时钟块内部的定义的output的信号值。
  • sig6是DUT输入的值。

对于TB而言其时钟块的值发生变化都是在时钟上升沿,只不过对于采样而言,采样点是在时钟上升沿之前;对于驱动而言,实际驱动值变化会在时钟上升沿叠加一个偏移量之后发生,这样可以保证DUT的输入能够准确无误。

2019年路科验证实战就业VIP春季班

早鸟报名通道开启

 扫码即可报名

前30名报名的同学给予早鸟价格

优惠500

往期精彩:

2019验证VIP春季班   早鸟报名通道扫码报名稿!
实锤!30W+!!!2018芯片校招薪资比肩互联网!
理解UVM-1.2到IEEE1800.2标准的变化,掌握这3点就够了
Verification和Validation傻傻分不清楚?面经重点!
没想到,双十一只花10块钱,我竟然爱上了加班
人工智能和机器学习让验证更快更智能

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注