我正在编写用于合成算法的 Verilog 代码,我对哪些情况可能导致推断锁存器有点困惑。下面是这样的一段代码,虽然它在模拟中工作得很好,但我担心它可能会导致硬件问题。
always@(b1 or b2)
.....
// b1_map,b2_map,m1_map & m2_map are derived from combinational functions using b1 & b2
.....
if(b1_map<=20 && m2_map<=20 && b1_map>=0 && m2_map>=0)
begin
accumulator1[b1_map][m2_map]= accumulator1[b1_map][m2_map] + 1;
end
if(b2_map<=20 && m2_map<=20 && b2_map>=0 && m2_map>=0)
begin
accumulator2[b2_map][m2_map]= accumulator2[b2_map][m2_map] + 1;
end
//accumulator1 & accumulator2 are 2d registers mapped like 2d arrays
因此,在这种情况下,我希望仅当数据在指定限制内时才映射数据。是否会因为没有定义“其他”场景而推断出闩锁?我没有添加 else 语句,因为如果数据不在限制范围内,我不想对它做任何事情。
如果你正确地编写了 if 语句,那就没问题了。当 if 语句中存在不更新一个或多个输出的路径时,就会生成锁存器。像下面这样的代码将生成一个锁存器:
always @* begin
if (a) begin
b <= c & d;
e <= f;
end else begin
b <= c | d;
end
end
请注意,仅当 a 为真时才对 e 进行赋值?这需要一个锁存器才能正确实现。
生成锁存器的另一种可能性是当敏感度列表不包含代码中使用的信号时。
always @(a) begin
if (a) begin
b <= c & d;
end else begin
b <= c | d;
end
end
此代码将在 c 和 d 或 b 上生成锁存器,因为它只允许在 a 更改时更新 b。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)