梳理了异步逻辑的处理原则之后,本篇针对常见的跨异步场景对应的处理方法进行一下汇总。那么开头当然是明确一下我们有哪些需要处理的情况,以及对应的处理方法。根据以往的经验,大概可以分为以下几类吧:
单比特信号打拍同步
单比特脉冲同步
多比特计数器格雷码步
多比特信号DMUX同步
多比特握手同步
异步FIFO同步
复位信号的时钟域同步
复位信号的时钟域同步比较场景独立,后面咱们找时间再单独聊。下面来针对前6种场景来做一下处理方法和对应的电路分析,当然这里的电路图可能并不完整,更多是起到表意的作用。
单比特信号打拍同步
对于单比特信号的同步处理,最常见也是最简单的方式当然是直接打拍了,在我上学的时候书上的说法还是打两拍,目前已经基本是打三拍处理了,当然在低频场景下还是有打两拍的场景。但是呢随着芯片频率的进一步增加,打三拍肯定也会慢慢的不能保证亚稳态概率降低到一个可接受的水平,因此还是要根据具体项目的工艺和频率进行计算的。
对应的电路图非常的简单:
单比特脉冲同步
一般单比特的电平型控制信号会采用直接打拍的方式进行同步,同时会伴随着一定的反馈与处理电路,比如在对端采样到合理值之前data_in信号不应跳变等。而如果是单比特的脉冲信号,则不能简单地进行打拍,因为此时会发生漏采的情况与,因此需要在源端进行信号拓展,一般来讲源端的跨异步信号需要维持目的端时钟2个周期(或者满足“三沿”要求)。
对应的电路图为:
多比特DMUX同步
多比特dmux同步主要是通过同步并捕获总线数据的valid信号跳转,进而采样总线数据的同步方法。做法当然是将valid信号打拍跨异步到接收端,接收端采集后使用vld的上升沿为锁存数据总线的使能信号。
对应的波形为:
使用DMUX结构的话,必须保证in_data在in_vld脉冲信号同步和采样过程中保持不变。通过观察也可以发现,这种方式一般用于信号由低频跨到高频的场景,如果高频跨到低频,那么还是需要对in_vld信号做相应的脉冲拓展。
多比特格雷码同步
这个也没啥必要再写一次了,相关的资料太多了。
异步握手协议步
典型的应用场景是当控制信号为多比特时,就不能打拍或者格雷码啥的了,那么可以选择握手协议同步器。具体实现方式有很多,全握手的半握手的,思路就是同步请求、获取数据、应答信号的流程吧,就画一个比较典型电路好了:
这个电路的实现核心是,当in_enable信号为高时开始进行数据同步,当数据同步没有完成前,tx_sel信号是不会落下去的:
异步FIFO同步
异步fifo相关的资料也很多了,看之前的专栏就好啦。
系列文章入口——
【芯片验证】sva_assertion: 15道助力飞升的断言练习 |
【芯片验证】可能是RTL定向验证的巅峰之作 |
【芯片验证】RTL仿真中X态行为的传播 —— 从xprop说起 |
【芯片验证】年轻人的第一个systemVerilog验证环境全工程与解析 |
【芯片设计】verilog中有符号数和无符号数的本质探究 |
【芯片设计】论RTL中always语法的消失术 |
【芯片设计】代码即注释,注释即代码 |
【芯片设计】700行代码的risc处理器你确实不能要求太多了 |
入职芯片开发部门后,每天摸鱼之外的时间我们要做些什么呢 |
如何计算系统的outstanding 和 burst length? |
芯片搬砖日常·逼死强迫症的关键词不对齐事件 |
熟人社会里,一群没有社会价值的局外人 |