删除verilog推断锁存器(递增寄存器)

时间:2014-03-31 10:26:55

标签: verilog

always @(state) 
     begin
          case (state)
               zero:
                    rowcounter = 1'b0;
               one:
                    rowcounter = 1'b0;
               two:
                    rowcounter = rowcounter + 1'b0;
               three:
                    rowcounter = rowcounter + 1'b1;
               default:
                    rowcounter = 1'b0;
          endcase
     end

基本上,当state = 2时,我想要' rowcounter'保持其当前值,而如果state = 3,我想要' rowcounter'增量。

我在合成所述代码时遇到问题,它说有推断的锁存器。我跟踪了闩锁,它们位于状态为2' 2时。或者' 3'。即使我已经设置了' rowcounter'的初始值。如下所示为零

initial
begin
rowcounter <= 1'b0;
end

它仍然推断锁存器。有哪些替代方案可以移除锁存器?

1 个答案:

答案 0 :(得分:3)

组合块(always @*)将在它们保持状态时推断锁存器。组合逻辑的输出通常由当前输入完全定义。

在数字逻辑中,只有锁存器触发器可以保持状态。由于你没有定义一个触发器,你有一个锁存器。

使用always @(posedge clk)推断触发器,您还应该使用非阻止分配<=

always @(posedge clk) begin
  case (state)
    zero:  rowcounter <= 1'b0;
    one:   rowcounter <= 1'b0;
    two:   rowcounter <= rowcounter + 1'b0;
    three: rowcounter <= rowcounter + 1'b1;
    default: rowcounter <= 1'b0;
  endcase
end