Archives par mot-clé : vivado

VHDL: afficher du texte au moment de la synthèse vivado

Lorsque l’on essait de faire des modules VHDL génériques, on utilise massivement les paramètres generic map des modules.

Ces paramètres sont utilisés ensuite à la synthèse pour calculer des tailles de tableaux, des constantes et autre structures matérielles générées.

Pour déverminer cette partie du code on a besoin de «voir» les valeurs qui sont calculées. En VHDL il n’y a pas de printf pour ça, mais il y a report utilisé en simulation dans un process :

process is
begin
    report "Affichons des trucs" severity note;
    wait;
end process;

Sauf que nous ne somme pas en simulation, ce process ne sera même pas traité à la synthèse.

Pour pouvoir afficher du texte on peut utiliser les assertions en les mettant systématiquement à faux pour être sur qu’elles soient affichées :

assert false report "Affichons des trucs à la synthèse" severity note;

Mais rien ne s’affiche dans les log à la synthèse Vivado. Ça n’est pas un bug, c’est juste que Xilinx a désactivé ces messages par défaut. Pour les réactiver il suffit de taper cette ligne magique dans la console tcl avant de lancer la synthèse :

set_param synth.elaboration.rodinMoreOptions {rt::set_parameter ignoreVhdlAssertStmts false}

Le message est ensuite visible dans les log:

INFO: [Synth 8-63] RTL assertion: "Affichons des trucs à la synthèse" [plop.vhd:108]

Merci à brimdavis pour le truc.

Utiliser UNISIM avec GHDL et CocoTB

Les constructeurs de FPGA fournissent des modèles VHDL de leurs primitives. Chez Xilinx cela se présente sous la forme d’une librairie nommée UNISIM.

Le logiciel libre de simulation GHDL n’inclut pas les sources VHDL de cette librairie dans son dépôt officiel car ça n’est pas sa propriété. Cependant, GHDL fourni des scripts permettant de les pré-compiler pour son projet.

Nous allons voir ici comment se servir des primitives disponible dans vivado avec une simulation utilisant CocoTB.

Les sources des primitives se trouvent dans le répertoire d’installation de Vivado

data/vhdl/src/unisims/

Pour les retrouver on peut utiliser la commande fd-find comme ceci :

$ fd unisim -e vhd
Vitis/2021.2/scripts/rt/data/unisim_VCOMP.vhd
Vitis/2021.2/scripts/rt/data/unisim_VCOMP_8h.vhd
Vitis/2021.2/scripts/rt/data/unisim_VCOMP_diablo.vhd
Vitis/2021.2/scripts/rt/data/unisim_VCOMP_e.vhd
Vitis/2021.2/scripts/rt/data/unisim_VPKG.vhd
Vivado/2021.2/data/vhdl/src/unisims/unisim_VCOMP.vhd
Vivado/2021.2/data/vhdl/src/unisims/unisim_VPKG.vhd
Vivado/2021.2/data/vhdl/src/unisims/unisim_retarget_VCOMP.vhd
Vivado/2021.2/ids_lite/ISE/vhdl/src/unisims/unisim_VCOMP.vhd
Vivado/2021.2/ids_lite/ISE/vhdl/src/unisims/unisim_VPKG.vhd
Vivado/2021.2/scripts/rt/data/unisim_VCOMP.vhd
Vivado/2021.2/scripts/rt/data/unisim_VCOMP_8h.vhd
Vivado/2021.2/scripts/rt/data/unisim_VCOMP_diablo.vhd
Vivado/2021.2/scripts/rt/data/unisim_VCOMP_e.vhd

# et pour unimacro :
$ fd unimacro -e vhd
Vitis/2021.2/scripts/rt/data/unimacro_VCOMP.vhd
Vivado/2021.2/data/vhdl/src/unimacro/unimacro_VCOMP.vhd
Vivado/2021.2/ids_lite/ISE/vhdl/src/unimacro/unimacro_VCOMP.vhd
Vivado/2021.2/scripts/rt/data/unimacro_VCOMP.vhd$ fd unimacro -e vhd
Vitis/2021.2/scripts/rt/data/unimacro_VCOMP.vhd
Vivado/2021.2/data/vhdl/src/unimacro/unimacro_VCOMP.vhd
Vivado/2021.2/ids_lite/ISE/vhdl/src/unimacro/unimacro_VCOMP.vhd
Vivado/2021.2/scripts/rt/data/unimacro_VCOMP.vhd
$ fd unimacro -e vhd
Vitis/2021.2/scripts/rt/data/unimacro_VCOMP.vhd
Vivado/2021.2/data/vhdl/src/unimacro/unimacro_VCOMP.vhd
Vivado/2021.2/ids_lite/ISE/vhdl/src/unimacro/unimacro_VCOMP.vhd
Vivado/2021.2/scripts/rt/data/unimacro_VCOMP.vhd

On s’assure d’avoir la variable d’environnement XILINX_VIVADO bien configurée :

$ export XILINX_VIVADO=/opt/Xilinx/Vivado/2021.2/Vivado/2021.2/
$ echo $XILINX_VIVADO
/opt/Xilinx/Vivado/2021.2/Vivado/2021.2/

Il peut être intéressant de mettre les librairies compilé à cet endroit pour y faire référence depuis tous ses projets ensuite :

cd data/vhdl
mkdir ghdl
cd ghdl
/usr/local/lib/ghdl/vendors/compile-xilinx-vivado.sh -all --vhdl2008
[...]

Pour compiler la librairie unisim pour vivado on utilisera le script suivant :

/usr/local/lib/ghdl/vendors/compile-xilinx-vivado.sh -a --vhdl2008
Loading environment...
Not all Xilinx primitives are VHDL-2008 compatible! Setting CONTINUE_ON_ERROR to TRUE.
Analyzing library 'unisim'...
Creating VHDL Library 'unisim'...
Analyzing files into library 'unisim'...
  WARNING: /opt/Xilinx/Vivado/2020.2/data/vhdl/src/unisims/primitive/SYSMONE4.vhd:1536:44:warning: prefix of array attribute must be an object name [-Wattribute]
SCRIPT ERROR: Unfiltered line
v_str_time_length := time'image(now)'length;
SCRIPT ERROR: Unfiltered line
^
  Warnings detected by filtering script.
Analyzing library 'secureip'...
Creating VHDL Library 'secureip'...
Analyzing files into library 'secureip'...
Analyzing library 'unimacro'...
Creating VHDL Library 'unimacro'...
Analyzing files into library 'unimacro'...
Analyzing library 'unifast'...
Creating VHDL Library 'unifast'...
Analyzing files into library 'unifast'...
Analyzing library 'secureip'...
Creating VHDL Library 'secureip'...
Analyzing files into library 'secureip'...
  WARNING: /opt/Xilinx/Vivado/2020.2/data/vhdl/src/unifast/secureip/GTHE2_CHANNEL.vhd:29:1:warning: entity "gthe2_channel" was also defined in file "/opt/Xilinx/Vivado/2020.2/data/vhdl/src/unisims/secureip/GTHE2_CHANNEL.vhd" [-Wlibrary]
SCRIPT ERROR: Unfiltered line
library IEEE;
SCRIPT ERROR: Unfiltered line
^
  Warnings detected by filtering script.
  WARNING: /opt/Xilinx/Vivado/2020.2/data/vhdl/src/unifast/secureip/GTXE2_CHANNEL.vhd:34:1:warning: entity "gtxe2_channel" was also defined in file "/opt/Xilinx/Vivado/2020.2/data/vhdl/src/unisims/secureip/GTXE2_CHANNEL.vhd" [-Wlibrary]
SCRIPT ERROR: Unfiltered line
library IEEE;
SCRIPT ERROR: Unfiltered line
^
  Warnings detected by filtering script.
--------------------------------------------------------------------------------
Compiling Xilinx Vivado libraries [SUCCESSFUL]

La compilation prend un temps infini, compter au moins 5 minutes sur un PC muni de 16 cœurs. Il suffira ensuite d’ajouter les lignes suivantes à son makefile CocoTB :


EXTRA_ARGS+=--std=08
EXTRA_ARGS+=-frelaxed-rules

UNISIMDIR=$(VIVADODIR)/data/vhdl/ghdl/xilinx-vivado/unisim/v93
EXTRA_ARGS=-P$(UNISIMDIR)
...
EXTRA_ARGS=-P$(UNIMACRODIR)

Et roulez jeunesse.

SymbiFlow, vers la synthèse libre pour la Série7 de Xilinx

Le projet IceStorm permettant générer des bitstreams à partir du verilog vers les FPGA ICE40 de Lattice étant maintenant très avancé, W.Clifford se lance avec d’autres dans le reverse-ingineering des FPGA de la Série 7 de Xilinx.

Pour cela, un nouveau projet nommé SymbiFlow est créé pour fédérer les différents outils permettant de développer autour des FPGA de Xilinx. L’objectif à terme étant d’intégrer également les ICE40 à SymbiFlow.

Le projet inclut un sous projet nommé sobrement «Project X-Ray» permettant de documenter les différents éléments du FPGA Artix7 sous forme de carte en ASCII et HTML. Se sous-projet vise à documenter le FPGA mais également à fournir des outils permettant de piloter Vivado avec des design simplistes permettant de générer des statistiques sur les bitstreams générés et approfondir la documentation.

Un des gros changement de SymbiFlow par rapport à Icestorm est la volontés de migrer le placement-routage de arachne-pnr vers VPR. Un sous-projet de VTR développé depuis bien plus longtemps que Arachne-pnr.

Vu le succès remporté par le projet IceStorm, avec la quasi totalité des FPGA ICE40 documenté ainsi que leurs timings, on peut espérer voir arriver rapidement une chaîne de développement libre pour les FPGA de la Série 7 de xilinx. Et voir ainsi le développement open-source sur FPGA devenir une réalité.