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

相关推荐
Eloudy4 小时前
FPGA (QSFP28 + CMAC US+ RoCEv2) 与 Ubuntu22 + Mellanox 网卡直连分析
fpga开发
szxinmai主板定制专家5 小时前
RK3568+FPGA高速并行采集|半导体探针测试设备多通道同步数据采集系统设计
人工智能·嵌入式硬件·计算机视觉·fpga开发
ARM|X86+FPGA工业主板厂家1 天前
RK3588+FPGA+EtherCAT异构架构解析|工业场景如何同时保住AI算力与微秒级运动实时性
人工智能·fpga开发·架构
zlinear数据采集卡1 天前
从“脏信号”到“纳伏级纯净”:硬核拆解DABL7606的多级抗混叠滤波与24位过采样算法
arm开发·科技·嵌入式硬件·fpga开发·开源
尤老师FPGA2 天前
HDMI数据的接收发送实验(二十)
fpga开发
千寻xun2 天前
三、实战篇-NVME SSD控制之FPGA实现(一)
fpga开发·nvme ssd·nvme协议
XMAIPC_Robot2 天前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
upper20202 天前
从零开始设计riscv cpu记录之七
fpga开发·riscv·riscv设计·btb·分支预测
ARM|X86+FPGA工业主板厂家3 天前
AI视觉跟随运动控制实战|RK3588 NPU检测+FPGA EtherCAT多轴联动精准跟随方案,适用于半导体视觉对位等
人工智能·fpga开发·硬件工程·ethercat·实时系统
XMAIPC_Robot3 天前
RK3588+FPGA半导体设备量产踩坑大全|发热、时序漂移、推理抖动、成像干扰、EMC干扰方案
人工智能·嵌入式硬件·fpga开发·arm+fpga