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个周期除外)。