|
|
📌 现象:RTL 仿真全绿,上板偶发错码
▍上周某接口模块 100MHz 采样,实测约 0.3% 概率出错,仿真却完全复现不了
🔍 定位三天,最后在一个时序 always 块里找到了阻塞赋值(=)
🧩 为什么仿真看不出来
⚡ 阻塞赋值立即生效,多个 always 块对同一信号交错读写时,执行顺序不确定
⚡ 仿真器调度顺序恰好掩盖了竞态,零延迟 RTL 仿真里常常测不到
✓ 一上板真实延迟介入,竞争条件立刻暴露,而且概率性复现极难
🔧 三条铁律
▍时序逻辑一律用非阻塞赋值(<=),保证读旧值
▍组合逻辑用阻塞赋值,但中间变量只在本块内部使用
✓ lint 工具开启 race condition 检查,别指望 code review 人眼抓
💡 结论
📐 仿真通过不等于设计正确,编码风格才是第一道防线
🧪 每次改代码后跑一遍 race 检查,成本不到一分钟,比上板抓虫便宜一百倍
抛个问题:你们团队 lint 是强制门禁,还是靠自觉跑? |
|