0

刚开始学习System Verilog。我对语句always_ffalways_latch. 前者将用作:

always_ff @ (posedge clk)
begin
    a <= b;
end

而后者:

always_latch
begin
    a <= b;
end

第一个仅由时钟的上升沿激活,并与非阻塞分配相结合产生 FF。

显然被always_latch认为代表一个锁存器,但是为什么要使用非阻塞赋值呢?always_comb使用阻塞分配不是更好吗?

4

2 回答 2

4

通过使用 always_latch 或 always_ff,设计人员打算分别推断锁存器或时序逻辑,但如果逻辑不正确,软件工具可以警告设计人员预期的硬件逻辑未正确推断。

例如:

always_ff @ (posedge clk or negedge rst) 
begin
  if (!rst)
    a <= '0;
end

对于上面的代码,设计者打算只获得一个时序逻辑而不是一个锁存器,但实际上会生成一个锁存器(任何静态工具都会生成一条警告消息,因为“将为逻辑推断锁存器”)

同样,对于以下代码,设计人员的意图是推断硬件锁存器,因此工具将(更好地理解您的逻辑)并且不会报告它。

    always_latch
    begin
      if (rst)
        a <= b;
    end

锁存器是一种时序逻辑,它在时钟电平而不是时钟边沿上工作。

一般来说,最佳实践是对顺序逻辑使用非阻塞赋值,对组合逻辑使用阻塞赋值,这在 Verilog 综合中的非阻塞赋值的第 5.0 节 Verilog 编码指南中进行了详细说明,编码风格致命!

准则 #2:在为锁存器建模时,使用非阻塞分配。

于 2015-07-01T16:14:18.880 回答
2

来自IEEE Std 1800-2012的“9.2.2.3 Latched logic always_latch procedure”部分:

always_latch 构造与 always_comb 构造相同,除了软件工具应执行额外检查并在 always_latch 构造中的行为不代表锁定逻辑时发出警告,而在 always_comb 构造中,工具应在行为不代表组合时检查并发出警告逻辑。

Std 中的代码示例显示了使用非阻塞赋值的 always_latch。

于 2015-07-01T15:58:21.497 回答