Verilog实现12位序列110001010111检测FSM输出触发异常求助
12位序列检测FSM输出异常问题排查结果
核心问题原因
- 复位逻辑未正确执行:你的序列检测模块采用高电平复位,要求仿真启动阶段先将复位信号拉高至少1个时钟周期,将状态寄存器
st初始化为初始状态w。但Testbench中把复位初始化代码注释,直接将reset设为低电平,导致st初始为不定态,后续状态跳转完全偏离预期。 - 输入激励对齐问题(次要):Testbench中输入信号变化与时钟上升沿完全对齐,可能存在采样建立时间违规,导致模块采样到错误的输入值。
修复方案
- 恢复Testbench中的复位初始化逻辑,修改
initial块代码如下:
initial begin reset = 1'b1; test_input = 1'b0; #(2*T); // 保持复位2个时钟周期,确保所有寄存器初始化完成 reset = 1'b0; test_input = 1'b1; #(T); test_input = 1'b1; #(T); test_input = 1'b0; #(T); test_input = 1'b0; #(T); test_input = 1'b0; #(T); test_input = 1'b1; #(T); test_input = 1'b0; #(T); test_input = 1'b1; #(T); test_input = 1'b0; #(T); test_input = 1'b1; #(T); test_input = 1'b1; #(T); test_input = 1'b1; #(T); $finish; end
- (可选优化)将输入信号切换逻辑对齐到时钟下降沿,避免采样时序风险,可将输入激励的延迟单位改为
#(T/2),或者采用negedge clk触发的赋值逻辑更新输入值。
验证说明
经核验,你设计的状态跳转逻辑完全匹配目标检测序列110001010111,复位逻辑修复后即可在检测到完整序列时在预期位置输出高电平tick。
实测波形参考:
内容的提问来源于stack exchange,提问作者Kartik Mann
相关产品推荐
相关产品推荐

