HDL中assigned 与 always 有什么区别?

在 HDL(以 Verilog / SystemVerilog ​ 为主)里,assign和 always都用于描述硬件行为 ,但建模层次、触发方式、可综合性和适用场景都有明显区别。

下面从几个关键维度系统对比说明。


一、本质区别一句话总结

**assign描述的是"组合逻辑的连续赋值",

always描述的是"在某个触发条件下执行的一段过程性语句"。**


二、基本语法与模型差异

1️⃣ assign(连续赋值)

复制代码
assign y = a & b;
  • 属于 连续赋值(Continuous Assignment)

  • 右侧表达式 任一信号变化,左侧立即更新

  • 类似一条硬连线

✅ 特点:

  • 无时钟

  • 无顺序

  • 并行执行

  • 只适合组合逻辑


2️⃣ always(过程块)

复制代码
always @(*) begin
    y = a & b;
end

或:

复制代码
always @(posedge clk) begin
    q <= d;
end
  • 属于 过程性语句(Procedural Block)

  • 只有在 敏感列表触发时​ 才执行

  • 内部可以使用:

    • if / else

    • case

    • 阻塞(=) / 非阻塞(<=)赋值

✅ 特点:

  • 可描述组合逻辑

  • 也可描述时序逻辑

  • 更接近"软件思维方式"


三、核心区别对比表

对比项 assign always
类型 连续赋值 过程块
触发方式 信号变化立即生效 敏感列表触发
是否有时钟 ❌ 没有 ✅ 可以有
是否可描述时序逻辑 ❌ 不行 ✅ 可以
是否支持条件/分支 ❌ 不支持 ✅ 支持
赋值符号 = =或 <=
可综合性 ✅ 仅限组合逻辑 ✅ 组合 + 时序
典型用途 简单组合逻辑 复杂逻辑 / 寄存器

四、组合逻辑:两种写法对比

✅ 用 assign

复制代码
assign y = sel ? a : b;

✅ 用 always @(*)

复制代码
always @(*) begin
    if (sel)
        y = a;
    else
        y = b;
end

📌 等价,但:

  • assign:简洁直观

  • always:更适合复杂逻辑


五、时序逻辑只能用 always

复制代码
always @(posedge clk) begin
    if (!rst_n)
        q <= 0;
    else
        q <= d;
end

❌ 以下写法是非法的 / 不可综合的:

复制代码
assign q = posedge clk ? d : q; // 错误

六、阻塞赋值 vs 非阻塞赋值(always 内)

在 always中:

复制代码
always @(*) begin
    a = b;   // 阻塞赋值
end

always @(posedge clk) begin
    q <= d;  // 非阻塞赋值
end
  • 组合逻辑 :推荐 =

  • 时序逻辑 :必须 <=

⚠️ assign中只能使用 =


七、常见错误与注意事项

❌ 同一信号被多次驱动

复制代码
assign a = b;
assign a = c;   // 错误:多驱动

always @(*) a = b;
always @(*) a = c; // 同样错误

✝ latch 风险(always 中)

复制代码
always @(*) begin
    if (en)
        y = a;
end

❌ 会推断锁存器(latch)

✅ 正确写法:

复制代码
always @(*) begin
    if (en)
        y = a;
    else
        y = b;
end

八、什么时候用哪个?

✅ 用 assign的情况

  • 简单组合逻辑

  • 信号连线

  • 不需要条件判断

✅ 用 always的情况

  • 复杂组合逻辑

  • 时序逻辑(寄存器)

  • 需要 if / case

  • 状态机


九、一句话总结

**assign是"线级建模",

always是"行为级建模";

简单用 assign,复杂用 always。**

相关推荐
FPGA小迷弟4 小时前
FPGA 与千兆以太网校验和:从原理到 Verilog 实现
嵌入式硬件·fpga开发·无人机·ai编程·fpga
码农小韩1 天前
FPGA学习(二)——LED闪烁
fpga开发·verilog·fpga·led·组合逻辑·分频设计
9527华安2 天前
FPGA纯verilog实现DP视频接口,支持2K60帧分辨率,提供3套工程源码和技术支持
fpga开发·音视频·dp
ChaseVLSI2 天前
FPGA与ASIC的区别详解:内部结构、开发成本与适用场景,项目选型到底该选哪个
嵌入式硬件·fpga开发·硬件架构·硬件工程
9527华安3 天前
FPGA实现ARINC818总线协议,基于GT Transceivers Wizard高速收发器,提供7套工程源码和技术支持
fpga开发·transceivers·arinc818
小蘇的FPGA3 天前
fpga-wide-data-crc32
fpga开发
落雨无风4 天前
fpga板级调试常见问题
fpga开发
码农小韩4 天前
FPGA学习(一)——LED点灯与开发流程
学习·fpga开发·入门·环境配置·仿真·点灯
FPGA小迷弟4 天前
FPGA 与千兆以太网:各类物理接口的形式、区别、使用方法与应用场景详解
tcp/ip·macos·fpga开发·udp·fpga
NamoAmitabha1284 天前
Zynq 的 AXI GPIO,是“ARM 通过一条国际标准高速公路(AXI 总线),去遥控 FPGA 里的一个寄存器”。---deepseek
fpga开发·zynq--ps