You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何添加检查器验证enable为1时clk是否跳变(clk频率未知)

使能有效时时钟跳变检查器实现方案

设计前提

你需要的检查器核心逻辑为:enable信号为高电平时,检测clk信号是否存在正常的上下边沿跳变,适配clk频率未知的场景。

常用实现方案

方案1:SystemVerilog断言(仿真验证场景)

适合在仿真阶段快速验证逻辑,无需额外硬件开销,直接内嵌到测试平台或RTL代码中即可:

// 断言定义:enable拉高后,直到enable拉低前,clk必须发生至少一次跳变
property p_clk_toggle_when_enable;
    @(posedge enable) disable iff (~rst_n)
    $rose(enable) |-> ##[1:$] $changed(clk) throughout enable[=0];
endproperty

// 断言实例化
a_clk_toggle: assert property(p_clk_toggle_when_enable) 
    else $error("ERROR: enable为高期间clk未发生跳变");

如果需要检测enable高期间clk持续跳变,可修改断言逻辑为:只要enable为高,每两个跳变的间隔不能超过你预设的最大间隔。

方案2:可综合硬件检查器(实芯片/FPGA在线检测场景)

适合流片后或板上运行时的实时检测,需要用到一个频率已知的参考时钟ref_clk,逻辑步骤如下:

  • 对输入的clk信号做异步同步(打两拍)避免亚稳态,再生成双边沿检测脉冲clk_edge_pulse,clk每出现一次上升/下降沿就拉高一个ref_clk周期
  • 配置最大超时计数阈值MAX_TIMEOUT_CNT,该值需根据你场景中clk的最小可能频率计算:MAX_TIMEOUT_CNT = ref_clk频率 / clk最低频率,保证clk最慢情况下两次跳变的间隔也不会超过该阈值
  • 当enable为低时,超时计数器清零,错误标志复位
  • 当enable为高时,超时计数器开始累加,每次收到clk_edge_pulse就清零计数器;如果计数器累加到MAX_TIMEOUT_CNT仍未被清零,就触发错误标志

Verilog实现示例:

module clk_toggle_checker #(
    parameter MAX_TIMEOUT_CNT = 32'd50000 // 按需修改阈值
)(
    input        rst_n,
    input        ref_clk,
    input        enable,
    input        clk,
    output reg   error_flag
);

// clk异步同步
reg clk_sync1, clk_sync2, clk_sync3;
always @(posedge ref_clk or negedge rst_n) begin
    if(!rst_n) begin
        clk_sync1 <= 1'b0;
        clk_sync2 <= 1'b0;
        clk_sync3 <= 1'b0;
    end else begin
        clk_sync1 <= clk;
        clk_sync2 <= clk_sync1;
        clk_sync3 <= clk_sync2;
    end
end

// 双边沿检测脉冲生成
wire clk_edge_pulse = clk_sync2 ^ clk_sync3;

// 超时计数器逻辑
reg [31:0] timeout_cnt;
always @(posedge ref_clk or negedge rst_n) begin
    if(!rst_n) begin
        timeout_cnt <= 32'd0;
        error_flag <= 1'b0;
    end else if(!enable) begin
        timeout_cnt <= 32'd0;
        error_flag <= 1'b0;
    end else begin
        if(clk_edge_pulse) begin
            timeout_cnt <= 32'd0;
        end else if(timeout_cnt == MAX_TIMEOUT_CNT) begin
            error_flag <= 1'b1;
            timeout_cnt <= timeout_cnt; // 锁存计数
        end else begin
            timeout_cnt <= timeout_cnt + 1'b1;
        end
    end
end

endmodule

注意事项

  • 可综合方案的MAX_TIMEOUT_CNT必须匹配你场景中clk的最低频率,阈值设置过小会导致误报,设置过大则会增加检测延迟
  • 如果clk和参考时钟是同步关系,可以省略异步同步的打拍逻辑

内容的提问来源于stack exchange,提问作者Jigar Vaidya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 10:57:04