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

如何在SystemVerilog中验证vld首次拉高时的data值?

解决SystemVerilog断言中首次vld拉高时的data验证问题

你的问题在于原断言只检查了20周期内存在某个时刻vld拉高且data等于'h20,但没有限定这是第一次vld拉高的时刻——这就导致哪怕第一次vld时data不符合要求,只要后续有一次符合,断言就会误判通过。

下面给出两种修正方案,都能精准验证首次vld拉高时的data值:

方案一:用first_match锁定首次vld时刻

利用first_match操作符可以匹配序列中最早出现的符合条件的时刻,这样就能确保我们只检查第一次vld拉高时的data:

sequence correct_first_vld_data;
    // 匹配1-20周期内最早出现的vld时刻,并检查此时的data是否为'h20
    first_match( ##[1:20] vld ) ##0 (data == 'h20);
endsequence

property prop_correct_first_vld_data;
    @(posedge clk) 
    precondition_met -> correct_first_vld_data;
endproperty

assert property (prop_correct_first_vld_data);

first_match会忽略后续的vld触发,只聚焦于第一次出现的vld,完美契合你的需求。

方案二:用局部变量跟踪vld触发状态

如果需要更灵活的控制(比如明确处理“20周期内未触发vld”的场景),可以用局部变量来标记是否已经见过vld:

property prop_correct_first_vld_data;
    bit vld_seen; // 局部变量,标记是否已出现过vld
    @(posedge clk)
    disable iff (!reset_n) // 根据实际电路添加复位条件
    precondition_met |-> 
        (1'b1, vld_seen = 0) throughout 
        (
            // 1-20周期内首次触发vld时,检查data值,并标记vld_seen为1
            ##[1:20] (vld && !vld_seen && (data == 'h20), vld_seen = 1) 
            or 
            // 20周期内未触发vld,断言也通过
            (##20 !vld)
        );
endproperty

assert property (prop_correct_first_vld_data);

这个方案不仅能确保首次vld的data正确,还明确处理了“20周期内未触发vld”的合法场景,逻辑更严谨。


内容的提问来源于stack exchange,提问作者Prasanna UV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:17:03