【问题标题】:Verilog always block properties - sequential vs. combinatorialVerilog 总是阻止属性 - 顺序与组合
【发布时间】:2021-12-23 14:33:00
【问题描述】:

我了解always 块可用于实现过程和顺序逻辑。

  1. 下面两个代码的门级实现会不会一样?如果是,那么描述这种连续时间逻辑的正确方式是什么?

一个。

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 所需的“始终”块属性是什么?我知道以下会导致 FF:
always @(posedge clk or negedge rst)
      [...]

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

【问题讨论】:

    标签: verilog hdl


    【解决方案1】:

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

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

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

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

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

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

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

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

    这些只是几个例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      相关资源
      最近更新 更多