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

Vhdl 如何";“欺骗”;在不使用特殊编译指令的情况下保持未使用信号的合成?,vhdl,Vhdl,关于工具问题的解决方案,需要“欺骗”合成和优化以保留未使用的信号,但合成在检测和删除实际未使用的信号方面似乎相当“聪明”。例如,下面的代码被优化掉了,因为未使用的*信号没有在其他地方使用: 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

关于工具问题的解决方案,需要“欺骗”合成和优化以保留未使用的信号,但合成在检测和删除实际未使用的信号方面似乎相当“聪明”。例如,下面的代码被优化掉了,因为
未使用的*
信号没有在其他地方使用:

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;
unused_1将信号作为输出。

您可能需要将其连接到分层设计中的顶层输出(pin)。

找到了一种方法,在2个周期后生成一个内部常量“1”值(
下面代码中的一个
),然后可以对未使用的信号(
一个或未使用的\u 1
)进行or运算,由于常数“1”(
已使用\u 1和(一个或未使用的\u 1)
),因此结果值可以在其他一些表达式上进行and运算而不产生任何效果。
在随后经历额外延迟时将_用作_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;
mdl的架构syn是 信号cnt:std_逻辑_向量(1到0):=“00”; 信号一:标准逻辑; 信号未使用_1:标准_逻辑; 使用的信号\u 1:std\u逻辑;——一些旧信号 用作\u 1的信号:标准\u逻辑;——与使用的_1值相同,但合并了未使用的_1以保留 开始 --简单的“1”在一个中生成,无需通过优化删除 过程(clk_i)是 开始 如果上升沿(clk_i),则
你使用哪种工具链?如果您使用的是Xilinx ISE:将属性
KEEP
附加到信号和/或禁用层次展平(KEEP hierarchy)。工具通常不会优化基本体。如果您使用D-FF而不是上升边(…),它将保留翻转。实际上使用Lattice Diamond工具,但问题是是否存在一般方法。这是直接的方法,但正如我在问题中所写的,不可取。这和您的原始问题之间有联系吗?未使用的_1去了哪里?@JimLewis:更新了代码,举例说明如何使用
one
值来欺骗合成,以保持
未使用的_1
,而不影响已使用的信号(前2个周期除外)。