关于时钟模块完备性验证方法第六章

系列文章目录


第六章 时钟glitch检查



前言

       之所以要进行时钟glitch检查,是因为实际工程中我们遇到这样的问题,有些时钟设计,比如在频率切换过程中,有的时钟设计并非无毛刺切换设计,但是这又是设计允许的,也有些设计虽然是无毛刺切换,但是切换过程中频率并不规整,但是频率也是可以接受的,这就导致前面章节中我们介绍的频率自动化检查的checker无法cover所有的需求,只能waive掉这些特殊的时钟,但是又担心waive掉后,系统运行过程中有可能漏掉一些不满足最小脉冲要求的情况,即我们常说的glitch。因此,这里我们新增了glitch检查,通过设定最小的min pulse值,让checker自动上报那些不满足脉宽要求的时刻,供验证人员分析。

      其次,glitch的风险还是挺大的,首先在前仿真阶段,有些gltich我们还不一定能够发现,这些问题往往需要到了后仿阶段才有可能暴露出来,而一旦系统运行过程中,出现时钟glitch,将有可能带来不可预估的影响,比如timing不满足导致亚稳态等。因此,一个鲁棒性好的设计,一定要避免设计中出现glitch。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是时钟glitch?

        就是我们通常所说的毛刺,即脉冲宽度很小,举个例子,对于某一款工艺节点的DFF的CK端min pulse要求为0.2ns,当clk的最小脉冲宽度小于0.2ns时,DFF就会出现timing违例。包括低电平glitch以及高电平glitch,尤其对于时钟而言,DFF的CK端有最小脉宽要求,一旦不满足要求,即DFF的timing无法保证,将有可能输出不定态,导致亚稳态传播。

二、使用步骤

1.自动化checker代码如下

`define CLK_GLITCH_CHK(clk_sig,t_min,sign) \
begin \
   real t_last, t_now, t_diff; \
   t_last = 0.0; \
   t_now  = 0.0; \
   begin \
      while(1) begin\
         @(chk_sig); \
         t_now = $realtime; \
         if(t_last >= 0) begin \
            t_diff = t_now - t_last; \
            if((t_diff >= 0) && (t_diff < t_min)) begin\
               err_num ++;\
            end \
         end \
         t_last = t_now;\
      end \
   end\
end\

2.算法解析

       这部分算法的核心即在每个时钟的跳变沿,记录当前时刻,然后用后一个沿时间减去前一个沿时间,计算最小min pulse。

       最后,我们可以在验证环境中调用该自动化checker,如下:

`CLK_GLITCH_CHK(clk_target, 0.1, "clk_target")

 比如上述调用,我们需要对clk_target,检查其在系统运行过程中,任意时刻不能出现最小min pulse小于0.1ns的情况,一旦出现,就会自动向testbench中上报错误信息,方便验证人员进行debug。


总结

      通过宏定义的方式对检查进行主体建模,然后在验证bench中对所有待检查的时钟进行扩展建模,很大程度上减少代码的复杂度,使代码通俗易懂,易维护。同时,通过这种自动化的glitch检查,可以检查出任意时刻,出现glitch时随时向testbench上报错误信息,大大提高验证效率。

      进一步扩展,该checker不仅仅局限于时钟的验证,甚至可以扩展到任意signal,在实战中大家可以尽情尝试。

<think>好的,用户现在问的是如何用SVA检查DUT内两个模块的时钟连接关系。首先,我需要回忆一下之前用户的问题,之前是关于检查两个信号的连接,现在则是时钟连接。时钟作为设计中非常关键的部分,连接是否正确直接影响整个系统的稳定性,特别是跨时钟域的情况。 用户可能对SVA有一定的基础,但可能不太清楚如何具体应用到时钟连接上。我需要考虑不同的场景,比如同步时钟、异步时钟、频率关系、相位关系等等。同时,用户可能需要知道如何验证时钟是否真的按照预期连接,是否存在短路、反相等问题。 首先,要明确时钟连接可能出现的问题:比如两个模块应该使用同一个时钟源,或者不同时钟但有特定频率比,或者完全异步但需要同步器处理。不同的情况需要不同的检查方法。 接下来,我需要考虑如何用SVA来覆盖这些情况。比如,对于同步时钟,检查它们的时钟边沿是否对齐;对于频率关系,检查周期是否匹配;对于异步时钟,可能无法直接检查,但可以验证是否存在同步电路。另外,还需要考虑时钟是否被正确使能,是否存在毛刺等问题。 然后,我需要组织这些思路,给出具体的断言例子。例如,用assert检查两个时钟信号是否同源,或者用覆盖点检查时钟使能信号的有效性。同时,可能还需要结合时序分析工具的结果,因为纯SVA可能在频率检测上有局限性。 还要注意用户可能忽略的方面,比如时钟分频器的正确性,或者门控时钟是否按预期工作。这时候可能需要设计一些断言来监控分频后的时钟是否符合预期频率,或者门控使能信号是否在正确的时间开启或关闭时钟。 最后,需要给出调试建议,比如如何通过波形查看时钟信号,或者结合覆盖率来确保所有情况都被测试到。同时提醒用户,某些检查可能需要综合后的网表才能准确验证,因为RTL仿真可能无法捕捉到物理连接的问题。</think>在 SystemVerilog Assertion (SVA) 中检查模块间时钟连接关系,需根据时钟设计特性构建多维度验证策略。以下是 **7 种典型时钟连接检查方法**,按验证场景分类: --- ### 场景 1:同源同步时钟检查 **目标**:验证两模块使用同一时钟源 ```systemverilog // 断言:clk_A与clk_B必须严格同步 assert_same_clock: assert property ( @(posedge clk_ref) // 基准时钟 $rose(clk_A) |-> $rose(clk_B) // 上升沿必须对齐 ) else $error("Clock phase mismatch: clkA@%0t vs clkB@%0t", $time, $time); ``` #### 增强检查项: - 下降沿对齐:`$fell(clk_A) |-> $fell(clk_B)` - 占空比一致性:`$countones(clk_A) == $countones(clk_B) within [0:period]` --- ### 场景 2:分频时钟验证 **目标**:检查分频电路生成的时钟频率 ```systemverilog // 检查4分频时钟周期是基准时钟的4倍 assert_clock_div4: assert property ( @(posedge clk_div4) $past(clk_ref_cycles, 4) == 4 // 基准时钟4周期对应分频时钟1周期 ); ``` #### 动态分频检查: ```systemverilog // 分频系数动态变化时的验证 assert_dynamic_div: assert property ( @(posedge div_en) first_match(div_ratio) |-> ##[1:div_ratio*2] $changed(clk_div) ); ``` --- ### 场景 3:门控时钟有效性 **目标**:验证时钟门控逻辑 ```systemverilog // 当门控使能关闭时,时钟必须保持稳定值 assert_clock_gating: assert property ( @(posedge clk_src) !gating_en |-> stable(clk_gated) throughout ##[1:2] ); ``` #### 组合检查: ```systemverilog // 门控时钟与源时钟关系 assert_gating_relation: assert property ( clk_gated == (clk_src & gating_en) ); ``` --- ### 场景 4:跨时钟域同步检查 **目标**:验证异步时钟域间同步机制 ```systemverilog // 检查跨时钟域信号同步器(两级触发器) property CDC_sync_check(sig, clk_dst); @(posedge clk_dst) $changed(sig) |-> ##1 $stable(sig_sync1) and ##2 $stable(sig_sync2); endproperty assert_cdc_sync: assert property ( CDC_sync_check(data_in, clk_B) ); ``` --- ### 场景 5:时钟切换保护 **目标**:验证时钟切换电路无毛刺 ```systemverilog // 时钟切换时必须有保护周期 assert_clock_switch: assert property ( @(posedge clk_sel_change) $fell(clk1) |-> ##[glitch_guard_cycles+1] $rose(clk2) ); ``` --- ### 场景 6:时钟相位关系 **目标**:验证多相位时钟的相对关系 ```systemverilog // 检查90度相位差的时钟 assert_phase_shift: assert property ( @(posedge clk_0) $past(clk_90, phase_shift/4) == ~clk_0 ); ``` --- ### 场景 7:时钟树完整性 **目标**:验证时钟网络物理连接 ```systemverilog // 检查时钟树末端信号传播 assert_clock_tree: assert property ( @(posedge clk_root) ##clock_tree_delay (clk_leaf == $past(clk_root, clock_tree_delay)) ); ``` --- ### 调试增强方法: 1. **时钟活动监测**: ```systemverilog cover_clock_active: cover property ( @(posedge clk) 1 // 基础覆盖率 ); ``` 2. **频率异常检测**: ```systemverilog assert_freq_range: assert property ( $realtime - $last_realtime_posedge(clk) < max_period ); ``` 3. **时钟交叉检测**: ```systemverilog assert_no_clock_cross: assert property ( !$cross(clk_A, clk_B) // 禁止时钟边沿重叠 ); ``` --- ### 时钟连接问题定位表: | 现象 | 可能原因 | 验证方法 | |----------------------|---------------------------|--------------------------| | 断言持续违反 | 时钟树未连接/短路 | 检查物理连接/综合网表 | | 周期性断言失败 | 时钟抖动超标 | 添加jitter容忍窗口检查 | | 门控时钟异常 | 使能信号时序不满足 | 检查建立/保持时间约束 | | 跨时钟域数据损坏 | 同步器缺失/级数不足 | CDC同步协议验证 | | 分频时钟频率错误 | 分频计数器错误 | 分频比断言检查 | --- **关键设计建议**: 1. 对关键时钟信号添加`clocking`块约束: ```systemverilog clocking master_clock @(posedge clk_main); output #1ns skew_tolerance; endclocking ``` 2. 使用SVA+UPF联合验证低功耗时钟: ```systemverilog assert_power_clock: assert property ( power_state == ACTIVE |-> !$isunknown(clk_core) ); ``` 3. 对异步时钟域接口强制添加协议检查: ```systemverilog assert_async_handshake: assert property ( @(posedge clk_src) req |-> ##[1:max_latency] ack ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

love混世_魔王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值