Verilog有限状态机(FSM)输出异常问题求助
Verilog FSM仿真count信号异常排查指南
第一步:核对FSM状态跳转逻辑
- 对照FSM模型图,逐行检查设计代码中的状态转移条件:
- 确认每个状态的输入触发条件(时钟沿、复位信号、控制信号等)是否和模型定义一致
- 检查状态编码(独热码/二进制码)是否与图中要求匹配
- 重点排查
count信号的更新逻辑:- 确认
count仅在指定状态下执行自增/复位操作,而非所有状态都触发 - 检查赋值类型:时序逻辑必须用非阻塞赋值(
<=),组合逻辑用阻塞赋值(=),混用会导致仿真时序异常
- 确认
第二步:检查测试平台(Testbench)激励逻辑
- 验证输入激励是否符合FSM触发要求:
- 时钟信号的周期、占空比是否正确,是否存在毛刺
- 复位信号的释放时机是否合规(需在时钟上升沿前稳定释放)
- 控制信号的变化是否与FSM模型中的触发条件同步,避免时序不匹配
- 确认测试平台中模块例化的端口映射完全对应,
count输出是否正确连接到观测信号
第三步:分析仿真波形细节
- 定位
count异常的时间点,查看对应时刻的:- 当前FSM状态、输入信号值,对比模型判断是否应该触发
count更新 count信号的变化是否与时钟沿对齐——时序逻辑下count必须在时钟沿后更新,异步变化说明赋值逻辑错误
- 当前FSM状态、输入信号值,对比模型判断是否应该触发
- 若使用
$display/$monitor打印语句,核对仿真日志中的状态和count值是否与波形一致,排除波形显示配置问题
第四步:代码层面常见错误排查
- 检查
count初始值设置:- 复位状态下是否将
count置为预期初始值(如0) - 寄存器型变量是否在模块开头或复位逻辑中完成初始化
- 复位状态下是否将
- 排查多驱动问题:确认
count仅在FSM状态逻辑中被赋值,无其他模块/语句同时驱动该信号 - 检查条件判断逻辑:
if-else分支是否覆盖所有状态,是否存在遗漏分支导致count未被正确更新
内容的提问来源于stack exchange,提问作者Danny Chang
相关产品推荐
相关产品推荐

