【verilog】多个 if 控制同一个变量(后面会覆盖前面)非阻塞赋值真的并行吗?

非阻塞赋值 (<=) 是"并行"的 ,但是代码顺序会影响结果?"这正是 Verilog 的硬件描述本质 vs 行为语义之间的微妙之处。


💡1. 非阻塞赋值真的并行吗?

是的!非阻塞赋值 <= 从行为上是并行的,也就是说:

复制代码
always @(posedge clk) begin
    a <= b;
    b <= c;
end

这段代码的意思是:

  • 在同一个时钟沿上

  • a 会接收到旧的 b

  • b 会接收到旧的 c

这叫做非阻塞(non-blocking),等价于这样写的"并行赋值逻辑":

复制代码
临时保存所有右边值:
    tmp_a = b
    tmp_b = c
时钟来临,一起赋值:
    a <= tmp_a
    b <= tmp_b

所以你说它"并行"是对的!💯


🧠2. 那为啥还说"顺序会影响结果"?

重点来了!

"并行"只适用于赋值的"时间点",不适用于你写代码时的"表达顺序"

来看下面这个例子,关键点是多个 if 控制同一个变量的场景:

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

⚠️ 虽然都是非阻塞 <=,但表达的是两个赋值行为的意图

a=1b=1,你是想:

  • x 同时变成 1 和 2?硬件无法这么干,它只能接收一个值

  • 所以编译器按照你写的顺序 ,理解为你希望用最后一个赋值为准

即使两个赋值语句都在非阻塞、在行为上并行,它们还是描述了两个竞争的硬件连接,Verilog 编译器不可能自动帮你"合并"这两个赋值。

所以顺序不是运行时的顺序,而是你代码"行为逻辑优先级"的顺序


🏗️3. 抽象层级理解:Verilog的三层视角

层级 你写的代码意义 实际电路含义 是否考虑顺序
行为级 (Behavioral) 多个 if 判断 多个触发条件 顺序决定优先级(谁"最后"赋值)
RTL级 (Register Transfer Level) 每一条赋值对应电路 描述寄存器、组合逻辑 并行,但赋值冲突要人为控制
门级 (Gate Level) 最终逻辑门实现 真正并行门电路 无代码顺序,纯逻辑表达

🔄4. 非阻塞赋值 ≠ 万能同步魔法

非阻塞赋值只是告诉 Verilog 在时钟沿后一起更新,它不会自动解决你逻辑写法上的冲突或覆盖问题。

如果你写多个 x <= xxx;,就相当于你拉了好多根线同时往一个寄存器塞值,编译器只能"按你写的顺序取最后那个"。


✅小结:关键点汇总

问题 回答
非阻塞赋值是并行的吗? ✅ 是的,更新在时钟沿后同时发生
那为什么顺序会影响? 因为你可能给一个变量多次赋值,Verilog 会保留最后一次赋值(前面的等于白费)
所以 Verilog 是并行的吗? ✅ 硬件层面是并行的,但行为描述上,赋值意图仍体现为"谁优先、谁覆盖"
怎么避免这种顺序冲突? - 同一变量赋值最好统一用 if-else - 先算中间变量,最后只赋一次 - 多个模块分开处理不同变量

【verilog】多个 if 控制同一个变量 是否不是标准的语言规范,标准的语言规范应该如何写?

相关推荐
ALINX技术博客15 小时前
【ALINX 教程】FPGA Multiboot 功能实现——基于 ALINX Artix US+ AXAU25 开发板
fpga开发·fpga
Genevieve_xiao17 小时前
【verilog】如何一小时成为verilog高手(并非
fpga开发
从此不归路18 小时前
FPGA 结构与 CAD 设计(第3章)上
ide·fpga开发
Aaron158820 小时前
基于VU13P在人工智能高速接口传输上的应用浅析
人工智能·算法·fpga开发·硬件架构·信息与通信·信号处理·基带工程
碎碎思20 小时前
在 FPGA 上实现并行脉冲神经网络(Spiking Neural Net)
人工智能·深度学习·神经网络·机器学习·fpga开发
集芯微电科技有限公司1 天前
替代HT6310/KP3310离线式AC-DC无感线性稳压器
数据结构·人工智能·单片机·嵌入式硬件·fpga开发
minglie11 天前
Zynq上UART/IIC/SPI的24个实验-第0课:目录
fpga开发
FPGA小c鸡1 天前
FPGA摄像头到屏幕完整链路:从OV5640采集到HDMI实时显示(附完整工程代码)
fpga开发
dai8910111 天前
使用紫光同创FPGA实现HSSTLP IP支持的线速率
fpga开发
s09071361 天前
XIlinx FPGA使用LVDS的电源与电平关键指南
fpga开发·xilinx·lvds