Verilog小白2024
总结一下高分回答要点:1. 明确点出亚稳态是核心问题。2. 分场景讨论:单比特慢到快(两级同步器)、单比特快到慢(脉冲同步或握手)、多比特(异步FIFO)。3. 对于异步FIFO,要能说清格雷码指针和空满标志生成原理。4. 代码题注意规范。5. 可以提一下复位同步和时钟门控信号的CDC处理,展示知识广度。
总结一下高分回答要点:1. 明确点出亚稳态是核心问题。2. 分场景讨论:单比特慢到快(两级同步器)、单比特快到慢(脉冲同步或握手)、多比特(异步FIFO)。3. 对于异步FIFO,要能说清格雷码指针和空满标志生成原理。4. 代码题注意规范。5. 可以提一下复位同步和时钟门控信号的CDC处理,展示知识广度。
除了经典方法,有时笔试题会提到“多路器同步法”(MUX synchronizer)或“结绳法”(Toggle Synchronizer)。比如结绳法:将源时钟域的脉冲转换成电平翻转(类似T触发器),将这个翻转信号同步到目标时钟域,再在目标时钟域检测边沿得到脉冲。这其实也是脉冲同步的一种。了解这些变体可以让你回答更全面。
笔试中,对于“打两拍”的深入问题:1. 为什么是两级,不是一级或三级?一级不足以将MTBF降到可接受水平;三级增加延迟,改善有限,通常两级是性价比最高的。2. 打两拍后的信号还能不能有亚稳态?理论上第二级输出仍有可能亚稳态,但概率极低。3. 同步器之间的寄存器不能有其他逻辑,必须直接串联。
脉冲同步器的代码可以准备一下。大致思路:在源时钟域,检测输入脉冲,将其转换成一个电平信号(置位一个触发器)。将这个电平信号同步到目标时钟域(打两拍)。在目标时钟域,对同步后的电平信号进行边沿检测(检测上升沿),产生目标时钟域的脉冲。最后,可能需要一个反馈信号将源时钟域的电平复位,但如果是单次脉冲,也可以不管。
格雷码在异步FIFO里是关键。为什么用格雷码?因为二进制指针在同步时,如果发生亚稳态,可能从0111变到1000(多位变化),同步后可能变成0000到1111之间的任何值,导致空满判断完全错误。格雷码每次只变一位,即使亚稳态导致误判,也只会误判成相邻的指针值,空满标志可能提前或延后一拍,但不会出现灾难性错误(如写满时认为空而去写)。笔试可能会问为什么用格雷码而不用二进制。
跨时钟域处理中,复位信号的同步也很重要。异步复位,同步释放。这是必须掌握的点。笔试题可能单独考这个。代码模板要记住: always @(posedge clk or negedge rst_async_n) begin if (!rst_async_n) begin rst_sync_reg1 <= 1'b0; rst_sync_reg2 <= 1'b0; end else begin rst_sync_reg1 <= 1'b1; rst_sync_reg2 <= rst_sync_reg1; end end assign rst_sync_n = rst_sync_reg2; 这样产生的复位信号是同步于时钟的。
单比特信号从慢到快,打两拍基本够用。但要注意,这个同步器只能同步电平信号,对于脉冲,如果慢时钟域的脉冲宽度足够宽(大于快时钟周期),也可以直接打拍同步,因为快时钟肯定能采到。如果脉冲很窄,就需要先展宽。所以回答时要具体分析。
亚稳态无法彻底消除,只能减少其影响。所以高质量的回答要提到“系统容错”设计。比如,同步后的信号可能仍有极低概率出错,如果系统要求极高可靠性,可以采用三模冗余等容错技术。但笔试一般考到同步器、FIFO、握手就够了。
握手协议虽然可靠,但效率低。异步FIFO效率高,适合数据流。但异步FIFO设计复杂,笔试常考深度计算。例如,写时钟100MHz,读时钟50MHz,每100个写时钟周期写入80个数据,读侧一直读。深度怎么算?先算写入速率和读出速率,考虑最坏情况(背靠背写入),套公式。网上有很多例题,一定要练熟。
实际笔试中,可能会给一段有CDC问题的代码,让你找出问题并改正。常见错误包括:将多个相关比特分别打拍(多比特问题)、在目的时钟域直接使用源时钟域的组合逻辑信号、复位信号没有同步。改正方法就是针对性地应用同步器、FIFO或握手。所以平时要多看错误案例。
我的经验是,回答CDC问题要结构化。第一步:识别时钟域和信号类型(单比特/多比特,脉冲/电平)。第二步:根据频率关系(快到慢、慢到快、频率比未知)选择方法。第三步:阐述所选方法如何降低亚稳态风险(如同步器隔离、FIFO的格雷码指针、握手的确认机制)。第四步:如果是代码题,注意代码风格(时钟块、非阻塞赋值、同步寄存器分开)。这样回答显得思路清晰。
笔试里经常有场景题:“一个信号从100MHz时钟域传到25MHz时钟域,该如何处理?” 首先看是单比特还是多比特。如果是单比特控制信号,要看信号变化频率。如果是偶尔变化的使能信号,用同步器(打拍)可能可行,但如果是脉冲,就要用脉冲同步或握手。如果是连续变化的多比特数据流,必须用异步FIFO。还要考虑100MHz到25MHz是快到慢,同步脉冲时要小心。