Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Verilog中导致闩锁推断的If语句?_Verilog_Fpga - Fatal编程技术网

在Verilog中导致闩锁推断的If语句?

在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

我正在为算法的合成编写一个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
始终@(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时,数字必须保持不变,而不是递增 不要改变。第二个是四分之一的人在报告——你的 电路需要某种内存,它将其报告为“锁存器”。不是 聪明到足以报告第一个问题,这才是真正的问题

试着用真正的硬件绘制电路图。“有什么 陈