异步FIFO的UVM验证(VCS+Verdi 附源代码)



1.DUT 设计

本设计框图及信号端口如下,同经典asyn_fifo设计。
在这里插入图片描述

2.UVM 验证

2.1 测试功能点

在这里插入图片描述

2.2 环境搭建

验证框图大致为:
在这里插入图片描述

2.2 功能仿真测试

2.2.1 复位测试

2.2.1.1 写复位

在这里插入图片描述
wrst_n 复位信号拉低,winc 和 wdata 随即拉低,wptr指向0。功能正常。
此测试共发送20笔write transaction,因为复位丢失的数据会在复位释放后,继续发送,比如上述的96,数据准备好了半个周期被复位信号打断,在下个clk的上升沿,并不能写入RAM中。在driver添加flag 实现不丢失包的发送。(不知道是不是多次一举)

2.2.1.2 读复位

在这里插入图片描述
同样,读操作,在读复位信号拉低时,rinc 拉低,共发送10笔,由于复位信号打断的会重新驱动。

2.2.2 读写测试

2.2.2.1 带有复位的读写测试

sequence激励代码:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

复位之后,仍能正常工作。并且scoreboard中没有报错,共接收到15笔 write transaction,10笔 read transaction(实际发送了3+10),少了三笔 读空时候的invalid read transaction。

2.2.3 写满及读空 异常测试

1 写满
在这里插入图片描述
连续发送20笔write transaction。从1处开始,DUT write进去第一个数据,mem[0] = 1b… ,发送完第16个transaction后,wptr指向0x10,wfull立即拉高。指针保持不变。第17 18 19 20笔数据并没有写进去。发送完毕后,winc拉低。符合设计。
2. 读空
在这里插入图片描述
连续读20次。从1处,DUT 开始read,rdata被驱动。读完第16笔之后,rptr指向了0x18,rempty拉高。第17 18 19 20笔,dut没有进行操作,rdata无效。
读出的数据 和 上面写入的数据一致。
在这里插入图片描述

2.2.3 时钟测试

2.2.3.1 写快读满

在这里插入图片描述
虚空

2.2.3.2 读快写慢

在这里插入图片描述

异步FIFO是一种常见的硬件设计模块,用于在不同的时钟域之间传输数据。UVM(Universal Verification Methodology)是一种用于验证硬件设计的方法学。在UVM验证中,验证工程师可以使用UVM中提供的各种类和方法来验证异步FIFO的功能和正确性。 下面是一个简单的UVM验证异步FIFO的示例: 首先,我们需要创建一个Transaction类来表示FIFO中的数据项。这个类可以包含需要验证的数据字段。 然后,我们创建一个Agent类来模拟FIFO的发送和接收端。这个Agent类可以包含两个接口,一个用于发送数据到FIFO,另一个用于从FIFO接收数据。Agent类还可以包含一个Monitor来监视FIFO的状态,并将收到的数据转换为Transaction对象。 接下来,我们创建一个Sequencer类来生成数据项并将其发送到FIFO的发送端口。Sequencer类可以使用UVM提供的随机化机制来生成不同的数据项。 然后,我们创建一个Driver类来驱动Sequencer生成的数据项,并将其发送到FIFO的发送端口。 最后,我们可以创建一个Test类来实例化和连接上述组件,并编写测试用例来验证异步FIFO的功能和正确性。 在验证过程中,我们可以使用UVM提供的各种断言和功能覆盖率工具来验证异步FIFO的正确性。通过生成不同的测试用例和使用各种场景和边界条件,我们可以尽可能地覆盖所有可能的情况,并验证异步FIFO的正确性。 需要注意的是,上述只是一个简单的UVM验证异步FIFO的示例,实际的验证过程可能更为复杂,需要根据具体的设计和需求进行调整和扩展。
评论 70
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值