关于工具问题的解决方案,需要“欺骗”合成和优化以保持未使用的信号,但合成似乎在检测和移除实际未使用的信号时非常“智能”。例如,以下代码已经过优化,因为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”这样的属性的工具支持,但这不适用于工具版本。有一个未使用的芯片输出是不可取的。
那么,是否存在一些通常的方式来“欺骗”合成和优化以不优化信号,即使信号有效地未被使用?
答案 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,因此不会删除电路。