Verilog Latch in always@(posedge clk)
Verilog Latch in always@(posedge clk)
如果我对闩锁的理解正确,它是在组合块中创建的,其中在将变量赋值给值时并未声明所有可能的条件。我如何在顺序块中获得锁存器?
当我通过 Quartus 编译我的代码时,它返回 2 Fmax,这表明我有一个锁存器。
always@(posedge clk or negedge nreset) begin
case(counter)
0: begin
if(state == IDLE) begin
// DOES SOMETHING
end
end
1: begin
// DOES ASSIGNMENT
end // PROLOG
81: begin
// DOES ASSIGNMENT
end // EPILOG
82: begin
// DOES ASSIGNMENT
end // POSTPROC
default: begin
// DOES ASSIGNMENT
end // ROUNDS
endcase
我检查了每种情况,并确保所有分配都是非阻塞的。知道我为什么会闭锁吗?
我的代码正在计算 SHA1
我有2个always@(posedge clk),一个计算下一个Wt,上面一个计算下一个A,B,C,D,E值。
你的 if
上没有 else
statement.The 合成器对接下来需要发生的事情感到困惑,因此推断锁存器。
如果这不是故意的,而只是您为堆栈溢出示例编写的内容,那么问题可能出在您的另一个 always 块中。
锁存器只是一个没有时钟的触发器。合成器认为它们不好的原因是它们可能会导致计时错误。闩锁也不总是一个问题,事实上有时您可能已经知道,它们是故意的。
检查你的 assign
语句,看看你是否有任何在 always
块之外声明的 regs 被初始化为 0 或某个值。
在那种情况下,您可能想尝试初始块。
语法:
initial
begin
value = 0;
input = 0; // or something
end
如果我对闩锁的理解正确,它是在组合块中创建的,其中在将变量赋值给值时并未声明所有可能的条件。我如何在顺序块中获得锁存器?
当我通过 Quartus 编译我的代码时,它返回 2 Fmax,这表明我有一个锁存器。
always@(posedge clk or negedge nreset) begin
case(counter)
0: begin
if(state == IDLE) begin
// DOES SOMETHING
end
end
1: begin
// DOES ASSIGNMENT
end // PROLOG
81: begin
// DOES ASSIGNMENT
end // EPILOG
82: begin
// DOES ASSIGNMENT
end // POSTPROC
default: begin
// DOES ASSIGNMENT
end // ROUNDS
endcase
我检查了每种情况,并确保所有分配都是非阻塞的。知道我为什么会闭锁吗?
我的代码正在计算 SHA1
我有2个always@(posedge clk),一个计算下一个Wt,上面一个计算下一个A,B,C,D,E值。
你的 if
上没有 else
statement.The 合成器对接下来需要发生的事情感到困惑,因此推断锁存器。
如果这不是故意的,而只是您为堆栈溢出示例编写的内容,那么问题可能出在您的另一个 always 块中。
锁存器只是一个没有时钟的触发器。合成器认为它们不好的原因是它们可能会导致计时错误。闩锁也不总是一个问题,事实上有时您可能已经知道,它们是故意的。
检查你的 assign
语句,看看你是否有任何在 always
块之外声明的 regs 被初始化为 0 或某个值。
在那种情况下,您可能想尝试初始块。 语法:
initial
begin
value = 0;
input = 0; // or something
end