Verilog 始终块属性 - 顺序与组合

Verilog always block properties - sequential vs. combinatorial

我明白 always 块可以用来实现过程逻辑和顺序逻辑。

  1. 下面两段代码的gate-level实现是一样的吗?如果是,描述这种连续时间逻辑的正确方法是什么?

一个.

module func(input a, input b , output reg o);
   always @(a,b)
    o=a&b;
endmodule

b.

module func(input, a, input b, output o);
   assign o = a & b;
endmodule

在 (a) 中,'o' 是 reg 类型,在 (b) 中是电线。这种差异意味着什么?

  1. 合成工具实现 FF 所需的 'always' 块属性是什么?我知道以下将导致 FF:
always @(posedge clk or negedge rst)
      [...]

但是,我正在寻找更深入的了解。

您的 (a) 和 (b) 代码在功能上是等效的。这意味着它们将以相同的方式进行模拟,并且在合成时将推断出相同的逻辑。

他们使用 2 种不同的建模风格:(a) 使用 程序 赋值,因为它使用 always 块,而 (b) 使用 continuous赋值,因为没有always块,它使用了assign关键字。

在这种简单的情况下,没有“正确”的方法;它们是实现相同功能的两种不同样式。对于这种简单的逻辑,最好使用(b),因为它使用的代码更少,也更容易理解。但是,如果您的组合逻辑更复杂,过程方法可能更容易理解。

在 (a) 中,o 信号必须是 reg 类型,因为它是在过程逻辑块内分配的。连续分配没有这样的要求。在这种情况下,定义 reg 类型不会产生触发器。当 always 块描述时序逻辑

时,reg 仅推断出触发器

综合工具在 Verilog 代码中寻找特定类型的模式来推断时序逻辑。以下将推断具有 异步 重置的触发器:

always @(posedge clk or negedge rst)
    if (!rst) ...
    else ...

以下将推断具有同步复位的触发器:

always @(posedge clk)
    if (!rst) ...
    else ...

这些只是几个例子。