15.【Verilog】Verilog 时钟简介
第一步详细分析与整理Verilog 时钟简介1. 时钟源分类1.1 外部时钟源RC/LC 振荡电路利用正反馈或负反馈产生周期性信号。频率范围大但稳定度低、工作频率较低。无源/有源晶体振荡器利用石英晶体的压电效应产生谐振。频率精度高、稳定性好、噪声低、温漂小。有源晶振带压控或温度补偿但电路复杂、频带窄、频率基本不可调。其他施密特触发器搭建的特定电路或信号发生器设备。1.2 内部时钟源锁相环PLL利用外部参考信号控制内部振荡信号的频率和相位实现倍频。可以产生稳定且高频的时钟集成在模块内部保证延迟和稳定性。时钟分频对系统时钟分频得到较低频率。常用计数器实现。时钟切换多个时钟源在低功耗或性能需求时切换。切换逻辑需要避免尖峰脉冲后续章节详述。典型方案外部晶振 内部 PLL 倍频再分频或切换。2. 时钟特性非理想因素特性定义原因影响时钟偏移 (skew)不同触发器时钟端到达时间的差异走线长度、负载电容、负载数量影响建立/保持时间时钟抖动 (jitter)时钟沿相对于理想位置的短时偏移不累积热噪声、半导体工艺随机抖动电源噪声、EMI固定抖动降低时序裕量转换时间 (transition)时钟从高到低或低到高的斜坡过渡时间工艺、负载电容影响功耗和时序时钟延时 (latency)从时钟源到触发器时钟端的总延时source latency network latency影响时钟树平衡时钟不确定度 (uncertainty)在综合工具中将 skew 和 jitter 统一用 uncertainty 表示。3. 时钟树定义由缓冲单元 (buffer) 平衡搭建的网状结构用于减少不同触发器之间时钟到达的时间差异平衡 skew并提供足够的驱动能力。组成一个时钟源点经多级 buffer。图中展示了 latency包括 network delay 和 source latency、transition、uncertainty。注意时钟树不减少绝对延迟而是减少相对差异。后端设计人员负责插入 buffer 构建时钟树前端设计人员保证时钟方案功能正确。4. 其他时钟分类4.1 同步时钟 vs 异步时钟已在《4.1 同步与异步》中详细说明同源且整数倍关系可视为同步同一时钟域逻辑无需同步处理。同步电路特点所有触发器时钟端连接在一起并接系统时钟端状态只在时钟脉冲到来时改变。4.2 门控时钟原理使能信号有效时打开时钟无效时关闭时钟。用于低功耗设计。简单实现使能信号与时钟做“与”操作但不安全易产生毛刺。安全门控时钟需避免毛刺后续章节介绍。4.3 双边沿时钟用途在时钟上升沿和下降沿都传输数据实现双倍数据速率DDR。示例DDR SDRAM。仿真示例模块double_rate在上升沿和下降沿分别采集数据通过片选信号csn选择输出。testbench 产生 100MHz 时钟和 200MHz 数据速率。代码保留moduledouble_rate(input rstn,input clk,input csn,input[7:0]din,input din_en,output[7:0]dout,output dout_en);// 上升沿采集reg[7:0]datap_r;reg datap_en_r;always (posedge clk or negedge rstn)begin...end// 下降沿采集reg[7:0]datan_r;reg datan_en_r;always (negedge clk or negedge rstn)begin...end assign dout!csn?datap_r:datan_r;assign dout_endatan_en_r|datap_en_r;endmodule不建议使用双边沿时钟的原因不能在同一个 always 块中使用posedge clk or negedge clk也不能在两个 always 块中为同一变量赋值。数据传输速率是时钟频率的两倍需要额外的片选信号或引入 2 倍频时钟。时钟约束复杂布局布线要求更严格。对时钟质量要求极高。第二步费曼教学法 – 通俗讲解时钟今天要聊的是数字系统的“心跳”——时钟。理解时钟的特性、分类和使用方法是验证时序正确性的基础。我会用“城市地铁系统”来比喻帮助你把抽象的概念变得具体。一、时钟源心跳的源头外部时钟源就像地铁的总发电站。RC 振荡器像一个小型发电机便宜但频率不准晶振像一个高精度原子钟稳定可靠但成本高。实际芯片通常用晶振提供基准频率。内部时钟源PLLPLL 就像一个“倍频器”能把外部晶振的低频比如 25MHz变成系统需要的高频比如 1GHz。没有 PLL高频率时钟会很难产生。PLL 还带有分频和相位调整功能。分频和切换有时系统需要不同速度的时钟比如 CPU 全速运行用 1GHz待机时降到 100MHz。我们可以用计数器做分频后面会讲或者在不同时钟源之间切换注意防毛刺。二、时钟的非理想特性——为什么时钟不完美想象一下地铁列车时钟偏移 (skew)同一线路上的不同车站列车到达时间可能相差几秒。这是因为线路长度、乘客数量负载不同。数字电路中这就是时钟信号到达不同触发器的时间差。时钟抖动 (jitter)列车每天到达同一个站的时间会有几秒的随机波动早到或晚到这是由司机操作、轨道状况等随机因素引起的。电路中抖动来自热噪声、电源波动。转换时间 (transition)列车启动和刹车不是瞬间完成的需要一个加速/减速过程。时钟信号的上升/下降也是斜坡时间越长功耗越大也可能影响时序。时钟延时 (latency)从发电站时钟源到某个车站触发器的总时间包括高压传输source latency和站内步行network latency。所有车站共有的源延时不会引起偏移但网络延时的差异会产生 skew。验证时关注什么在时序仿真中通过 SDF 反标会包含这些非理想值。如果设计在理想时钟下能跑 1GHz加上 skew/jitter 后可能只能跑 900MHz。你需要检查工具报告的uncertainty设置是否合理以及时序是否有违例。三、时钟树平衡的“公交网络”如果时钟信号直接连到上万个触发器驱动能力不够而且延迟差异巨大。所以后端工程师会插入大量buffer像地铁网络中的多个换乘站让所有列车的到站时间尽量一致。时钟树的目标是最小化 skew而不是最小化 latency。前端设计者只需在综合时指定时钟频率和 uncertainty后端负责实现时钟树。四、同步与异步时钟复习同步时钟同源且频率成整数倍比如 100MHz 和 50MHz它们之间可以直接传输数据无需特殊同步器但要注意脉冲宽度。异步时钟不同源或非整数倍必须使用 FIFO、握手等同步电路。五、门控时钟省电妙招当模块不工作时关闭它的时钟可以大幅降低动态功耗。最简单的方法是把使能信号和时钟“与”起来但这种方法会产生毛刺glitch当使能信号在时钟高电平时变化输出会出现很短的低电平脉冲可能误触发触发器。安全门控时钟通常使用锁存器与门结构将在低功耗章节详述。六、双边沿时钟——双倍速还是双倍麻烦优点在时钟上升沿和下降沿都传输数据理论上速率翻倍。DDR 内存就使用这种技术。为什么一般不推荐在普通逻辑中使用无法直接在同一 always 块中同时响应两个边沿必须分别写两个 always 块然后组合输出代码复杂且容易出错。需要额外控制信号如示例中的csn来选择输出增加了逻辑。时序约束复杂既要约束上升沿也要约束下降沿且两者之间的时钟占空比必须精确否则数据窗口不对称。对时钟的占空比、抖动要求极高一旦占空比不是 50%上升沿和下降沿之间的时间就不是半个周期数据传输会出错。验证工程师的态度除非你正在设计 DDR 接口或必须双倍速的模块否则坚决要求使用单边沿 倍频时钟例如用 200MHz 时钟代替 100MHz 双边沿。这样设计更简单时序收敛更容易。第三步详解示例——使用 PLL 产生不同时钟并验证为了更好地理解时钟源和分频概念下面给出一个实际验证中常用的例子模拟内部 PLL 产生高频时钟并用计数器分频得到低频时钟同时测量时钟偏移和抖动的影响。示例目标在 testbench 中产生一个基准时钟如 50MHz模拟外部晶振。通过 PLL 行为模型倍频到 200MHz。通过计数器分频得到 100MHz 和 50MHz 时钟模拟内部时钟树。人为加入 skew 和 jitter观察不同触发器之间时钟到达时间的差异以及数据采样的安全性。代码详解timescale1ns/1ps// 模拟 PLL 行为模型倍频、固定抖动modulepll_model(input wire clk_in,// 50MHz 参考时钟output wire clk_out// 200MHz 输出);// 简单倍频通过延迟环或PLL实际仿真中可用重复事件// 这里采用 generate 200MHz 时钟只演示相位对齐reg clk_200m;initial clk_200m0;always #(2.5)clk_200m~clk_200m;// 200MHz周期5nsassign clk_outclk_200m;endmodule// 时钟分频器偶数分频占空比50%module clk_divider #(parameter DIV2)(input wire clk_in,input wire rstn,output wire clk_out);reg[$clog2(DIV)-1:0]cnt;reg clk_div;always (posedge clk_in or negedge rstn)beginif(!rstn)begin cnt0;clk_div0;endelsebeginif(cntDIV/2-1)begin cnt0;clk_div~clk_div;endelsebegin cntcnt1;end end end assign clk_outclk_div;endmodule// 测试模块用不同时钟驱动两组寄存器并故意制造skewmoduleskew_test(input clk_fast,// 200MHzinput clk_slow,// 100MHz由200MHz分频得到同源input[7:0]data_in,input data_valid,output[7:0]data_out);reg[7:0]reg_fast,reg_slow;always (posedge clk_fast)beginif(data_valid)reg_fastdata_in;end always (posedge clk_slow)begin reg_slowreg_fast;// 从快时钟域到慢时钟域end assign data_outreg_slow;endmodule// Testbenchmodule testbench;reg clk_xtal0;reg rstn0;wire clk_200m;wire clk_100m;reg[7:0]test_data;reg test_valid;wire[7:0]result;// 外部晶振 50MHzalways #(10)clk_xtal~clk_xtal;// 20ns周期50MHz// 实例化 PLL 和分频器pll_modelu_pll(.clk_in(clk_xtal),.clk_out(clk_200m));clk_divider #(.DIV(2))u_div2(.clk_in(clk_200m),.rstn(rstn),.clk_out(clk_100m));// 被测试的跨时钟域模块skew_testu_test(.clk_fast(clk_200m),.clk_slow(clk_100m),.data_in(test_data),.data_valid(test_valid),.data_out(result));// 激励产生initial begin rstn0;repeat(10)(posedge clk_200m);rstn1;// 产生一组数据for(inti0;i10;i)begin (posedge clk_200m);test_data$random;test_valid1;(posedge clk_200m);test_valid0;end #500$finish;end// 监测跨时钟传输是否正确仿真时观察波形或打印initial begin $monitor(Time %0t: result %h,$time,result);end// 可选人为加入clk_slow的skew实际后端工具会做这里仅模拟// 方法延迟clk_slow的边沿例如在分频器输出后加延迟// 此部分仅示意不扩展endmodule详解PLL 行为模型我们用简单的always #(2.5)产生 200MHz 时钟假设它已经与输入的 50MHz 参考时钟同步相位锁定。实际 PLL 会有锁定时间和抖动这里简化。时钟分频器参数化偶数分频产生 100MHz 时钟。因为 200MHz 和 100MHz 同源且整数倍它们是同步时钟但快→慢传输时需要小心脉冲丢失。跨时钟域测试reg_fast在 200MHz 下采样数据reg_slow在 100MHz 下采样reg_fast。由于 100MHz 周期10ns大于 200MHz 周期5nsreg_fast的变化可能会在 100MHz 的采样沿上被漏掉实际上reg_fast会保持到下一个 200MHz 沿而reg_slow每 10ns 采样一次总是能采到稳定值因为reg_fast至少保持 5ns。但若test_valid只有一个 200MHz 周期reg_fast也只会保持 5ns而reg_slow的采样沿可能刚好错过例如在reg_fast变化之前 0.1ns 采样会采到旧值。这就是同步但快→慢需要考虑脉冲展宽的场景。实际设计中应该将data_valid展宽或使用握手。这个示例正是为了揭示这种风险。验证方法运行仿真观察result是否丢数。在波形中测量clk_100m与clk_200m的相位关系调整分频器的初始相位看看何时数据会丢失。这让你直观理解同步时钟域之间的潜在问题。学习建议动手跑仿真复制上述代码修改分频系数或相位观察数据是否正确传输。加入抖动和偏移在clk_200m上加入固定偏移如#0.2延迟或随机抖动使用$urandom和#观察时序违例。使用 STA 工具学习用create_clock、set_clock_uncertainty等命令定义时钟并生成时序报告。工作中的应用当你拿到一个新项目的时钟方案时要理解主时钟来自哪个 PLL分频比是多少是否存在同源但不同频的时钟域之间的数据传输是否有门控时钟这些都会影响验证策略和时序收敛。总结时钟是数字系统的“心跳”但真实的心跳不是完美的。偏移像每个人的反应快慢不同抖动像心率有时快有时慢转换时间像心肌收缩不是瞬间完成。优秀的数字设计会通过时钟树让所有触发器步调一致用门控时钟在空闲时省电用同步时钟域相互沟通。作为验证工程师你要确保这些心跳规则被正确落实并且不会因为“心律不齐”导致系统崩溃。永远记住理想时钟只存在于教科书真实世界需要敬畏每一个皮秒的差异。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2595494.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!