我只想知道这两种说法的区别
always @(posedge CLK)
begin
state <= next_state;
end
和:
always @(CLK)
begin
case(CLK)
1'b1:
state <= next_state;
1'b0:
state <= state;
end
两者有区别吗?
谢谢
我只想知道这两种说法的区别
always @(posedge CLK)
begin
state <= next_state;
end
和:
always @(CLK)
begin
case(CLK)
1'b1:
state <= next_state;
1'b0:
state <= state;
end
两者有区别吗?
谢谢
不完全的。posedge
检测这些转换(来自 LRM):
Table 43—Detecting posedge and negedge
To 0 1 x z
From
0 No edge posedge posedge posedge
1 negedge No edge negedge negedge
x negedge posedge No edge No edge
z negedge posedge No edge No edge
posedge
因此,例如, 0->x 是 a 。您的第二个示例仅检测CLK
以 1 结尾的情况,因此未检测到 0->x 和 0->z。
IEEE标准。1364.1(E):2002 (IEC 624142(E):2005),Verilog 寄存器传输级综合标准,在 Sec. 5.1 敏感列表中没有任何posedge
/negedge
事件的always块是组合逻辑。即事件列表中的信号被忽略,并且块被合成,就好像使用了隐式表达式列表(@(*)
,@*
)。标准中给出了以下示例(第 14 页的“示例 4”):
always @ (in)
if (ena)
out = in;
else
out = 1’b1;
// Supported, but simulation mismatch might occur.
// To assure the simulation will match the synthesized logic, add ena
// to the event list so the event list reads: always @ (in or ena)
(注释也是从标准文档中复制的)
即对于合成工具,您的第二个块实际上是:
always @*
begin
case(CLK)
1'b1:
state <= next_state;
1'b0:
state <= state;
end
它只是一个多路复用器,CLK
作为选择输入,next_state
作为 active-1 输入,输出 ( state
) 作为 active-0 输入反馈。智能综合工具可能会检测到这与CLK
作为使能输入的 d 型锁存器相同,并创建一个 d 型锁存器而不是组合循环。请注意,综合工具不需要检测此锁存器,因为代码state
在所有分支中明确分配(比较标准的第 5.3 节)。
无论哪种方式,这都不同于您的第一个代码示例将合成的 d 型触发器。这是 Verilog 代码在仿真和综合中具有不同含义的众多情况之一。因此,重要的是 (1) 以避免这种情况的方式编写可综合的 Verilog 代码,以及 (2) 始终运行您的设计的综合后仿真(即使您也在使用形式验证!)以确保您已成功避免这个陷阱。
从功能上讲,这两个电路在verilog中描述了相同的行为,所以我认为应该没有区别。
但是,您通常应该使用第一种样式,因为这是编写可综合代码的标准样式,并且其他阅读您的代码的人最容易理解。后一种风格虽然描述了正确的行为,但可能会混淆一些不希望看到对正边沿和负边沿都敏感的时钟的合成器。
Verilog 模拟器可以对 进行左手采样CLK
,从而有效地使case(CLK)
版本与negedge CLK
翻牌相同。否则模拟器会将其视为posedge CLK
失败。这实际上取决于它在特定模拟器的调度程序中的处理方式(或特定合成器将如何处理它)。
最常见的编码风格都使用第一个条件。合成器和阅读代码的任何人都清楚地知道,该代码state
旨在成为具有正沿时钟触发器的触发器。
还有一个模拟性能差异。每个时钟周期posedge CLK
执行 2 个 CPU 操作,而每个时钟周期case(CLK)
将执行 6 个 CPU 操作。在这个例子中,这些差异是微不足道的,但在大型设计中,到处使用的糟糕编码将浪费数小时的仿真时间。
这两个块非常不同。
顶部为您提供一个触发器,而底部为您提供一个带有多路复用器的锁存器,其中 CLK 作为选择信号。
两个块之间的关键区别在于顶部是一个同步块,即posedge clk部分,而底部是与CLK 电平异步的,而不是边缘。