<= 运算符在这段代码中做了什么?
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 之间的任意数量的时钟:它的行为也是不确定的。
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 之间的任意数量的时钟:它的行为也是不确定的。