You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SystemVerilog always块同一变量多次赋值的多维度技术疑问

SystemVerilog 过程块多次赋值行为详解

问题1:该最后赋值优先的行为是否适用于所有always块,还是仅适用于always_comb块?

所有类型的always块(包括always_comb、always_ff、always_latch以及传统的always块)都遵循“最后一次赋值优先”的规则。过程块的执行是顺序语义,在同一个时间步内,对同一个变量的多次赋值操作,只有最后一次赋值会最终更新变量的值。

问题2:该行为是标准规范保障的,还是依赖编译器实现?

这是SystemVerilog标准明确规定的行为,并非依赖编译器实现。在IEEE 1800-2017标准的10.4.2 过程赋值的语义章节中明确说明:在同一个过程语句的执行流程中,对同一个变量的多个过程赋值,只有最后一次赋值会被用来更新该变量。

问题3:阻塞赋值与非阻塞赋值的该行为是否一致?

最终效果一致(最后一次赋值生效),但底层机制不同:

  • 阻塞赋值(=):赋值操作立即更新变量,后续的阻塞赋值会直接覆盖前面的结果。
  • 非阻塞赋值(<=):赋值操作会被放入非阻塞赋值(NBA)队列,同一时间步内同一变量的多个非阻塞赋值,只有最后一次会保留在队列中,待当前时间步的所有阻塞赋值执行完成后,再统一更新变量。
    两者最终都会让变量取最后一次赋值的值。

问题4:至少在Vivado工具中,该行为是否可综合?

完全可综合,而且这是Vivado推荐的组合逻辑避免锁存器的常用写法。通过先给变量赋默认值,再在条件分支中覆盖的方式,工具能明确识别出变量在所有路径下都有赋值,不会推断出不必要的锁存器,最终综合出正确的组合逻辑电路。

内容的提问来源于stack exchange,提问作者ahmouse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 14:03:09