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。**

相关推荐
博览鸿蒙4 天前
FPGA开发使用的语言
fpga开发·fpga
明德扬4 天前
机器人多摄像头如何做FPGA多路视频聚合?
学习·fpga开发·fpga
JoYER_cc5 天前
FPGA 调试实录:LED 闪烁程序从踩坑到仿真验证的完整经验总结
fpga开发
ktd0075 天前
复旦微开发环境搭建流程备忘录
fpga开发
ERROR:995 天前
陈工,试试Agent开发FPGA
fpga开发
威嵌神州5 天前
复旦微 FMQL100TAI 开发 8 问:仿真器、系统、接口高频问题解答
人工智能·嵌入式硬件·fpga开发
北京青翼科技5 天前
青翼基于PCIe的VU13P FPGA信号处理板
fpga开发·fpga开发板·图像处理卡·pcie板卡
szxinmai主板定制专家5 天前
NXP LS1046A 硬件方案: LS1046A+FPGA 异构加速架构实践
大数据·图像处理·人工智能·嵌入式硬件·fpga开发
Riwuarua6 天前
从近似0基础开始FPGA开发 -- part.14 JESD204协议、IP核与嵌入式初始化
fpga开发·jesd
第二层皮-合肥6 天前
Vivado 自动生成的 AXI‑Lite 从机 IP 的操作步骤
fpga开发