2009-02-18 5 views
2

J'ai un code VHDL que j'écris pour un cours. Cependant, l'outil de synthèse identifie cell3, cell2 et cell1 comme code «mort» et ne le synthétisera pas. Je n'ai aucune idée de ce qui se passe pour que les cellules 3,2,1 soient éliminées en synthèse; J'ai passé en revue plus de 5 fois et demandé à plusieurs personnes différentes et je ne peux pas trouver le "pourquoi"."Code mort" dans Xilinx

Vous n'êtes pas à la recherche d'une solution, juste un pointeur vers pourquoi.

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; 

Répondre

8

Tout ce que je peux suggérer, sans voir le reste du code est que l'entrée de vos « c » cell_a est inutilisé, ce qui provoque l'inutilisation de toutes les sorties de cell3/2/1 (donc, code mort, car il ne donne aucun résultat observable). Cell0 instancie parce que la sortie 'p' du multiplicateur est observable.

+0

Merci. Si j'avais pensé à ça, j'aurais été fait il y a des heures. Je vous remercie. –

1

Il se pourrait que cell1-3 OBTIENNENT optimisés par la synthèse depuis la sortie de ce bloc « p » est seulement 1 bit.

Vous n'avez pas besoin d'évaluer pleinement toute la logique pour déterminer si ce bit doit être un 0 ou un 1.

+1

Apparemment vous le faites, sinon il n'aurait pas été écrit. Comme je l'ai dit dans ma réponse, il s'agit plus probablement d'une erreur dans l'architecture de cell_a. – Zooba

+0

Je ne comprends pas votre commentaire. Je peux écrire quelque chose qui n'est pas nécessaire et cette logique sera optimisée par l'outil de synthèse. Par exemple si j'écris out = in | ! in, alors l'outil de synthèse optimisera la porte OU et la porte INV, et écrira juste = 1. –

+0

Oui, mais si vous vouliez que ce soit inclus et ce ne soit pas le cas, il y a plus de chances qu'une erreur apparaisse votre part. La question implique que le développeur veut que tout le code soit utilisé, et le fait qu'il ne soit pas utilisé est incorrect. – Zooba

Questions connexes