【verilog】在同一个 always 块中写了多个“看起来独立”的 if / if-else,到底谁先谁后,怎么执行?会不会冲突?

🔍 问题本质

在一个 always @(posedge clk) 块中,所有的代码都是顺序执行 的。但这不意味着它就像软件一样"一条一条执行",因为最终是电路!电路是并行存在的!

Verilog 是硬件描述语言(HDL),你写的 if 看起来像判断语句,实际上是用来描述硬件行为的。比如赋值,就是描述电路连线和寄存器触发器之间的连接与更新方式。


🌰例子一:多个 if 控制不同变量(并行)

复制代码
always @(posedge clk) begin
    if (a) 
        x <= 1;
    if (b) 
        y <= 2;
end

✅ 分析:

  • x 和 y 是两个不同的变量(信号)

  • if (a) 和 if (b) 虽然写在一个 always 里,但它们控制的是不同的变量

  • 所以它们最终在硬件上是并行存在的,谁满足条件谁赋值,互不干扰

🎯 打比方:

你想象有两个电工:

  • 电工A:看到 a=1 就把灯 x 打开

  • 电工B:看到 b=1 就把灯 y 点亮

两个电工各干各的,不会打架。


🌰例子二:多个 if 控制同一个变量(后面会覆盖前面)

复制代码
always @(posedge clk) begin
    if (a) 
        x <= 1;
    if (b) 
        x <= 2;
end

⚠️ 注意:

  • 现在两个 if 都是对 x 赋值

  • 如果 a=1,b=1,那么两个赋值都触发,但最后一个有效

💥 为什么?

Verilog 顺序描述 => 最后一个赋值会"覆盖"前面那个 所以:

  • 如果 a=1,b=1,x <= 2

  • 如果 a=1,b=0,x <= 1

  • 如果 a=0,b=1,x <= 2

🎯 打比方:

还是两个电工:

  • 电工A先来,把灯 x 调到1

  • 电工B后到,把灯 x 调到2

最后你看到灯 x 是2,电工A的动作被"覆盖"了

这里如果有疑惑,可以看这篇博客:
【verilog】多个 if 控制同一个变量(后面会覆盖前面)非阻塞赋值真的并行吗?


🌰例子三:中间插入打拍语句(可以)

复制代码
always @(posedge clk) begin
    if (a)
        x <= 1;
        
    x_d1 <= x;  // 打拍:让x的值走一拍

    if (b)
        x <= 2;
end

⚠️ 这个时候 x <= 1 先执行,但后面又 x <= 2,会不会有问题?

会被覆盖!除非你做数据隔离或选择性赋值


🌰例子四:多个 if else + case 都是并行行为的体现

复制代码
always @(posedge clk) begin
    if (sel == 0)
        x <= 1;
    else if (sel == 1)
        x <= 2;

    case(sel)
        2: x <= 3;
        3: x <= 4;
    endcase
end

😵‍ 分析:

  • 如果 sel == 2,那么:上面 if-else 不触发,case 触发 x <= 3

  • 如果 sel == 1,if-else 触发 x <= 2,case 不触发

但是注意,如果你写多个能影响同一个变量的赋值语句,它们中间的优先级以代码顺序为准


✅ 结论总结

情况 行为 说明
多个 if 控制不同变量 并行 谁条件满足谁执行,互不干扰
多个 if 控制同一个变量 顺序 后面赋值覆盖前面
if/else + case 控制同一变量 顺序+可能冲突 后面的 case 会覆盖前面 if 的赋值
插入打拍语句 合法 不影响并行结构,但要注意覆盖风险
多个嵌套 if 按照语句顺序 但并不表示电路是串行运行,是条件表达上的判断顺序

😎 建议写法

为了代码清晰和避免莫名其妙的赋值冲突:

  • 推荐使用 if-else if-else 结构统一处理一个变量的所有情况

  • 或者先保存中间变量,最后统一赋值

  • 打拍信号最好和主赋值语句分开块写,减少混乱


相关推荐
一口一口吃成大V17 小时前
Fpga中常用器件
fpga开发
Riwuarua19 小时前
从近似0基础开始FPGA开发——Part.23:AXI/AXIS 数据搬运、DMA 与 DDR 缓存架构设计
缓存·fpga开发
Jason_zhao_MR1 天前
电力数据采集核心板选型指南
linux·嵌入式硬件·fpga开发·嵌入式
长春的KAKA1 天前
Proxmark3 RDV4.01:Windows 11 下 Iceman 固件升级与完整使用指南
fpga开发
奋斗的阿狸_19862 天前
ESP32-S3 + ES7210 四通道麦克风录音上传方案
c语言·开发语言·fpga开发
hahaha60162 天前
FPGA+ARM实现AWB的全流程
人工智能·嵌入式硬件·算法·计算机视觉·fpga开发
unicrom_深圳市由你创科技2 天前
板上调试,先抓哪些信号?排查顺序是什么?
fpga开发
北城笑笑2 天前
FPGA 55 ,FPGA 行业 2026 发展分析与报告
fpga开发·fpga
Jason_zhao_MR2 天前
新一代电能数据采集终端方案
linux·人工智能·嵌入式硬件·fpga开发·嵌入式
ERROR:993 天前
AMD Ross没有介入Vivado的私生活
fpga开发