HDL中assigned 与 always 有什么区别?

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

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


一、本质区别一句话总结

**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小徐2 小时前
深度神经网络FPGA设计进展、实现与展望
fpga开发
FPGA小徐5 小时前
FPGA数字信号处理(一)数字混频实现详解|NCO/DDS原理、有符号数避坑、直流滤除工程实战
fpga开发
Passionate.Z6 小时前
基于FPGA的CLAHE自适应限制对比度直方图均衡算法硬件verilog实现
图像处理·嵌入式硬件·算法·fpga开发·fpga
Szime20 小时前
AD9694 国产替代方案:四通道高速 ADC 在通信与雷达项目中的选型参考
单片机·嵌入式硬件·fpga开发
kaizq1 天前
在线MakerChip虚拟FPGA设计动态仿真实践
fpga开发·mulerun·makerchip·virtualfpgalab·在线动态仿真·imacopilot
FPGA小徐1 天前
OV5640 摄像头 DDR3 缓存 HDMI/VGA 显示系统详解与
fpga开发
Monkey of Semi1 天前
ARTIX-7 FPGA 核心板学习之FPGA Xilinx 7 series 命名规则
fpga开发
ALINX技术博客1 天前
【黑金云课堂】FPGA技术教程Vitis开发:TCP以太网通信
网络协议·tcp/ip·fpga开发
FPGA小徐1 天前
FPGA 电赛信号叠加与分离项目 完整工程包
fpga开发
FPGA小徐1 天前
FPGA在做信号处理相比cpu的优势对比
fpga开发