可综合的异步fifo设计(二)

本文详细探讨了可综合的异步FIFO设计的重难点,包括空满标志产生、同步延迟处理、数据保护策略以及读写同时进行的逻辑测试。通过仿真波形验证了FIFO的初始化、空满标志产生、写满保护和读空保护等功能,并提供了testbench代码和FIFO最小深度的计算方法。
摘要由CSDN通过智能技术生成

本篇是继可综合的async_fifo设计(一)的下半篇,给出了testbench代码、测试波形及几个注意事项。

三、重难点

整个设计前后,提出以下几个问题:

// 1、空满标志产生(关键)

答:比较读写格雷码产生,满标志wr_full在写时钟域产生,写指针多轮回一圈,最高位标志位相异,其余位相同;空标志rd_empty在读时钟域产生,读写指针在同一奇偶圈,所有位相同时表示读指针追赶上写指针,此时读空标志产生。

// 2、空满标志产生后,持续时间是多长?

答:本设计采用的方法是:通过将一部时钟域的读写使能信号同步到本时钟域,写满后直到读使能,才清零wr_full,读空后直到写使能信号到来,才清零rd_empty。异步信号的同步处理打2拍处理,会延迟异步读写使能信号的到来,所以,标志的清空会有一定延迟。

// 3、是否有空满数据保护(满了不准写,或者空了不再读)?

答:有,通过格雷码反转为二进制地址,排除了空满标志延迟产生以及空满标志产生后继续的读写操作等造成地址的冗余增加,进而实现了空满保护。

// 4、地址跨时钟域同步是否对空满判断产生影响?

答:同步固然带来延迟,延迟直接对空满标志的产生造成影响。以rd_empty为例,若在延迟间隔内,写使能无效(不继续写),rd_empty正常产生(读、写不同时进行),若在间隔内,写使能有效,则写指针会递增,则传递到读时钟域的写指针一定小于或等于当前时刻的实际写指针,产生的读空则为"假空",因为实际上写地址已经变化了;同理,写满时,也会产生"假满"。“假空”、"假满"是一种保守操作,只是产生了假的空满标志,不会影响实际的fifo的数据读写。

// 5、同步后的地址有延迟,会造成地址多增加(如读空判断模块),怎么解决?

答:同步后的地址会导致空满标志滞后产生,从而影响地址多增加,属于空满保护的范畴,将gray地址转换成bin地址,限制地址过增。

// 6、同步器带来的影响是什么?是否致命?出现"假"空"假"满–>保守。

答:同4,是不致命的,实际上,异步fifo本身就不是100%的可靠性ram设计,有些问题必然存在。

// 7、快时钟域地址同步到慢时钟域,产生地址遗漏现象,漏掉的地址会产生致命影响吗?

答:本设计中,读时钟慢与写时钟(写的快,读的慢),在rd_logic中判断rd_empty的产生时,写指针同步到读时钟域,存在遗漏现象(慢时钟采样快时钟),在读写操作不同时进行时(若同时进行写操作),问题不大(不会影响空满标志产生),同时进行需要考虑是否会漏掉进行空标志产生所需要的关键指针(此时等待不到相等,则标志就产生不了)。

遗漏现象还会导致,格雷码的优势发挥不出,因为格雷码漏掉之后,相邻码之间就不是唯一1bit不同了,这就增加了重汇聚现象发生的概率。

// 8、判空判满标志产生逻辑的异同要理解

答:两者的判断相似却不同,结合代码仔细推敲。

// 9、读写同时进行如何考虑,本设计有隐患吗?

答:一般读慢,写快。当读得快写得慢时,为了避免出现问题需要扩展fifo_deepth。读写同时进行时,具体讨论结合仿真波形分析。

// 10、读写时钟的快慢是如何影响读写功能的?这种影响是否可以不考虑?

答:慢时钟域到快时钟域,只会出现保守问题,快时钟域到慢域,将出现漏采,漏掉的地址一般不会影响fifo的行为,但会影响fifo的效率。但如果漏掉关键指针则会出现逻辑错误。

四、仿真波形

4.1 读写不同时进行的逻辑测试

4.1.1 FIFO初始化功能验证

实际上,这部分测试对FIFO的读写是没有太大影响的,但一般来说,FIFO是应该具有初始化功能的,这部分功能在RTL代码中描述不方便(容易造成额外的硬件资源开销)。故将该部分功能放在tb中,所以用户根据需求在操作时可以添加初始化操作。初始化的测试波形如下图4-1.1所示。观察波形,0-1023地址都被初始化为0,知初始化功能正常。

特别地,初始化与否并不影响FIFO的正常读写。若使用了初始化,因为这是写操作的一种特例,当写完所有地址后,会产生wr_full标志,且circle_high会取反置1,这样,后续进行用户数据的写入时,如果不做逻辑复位,则会使逻辑功能出错。故作如下处理:

添加init_en信号,作为逻辑复位的使能信号。该信号在tb中,初始化结束后产生,并持续1个wr_clk。复位逻辑清除的波形如下图4-1.2所示。

Tb中init_en的产生:

@ (posedge wr_clk); //等待wr_clk上升沿
init_en = 1; 		// init状态下的使能信号,用于wr_full和circle_high的复位
@ (posedge wr_clk); // 持续1个clk_high
init_en = 0;

在这里插入图片描述

图4-1.1 异步FIFO初始化清零仿真波形

在这里插入图片描述

图4-1.2 异步FIFO初始化后的逻辑复位仿真波形
4.1.2 FIFO空标志产生逻辑的验证

初始化后完成逻辑复位,写入100个随机数据,而后依次读出数据直到产生rd_empty,如下图4-1.3所示。

在这里插入图片描述

图4-1.3 异步FIFO读空标志产生的仿真波形
4.1.3 FIFO满标志产生逻辑的验证

读空后,写入1024个数据,直到写地址指向地址100,写指针再次追赶上读指针,FIFO写满标志wr_full产生,如下图4-1.4所示。

在这里插入图片描述

图4-1.4 异步FIFO写满标志产生的仿真波形
4.1.4 FIFO写满保护功能的验证

上述操作,写满标志wr_full产生后,再次使能写使能信号,观察FIFO中数据的变化情况,看到FIFO中100以后的地址并没有被新的数据给覆盖,则知写满保护功能有效。写满保护的仿真波形如下图4-1.5所示。

在这里插入图片描述

图4-1.5 异步FIFO写满保护功能测试的仿真波形
4.1.5 FIFO读空保护(不再读)功能的验证

测试读空后是否有读空保护功能,测试波形如下图4-1.6所示。
在这里插入图片描述

图4-1.6 异步FIFO读空保护功能测试的仿真波形

4.2 读写同时进行的逻辑测试

4.2.1 写信号不做间隔控制

Rd_en起来之后,wr_en一直有效连续写入数据,可以预测,这种情形下写的速度快于读的速度,最终的结果是,连续的wr_full产生,然后再rd_en下清零,写入数据后wr_full又产生wr_full,如此循环,此case下FIFO的效率低,不建议使用。测试的波形如下图4-2.1所示。

仿真结果与理论相符合,但出现了逻辑错误,即同一个地址吃掉了2-3个数据(发生在连续周期的wr_full信号段),使得写入的数据发生丢失现象,这在对数据要求场合较高时是不允许的。

在这里插入图片描述

图4-2.1 异步FIFO同时读写不作写信号间断控制时测试的仿真波形
4.2.2 写信号做间隔控制

逻辑协调wr_en间断有效,保证写入的数据快被读完后者读完后再次写入数据,如此循环控制,可使FIFO连续的读写。测试的波形如下图4-2.2所示。

在这里插入图片描述

图4-2.2 异步FIFO同时读写且写信号做间断控制时测试的仿真波形

观察细节,发现,写完数据后作读操作,最终读出的地址和数据会比上次写到的地址多1,原因是rd_en一直有效,在rd_empty产生间隙时,多读了一个数据,如果rd_en做好时序控制,可以避免该现象。此外,读空后再写入数据,而后读操作的起始地址和刚刚多读的地址一样,这相当于将该地址的数据读了两次,分别是写之前和写之后的。其中,多读数据的情况如下图4-2.3所示。在大多数情况下,这种情况应该没有太大的影响。
在这里插入图片描述

图4-2.3 异步FIFO同时读写多读一个数据细节的仿真波形

4.3 testbench代码


`timescale 1ns / 1ps
//--------------------------
// 问题记录:2020-06-19 20:00
// 1、空满标志产生(关
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值