<= 运算符在这段代码中做了什么?

What does <= operator do in this code?

module counter (clk,rst,enable,count);
input clk, rst, enable;
output [3:0] count;
reg [3:0] count;

always @ (posedge clk or posedge rst)
if (rst) begin
  count <= 0;
end else begin : COUNT
  while (enable) begin
    count <= count + 1;
    disable COUNT;
  end
end

endmodule

(来源:http://www.asic-world.com/verilog/verilog_one_day2.html#While

据我了解,<= 是一个关系运算符,如果为真,它将 return 为 1,如果为假,则为 0,但是它在这段代码中的什么地方 return?

在您的代码上下文中,<= 不是关系运算符,而是 赋值运算符 。 Verilog中有两种类型的赋值:

  • 阻塞 : =

  • 非阻塞 : <=

在 Verilog 设计中,您

  • 总是对组合逻辑

  • 使用阻塞赋值
  • 始终对时序逻辑

  • 使用non_blocking赋值

如果你不这样做,你的模拟将是 不确定的 - 它不一定会在你每次 运行 时表现相同。这当然不好。

那么,这是为什么呢?好吧,首先您必须了解 Verilog 有 4 个 调度区域 :

from prev time step
        |
      ACTIVE
        |
     INACTIVE
        |
       NBA
        |
    POSTPONED
        |
        V
 to next time step

阻塞赋值在ACTIVE区域执行。但是,虽然在 ACTIVE 区域评估非阻塞分配的右侧,但分配直到 NBA 区域才会发生。这是为什么需要将它们用于时序逻辑的关键。

那么,为什么需要对时序逻辑使用非阻塞赋值呢?原因是因为右侧求值和左侧赋值之间的延迟使得 Verilog 模拟可以 确定 ,即每次 运行它。这种延迟意味着模拟的行为不依赖于 always 块的执行顺序,如果只使用阻塞分配,它就会如此。

评估非阻塞分配的右侧和分配左侧之间的延迟的一个简单类比是 clock-to-Q 延迟一个真正的人字拖。在实际的触发器中,在被采样(由时钟)的 D 输入和被驱动的 Q 输出之间总是有一个小的延迟(时钟到 Q 延迟)。这对于真实时序逻辑的正确运行至关重要。例如,如果在实际触发器中没有时钟到 Q 延迟,而不是在 4 级移位寄存器中第一个触发器的 D 输入恰好需要 4 个时钟才能到达 Q 输出第四个触发器,它可能需要 1 到 4 之间的任意数量的时钟:它的行为也是不确定的。