如果我正确理解了锁存器,则它是在组合块中创建的,其中在将值赋值给变量时并未声明所有可能的条件。如何在顺序块中获取锁存器?
当我通过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个总是@(posedge clk),一个计算下一个Wt,上面计算下一个A,B,C,D,E值。
答案 0 :(得分:1)
else
语句中没有if
。合成器对于接下来需要发生什么感到困惑,从而推断出锁存器。
如果不是这样,而只是你为堆栈溢出示例编写的内容,那么问题可能在于你的另一个总是阻塞。
闩锁只是一个没有时钟的触发器。合成器认为它们不好的原因是它们可能会导致定时错误。锁存器也不总是一个问题,实际上有时你可能已经知道,它们是故意的。
检查您的assign
语句,看看是否在always
块之外声明了任何初始化为0或某个值的regs。
在这种情况下,您可能想尝试初始块。 语法:
initial
begin
value = 0;
input = 0; // or something
end