【发布时间】:2016-06-01 14:22:03
【问题描述】:
有人可以向我解释为什么会推断出闩锁而不是触发器吗?
always_ff @ (posedge clk, negedge rst)
begin
if (!rst)
a <= '0;
end
always 块对信号边沿敏感这一事实是否足以推断出触发器。在这种情况下,当触发复位的下降沿时,a 为 0,否则保持原来的值。
此问题来自此 stackoverflow 问题的选定最佳答案:
System Verilog always_latch vs. always_ff
================================================ ==============================
我将在这里分享我到目前为止发现的内容。之所以合成到锁存器而不是触发器,是因为在分配的右侧是一个 CONSTANT。 在这种情况下,锁存器和触发器的行为是等效的,因为无论是在信号边沿(触发器)还是在启用输入锁存器(锁存器)时捕获输入值都无关紧要因为输入不会改变。所以综合工具会选择占用资源较少的元素,即锁存器。
另一方面,如果在分配的右侧有一个 VARIABLE,则综合将不得不推断一个触发器,因为输入是否在边缘采样(触发器flop)或在启用输入锁存期间(latch),这意味着两个逻辑元件不等价。
这是一个例子。前两个 always 块将综合到一个锁存器(在 Quartus 14 中),这没关系,因为它们是等价的,因为它们是一个常数。但是,3. 和 4. always 块也将被合成到一个锁存器中,这不是预期的行为,并且这些块不等价! 3. 块会发出警告,而 4. 不会。
module ff_latch(
input logic clk,
input logic nrst,
input logic a,
output logic t, x, y, z
);
always_ff @(posedge clk, negedge nrst)
begin
if (!nrst)
t <= 0;
end
always_latch
begin
if (!nrst)
x <= 0;
end
always_ff @(posedge clk, negedge nrst)
begin
if (!nrst)
y <= a;
end
always_latch
begin
if (!nrst)
z <= a;
end
endmodule: ff_latch
对我来说,这种行为是不正确的,因为我特别说过我想要一个触发器(带有边沿触发)。甚至不是编码是模棱两可的,总是块 3. 和 4. 明显不同,从上面的模拟波形中可以看出:
块 3. (tb_y) 的行为类似于 异步触发器,块 4. (tb_z) 的行为类似于 锁存器。 但综合工具在这两种情况下都会推断出闩锁。
如果有人能对此有所了解或评论代码或波形,将不胜感激。
【问题讨论】:
标签: verilog hardware digital-logic flip-flop digital-design