async_fifo学习

1.框架

1.1 逻辑框图

Fifo 看成环形存储器,读操作把读指针指向下一个读数据地址,写操作把写指针指向下一个写数据地址

 

1.2 gray转换框图,注意二进制地址和格雷码转换要同步

2.代码实现

2.1 写控制模块

2.1.1 端口和参数定义

2.1.2 给ram产生二进制地址,再经过二进制寄存器

2.1.3 对产生的写地址转换格雷码,再经过格雷码寄存器

2.1.4  在w_clk对读模块产生的读格雷码指针打两拍

2.1.5 产生写满信号

 

对比gray-code 7和15 要对高位和次高位都取反 

2.2 读控制模块

2.2.1 端口和参数定义

2.2.2 给ram产生二进制读地址,再经过二进制寄存器

 

2.2.3 对产生的读地址进行格雷码准换,再经过格雷码寄存器 

2.2.4 在r_clk对写模块产生的写格雷码指针打两拍

2.2.5 产生读空信号

#步骤总结#

1 产生读写地址
2 转格雷码
3 对传过来的写读格雷码指针打两拍
23 比较产生空满

2.3 例化ram

先生成ipcore 

去掉产生的读写地址的msb送进ram

2.4 顶层例化top

 

 

3.编写tb

3.1参数 时间单位 端口定义

3.2 读写时钟定义 以及初始化读写模块

 3.3 利用task 进行数据读写

task 任务名;// 不要漏分号!!!!!

//1.声明变量,举例:

  integer i;

//2.赋值 编程

  begin

  赋值逻辑

        比如:for(...)begin

                                @(posedge clk)

                        end

  end

        @(posedge clk)

endtask

initial 一上电就执行,仅执行一次 !

3.4 例化顶层

4. 仿真波形

4.1利用脚本 跑modelsim

quit -sim
.main clear

vlib work

vlog ./tb_fifo_top.v
vlog ./../design/*.v
vlog ./../ipcore

vsim -voptars=+acc work.tb_fifo_top

add wave tb_fifo_top/fifo_top_inst/*

run 20us

4.2

观察波形

4.2.1 写进去256个数据 0-255

4.2.2写满信号在写data 8ff时候拉高

 4.2.3读空信号在读data 8ff时候拉高

 4.2.4

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: async_fifo是一种用于数据传输的FIFO(先进先出)队列,其在UVM验证环境中的验证是非常重要的。 在进行async_fifo的UVM验证过程中,需要创建一个验证组件(agent),该组件主要由sequencer、driver和monitor组成。其中,sequencer负责向FIFO队列中发出数据请求,driver负责处理这些请求并将数据发送到FIFO队列中,monitor负责监测FIFO队列的状态和数据。 首先,需要编写驱动程序(driver),该驱动程序会从随机产生的数据生成交易,并将其发送到FIFO队列中。驱动程序还会处理来自环境的输入交易,并将它们传递给FIFO队列。通过监控程序(monitor)可以实时监测FIFO队列中的数据状态以及数据的正确性。 其次,需要编写一个产生随机交易的生成器(generator),用于测试FIFO队列的各种边界条件和异常情况。生成器可以随机生成一系列输入交易,并将其提供给驱动程序。 然后,需要编写一个转发器(sequencer),用于将生成器产生的交易传递给驱动程序,并处理来自驱动程序的数据请求。转发器可以控制交易的发送顺序以及产生的时序等。 最后,需要编写一个检查器(checker),以验证FIFO队列的输出数据是否正确。检查器可以对接收到的数据进行校验,并与预期结果进行比较来判断测试是否通过。 在整个验证过程中,需要编写相应的验证测试用例,覆盖不同的情况和边界条件,以确保async_fifo的正确性和稳定性。 综上所述,async_fifo的UVM验证主要涉及到创建验证组件、编写驱动程序、生成器、转发器和检查器,并通过编写相应的测试用例来验证FIFO队列的功能和性能。这样可以保证async_fifo的正确性,并提高其在实际应用中的可靠性。 ### 回答2: async_fifo是一种异步先进先出(FIFO)队列,在UVM验证环境中使用它可以有效地进行一些验证任务。在验证过程中,我们经常需要将一些数据交换或传递给不同的模块或组件。使用FIFO队列可以帮助我们管理输入和输出数据的顺序,以确保正确性和一致性。 在UVM中验证async_fifo,我们可以创建一个自定义的验证组件,该组件包含了FIFO队列。我们可以使用UVM提供的uvm_queue类来实现FIFO功能,该类提供了插入和提取数据项的方法,以及一些其他操作。 为了验证async_fifo,我们需要编写一些验证代码,以测试FIFO的正确性和性能。我们可以创建信号生成器来生成一系列随机的输入数据项,并将其插入到FIFO队列中。然后,我们可以创建一个监控器,用于检查FIFO队列的输出数据,并与预期结果进行比较。通过这种比较,我们可以验证async_fifo是否按照预期的顺序提取数据项。 此外,我们还可以使用UVM的事务和驱动机制来验证async_fifo的性能。我们可以创建一个驱动来向FIFO队列中连续插入数据项,并创建一个监控器来检查每个数据项的提取时间。通过分析提取时间,我们可以评估FIFO队列的性能和延迟,并确定是否满足设计要求。 总而言之,验证async_fifo是一个重要的任务,可以通过创建自定义的验证组件、使用uvm_queue类实现FIFO功能以及使用UVM的事务和驱动机制来完成。通过验证FIFO的正确性和性能,我们可以确保它在实际应用中的可靠性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值