Simulation de la CPU d’apprentissage
la dernière fois que j’ai examiné un simple processeur de RISC 16 bits destiné aux étudiants. Il fallait une petite aide sur la documentation ainsi que d’avoir un fichier manquant, mais j’ai réussi à le faire simuler en utilisant une utilisation gratuite sur Internet appelé EDA Playground. Cette fois, je vais vous emmener avec les détails du code ainsi que sur la manière d’exécuter la simulation.
Vous voudrez vous référer à la publication précédente si vous ne l’avez pas déjà vérifié. Les diagrammes ainsi que les tableaux fournissent un aperçu de haut niveau qui vous aidera à comprendre les fichiers abordés dans ce poste.
Si vous souhaitez vraiment programmer cela sur un FPGA authentique, vous auriez un peu de travail à faire. La mémoire ainsi que l’initialisation du registre est effectuée dans une méthode qui fonctionne bien pour la simulation, cependant ne fonctionnerait pas sur un véritable FPGA. Quoi qu’il en soit, commençons!
File-by-file
Si vous prenez chaque donnée individuellement, aucun d’entre eux n’est extrêmement difficile à comprendre. Voici un délai rapide (j’utilise les noms de données que je vais utiliser dans ma simulation sur Internet):
Paramètre.v – Ceci est comme une société incluant certaines définitions fondamentales de tous les autres fichiers.
PROG.V – C’est la mémoire de la direction. Un module simple, il faut une adresse et présente des données pour cette adresse. La directive $ READMEMB lit les données d’une donnée (test.prog).
register.v – le fichier de registre. Ceci est presque comme la mémoire de direction, mais il a deux ports vérifiés ainsi que vous pouvez en composer.
data.v – la mémoire RAM. Ceci est presque comme les registres, aussi plus grand et avec un seul port à vérification. Il existe un code de simulation qui ouvre une donnée et imprime les commentaires de la mémoire, mais j’ai supprimé cela, car il s’agissait simplement de déboguer. Le contenu préliminaire provient du fichier test.data.
Alu.v – Vous croyez que cela serait compliqué, mais ce n’est pas le cas. Il faut juste deux entrées aussi bien que quelque chose pour produire la sortie. Quelque chose de simple comme ajoute ou soustrait. Le Toujours @ (*) indique à Verilog de ne pas produire de logique chronométrée pour cela. Cela se transforme simplement sur des portes simples aussi bien que des muxes.
DataPath_Unit.v – Il s’agit de l’un des fichiers les plus complexes, bien que si vous le creusez, vous le verrez que c’est principalement en vrac. Ces données produisent toutes les ressources (telles que les registres ainsi que les mémoires), ainsi que les câbles ensemble.
Control_unit.v – Un module plus plus long plus long, cela implémente simplement la table de direction, définissant les lignes de contrôle en fonction de l’instruction actuelle.
Alucontrol.v – Ces données décochent des instructions pour l’ALU. Il manquait sur le post original. Curieusement, il existe un CPU plus similaire sur le même site qui comporte un fichier d’alucontrol, mais il est clairement pour une direction différente. Cependant, commencer à garder ces données ainsi qu’à utiliser la table de style, j’ai pu recréer. Si [FPGA4Students] corrige cela, les fichiers peuvent être extrêmement différents.
Design.sv – Ces données sont nécessaires pour le simulateur Edaplayground que j’utilise. Il contient les éléments de niveau supérieur (le chemin de données ainsi que l’unité de contrôle). Étant donné que Edaplayground ne traite que ce fichier, il est nécessaire d’inclure les autres fichiers mentionnés ci-dessus. Cela provoque des avertissements depuis que chacun d’entre eux a une directive de calendrier, mais cela est inoffensif.
testbench.sv – Le testbench ne fait pas partie de la conception authentique, cependant définit simplement la simulation et collecte les résultats. Je devais le modifier un peu à travailler avec Edaplayground, mais l’opération est la même. Il produit simplement une CPU, nourrit une horloge et le permet de courir pendant un moment. Le programme de test ainsi que le contenu de la mémoire sont dans test.Prog aussi bien que test.data.
Simulation
Vous pouvez faire l’une des deux choses. Vous pouvez ouvrir ma copie du style prêt-à-go, mais ce n’est peut-être pas votre meilleure option. Je vous suggérerais d’aller à Edaplayground et de produire un nouveau projet Verilog. Commencez ensuite à déplacer les fichiers du message d’origine. Vous rencontrerez des erreurs ainsi que des fichiers manquants. Voyez exactement combien vous pouvez corriger. Si vous êtes soulevé, vous pouvez utiliser ma copie pour vous aider si vous êtes soulevé. Vous découvrirez plus de cette façon.
Si vous choisissez de l’essayer, il y a quelques conseils sur Edaplayground. Vous n’ayez pas besoin d’exigence UVM / OVM sélectionnée, vous n’avez pas besoin de tout type d’autres bibliothèques. J’ai utilisé Icarus Verilog 0.9.7, mais vous pouvez utiliser le plus probablement tout type des outils Verilog disponibles. Vous souhaitez inspecter la case à cocher Epwave aussi bien que vous devez l’ajouter à la partie intale de Testbench:
initiale
commencer
$ bennedfile (“benned.vcd”);
$ buppvars;
Utilisez l’indication + + à côté des onglets de nom de données pour créer de nouveaux fichiers. Edaplayground a une limite de dix fichiers par volet. N’oubliez pas que vous devrez inclure tout type de fichiers .v que vous produisez dans TestBench.sv ou design.sv. Vous n’avez pas l’obligation d’inclure les fichiers de données puisque les autres fichiers les utilisent indirectement.
Cours!
Une fois que toutes les erreurs ont fonctionné, vous pouvez appuyer sur Exécuter aussi bien que vous obtiendrez la visionneuse de forme d’onde, Epwave. Tu asE Pour ajouter des signaux de taux d’intérêt afin que vous puissiez regarder la CPU au travail. Il serait amusant d’ajouter des périphériques d’E / S en mémoire ou certains ports de débogage afin que vous puissiez regarder les choses un peu mieux. Je regarderai généralement le comptoir du programme ainsi que le registre composant le port pour obtenir un concept de ce qui se passe à l’intérieur.
Le code d’origine avait un programme qui a exercé de nombreuses instructions. Je l’ai commenté aussi bien que le remplacé avec ceci:
0000_0100_0000_0000 // 0000: tonnes R0 <- Mem (R2 + 0) depuis R2 = 0 Ceci met 1 en R0 0000_0100_0100_0000 // 0002: tonnes exactes en R1 (R1 contiendra toujours 1) // place 8 (octet), 4 (mot): 0010_0000_0101_0000 // 0004: R2 = R0 + R1 0001_0010_1000_0000 // 0006: MEM [R1] = R2 (c'est MEM [1] = R2 0000_0010_0000_0000 // 0008: R0 = MEM [R1] 1101_0000_0000_0011 // 000A: Aller à la place # 4 (la CPU se multipliera par 2 ainsi que l'ajout 2) // pas de direction à 000c, cependant PC restera suspendu là-bas pendant que cela traite sauter Vous devriez être capable de respecter la valeur d'incrémentation de la mémoire en mémoire et de regarder le cycle du compteur de programme à la place 4 avec chaque boucle. Voici une session typique: J'ai laissé beaucoup de signaux intérieurs, mais vous pouvez voir que l'adresse de la mémoire 1 est définie sur 2 ainsi que sur 3 sur les deux premières itérations de la boucle. Fin du jeu Est-ce une grande processeur académique? Je ne suis pas sûr. Certains processeurs plus simples existent, mais ils sont souvent peu peu nombreux car ils sont délicats ou sont extrêmement peu pratiques. Tout ce qui est plus difficile que cela est le plus susceptible de mordre pour un débutant. Bien que je pense que vous devriez avoir une compréhension de Verilog fondamental avant de vous attaquer à quelque chose comme ça, la documentation était un peu rare (et déroutante) dans certaines régions. De toute évidence, c'était très suffisant depuis que je le faisais fonctionner, cependant, si vous commencez simplement, vous seriez probablement apprécié un peu plus d'assistance ainsi que des explications. Avez-vous un processeur de Verilog académique préféré? Je cherche toujours une personne qui est "juste juste".