【无标题】

SystemVerilog芯片验证SV语言部分之二
主要内容
1.接口
2.采样和数据驱动
3.测试的开始和结束
4.调试方法
接口—interface
什么是接口(interface) ?
• 接口可以用作设计,也可以用作验证。
• 在验证环境中,接口可以使得连接变得简洁而不易出错。{modport}
• interface和module的使用性质很像。它可以定义端口,也可以定义双向信号;它可是使用initial和always,也可以定义function和task。接口可以做模块90%的事情,那么区别是声明?模块里面可以例化模块,模块里面可以例化接口;接口里面可以例化接口,但是接口里面不可以例化模块。
• interface可以在硬件环境和软件环境中传递,例如作为module的端口列表,也可以作为软件方法的形式参数(但是声明的方式不一样 ,virtual)。
• 可以将interface看做一个“插排",而DUT与TB之间的数据驱动关系都可以使用interface这个插排来完成。
在这里插入图片描述

• 对于design来讲
在这里插入图片描述

对于testbench来讲
在这里插入图片描述

顶层top
在这里插入图片描述

接口的优势
• 将有关信号封装在同一个接口中,对于设计和验证环境都便于维护和使用。如果你需要新添加信号,只需要在接口中定义这个信号,而在使用这个接口的模块或者验证环境中做出相应修改。
• 由于接口既可以在硬件世界(module)中使用,又可以在软件世界(class)中使用,interface作为SV中唯一的硬件和软件环境的媒介交互,它的地位不可取代,所以verifier一定要精通接口的使用,对应的实验部分在后期会主要使用接口来做数据驱动。
• 接口由于可以例化的特性,使得对于多组相同的总线,在例化和使用时变得更加灵活,不仅使得代码变得简洁,也更易于验证环境的管理和维护。

• 每个slave initiator的端口列表中只需要一个slave_if接口即可,不再需要分散的端口。
• arbiter responder也只需要-个arb_if接口。
• 顶层在例化时,只需要罗列出接口的数量,不再需要分散的变量作为TB与DUT之间的连线。
• stimulator驱动数据只需要借助对应的interface即可,易于操作和管理。
在这里插入图片描述

• interface定义与module类似,初学者可以参考。
• 在interface的端口列表中只需要定义时钟、复位等公共信号,或者不定义任何端口信号,转而在变量列表中定义各个需要跟DUT和TB连接的logic变量。为了简单易用,我们推荐使用logic来定义变量。(接口为什么使用4值逻辑而不是二值逻辑)
• interface也可以依靠参数化方式提高复用性。(用参数来控制接口信号中的宽度,地址宽度等)
• interface在例化时,同module的例化方式一样。
• 对于有对应interface的DUT和TB组件(例如stimulator),在其例化时,也只需要传递匹配的interface变量名即可完成interface的变量传递。
• 更多的知识,还需要同学们在接下来的实验2中完成呢!

采样和数据驱动
o 竞争问题为了避免在RTL仿真行为中发生的信号竞争问题,我们建议通过非阻塞赋值或者特定的信号延迟来解决同步的问题。
o 同样地在仿真行为中,为了尽量避免时序电路中时钟和驱动信号的时序竞争问题,我们需要给出尽量明确的驱动时序和采样时序。
o 默认情况下,时钟对于组合电路的驱动会添加一个无限最小时间(delta-cycle)的延迟,而该延迟无法用绝对时间单位衡量,它要比最小时间单位精度还小。
o 在一个时间片(time-slot)中可以发生很多事情,例如在仿真器中敲入命令"run 0",即是让仿真器运行一个delta-cycle的时间。
o 那么,了解delta-cycle,对了解数据驱动和采样有什么帮助呢?我们来看下一道习题。
o 所以由于各种可能性, clk与被采样数据之间如果只存在若干个(0…N) delta-cycle的延迟,那么采样可能会存在问题,例如上面例子中clk1与clk2对d1采样,在同样的时刻中得到的是不同采样结果。
o 因此采样数据中的竞争问题会成为潜在困扰仿真采样准确性的问题。
o 如何避免采样的竞争问题呢?
o 在驱动时,添加相应的人为延迟,模拟真实的延迟行为,同时加大clk与变量之间的延迟,以此提高DUT使用信号时的准确度和TB采样信号时的可靠性。
o 对于一些采样时依然存在delta-cycle延迟的信号,我们还可以依靠在采样事件前的某段时刻中进行采样,来模拟建立时间的采样要求,确保采样的可靠性。

接口中的clocking(时钟块)
• 硬件世界和软件世界的连接可以通过灵活的interface来实现,也可以通过modport来进一步限定信号传输的方向,避免端口连接的错误。
• 我们也可以在接口中声明clocking (时序块)和采样的时钟信号,用来做信号的同步和采样。
• clocking块基于时钟周期对信号进行驱动或者采样的方式,使得testbench不再苦恼于如何准确及时地对信号驱动或者采样,消除了信号竞争的问题。
在这里插入图片描述

• 第一行定义了一个clocking块bus,由clock1的上升沿来驱动和采样。{时钟块都是出现在interface里面}
• 第二行指出了在clocking块中所有的信号,默认情况下会在clocking事件(clock1上升沿)的前10ns来对其进行输入采样,在事件的后2ns对其进行输出驱动。
• 下一行是声明了要对其采样的三个输入信号, data, ready和ènable信号,这三个信号作为输入,它们的采样事件即采用了默认输入事件(clock1上升沿前的10ns)。
• 第四行声明了要驱动的ack信号,而驱动该信号的事件是时钟clock1的下降沿{如果不强调的话,默认是上升沿},即覆盖了原有的默认输出事件(clock1上开沿后的2ns).
• 接下来的addr,也采用了自身定义的采样事件,即clock1上升沿前的1step【一个时间片区域】。这里的1step会使得采样发生在clock1上升没的上一个时间片采样区域,即可以保证采样到的数据是上一个时钟周期的数据。
• clocking块不但可以定义在interface中,也可以定义在module和program中。
• clocking中列举的信号不是自己定义的,而是应该由interface或者其它声明clocking的模块定义的。
• clocking在声明完名字之后,应该伴随着定义默认的采样事件,即"default input/output event"。如果没有定义,则会默认地在clocking采样事件前的1step对输入进行采样,在采样事件后的#0对输出进行驱动。
• 除了定义默认的采样和驱动事件,也可以在定义信号方向时,用新的采样事件对默认事件做覆盖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值