上一篇尝试构建了基于静态随机函数的单比特跨时钟同步器并进行了简单的仿真,这一篇实现一下本系列文章的最终目的 —— 多比特跨时钟域的仿真模块。其实在单比特的模块完成后,本篇的多比特同步器就比较简单了,只需要对单比特模块进行封装:
module multi_bit_async #( //parameter parameter WD = 4)( /*AUTOARG*/ // Outputs o_data, // Inputs i_clk, i_rst_n, i_data, o_clk, o_rst_n );
// ----------------------------------------------------------------// Interface declare// ----------------------------------------------------------------input i_clk;input i_rst_n;input [WD -1:0]i_data;
input o_clk;input o_rst_n;output[WD -1:0]o_data;
genvar i;generate for(i=0; i1)begin: MULTI_OSYNC bit_async u_bit_async( .i_clk (i_clk), .i_rst_n (i_rst_n), .i_data (i_data), .o_clk (o_clk), .o_rst_n (o_rst_n), .o_data (o_data) ); endendgenerate全部代码就完成了,而后进行下简单的测试。先来“试错”所以把顺序增长计数器送进去看看,快打慢的场景是这样的:
慢打快:
从这两个图可以清晰的看出来,异步FIFO里如果使用普通的计数器通过多比特同步器同步确实会造成指针逻辑判断错误。
接下来换成格雷码跨异步的测试:
以及慢打快,都没有发生异常的计数值传递:
系列文章入口——
【芯片设计】SoC 101(一):绪论 | 【芯片设计】FIFO漫谈(零)从无处不在的FIFO开始说起 | 【芯片设计】计算机体系结构(一)虚拟内存 | 【芯片设计】深入理解AMBA总线(零)绪论
| 【芯片设计】握手协议的介绍与时序说明 | 【芯片设计】复位那些小事 —— 复位消抖 | 【芯片设计】快速入门数字芯片设计(一)Introduction | 【芯片验证】UVM源码计划(零)下定决心读源码前的自测环节
| 【芯片设计】异步电路碎碎念(一) 到底什么是异步电路
| 【芯片设计】从RTL到GDS(一):Introduction
| 其他文章链接——
【芯片验证】sva_assertion: 15道助力飞升的断言练习 | 【芯片验证】可能是RTL定向验证的巅峰之作 | 【芯片验证】RTL仿真中X态行为的传播 —— 从xprop说起 | 【芯片验证】年轻人的第一个systemVerilog验证环境全工程与解析 |
【芯片设计】verilog中有符号数和无符号数的本质探究
| 【芯片设计】论RTL中always语法的消失术 | 【芯片设计】代码即注释,注释即代码 | 【芯片设计】700行代码的risc处理器你确实不能要求太多了 |
入职芯片开发部门后,每天摸鱼之外的时间我们要做些什么呢 | 如何计算系统的outstanding 和 burst length? | 芯片搬砖日常·逼死强迫症的关键词不对齐事件 | 熟人社会里,一群没有社会价值的局外人 |
|