80%的现场bug都出在边界条件上。溢出、极值、临界状态,这些在验证和实验室测试时被漏掉的场景,到了量产后就是灾难。
看一个真实场景:某款芯片的FIFO控制器在流片后被发现,当深度配置为256时会丢数据。问题出在哪?
go
parameter FIFO_DEPTH = 256;
reg [7:0] wr_ptr, rd_ptr;
reg [7:0] data_count;
// 写入控制逻辑
always @(posedge clk) begin
if (wr_en && data_count < FIFO_DEPTH) begin
fifo_mem[wr_ptr] <= wr_data;
wr_ptr <= wr_ptr + 1;
data_count <= data_count + 1;
end
end
// 满标志
assign fifo_full = (data_count == FIFO_DEPTH);
这段代码的致命问题在于:data_count是8位宽,最大只能表示到255,而FIFO_DEPTH配置的是256 。当FIFO写入第255个数据后,data_count变成255,判断255 < 256成立,允许继续写入。但写入后data_count递增到256,8位寄存器溢出归零,FIFO满标志永远无法拉高。