1

有人可以向我解释为什么会推断出闩锁而不是触发器吗?

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

总是块对信号边缘敏感的事实是否足以推断触发器。在这种情况下,当触发复位的下降沿时,a 为 0,否则保持以前的值。

这个问题来自这个stackoverflow问题的选定最佳答案:
System Verilog always_latch vs. always_ff

==================================================== ==========================

我将在这里分享我到目前为止发现的内容。之所以合成到锁存器而不是触发器,是因为分配的右侧是一个常数。在这种情况下,锁存器和触发器的行为是等效的,因为它是否在信号边沿(触发器)上捕获输入值或在输入锁存启用时(锁存器)作为输入都没有关系不改变。所以综合工具选择占用资源较少的元素,即锁存器。

另一方面,如果在分配的右侧有一个 VARIABLE,那么综合将不得不推断一个触发器,因为输入是在边沿(触发器)上采样还是在输入锁存期间采样很重要启用(锁存器),这意味着两个逻辑元素不相等

这是一个例子。前两个 always 块将合成到一个锁存器(在 Quartus 14 中),这没关系,因为它们是等价的,因为它们是一个常数。但是,3. 和 4. always 块也将被合成到一个锁存器中,这不是预期的行为,并且这些块不等价!3. 块会发出警告,而 4. 不会。

 module ff_latch(
   input logic clk,
   input logic nrst,
   input logic a,
   output logic t, x, y, z
 );

    always_ff @(posedge clk, negedge nrst) 
       begin
          if (!nrst)
           t <= 0;
       end

    always_latch
       begin
          if (!nrst)
           x <= 0;
       end

    always_ff @(posedge clk, negedge nrst) 
       begin
          if (!nrst)
           y <= a;
       end

    always_latch
       begin
          if (!nrst)
           z <= a;
       end

endmodule: ff_latch

对我来说,这种行为是不正确的,因为我特别说过我想要一个触发器(带有边沿触发)。甚至不是编码是模棱两可的,总是块 3. 和 4. 明显不同,从上面的模拟波形中可以看出:

在此处输入图像描述

块 3. (tb_y) 的行为类似于异步触发器,块 4. (tb_z) 的行为类似于锁存器但综合工具在这两种情况下都会推断出一个闩锁

如果有人可以对此有所了解或评论代码或波形,将不胜感激。

4

2 回答 2

4

合成器将推断出锁存器,因为此代码的行为类似于锁存器。它的行为不像触发器。就这么简单。

想想这段代码的行为方式:最初的值为awill 'x。当rst被断言为低a时将变为'0a然后将'0永远存在。因此,状态a不仅取决于输入的当前状态,还取决于过去的状态。因此,我们有时序逻辑,而不是组合逻辑。触发器在时钟沿改变状态;a才不是。always 块对信号边缘敏感的事实是无关紧要的。这只是意味着里面的代码是在那个信号边沿上执行的 - 的上升沿clk。但是当这种情况发生时,什么也没有发生,所以这段代码的行为就像一个闩锁。

于 2016-06-01T14:40:53.723 回答
1

因为您还没有指定在时钟摆位时会发生什么。就好像a根本不依赖clk或不依赖它的姿态。您的所有描述a都是设置为0when rst=0。此外,它(隐含地)表示a在所有其他情况下保持其先前的值。这可以通过锁存器来实现。

请注意,仅仅因为您有@posedge ofclk并不意味着该块内的每个变量都将被合成为翻牌。a当块在 clk 的 posedge 被激活时,您还需要一个非阻塞分配。见这里

如果你坚持要实现相同的功能,你可以试试这个:

always_ff @ (posedge clk or negedge rst) 
begin
  if (!rst)
    a <= '0;
  else 
    a <= a;  //Here, we are specifying what happens @posedge of clk
end
于 2016-06-01T23:49:51.243 回答