SystemVerilog中启用strobe的covergroup事件采样机制疑问
SystemVerilog Covergroup 触发事件与strobe采样的时序协调
当你在covergroup中指定@(posedge clk)作为触发事件,同时设置type_option.strobe=1时,SystemVerilog的调度机制会自动解决触发区域与采样区域的时序差异,具体逻辑如下:
明确时序区域的差异
@(posedge clk)的触发时机是时钟上升沿的Active区域,这是事件触发的常规调度阶段。type_option.strobe=1强制covergroup的采样动作在当前时间步的Postponed区域执行,这个区域是当前时间步的最后一个调度阶段,所有信号赋值操作都已完成并稳定。
时序协调的具体流程
对于示例代码:covergroup c @(posedge clk) type_option.strobe=1; // 定义coverpoint、cross等覆盖率对象 endgroup实际执行步骤为:
- 时钟上升沿到来,进入Active区域,
@(posedge clk)事件触发,系统标记该covergroup需要执行采样,但不会立刻执行。 - 系统继续执行Active、Inactive区域的所有其他操作(比如信号赋值、组合逻辑计算等)。
- 当进入当前时间步的Postponed区域时,才执行covergroup的采样动作,此时所有信号都已经完成当前时间步的更新,采样到的是最终稳定值。
- 时钟上升沿到来,进入Active区域,
设计本质
这种机制本质是利用SystemVerilog的多阶段调度特性,将采样动作从事件触发的Active区域延迟到Postponed区域,既遵循了触发事件的时机,又保证了采样到的是信号的最终稳定状态,避免了采样到中间过渡值的问题。
内容的提问来源于stack exchange,提问作者Gus Mantzorogeorge
相关产品推荐
相关产品推荐

