如何避免合成期间的闩锁


9

我想使用VHDL设计一个组合逻辑块,但有时合成结果包含一个无意的锁存器。

为了避免合成器推断锁存器,我需要遵循哪些编码准则?

示例:在一小段代码中,我应该使用if-else语句吗?


如果有人可以得到我想问的问题,请通知我

我不确定您从您的示例中得出的意思。请检查以确保改写符合您的原始意图。
W5VO 2011年

@fatai,我已经评论过,在meta.stackexchange.com上有一种删除您的帐户的特定方法。我链接了我被标记的最后一个问题。现场主持人从来没有这种权力。这需要联系开发团队。
Kortuk

Answers:


13

为了避免闩锁,您需要确保所有输出都分配在代码的所有可能分支上。

例如,

if a = '1' then
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

会生成一个锁存器,因为在第一个条件下,未指定b(1)的值,因此编译器决定您要在其中保留b(1)的先前值。编写这种不会生成闩锁的方法是:

if a = '1' then
   b <= prev_b;
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

...

if rising_edge (clk)
    prev_b <= b;
end if;

在这里,您明确声明b应该保留其旧值,然后用新值覆盖b(0)。

另一种方法是给ba默认值,如@TomiJ的答案。

如果您发布代码,则会陷入困境,我们可以帮助您找到具体原因。


我认为您的方法b <= b不会避免闩锁,因为它仍然需要保留信号状态。
Tomi Junnila 2011年

你可能是对的; 我也很习惯逻辑逻辑。我会编辑。
fbo

6

如果您将流程用于组合逻辑(出于这个原因,我建议您不要这样做),那么请确保流程的每条路径都为流程驱动的每个信号分配某种东西。没有任何一个输出可以依赖于该过程“上一次”运行的任何输出。

否则,您会推断出一个锁存器,因为下次调度该进程时,必须保留上次未获得新值的信号值。

我更喜欢将纯粹的组合逻辑作为连续的分配,并使用时钟逻辑的进程,这样我就不会得到闩锁。


5

避免闩锁的四个规则:

  • 不要从您写入的信号中读取。
  • 拥有正确的灵敏度列表(您读取的所有信号都应在灵敏度列表中)
  • 确保在每个路径中分配了所有写入信号。(例如:在if-else语句的每个分支中)
  • 对于使用变量的过程,请确保在读取每个变量之前将其初始化为默认值(在另一个变量或signal中)。

此外,如果您有多个组合过程,请确保不创建循环。

几种编码样式可以帮助您坚持这些规则,例如@TomiJ答案中的样式。正如@Martin Thompson所指出的,最好避免同时使用组合逻辑。而是将所有内容置于定时过程中。


+1套不错的规则。您是否同意规则2(关于敏感度列表)对于确保合成和仿真之间的结果一致确实很重要,但对于锁存器的推论并没有真正的区别吗?
里克2014年

@rick AFAIK,不能保证综合工具对不完整的灵敏度列表会做什么。IEEE VHDL综合标准(1076.6-1999)指出:“过程敏感性列表应包含在过程声明中读取的所有信号。不支持敏感性列表不完整的过程。” 就是说,我知道某些综合工具(也许是全部?)接受不完整的敏感性列表,但是完全忽略了敏感性列表。如果您要依靠这种行为而不是更严格的IEEE标准,我想您的说法将是正确的。
菲利普2014年

谢谢,听起来不错,这会使我的模型不符合该标准。只是出于好奇,因为到目前为止我所见过的所有综合工具都忽略了灵敏度列表,但是我听说有传言说某些工具可以推断出锁存器。
里克2014年

3

正如@fbo和@Martin Thompson所指出的那样,您需要确保由该过程驱动的每个信号在该过程的每个分支中都分配有某个值,并且该值不得依赖于任何输出的先前状态。的过程。

确保这一点的最简单方法是在过程的开始就为每个输出分配一些默认值,例如(选择fbo的示例):

COMBO: process(a)
begin
    b <= (others => '0'); -- Assign default value to b
    if a = '1' then
        b(0) <= '1';
    else
        b(1 downto 0) <= "00";
    end if;
end process COMBO;

1
这是我经常使用的好方法。但是有时,闩锁警告可能会向您指示您忘记分配一些位,而此方法可能会使错误更难发现。例如,如果您要分别分配宽信号的所有位,并且会误计数。
fbo

2
仅在组合过程中。在计时过程中,您可以推断出一个触发器,它可能正是您想要的。
马丁·汤普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.