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

相关推荐
我爱C编程4 小时前
【3.5】固定旋转因子系数乘法模块的FPGA实现1——45°旋转因子和高阶蝶形修正因子
fpga开发·固定旋转因子·旋转因子
Terasic友晶科技14 小时前
答疑解惑 | DE25-Nano开发板串口在访问FPGA端外设LED时卡死,无任何反应
fpga开发·串口·led·de25-nano
尤老师FPGA18 小时前
LVDS系列46:Xilinx Ultrascale系 ADC LVDS接口参考方法(八)
fpga开发
何如呢1 天前
uw_inserter
fpga开发
何如呢1 天前
SC-FDE_tx_comb_part
fpga开发
LCMICRO-133108477461 天前
长芯微LCMDC8588完全P2P替代ADS8588,是一款16位、8通道同步采样的逐次逼近型(SAR)模数转换器
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模数转换器
云端码字人1 天前
007、PCIE数据链路层:可靠传输的保障
fpga开发
nuoxin1142 天前
CH6001FN/BW-富利威
网络·人工智能·嵌入式硬件·fpga开发·dsp开发
LCMICRO-133108477462 天前
长芯微LCMDC8685完全P2P替代ADS8685,16位模数转换器(ADC)
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·模数转换器adc