【问题标题】:Verilog Latch in always@(posedge clk)Verilog Latch in always@(posedge clk)
【发布时间】:2015-03-17 23:29:19
【问题描述】:

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

当我通过 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 值。

【问题讨论】:

  • 这个always块不是组合块。它由时钟事件触发,因此合成器不会推断锁存器,而是推断寄存器(带时钟的触发器)。如果打算将其作为 FSM 的组合部分,则敏感度列表将写为:always @(*)

标签: verilog hdl


【解决方案1】:

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

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

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

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

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

 initial
 begin

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

 end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多