前仿都过了,芯片流片回来就是点不亮。这种情况在行业里见得太多。
问题往往出在两个地方:上电复位和时钟切换。这两个功能看起来简单,实际上是芯片最容易翻车的陷阱。
芯片上电那一瞬间,内部所有寄存器的状态都是不确定的。有的是0,有的是1,完全随机。如果复位电路设计有问题,某些状态机可能会进入非法状态,然后整个芯片就卡死在那里。
更麻烦的是,这种问题在RTL仿真里根本看不出来。因为RTL仿真环境太理想化,复位信号一来,所有寄存器乖乖同时归零。但真实硅片上,复位信号从PAD传到芯片内部深处,会有延迟,会有偏斜,不同区域的电路复位时间根本不一样。
// 看似安全的复位代码 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin state <= IDLE; counter <= 8'd0; end else begin case (state) IDLE: if (start) state <= RUNNING; RUNNING: begin counter <= counter + 1; if (counter == 8'd255) state <= DONE;