«Мертвый код» в Xilinx - PullRequest
       21

«Мертвый код» в Xilinx

2 голосов
/ 19 февраля 2009

У меня есть некоторый код VHDL, который я пишу для класса. Однако инструмент синтеза идентифицирует cell3, cell2 и cell1 как «мертвый» код и не будет его синтезировать.

Я действительно понятия не имею, что вызывает удаление клеток 3,2,1 в процессе синтеза; Я просмотрел это более 5 раз и спросил несколько разных людей, и я не могу найти «почему».

Не ищите решения, просто указатель на причину.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;



entity multiply is
    Port ( a : in  STD_LOGIC_VECTOR (3 downto 0);
           b : in  STD_LOGIC;
           clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;

           p : out  STD_LOGIC);

end multiply;

architecture Behavioral of multiply is

    component cell_a port(
                s: in std_logic;
                c: in std_logic;
                a: in std_logic;
                b: in std_logic;
                clk: in std_logic;

                c_out: out std_logic;
                s_out: out std_logic);
    end component;

    signal c_s_0: std_logic;    --loopback wire for cell 0 from carry to sum
    signal c_s_1: std_logic;
    signal c_s_2: std_logic;
    signal c_s_3: std_logic;

    signal xfer1_0: std_logic;  --wire between 1 and 0
    signal xfer2_1: std_logic;  --"     2 and 1
    signal xfer3_2: std_logic;      --"     3 and 2


begin

    cell3: cell_a port map(
                                    clk => clk, 
                                    s => c_s_3 , c => '0',   a => a(3), b => b,
                                    c_out => c_s_3, s_out => xfer3_2
                                    );

    cell2: cell_a port map(
                                    clk => clk, 
                                    s => c_s_2 , c => xfer3_2, a => a(2), b => b, 
                                    c_out => c_s_2, s_out => xfer2_1
                                    );

    cell1: cell_a port map(
                                    clk => clk, 
                                    s => c_s_1, c => xfer2_1, a => a(1), b => b, 
                                    c_out => c_s_1, s_out => xfer1_0
                                    );

    cell0: cell_a port map(
                                    clk => clk, 
                                    s => c_s_0 , c => xfer1_0, a => a(0), b => b, 
                                    c_out => c_s_0, s_out => p
                                    );
    process(clk)
    begin
        if(clk'event and clk = '1') then
            if(rst = '1') then
            --reset logic here. Magic happens and the circuit goes to all 0
            end if;
        end if;
    end process;
end Behavioral;

Ответы [ 2 ]

8 голосов
/ 19 февраля 2009

Все, что я могу предложить, не видя остальную часть кода, это то, что ваш вход 'c' для cell_a не используется, что приводит к тому, что все выходы из cell3 / 2/1 не используются (следовательно, мертвый код, так как он не производит наблюдаемые результаты).

cell0 создается, потому что вывод 'p' множителя можно наблюдать.

1 голос
/ 19 февраля 2009

Возможно, что ячейка 1-3 оптимизируется при синтезе, поскольку выход этого блока "p" составляет всего 1 бит.

Вам не нужно полностью оценивать всю логику, чтобы определить, должен ли этот бит быть 0 или 1.

...