在Verilog中导致闩锁推断的If语句?
我正在为算法的合成编写一个Verilog代码,对于什么情况可能会导致锁存被推断,我有点困惑。下面是一段这样的代码,虽然它在模拟中运行良好,但我担心它可能会在硬件上引起问题在Verilog中导致闩锁推断的If语句?,verilog,fpga,Verilog,Fpga,我正在为算法的合成编写一个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&l
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
始终@(b1或b2)
.....
//b1_图、b2_图、m1_图和m2_图是使用b1和b2从组合函数中导出的
.....
如果(b1_映射=0)
开始
累加器1[b1_地图][m2_地图]=累加器1[b1_地图][m2_地图]+1;
结束
如果(b2_映射=0)
开始
累加器2[b2_地图][m2_地图]=累加器2[b2_地图][m2_地图]+1;
结束
//累加器1和累加器2是像2d数组一样映射的2d寄存器
因此,在本例中,我希望仅当数据在指定的限制内时才映射数据。是否会因为没有定义“其他”场景而推断闩锁?我没有添加else语句,因为如果数据不在限制范围内,我不想对其进行任何处理。如果您正确编写了if语句,您会没事的。当通过if语句的路径不更新一个或多个输出时,将生成锁存。类似以下的代码将生成闩锁:
always @* begin
if (a) begin
b <= c & d;
e <= f;
end else begin
b <= c | d;
end
end
始终@*开始
如果(a)开始
如果你把If语句写对了,你会没事的。当通过if语句的路径不更新一个或多个输出时,将生成锁存。类似以下的代码将生成闩锁:
always @* begin
if (a) begin
b <= c & d;
e <= f;
end else begin
b <= c | d;
end
end
始终@*开始
如果(a)开始
b推断锁存可能来自不完整的敏感性列表或不完整的分配
组合块的灵敏度列表通常应使用始终@*
编写。这样可以避免在更新代码时出现编码错误。组合块(不包括边缘灵敏度)一旦合成,将以始终@*
的方式执行。具体而言,命名信号会增加更多工作,并可能导致RTL到门级(后合成)错误
不完整的赋值意味着必须保留该值,这将推断出锁存。闩锁本身并不坏,但需要仔细考虑。以这种方式推断一个人会移除你原本对它的思想充实和控制。这可能导致复杂的时间问题。因为闩锁是级别敏感的,而不是边缘敏感的。理想情况下,您希望锁存器在时钟周期的第一个周期内打开,以便在从中读取数据时关闭锁存器。闩锁将移除此控件
对于设置合理值(0)的case castanet,使用else(默认值)完成if语句有助于避免这些意外锁存。推断锁存可能来自不完整的敏感度列表或不完整的赋值
组合块的灵敏度列表通常应使用始终@*
编写。这样可以避免在更新代码时出现编码错误。组合块(不包括边缘灵敏度)一旦合成,将以始终@*
的方式执行。具体而言,命名信号会增加更多工作,并可能导致RTL到门级(后合成)错误
不完整的赋值意味着必须保留该值,这将推断出锁存。闩锁本身并不坏,但需要仔细考虑。以这种方式推断一个人会移除你原本对它的思想充实和控制。这可能导致复杂的时间问题。因为闩锁是级别敏感的,而不是边缘敏感的。理想情况下,您希望锁存器在时钟周期的第一个周期内打开,以便在从中读取数据时关闭锁存器。闩锁将移除此控件
对于设置合理值(0)的case castanets,使用else(默认值)完成if语句有助于避免这些意外锁定。您误解了问题(不应该接受答案)
-这个问题从根本上与“闩锁”无关。你的代码不符合要求
感觉(用于合成)。夸特斯知道这一点,它基本上是在告诉你
重写你的代码
你有一个组合块,当一个
信号改变。两个问题:(1)这肯定不是你真正想要的
硬件,和(2)b1时,数字必须保持不变,而不是递增
不要改变。第二个是四分之一的人在报告——你的
电路需要某种内存,它将其报告为“锁存器”。不是
聪明到足以报告第一个问题,这才是真正的问题
试着用真正的硬件绘制电路图。“有什么
b1或b2'的变化实际上意味着什么?您将如何保持产品的价值
b1和b2不变化时的蓄能器?电路不是不可能的,
但这远远超出了所谓的问题
使电路同步,在时钟边缘触发,只需一个时钟
(以及可能的重置)在灵敏度列表中,并准确保留内部
相同的。您的if
语句没有任何错误,因为您实际上
如果没有发生任何有趣的事情,希望累加器保持不变
在b1/b2上。你误解了你的问题(你不应该接受答案)
-这个问题从根本上与“闩锁”无关。你的代码不符合要求
感觉(用于合成)。夸特斯知道这一点,它基本上是在告诉你
重写你的代码
你有一个组合块,当一个
信号改变。两个问题:(1)这肯定不是你真正想要的
硬件,和(2)b1时,数字必须保持不变,而不是递增
不要改变。第二个是四分之一的人在报告——你的
电路需要某种内存,它将其报告为“锁存器”。不是
聪明到足以报告第一个问题,这才是真正的问题
试着用真正的硬件绘制电路图。“有什么
陈