如何在不使用特殊编译指令的情况下“欺骗”合成以保留未使用的信号?

时间:2015-06-05 22:28:21

标签: vhdl

关于工具问题的解决方案,需要“欺骗”合成和优化以保持未使用的信号,但合成似乎在检测和移除实际未使用的信号时非常“智能”。例如,以下代码已经过优化,因为unused_*信号未在其他地方使用:

unused_1 <= ...;  -- Some value assigned elsewhere
process (clk_i) is
begin
  if rising_edge(clk_i) then
    unused_2 <= unused_1 and unused_2;
  end if;
end process;

通常有像“keep”这样的属性的工具支持,但这不适用于工具版本。有一个未使用的芯片输出是不可取的。

那么,是否存在一些通常的方式来“欺骗”合成和优化以不优化信号,即使信号有效地未被使用?

2 个答案:

答案 0 :(得分:1)

使信号成为输出。 您可能需要将其连接到分层设计中的顶级输出(引脚)。

答案 1 :(得分:0)

找到一种在2个周期(下面的代码中为one)后生成内部常量“1”值的方法,然后可以对未使用的信号(one or unused_1上的常量“1”值进行“或”运算。然后,由于常数'1'(used_1 and (one or unused_1)),结果值可以在其他表达式上进行AND运算而不起作用。 used_as_1然后经历一个额外的延迟,但具有相同的逻辑值。

为Altera,Lattice和Xilinx生成和内部常量'1'的方法是:

architecture syn of mdl is

  signal cnt : std_logic_vector(1 downto 0) := "00";
  signal one : std_logic;

  signal unused_1 : std_logic;

  signal used_1    : std_logic;  -- Some used signal
  signal used_as_1 : std_logic;  -- Same value as used_1, but merged unused_1 to keep

begin

  -- Trivial '1' made in one without removal by optimization
  process (clk_i) is
  begin
    if rising_edge(clk_i) then
      one <= cnt(0) or cnt(1);
      if unsigned(cnt) = 3 then
        cnt <= std_logic_vector(unsigned(cnt) + 2);
      else
        cnt <= std_logic_vector(unsigned(cnt) + 1);
      end if;
    end if;
  end process;

  -- Merge unused with used code to avoid removal by synthesis
  used_as_1 <= used_1 and (one or unused_1);

  ... actual code

end architecture;

这些工具的当前版本并未将此标识为常量1,因此不会删除电路。