Ce TP va consister à calculer la valeur PI sur HoMade suivant une méthode Monté-Carlo, à partir de codes développés avec cet assembleur et de votre propre Short_IP. Une partie du calcul se fera par programme et une partie par matériel (IP).
L'assembleur contient une liste d’IPs prédéfinis pour lesquels il existe pour chacun un nom correspondant. Vous pourrez modifier ce fichier si vous voulez modifier l’assembleur ou ajouter par la suite vos propres IPs, à vos risques et périls ;-). Cet assembleur produit entre-autres le fichier que vous chargerez dans la mémoire d‘instructions des processeurs HoMade maître et esclaves via le port UART. Un exemple de code source est fourni sur le site HoMade. Vous en avez un ici avec le code test_led.fsh. Chargez cet exemple dans le dossier programmes.
Ce TP va consister à valider quelques algorithmes sur HoMade à partir de codes développés avec cet assembleur et de développer votre propre Short_IP.
La commande d’assemblage se lance avec java :
Antrlr4
antlr4 est déployé sur les postes du M5. => Il est disponible dans /usr/share/java/antlr4-4.5.1.jar ,
ajoutez ce chemin dans votre classpath ainsi que le dossier unzippé ( ici . en lançant la commande depuis ce dossier)
export CLASSPATH=/usr/share/java/antlr-4.5-complete.jar:.:$CLASSPATH
ou en utilisant la version locale
export CLASSPATH=/home/........ ...../v6.1.1/antlr-4.5-complete.jar:.:$CLASSPATH
java HV6 test_led.fsh ou java -classpath /usr/share/java/antlr-4.5-complete.jar:. HV6 test_led.fsh si vous n'avez pas changer le CLASSPATH
Cela produit 3 fichiers :
.hmd est le binaire à charger sur votre HoMade,
.isim est le code à recopier dans masterbench pour la simulation du programme sur le softcore HoMade et
.vhd sera non vide lors de la spécification fonctionnelle d'IP en Hasm qui génère alors le code vhdl de cet IP, on ne l'utilisera pas cette année....
Compilez le fichier test_led.fsh et comparez la structure du code binaire avec celui que vous aviez à votre disposition dans le TP précèdent. Simulez-le. Exécutez-le sur la carte.
Ecrire le code add32.fsh qui lit 2 nombres de 16 bits et les place sur la pile, puis il crée 1 nombres de 17 bit par la somme des deux avant d'afficher le résultat sur l’afficheur 7 segments pour les 16 bits de poids faibles et le 17ieme bit sur les led. Vous pourrez utiliser une fonction pour la saisie d’un mot de 16 bits et une boucle qui l’appelle 2 fois.
Utilisez les IP TIC et TICRAZ pour afficher, avant la valeur résultat, le nombre de cycles nécessaires pour ce calcul (une fois les quatre nombres sur la pile et avant l'affichage du résultat sur le 7seg)
Proposez un IP RDM sur 32 bits qui génère le prochain nombre aléatoire de la série lorsqu'il est appelé par une instruction HoMade de type IP. On utilise un composant LFSR qui renvoie un nombre aléatoire sur 32 bits (Linear Feedback Shift Registers). Vous avez bien sûr lu les informations sur LFSR. Pour un générateur 4 bits il suffit de 4 bascules D et de relier les sorties des bascules 0 et 1 par un XOR2 pour alimenter l'entrée de la bascule 3. La bascule 3 est initialisée à '1', les autres à '0'. Voici le schéma d'un tel circuit:
Pour un générateur de nombres aléatoires de 32 bits, on utilise la même construction en appliquant un XOR sur les sorties 0, 2, 3 et 4 afin d'alimenter la bascule 31. On initialise le bit 31 à '1' et les autres à '0'.
En Vhdl et toujours pour 32 bits vous allez créer un fichier par Add sources de type VHDL de nom random. Placez ensuite les ports de ce composant. Vivado vous aide en cela, vous avez la possibilité de spécifier de suite les noms, le sens et la taille de tous vos ports. Vous pourrez toutefois en rajouter ensuite si besoin était.
Définissez l'architecture puis testez ce composant VHDL qui produit un nombre aléatoire r sur 32 bits. Au démarrage ou après un reset , la valeur initiale est mise à r<=x"80000000", à chaque génération du nombre suivant, le décalage à droite de r est complété sur le bit 31 par la fonction r(31) <= (((r(0) xor r(2)) xor r(3)) xor r(4)) . Le signal enable permet de produire ou non le nombre aléatoire suivant. Une description structurelle ou comportementale convient. Validez le comportement de cet IP par simulation. Pour lancer une simulation sur un code vhdl , il est préférable via Settings>Simulation de créer un nouveau simulation set sim2, c'est lui qui sera actif et ramdom sera mis comme set as top. Il faudra revenir sur sim_1 pour simuler le processeur HoMade par la suite.
Voici l'entity :
entity random is
generic ( width : integer := 32 );
port (
clk , reset : in std_logic;
enable : in std_logic;
random_num : out std_logic_vector (width-1 downto 0) --output vector
);
end random;
En vous aidant du code de IPtic.vhd (voir dans le projet Basys3v6) proposez un code vdhl qui réalise l'IP_rdm en instanciant le composant random et en produisant un résultat sur le bus seulement si le IPcode produit correspond au Mycode de IP_rdm, Le composant random sera actif que lors d'un appel à cet IP via IPcode. Voici l'entity :
entity IP_Rdm is
GENERIC (Mycode : std_logic_vector(10 downto 0) := "00000010000"
);
port (
clk , reset : in std_logic;
IPcode : in std_logic_vector (10 downto 0);
Tout : out std_logic_vector (31 downto 0)
);
end IP_Rdm;
Dans le code Hmaster.vhd il vous reste à dé-commenter ce qui concerne IP_rdm, et vérifiez dans Ipcode.vhd qu'il est bien décommenté. Le code IP de rdm est bien dans ce cas "00000010000". Hasm ne propose pas de nom par défaut pour cet IP. Vous devez utiliser dans votre programme :IP pour associer le nom rdm à un IPCODE respectant word16. Il faut bien sur recompiler le processeur HoMade et le recharger sur la carte!!
Ecrire un programme HoMade qui affiche les 16 bits de poids faibles du 50ième nombre aléatoire de la série en utilisant ce nouvelle IP_rdm. Vérifiez sur le simulateur le nombre de cycle utilisés pour ce programme. Modifiez le programme pour produire cette valeur avec TIC et TICRAZ.
2.(si vous avez le temps seulement, sinon passez à la question suivante) Montrez que l'on peut écrire une fonction logicielle Hasm qui génère cette série aléatoire mais en n'utilisant que des IPs présents dans la bibliothèque de base. Si vous utilisez l'IP Regfile de la bibliothèque il faut avant tout positionner la constante GenM_register à '1' dans le fichier IPcode.vhd;
constant GenM_register : std_logic :='1';
ensuite recompilez le code du processeur et rechargez le sur la carte.Vérifiez par simulation le fonctionnement de cet fonction en plaçant le fichier ism dans le programme de test masterbench.vhd. Quel est le nombre de cycles nécessaires pour afficher le 50ième random? Testez cette version soft sur la carte. Le résultat devrait être le même que la version hard mais beaucoup plus lent!!! Produire le nombre de cycle par programme avec TIC et TICRAZ et obtenez ainsi le facteur d'accélération entre la version hard et la version soft.
Réalisez un programme HoMade qui calcul la valeur de PI par méthode Monte Carlo. Pour chaque tirage d'un nombre aléatoire de 32 bits , les 12 bits de poids faibles f [11:0] et les 12 bits suivants F [23:12] , produiront les cordonnées d'un point dans le carré de taille [ x"FFF" , x"FFF" ] . Il suffit d'identifier le nombre de point satisfaisant l'inéquation F2 + f2 <= x"FFF"2 = FFE001,si la réponse est oui, alors on est dans le cercle et on cumule 1 sinon on est en dehors. Vous avez un IP mul16 disponible dans la version Basys3V6. Il faut faire beaucoup de tirages aléatoires, vous pouvez tester différentes valeurs afin d’observer le comportement de l’algorithme, essayez avec x"10000". En faisant le rapport du nombre de points dans le disque au nombre de tirages, on obtient une approximation du nombre π/4 si le nombre de tirages est grand.
Calculez le nombre de cycles processeur nécessaires hors I/O avec TIC et TICRAZ. Attention ici si vous tirez un grand nombre de random le nombre de cycle nécessaire sera codé sur plus de 16 bits , il faut alors afficher la valeur en 2 fois 16 bits avec deux pressions sur les boutons. Cette valeur servira dans le TP suivant pour le calcul du facteur d'accélération après modification du partitionnement logiciel/matériel!