Verilog中always@()语句双边沿触发(语法与综合的差异)

本文探讨了Verilog中always@()语句的双边沿触发问题,指出虽然语法上可行,但实际硬件中并不存在对应元件,导致无法综合。通过FPGA中的触发器原理说明,强调在设计时要考虑综合映射到硬件,避免出现无法实现的电路描述。同时提到了奇偶分频电路的两种实现,其中双边沿计数取反方式无法综合。

满足Verilog语法的设计并不一定能够综合,因为Verilog本质上描述的是硬件,因此应该转变思维,只有立足于实际电路而不是语法,设计的功能才能够综合并落地;
硬件描述语言:Verilog本质上是硬件描述,设计的本质仍是硬件设计。因此必须始终记住您正在使用寄存器传输语言(RTL)来合成推断硬件,心中有电路。Verilog HDL几乎可以做任何事情,但是满足语法要求的描述不一定能够综合。 因为进行综合设计时,代码必须映射到FPGA上的可用硬件

触发器与always@()语句:
    FPGA中很常见的器件就是触发器;触发器是一个具有一个时钟且仅对该时钟的一个边缘敏感的器件。 因此,当灵敏度列表为always@(posedge clk)形式时,综合工具只能映射到此设备。 我们有触发器的变种,即可以进行异步预置/清除的触发器,其将映射到always@(posedge clk或<posedge / negedge> rst)语句。
    即实际存在的触发器只有两种:一种只对一个时钟边沿敏感;另一种除对一个时钟边沿敏感外,还有一个异步控制端;
    这就意味着,always@()中最多只能有一个时钟边沿项;双时钟沿触发虽然语法无误,但是无法综合;因为实际中压根就不存在这样的原件,虽然仿真无误,但是综合成对应电路时就会暴露出这一问题;

如之前奇分频电路的实现:奇偶分频电路设计
实现1:上升沿分频,下降沿移位,后两者相或方式

### ### `always@(*)` `assign` 的信号类型定义 在 Verilog 中,`assign` 语句用于对 `wire` 类型的信号进行连续赋值,而 `always@(*)` 块中赋值的信号必须定义为 `reg` 类型。尽管 `reg` 类型通常寄存器相关联,但在组合逻辑中,`always@(*)` 块内的 `reg` 类型并不会综合为触发器,而只是用于表示组合逻辑的输出信号。因此,`assign` 和 `always@(*)` 在硬件实现上可能相似,但在仿真行为和语法结构上存在显著差异[^4]。 ### ### 敏感列表仿真行为 `always@(*)` 中的 `*` 表示该块的敏感列表包含所有输入信号的变化。这意味着,只有当 `always@(*)` 块内的输入信号发生变化时,该块中的赋值操作才会被触发。例如,`always@(*) b = 1'b0;` 中的 `b` 信号在仿真时不会立即更新,因为 `1'b0` 并不会发生变化,导致 `b` 信号保持不定态。相比之下,`assign` 语句是连续赋值的,无论输入信号是否变化,都会实时更新输出信号的值。因此,`assign` 更适合描述纯粹的组合逻辑行为,而 `always@(*)` 更适合描述具有复杂逻辑判断的组合逻辑[^2]。 ### ### 综合结果仿真差异综合过程中,`assign` 和 `always@(*)` 都可以生成组合逻辑电路,例如多路选择器或逻辑门。然而,在仿真阶段,两者的行为可能不同。例如,`always@(*)` 块中的信号更新依赖于敏感列表的触发,而 `assign` 语句会立即更新信号值。这种差异可能导致功能仿真时出现不一致的结果,特别是在未覆盖所有输入变化的情况下。例如,如果 `always@(*)` 块中没有 `default` 分支,可能会生成锁存器,而 `assign` 不会[^3]。 ### ### 代码示例 以下是一个使用 `assign` 和 `always@(*)` 实现相同功能的组合逻辑示例: #### 使用 `assign` 的组合逻辑 ```verilog module combo_assign ( input a, input b, output wire out ); assign out = a & b; endmodule ``` #### 使用 `always@(*)` 的组合逻辑 ```verilog module combo_always ( input a, input b, output reg out ); always @(*) begin out = a & b; end endmodule ``` 这两个模块在硬件实现上可能相似,但在仿真阶段,`always@(*)` 块中的 `out` 信号更新依赖于 `a` 或 `b` 的变化,而 `assign` 会立即更新 `out` 的值[^1]。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值