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

VHDL信号稳定时长检测问题:无计数器实现方案咨询

无计数器的纯VHDL实现方案

不用计数器的话,可以通过记录信号每次变化的时间戳来计算稳定时长:

  • 定义一个信号(比如last_change_time : time := 0 ns),用来存储信号S上一次发生变化的时间。
  • 在敏感列表包含S的进程里,每当S触发'event时,把last_change_time更新为当前时间now。
  • 当需要检测稳定时长时(比如收到检测触发信号),直接计算now - last_change_time得到实际稳定时长,再和X ns做对比:
    signal S : std_logic;
    signal check_trigger : std_logic;
    signal last_change_time : time := 0 ns;
    signal actual_stable_time : time;
    
    process(S)
    begin
      if S'event then
        last_change_time <= now;
      end if;
    end process;
    
    process(check_trigger)
    begin
      if rising_edge(check_trigger) then
        actual_stable_time <= now - last_change_time;
        if actual_stable_time < X ns then
          report "信号S稳定时长不足,实际为" & time'image(actual_stable_time);
        end if;
      end if;
    end process;
    
    这个方案完全不需要计数器,靠VHDL原生的now函数获取时间戳计算间隔,避开了S'last_event可能遇到的上下文限制问题。
基于OSVVM库的实现方法

OSVVM提供了成熟的事务记录和验证工具,适合做这类信号时长检测:

  • 使用TransactionRecorder组件跟踪信号S的变化,它会自动记录每次信号跳变的时间戳。
  • 调用GetLastTransactionTime函数获取S上一次变化的时间,再计算稳定时长并做检查:
    library OSVVM;
    use OSVVM.TransactionRecorderPkg.all;
    use OSVVM.AlertLogPkg.all;
    
    signal S : std_logic;
    
    -- 初始化事务记录器
    shared variable S_Recorder : TransactionRecorderType := NewTransactionRecorder("S Signal Monitor");
    
    process
      variable last_change : time;
      variable stable_time : time;
    begin
      -- 绑定信号到记录器
      SetTransactionRecorder(S_Recorder, S);
      wait until rising_edge(check_trigger); -- 等待检测触发信号
      last_change := GetLastTransactionTime(S_Recorder);
      stable_time := now - last_change;
      if stable_time < X ns then
        Alert(WARNING, "信号S稳定时长不足,实际为" & to_string(stable_time), S_Recorder);
      end if;
      wait;
    end process;
    
    OSVVM的AlertLog会自动关联信号波形和告警信息,方便后续调试定位。
基于Vunit库的实现方法

Vunit的验证框架可以结合断言和时间检查,快速实现需求并生成清晰的测试报告:

  • 用Vunit的Check库做条件断言,同时记录实际稳定时长:
    library Vunit_lib;
    context Vunit_lib.Vunit_context;
    
    signal S : std_logic;
    signal check_trigger : std_logic;
    signal last_change_time : time := 0 ns;
    
    process(S)
    begin
      if S'event then
        last_change_time <= now;
      end if;
    end process;
    
    test_runner_watchdog(runner, 1 ms);
    
    process(runner)
      variable stable_time : time;
    begin
      test_runner_setup(runner, runner_cfg);
      while test_suite loop
        if run("check_stable_duration") then
          wait until rising_edge(check_trigger);
          stable_time := now - last_change_time;
          check_true(stable_time >= X ns, 
                     "信号S稳定时长不足,实际为" & to_string(stable_time));
        end if;
      end loop;
      test_runner_cleanup(runner);
    end process;
    
    Vunit会自动收集断言结果,在测试报告里明确展示失败原因和实际时长,适合批量验证场景。

内容的提问来源于stack exchange,提问作者Yee Yang Tan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:15:13