如何添加检查器验证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
相关产品推荐
相关产品推荐

