Verilog Latch in always@(posedge clk)

Verilog Latch in always@(posedge clk)

如果我对闩锁的理解正确,它是在组合块中创建的,其中在将变量赋值给值时并未声明所有可能的条件。我如何在顺序块中获得锁存器?

当我通过 Quartus 编译我的代码时,它返回 2 Fmax,这表明我有一个锁存器。

   always@(posedge clk or negedge nreset) begin
      case(counter)
         0: begin
            if(state == IDLE) begin
               // DOES SOMETHING
            end
         end

         1: begin
           // DOES ASSIGNMENT
         end // PROLOG

         81: begin
           // DOES ASSIGNMENT
         end // EPILOG


         82: begin
            // DOES ASSIGNMENT
         end // POSTPROC

         default: begin
            // DOES ASSIGNMENT
         end // ROUNDS

      endcase  

我检查了每种情况,并确保所有分配都是非阻塞的。知道我为什么会闭锁吗?

我的代码正在计算 SHA1

我有2个always@(posedge clk),一个计算下一个Wt,上面一个计算下一个A,B,C,D,E值。

你的 if 上没有 else statement.The 合成器对接下来需要发生的事情感到困惑,因此推断锁存器。

如果这不是故意的,而只是您为堆栈溢出示例编写的内容,那么问题可能出在您的另一个 always 块中。

锁存器只是一个没有时钟的触发器。合成器认为它们不好的原因是它们可能会导致计时错误。闩锁也不总是一个问题,事实上有时您可能已经知道,它们是故意的。

检查你的 assign 语句,看看你是否有任何在 always 块之外声明的 regs 被初始化为 0 或某个值。

在那种情况下,您可能想尝试初始块。 语法:

 initial
 begin

 value = 0;
 input = 0; // or something

 end