Verilog Latch in always @(posedge clk)

时间:2015-03-17 23:29:19

标签: verilog hdl

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

当我通过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个总是@(posedge clk),一个计算下一个Wt,上面计算下一个A,B,C,D,E值。

1 个答案:

答案 0 :(得分:1)

else语句中没有if。合成器对于接下来需要发生什么感到困惑,从而推断出锁存器。

如果不是这样,而只是你为堆栈溢出示例编写的内容,那么问题可能在于你的另一个总是阻塞。

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

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

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

 initial
 begin

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

 end