Erreurs fréquentes avec ISE

De Ensiwiki
Aller à : navigation, rechercher

Laptop.png  Première Année  Puce.png  Matériel 

(Pour une méthode de recherche de problèmes, consulter Debugger un composant VHDL sur FPGA)

Au niveau VHDL

  • N'oubliez pas de préciser dans la liste de sensibilité tous les signaux qui sont susceptibles de faire changer les sorties (à savoir la liste des signaux définis dans la parenthèse qui suit le mot clé process).

Exemple 1 : dans un multiplexeur 2 vers 1 (Sel est la selection, E0 et E1 sont les entrées):

process (Sel,E0,E1)
-- ne pas oublier E0 et E1 sinon la sortie ne changera que si Sel change!!!

Exemple 2 : Dans la partie contrôle, le bloc qui définit l'état à venir et les sorties en fonction de l'état présent. L'état à venir dépend de la valeur de l'instruction (à partir de l'étape 2).

process (ETAT_PRESENT,IR)
  • Un signal ne peut être affecté que par un seul processus (ou affectation hors processus) à un instant donné (ça paraît bête, mais si on l'autorisait, il faudrait aussi dire quelle valeur garder au final ...). La mauvaise nouvelle, c'est que le synthétiseur n'est pas capable, en général, de comprendre finement quand un signal sera affecté ou non. Parfois, ISE va être malin et comprendre tout seul, souvent, il sera stupide. La règle qui marche à tous les coups, c'est de n'avoir qu'un seul process ou une seule affectation concurrente pouvant modifier le signal.

Exemple 1 : on veut avoir une valeur par défaut sur A, mais on s'y prend mal

A <= B;
process (C)
begin
    if ... then
      A <= C;
    end if;
end;

Exemple 2 : on ne veut modifier qu'une partie d'un tableau mais ISE ne comprend pas

A(1) <= B;
process (Sel, C)
begin
    if ... and Sel /= 1 then
      A(Sel) <= C;
    end if;
end;

Si vous avez un problème de ce type, ISE vous le signalera par un message d'erreur mentionant des pilotes (drivers) ou des entrées (inputs) multiples pour un signal donné (qui est connecté d'une manière ou d'une autre au signal fautif, mais ce n'est pas forcément précisément lui dont l'affectation pose problème).

  • Si la création de testbench en VHDL ne marche pas (i.e. vous cliquez sur OK à la fin de la procédure de création du TestBench et il ne se passe rien, sans message d'erreur), ça peut être que vous n'avez pas selectionné le bon composant (cf. ci dessous et copie d'écran).
  • Si lorsque vous lancez la simulation d'un TestBench, elle échoue avec un message du type :

ERROR:Simulator:170 - work/gene_rgb/Behavioral is not compiled properly. Please recompile work/gene_rgb/Behavioral in file "C:/Archi/tp1prep/gene_rgb.vhd" without -incremental option.

ERROR:Simulator:199 - Failed when handling dependencies for entity tb_vga_vhd, architecture behavior

Ouvrez le fichier VHDL en question, modifiez le (par exemple en ajoutant puis effaçant un espace) et re-sauvegardez le.

Au niveau XST (Synthèse)

D'une manière générale, si votre processeur marche en simulation mais pas sur carte FPGA, lisez et relisez Debugger un composant VHDL sur FPGA.

  • Pensez à lire le rapport détaillé de la synthèse, de temps à autre (vous pouvez le lire en dehors d'ISE, c'est le fichier .syr), pour vous assurer que le résultat est à peu près ce à quoi vous vous attendez. Si vous voyez des composants qui n'ont pas leur place dans votre modèle, p.ex. des latches (de loin le problème le plus courant), ça sent mauvais... D'autres exemples de trucs douteux : si votre PC ne se synthétise pas en une machine à états, si ISE ne reconnaît pas des macro blocs dans votre UAL, etc.
  • Parfois ISE vous rapporte des données contradictoires, par exemple :
   Found 16-bit up counter for signal <Regs<0:7>>.
   Found 16-bit up counter for signal <Regs<8>>.
   [...]
   Summary:
       inferred   1 Counter(s).
       [...]

Dans ce genre de cas, il vous faut deviner où sont passés vos signaux (ce qui se manifeste par un surplus dans une autre catégorie de composants) ; regarder les RTL schematics (cf. troisième cours d'amphi) aide, mais au final, personne ne peut être sûr de ce que ISE va vraiment faire... Lisez les schémas RTL, simulez, et priez.

  • Un bug de XST fait qu'il génère du code incorrect dans le cas des registres connectés à la sortie de la ROM (typiquement, IR pour nous) si le registre n'a pas de RESET. Solution : utiliser un registre avec RESET, et forcer ce RESET à 0 par ailleurs.

Au niveau ISE (Gestionnaire de Projet)

  • Mettre les fichiers dans le répertoire ne suffit pas pour l'associer au projet, il faut en plus rajouter les fichiers au projet (Add existing file) - Si ce n'est pas le cas et que vous utilisez un composant non associé au projet, un point d'interrogation s'affiche en face de l'objet dans Sources in project). Attention seuls les fichiers .sch et .vhd peuvent être ajoutés.
  • La création d'un symbole de composant pour un composant créé avec stateCAD doit se faire avec l'élément ..._behavior (... .vhd). Sinon le symbole créé pourra être surprenant.
  • Attention, vous ne pouvez pas avoir 2 composants dans votre projet qui portent le même nom ! On ne peut pas non plus appeler un de nos composant comme l'un défini dans le logiciel (par exemple on ne peut pas créer un composant s'appelant GND ou FD, ...)
Choix du bon composant
  • Dans le Gestionnaire de projet, si vous ne prenez pas le bon composant (Xilinx - Spartan3 - XC3S1000 - FT256 - -4), l'attribution des pattes peut ne pas fonctionner. En tout cas, votre conception ne sera pas opérationnelle. Pour savoir si vous avez choisi le bon composant, regardez en haut à gauche de l'arbre des sources du projet (cf. copie d'écran).
  • Si vous travaillez en dehors des séances, et que vous apportez vos fichiers modifiés sur d'autres machines, vous pouvez avoir des problèmes avec ISE (surtout si la machine sur laquelle vous avez travaillé a une horloge en avance sur celle des machines de la salle de TP). Dans ce cas, vérifiez les dates de vos fichiers et essayez d'utiliser l'option "Cleanup projet files".


Au niveau PACE (Attribution des numéros de patte)

  • Si dans PACE (logiciel lancé lorsqu'on lance Assign Pin Package), le tableau avec le numéro des pattes n'apparait pas il faut ajouter dans les fenêtres visualisables Design Object List (View → Design Object List)
  • Si des noms n'existent plus dans la conception par rapport à ceux définis dans les contraintes (Assign Pin Package), il faut supprimer à la main les contraintes des signaux qui n'existent pas dans le fichier texte (Dans les process du projet User Constraints → Edit Constraints (Text)).
  • IL FAUT ABSOLUMENT ATTRIBUER LES BONS NUMEROS DE PATTES POUR TOUTES LES SORTIES. (Possiblilité de détruire physiquement la carte)
  • En fait, il est en général plus simple d'éditer l'attribution des pattes (fichier.ucf) en mode texte, la syntaxe est simplement :
NET "nom_du_signal_vhdl" LOC="numero_de_broche";
NET "HSYNC" LOC="R9";
...


Au niveau Impact (Programme d'implantation dans le FPGA)

  • Il faut faire toutes les connexions avant de mettre l'alimentation sur la carte D2SB!!!
  • On ne peut pas lancer 2 fois IMPACT (Configure Device), la conséquence est que le composant n'est plus détecté par le logiciel. Il faut donc fermer toutes les applications IMPACT et recommencer.
  • Le nom du fichier à charger porte le nom du composant généré (plus l'extension .bit).
Selection de l'option HIGHZ dans Impact
  • Si la programmation ne marche pas, vérifiez que vous avez bien selectionné l'option HIGHZ dans les préférences d'Impact :

Voir aussi