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)
据我所知,<=
是一个关系运算符,如果为true则返回1,如果为false则返回0,但在此代码中返回的位置是什么?
答案 0 :(得分:0)
在代码的上下文中,<=
不是关系运算符,而是赋值运算符。 Verilog中有两种类型的赋值:
阻止:=
非阻止:<=
在Verilog设计中,你
始终使用组合逻辑的阻止分配
始终对顺序逻辑使用non_blocking分配
如果不这样做,您的模拟将不确定 - 每次运行时它的行为都不一定相同。当然,这不好。
那么,为什么呢?好吧,首先,您必须了解Verilog有4个调度区域:
from prev time step
|
ACTIVE
|
INACTIVE
|
NBA
|
POSTPONED
|
V
to next time step
阻止分配在ACTIVE区域中执行。然而,虽然在ACTIVE区域中评估非阻塞分配的右侧,但是在NBA区域之前不会发生分配。这是您需要将它们用于顺序逻辑的关键。
那么,为什么需要对顺序逻辑使用非阻塞赋值?原因是因为右侧评估与左侧分配之间的延迟使得Verilog仿真能够确定,即每次运行时都表现相同。此延迟意味着模拟的行为不依赖于执行always
块的顺序,如果仅使用阻塞分配,则会执行此操作。
评估非阻塞分配的右侧和分配左侧之间的延迟的简单类比是实际触发器的时钟到Q延迟 。在实际的触发器中,在被采样的D输入(通过时钟)和驱动的Q输出之间总是存在小的延迟(时钟到Q延迟)。这对于实际顺序逻辑的正确操作至关重要。例如,如果在实际触发器中没有时钟到Q的延迟,而不是在4级移位寄存器中为第一个触发器的D输入正好采用4个时钟来获得Q输出第四个触发器,可能需要1到4之间的任意数量的时钟:它的行为也是不确定的。