上一篇尝试构建了基于静态随机函数的单比特跨时钟同步器并进行了简单的仿真,这一篇实现一下本系列文章的最终目的 —— 多比特跨时钟域的仿真模块。其实在单比特的模块完成后,本篇的多比特同步器就比较简单了,只需要对单比特模块进行封装:
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; i<WD; i=i+1)begin: MULTI_OSYNC
bit_async
u_bit_async(
.i_clk (i_clk),
.i_rst_n (i_rst_n),
.i_data (i_data[i]),
.o_clk (o_clk),
.o_rst_n (o_rst_n),
.o_data (o_data[i])
);
end
endgenerate
慢打快:
从这两个图可以清晰的看出来,异步FIFO里如果使用普通的计数器通过多比特同步器同步确实会造成指针逻辑判断错误。
接下来换成格雷码跨异步的测试:
以及慢打快,都没有发生异常的计数值传递:
系列文章入口——
【芯片验证】sva_assertion: 15道助力飞升的断言练习 |
【芯片验证】可能是RTL定向验证的巅峰之作 |
【芯片验证】RTL仿真中X态行为的传播 —— 从xprop说起 |
【芯片验证】年轻人的第一个systemVerilog验证环境全工程与解析 |
【芯片设计】verilog中有符号数和无符号数的本质探究 |
【芯片设计】论RTL中always语法的消失术 |
【芯片设计】代码即注释,注释即代码 |
【芯片设计】700行代码的risc处理器你确实不能要求太多了 |
入职芯片开发部门后,每天摸鱼之外的时间我们要做些什么呢 |
如何计算系统的outstanding 和 burst length? |
芯片搬砖日常·逼死强迫症的关键词不对齐事件 |
熟人社会里,一群没有社会价值的局外人 |