1 code style guide
basic
在实际 RTL 可综合设计中,不允许 X 态存在。X 只是仿真器用来表示“未知/未初始化/多驱动/时序违例”的抽象值,真实硬件只有 0 和 1。仿真中出现 X 通常意味着设计存在缺陷,必须定位并修复,不能带到流片或上板。
FSM
- 采用三段式状态机:
- 第一段:时序块,只更新 STATE。
- 第二段:组合块,计算 next_state。
- 第三段:组合或时序块,根据 STATE 和输入计算输出。
- 数据路径独立:将数据路径逻辑拆分成独立的组合逻辑或子模块,用状态作为选择信号,而不是把大量寄存器更新塞进状态机的 case 中。
- 使用函数/任务:将重复的地址计算、计数器更新封装成函数或任务,减少重复代码。
- 拆分状态:如果状态过多,可以拆分成多个子状态机或使用层次化状态机。
always_comb
默认值技巧
// 推荐:开头给默认值,避免锁存器
always_comb begin
y = 1'b0; // 默认值
if (sel)
y = a;
end
// 也推荐:用 case 的 default
always_comb begin
case (sel)
2'b00: y = a;
2'b01: y = b;
2'b10: y = c;
default: y = 1'b0; // 必须有 default
endcase
end