如果我正确理解闩锁,它是在组合块中创建的,在组合块中,当将变量赋值时并不会声明所有可能的条件。我怎么把锁锁在我的顺序块里?
当我通过Quartus编译我的代码时,它实现了2FMAX,这表明我有一个锁存器。
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始终@(后缘clk),一个计算下一个Wt,上面计算下一个A、B、C、D、E值。
发布于 2015-03-17 16:33:50
您的else
上没有if
,statement.The合成器不知道接下来需要发生什么,从而推断锁存器。
如果这不是有意的,而是您为堆栈溢出示例编写的代码,那么问题可能在您的另一个始终块中。
锁存器就是没有时钟的触发器。合成器之所以认为它们不好,是因为它们可能会导致计时错误。锁锁也不总是一个问题,事实上,有时你可能已经知道,它们是故意的。
检查您的assign
语句,看看是否在初始化为0的always
块之外声明了任何regs或某些值。
在这种情况下,您可能希望尝试初始块。语法:
initial
begin
value = 0;
input = 0; // or something
end
https://stackoverflow.com/questions/29111599
复制相似问题