在合成过程中,我应该关心"找到的闩锁"警告,如果我真的想要闩锁?

时间:2015-08-15 19:29:43

标签: vhdl synthesis circuit

说我有以下状态机:

....
if state_a then
    output_a <= '0';
    next_state <= state_b;
elsif state_b then
    output_a < '0';
    if cond then
        output_b <= '1';
        next_state <= state_a;
    else
        next_state <= state_b;
    end if;
 end if;
 ......

除非在state_b中再次分配,否则我不希望输出更改。但是,当我尝试合成这段代码时,大多数综合工具会在这一行上说些什么:

  

警告:找到信号的1位锁存器&#34; output_b&#34;。闩锁不是   建议用于FPGA设计,因为它可能会导致时序问题   问题。

我应该担心这件事吗?如果是这样,为什么以及有哪些替代方案?

3 个答案:

答案 0 :(得分:1)

关注Xilinx

  

如果打算使用锁定推断,您可以放心地忽略此消息。但是,一些低效的编码风格可能会导致意外的锁定推断。您应该分析您的代码以查看是否有此结果。

一些避免锁存推理的技巧:

  • 确保&#34; if / else if&#34;陈述有一个结论&#34; else&#34;子句,
  • 在每种情况下分配给所有相同的输出,
  • 在case语句中包含所有可能的情况(但要注意WHEN OTHERS子句始终有效,但可以创建无关的逻辑。)

答案 1 :(得分:1)

如果您在时钟进程中有if / elsif或case语句不完整,那么它绝对无害。

if rising_edge(clk)
    if a then
        out <= b;
    end if;
end if;

这意味着你有一些带有某种反馈的触发器,或者就像在这种情况下,你有一个使用时钟使能引脚的触发器,这甚至更好。

如果你在非时钟进程中有if / elsif或case语句不完整 - 它是一个锁存器,它在大多数情况下都是:

  1. 你真不想要的东西;
  2. 指出设计不佳的东西,可以通过重新设计来避免。
  3. 如果你完成了你的小例子,有人可以帮助你重新设计它。现在信息不够。

答案 2 :(得分:0)

您遇到的问题源于您(可能)使用的FSM编码风格。正如其他人指出的那样,不可能猜出你想要代码做什么,因为你没有提供足够的代码来解决这个问题,所以我提出了一种可能的解释,假设你真的想以某种方式改变output_a一次(之后) reset)lock_b的锁存应该在FSM状态转换的同时发生。

每个FSM样式使用2个进程,我们的代码没有给出锁存警告:

----
signal CLK, RESET, cond : std_logic;
type state_t  is (a,b);
signal state, state_next : state_t;
signal ouput_a, output_b, output_b_next : std_logic;
----
  FSM_clock: process(all)
  begin
    if rising_edge(CLK) then
      if RESET then
         state <= a;
         output_b <= '0';
      else
        state <= state_next;
        output_b <= output_b_next;
      end if;
    end if;
  end process;

  FSM_next: process(all)
  begin
    state_next <= state;
    output_b_next <= output_b;
    output_a <= '0';
    case state is
      when a => 
        state_next <= b;
      when b => 
        output_a <= '1';
        if cond then
          output_b_next <= '1';
          state_next <= a;
        else
          state_next <= b;
        end if;
    end case;
  end process;