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

Vivado仿真中always块未按时钟边沿触发的问题排查

Vivado 2023.2仿真时部分always块偶发不触发问题排查

针对你在Windows 11 + Vivado 2023.2环境下,SystemVerilog模块Peak_Mean.sv中peak_reg和mean_reg两个always@(posedge clk)块偶发不触发、输出assign语句不更新的问题,可从以下几个方向排查:

一、代码层面潜在问题

  1. 仿真器优化导致的逻辑冗余判定
    如果这两个always块内的逻辑在特定周期(如第5、6周期)未修改任何寄存器值,Vivado仿真器可能会将其判定为“无活动进程”,跳过触发显示(甚至实际执行被优化)。即使设置了断点,也可能因为进程被标记为 inactive 而不触发。

    • 排查方法:在块内添加一条无意义的寄存器赋值(如logic dummy; always@(posedge clk) dummy <= ~dummy;),强制进程每个时钟周期都有活动,再观察断点触发情况。
  2. 组合逻辑输出的依赖链问题
    你提到的临时方案(将输出改为寄存器类型)说明,原assign语句依赖的内部寄存器(由这两个always块驱动)可能存在仿真更新延迟。当仿真器对内部寄存器的更新时序做了优化时,组合逻辑assign无法及时捕获到寄存器值的变化,导致输出不更新。

    • 排查方法:检查assign语句的驱动源是否唯一,是否存在多驱动冲突;同时确保内部寄存器有明确的复位逻辑(异步/同步复位),未初始化的寄存器可能引发仿真器的异常时序处理。
  3. SystemVerilog语法隐性问题
    检查块内是否使用了自动变量(automatic)、不正确的变量作用域,或者未明确声明的信号类型——这些都可能导致仿真器解析逻辑时出现异常。

二、Vivado仿真设置问题

  1. 仿真优化级别过高
    Vivado默认的仿真优化(如-O2级别)会合并冗余逻辑、跳过无变化的进程执行。在大型项目中,这种优化更容易触发边缘情况。

    • 解决方法:打开仿真设置(Run Simulation -> Simulation Settings),将Optimization Level设置为None,重新运行仿真验证问题是否消失。
  2. 时间精度与单位不匹配
    如果仿真时间单位(timescale)设置过大,时钟上升沿的精度可能被截断,导致仿真器错过部分时钟沿触发。

    • 排查方法:确保模块的timescale设置(如timescale 1ns/1ps)足够覆盖时钟周期的精度需求,同时在仿真设置中匹配对应的时间精度。
  3. 波形压缩或进程过滤设置
    Vivado的仿真波形工具可能启用了“Skip inactive processes”选项,导致未修改寄存器的进程不显示触发记录,给你造成“未执行”的错觉。

    • 解决方法:在波形窗口中右键选择Properties,禁用相关的进程过滤选项,查看完整的进程触发日志。

三、软件版本Bug可能性

Vivado 2023.2属于较新的版本,可能存在仿真器的边缘场景Bug,尤其是在Windows环境下的SystemVerilog进程调度逻辑。

  • 验证方法:
    1. 升级到Vivado 2023.3或更高版本,重复仿真测试;
    2. 在Linux环境下运行相同的仿真工程,对比是否出现同样问题——若仅Windows环境存在,基本可以判定为Windows版本的仿真器Bug。

临时方案的原理说明

你将输出改为寄存器并在always块中直接赋值的方案,本质上是绕过了组合逻辑assign对内部寄存器的依赖链,让输出直接由时钟同步的寄存器驱动,避免了仿真器对组合逻辑时序优化带来的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:40:35