连接设计和测试平台

目录

接口

激励时序

接口的驱动与采样

SystemVerilog断言


接口

SystemVerilog使用接口为块之间的通信建模,接口可以看作一捆智能的连线。接口包含了连接、同步、甚至两个或者更多块之间的通信功能,它们连接了设计块和测试平台。

最简单的接口仅仅是一组双向信号的组合。这些信号用logic数据类型,可以使用过程语句驱动。

使用接口的好处:连接变得更加简洁而不易出错。如果希望在一个接口中放人一个新的信号,只需要在接口定义和实际使用这个接口的模块中做修改。你不需要改变其他任何模块,例如在top模块,信号只是穿过该模块,而不进行任何操作。这种特性极大地降低了连线出错的机率。

使用接口时需要确保在模块和程序块之外声明接口变量。如果你忘了这一点,就会带来很多的错误。有些编译器可能不支持在模块中定义接口。即使允许,那么接口就只是所在模块的局部变量,所以对设计的其他部分来说是不可见的。

使用modport将接口中信号分组

在设计中可以通过两种方法来使用这些modport名。可以在使用接口信号的程序和模块中使用modport名;也可以在顶层模块中使用modport名然后把接口放到程序和模块的端口表里。

使用接口的优势如下:

(1)接口便于设计重用.当两个块之间有两个以上的信号连接,并且使用特定的协议通信的时候,应当考虑使用接口。如果信号组一次又一次地重复出现,那就应该使用虚拟接口。

(2)接口可以用来替代原来需要在模块或者程序中反复声明并且位于代码内部的一系列信号、减少了连接错误的可能性

(3)要增加一个新的信号时,在接口中只需要声明一次,不需要在更高层的模块层声明,这进一步减少了错误。

(4)modport允许一个模块很方便地将接口中的一系列信号捆绑到一起,也可以为信号指定方向以方便工具自动检查。

使用接口的劣势如下:

(1)对于点对点的连接,使用modport 的接口描述跟使用信号列表的端口一样的冗长。接口带来的好处是所有的声明集中在一个地方,减少了出错的几率。

(2)必须同时使用信号名和接口名,可能会使模块变得更加冗长

(3)如果要连接的两个模块使用的是一个不会被重用的专用协议,使用接口需要做比端口连线更多的工作。

(4)连接两个不同的接口很困难。一个新的接口(bus_if)可能包含了现有接口(arb.if)的所有信号并新增了信号(地址、数据等等)。你需要拆分出独立的信号并正确地驱动它们。

激励时序

使用时钟块控制同步信号的时序

接口块可以使用时钟块来指定同步信号相对于时钟的时序。时钟块中的任何信号都将同步地驱动或采样,这就保证了测试平台在正确的时间点与信号交互。

一个接口可以包含多个时钟块,因为每个块中都只有一个时钟表达式,所以每一个对应一个时钟域。典型的时钟表达式如@( posedge clk)定义了单时钟沿,而e (clk)定义了DDR时钟(双数据率)。

可以在时钟块中使用default语句指定一个时钟偏移,但是默认情况下输人信号仅在设计执行前被采样,并且设计的输出信号在当前时间片又被驱动回当前设计。

一旦定义了时钟块,测试平台就可以用@ arbif.cb表达式等待时钟,而不需要描述确切的时钟信号和边沿。这样即使改变了时钟块中的时钟或者边沿,也不需要修改测试平台的代码。

接口中的logic和wire对比

如果测试平台在接口中使用过程赋值语句驱动一个异步信号,那么该信号必须是logic类型的。wire类型变量只能被连续赋值语句驱动。logic信号可以直接驱动,只能用assign驱动wire信号,时钟块中的信号始终是同步的,可以定义为logic或者wire。

程序块(Program Block)和时序区域(Time Regin)

SystemVerilog 引入一种新的时间片的划分方式:

 在Verilog中,大多数的事件在有效区域(active region)执行。

在一个时间片内首先执行的是 Active区域,在这个区域中运行设计事件。包括RTL、门级代码和时钟发生器(clock generator)。第二个区域是Observed区域,执行断言。接下来就是执行测试平台的 Reactive区域。注意到时间并不是单向地前向流动——-Observed和Reactive区域的事件可以触发本时钟周期内Active区域中进一步的设计事件。最后就是Postponed区域,它将在时间片的最后,所有设计活动都结束后的只读时间段采样信号。

 仿真的结束

在Verilog 中,仿真在调度事件存在的时候会继续执行,直到遇到$finish。

SystemVerilog 增加了一种结束仿真的方法。SystemVerilog把任何一个程序块都被视为含有一个测试。如果仅有一个程序块,那么当完成所有initial块中的最后一个语句时,仿真就结束了,因为编译器认为这就是测试的结尾。即使还有模块或者程序块的线程在运行,仿真也会结束。所以,当测试结束时无需关闭所有的监视器(monitor)和驱动器(driver)。

如果存在多个程序块,仿真在最后一个程序块结束时结束。这样最后一个测试完成时仿真就会结束。可以执行$exit提前中断任何一个程序块。当然,仍然可以使用$finish来结束仿真。

指定设计和测试平台之间的延时

时钟块的默认时序是在# 1step 延时之后采样输人信号,在#0延时之后驱动输出信号。1step延时规定了信号在前一个时间片的Postponed区域,在设计有任何新的动作之前被采样。这样你就可以在时钟改变之前捕获输出值。因为时钟模块的原因,测试平台的输出信号是同步的,所以它们直接送人设计中。在Reactive区域运行的程序块在同一个时间片内再一次触发Active区域。

接口的驱动与采样

接口同步

可以使用Verilog的@和wait来同步测试平台中的信号。

接口信号的采样

从时钟块中读取一个信号的时候,是在是时钟沿之前得到采样值。例如在Postponed区域

接口信号驱动

在时钟块中应当使用同步驱动(synchronous drive),即“<=”操作符来驱动信号。如果测试平台在时钟的有效沿驱动同步接口信号,那么其值将会立即传递到设计中。这是因为时钟块的默认输出延时是#0。如果测试平台在时钟有效沿之后驱动输出,那么该值直到时钟的下一个有效沿才会被设计所捕获。

 第三个周期中间产生的值2永远不会被DUT捕获,因为在第三个周期结束时测试平台产生了1。异步地驱动时钟块信号会导致数值丢失。相反,你应该使用时钟延时前缀以保证在时钟沿驱动信号。

SystemVerilog断言

可以使用SystemVerilog 断言(SVA)在设计中创建时序断言。断言的例化跟其他设计块的例化相似,而且在整个仿真过程中都是有效的。仿真器会跟踪哪些晰言被激活,这样就可以在此基础之上收集功能覆盖率的数据。

立即断言

断言比if语句更加紧凑,但是断言的逻辑条件跟if语句里的比较条件是相反的。设计者应该期望括号内的表达式为真,否则输出一个错误。

 如果正确地产生了grant信号,那么测试继续执行。如果信号不符合期望值,仿真器将给出一个错误信息。断言是声明性的代码,它的执行过程和过程代码有很大差异。使用几行断言,可以验证复杂的时序关系;等价的过程代码可能远比这些断言要复杂和冗长。一个立即断言有可选的then和else分句。

并发断言

可以认为它是一个连续运行的模块,它为整个仿真过程检查信号的值。你需要在断言内指定一个采样时钟。

在接口中使用断言,接口不仅可以传递信号,也可以检查协议的正确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值