{"id":19062543,"url":"https://github.com/julio-guerra/mips","last_synced_at":"2026-06-13T20:05:14.795Z","repository":{"id":18197373,"uuid":"21323184","full_name":"Julio-Guerra/mips","owner":"Julio-Guerra","description":null,"archived":false,"fork":false,"pushed_at":"2015-07-09T20:51:31.000Z","size":1082,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-02T13:17:35.960Z","etag":null,"topics":["computer-organization","computer-science","hardware-architectures","pipeline","workshop"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Julio-Guerra.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-06-29T12:52:44.000Z","updated_at":"2018-04-25T13:31:51.000Z","dependencies_parsed_at":"2022-07-13T05:40:34.069Z","dependency_job_id":null,"html_url":"https://github.com/Julio-Guerra/mips","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Julio-Guerra%2Fmips","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Julio-Guerra%2Fmips/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Julio-Guerra%2Fmips/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Julio-Guerra%2Fmips/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Julio-Guerra","download_url":"https://codeload.github.com/Julio-Guerra/mips/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240115782,"owners_count":19750080,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["computer-organization","computer-science","hardware-architectures","pipeline","workshop"],"created_at":"2024-11-09T00:26:27.875Z","updated_at":"2026-05-14T00:30:21.295Z","avatar_url":"https://github.com/Julio-Guerra.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MIPS #\n\n## Sujet ##\n\nImplémenter en C++ le pipeline MIPS étudié en cours. Pour être représentatif de la version hardware du pipeline, ce\ndernier devra avoir les propriétés suivantes:\n\n  1. Un thread par étage du pipeline afin de paralléliser leur exécution et rendre indispensable la synchronisation\n     des échanges de données entre étages.f\n  1. le pipeline est cadancé à la vitesse de l'étage le plus lent. Aucun étage n'est en avance par rapport aux autres,\n     c'est-à-dire que le cycle courant est le même pour tous à tout instant.\n\nUn ensemble de classes vous sont fournies afin d'assurer ces propriétés. Votre objectif étant de vous concentrer sur\nl'implémentation des étages tels que décrits dans leurs moindres détails dans [les illustrations de cette annexe][1].\n\nLa charge de travail du projet est de 3j (2j de dev + 1j de préparation de la soutenance - scripts gdb \u0026 exemples).\n\n## Objectifs ##\n\nVous devez implémenter dans un premier temps la base permettant l'exécution d'instructions indépendantes puis les\nforwarding-unit et hazard-detection-unit permettant l'exécution d'instructions avec dépendances. Suivez les\nindications/illustrations/explications de la [référence][1] pour réaliser ces étapes. Vos étages doivent contenir\nexactement ce qui est visible dans les illustrations (e.g. la control-unit dans ID). Les delay-slots s'obtiennent par\nconstruction en respectant l'architecture du pipeline: les instructions de branchement (e.g. `beq`) impliquent un\ndelay-slot de deux instructions; la version optimisée à une instruction est acceptée mais n'apporte\naucun point bonus. Enfin, et afin de couvrir tous les cas de gestions des dépendances (software-based interlock vs\nhardware-based interlock vs data-forwarding), la hazard-unit de la [référence][1] stall le pipeline (i.e. insère une bulle)\npour gérer un Read-After-Write impliquant l'instruction `lw`.\n\nA vous de choisir quelles instructions vous souhaitez gérer. Choisissez donc (au moins) le sous-ensemble\nd'instructions couvrant les objectifs: toutes celles des exemples de la [référence][1], des branchements conditionnels\n(e.g. `beq`), des branchements inconditionnels (e.g. `j`) et l'instruction `nop`.\n\nTaillez la mémoire et votre banque de registres en fonctions de vos exemples.\n\nAvant de quitter, votre programme doit écrire sur la sortie standard (au moins) la valeur des registres, le nombre\nmoyens de cycles par instruction (CPI) et d'instructions par cycle (IPC) nécessaires à l'exécution de votre programme.\nPar exemple:\n\n\u003e r1 = 67  \n\u003e r2 = 33  \n\u003e ...  \n\u003e r31 = 2  \n\u003e CPI = 5  \n\u003e IPC = 0.2\n\n### Soutenance ###\n\n**[Liste de Passage](https://docs.google.com/spreadsheets/d/1_lwp6siRekOX9KWcdfQ6ht9vVxsl4sqo-8_YO-yohRE/edit?usp=sharing)**\n\nLa soutenance 2015 est prévue le **13/07/2015** à **Villejuif** (cf. chronos et la liste de passage).\nAucun retard ne sera admis en dehors des plages horaires qui vous sont allouées. Un groupe à l'heure disposera ainsi\nde **12 minutes précises** (chronomètre en main) pour présenter son projet.\n\nChaque groupe vient avec sa machine, son projet et ses exemples prêts pour la soutenance.\nPour chaque groupe:\n  1. Exécution de vos exemples.\n  1. Démo instrumentée avec GDB de la gestion d'instructions avec dépendances.\n  1. Parcours rapide du code source de vos étages afin d'évaluer la fidélité de votre pipeline à la référence.\n  \nC'est au groupe d'être le moteur de sa soutenance et de montrer chaque point lorsque demandé. N'hésitez pas à fournir\nautant d'exemples que vous le souhaitez.\n\n### Notation ###\n\nLa grille de notation vous est fournie avec la liste de passage. Voici quelques explications aditionnelles:\n\n- Fidélité: note la fidélité de vos étages par rapport à la réalité (la référence, le cours).\n- Latch Struct: note la fidélité de vos structures de latch-results par rapport à la réalité.\n- Calcul du CPI/IPC: exécution de programmes MIPS dans votre pipeline à présenter à l'oral et dont les performances\n  qui en resulteront (CPI/IPC) seront à expliquer. Dans les cas optimisés, le nombre moyen de cycles par instructions\n  diminue et, à l'inverse, le nombre moyen d'instructions par cycle augmente.\n    - Exemple de base du pdf #N: illustrations de la [référence][1] à partir de la page 4-12-16.\n    - Exemple delay-slot non exploité: exemple de programme non optimisé comportant un ou plusieurs delay-slot\n      non exploité(s), c'est-à-dire occupé(s) avec l'instrution `nop`.\n    - Exemple delay-slot exploité: exemple **précédent** optimisé. La pertinence de l'exemple est importante.\n    - Exemple avec bulles: exemple de programme non optimisé qui génère des stalls (grace à votre\n      hazard-detection-unit).\n    - Exemple sans bulles: exemple **précédent** optimisé, c'est-à-dire que vous aurez réordonné les instructions\n      tel que plus aucun stall n'aura lieu. La pertinence de l'exemple est importante.\n- Démo avec scripts GDB: à vous de préparer des scripts de debug permettant d'observer votre\n  control/hazard/forward-unit.\n  Vous pourriez par exemple insérer un breakpoint dans le cas où vous détectez une dépendance et forwardez des\n  données.\n  Le but est d'aller le plus vite possible en observant uniquement les cas pertinents.\n- Malus: ce qui est indispensable pour les éviter (SMP = multithread).\n- Bonus: des points bonus pourront vous être accordées si vous en fait plus qu'attendu.\n\n## Astuces ##\n\nQuelques astuces afin de vous simplifier la tache:\n\n- Simplifiez au maximum le parsing des instructions qui présente peu d'intéret, préférez donc `lw 10 1024 1` à `lw r10, 1024(r1)`.\n\n- Simplifiez les destinations de vos branchement en termes de \"numéros de lignes\": `j 1` \u003c=\u003e \"jumper à la ligne 1\". \n\n- `ifstream` permet de déplacer le curseur de lecture du fichier d'entrée à l'octet prèt. Plutot que de chercher les retours chariots dans vos fichiers afin de déterminer la ligne destination de votre branchement, préférez une solution simple où toutes les lignes ont la meme taille (e.g. 2o caractères dont \\n) afin de directement pouvoir déplacer le curseur en début de ligne destination ((ligne courante - ligne destination) * 20).\n\n## Documentation ##\n\n### doc/pipeline-reference.pdf ###\n\nLa référence à utiliser pour implémenter le pipeline en C++. Cette dernière contient en plus l'implémentation en VHDL du pipeline. Les illustrations à partir de la page 4-12-16 *More Illustrations of Instruction Execution on the Hardware* sont à suivre à la lettre et constituent en plus vos exemples de base couvrant tous les cas à gérer.\n\n### doc/mips-green-shit.pdf ###\n\nCheat Sheet de l'ISA MIPS.\n\n## Contenu du repository ##\n\n### src/pipeline.hh ###\n\nAlgorithme de pipeline prèt à l'emploi au lieu de la libtbb qui ne répond pas à nos propriétés par défaut.\nCf. src/main.cc ci-dessous pour un exemple d'utilisation.\n\nVous y trouverez également les classes `p::spinlock` et `p::barrier` qui sont des moyens de synchronisation SMP userland (ce qui permet d'assurer que vos threads seront préemptés en userland et non pas dans un lock kernel - utile pour suivre avec gdb l'exécution de vos étages en les interrompant à tout instant :)).\n\n### src/main.cc ###\n\nExemple d'utilisation du pipeline et potentiel squelette de base pour votre programme. L'exemple montre comment les latch-results transitent dans le pipeline. Vous pouvez observez ci-dessous ce que donne l'exemple (le numéro après le nom de l'étage est le cycle courant). Vous comprendrez ainsi pourquoi de la synchronisation sera nécessaire lorsque vous ferez transiter des infos entre étages puisque ceux-ci s'executent en parallèle (e.g. cycle 2, EX print avant ID).\n\n```bash\n~/mips.git\u003e ./memu.elf test/t2\nIF 1: i1\nID 2: i1\nIF 2: i2\nEX 3: i1\nID 3: i2\nEX 4: i2\nMEM 4: i1\nWB 5: i1\nMEM 5: i2\nWB 6: i2\n\nTotal Number of Cycles = 6\nAverage IPC = TODO\n```\n\n### gdb/ ###\nExemple de script gdb avec debug multi-threading à exploiter en soutenance (et pour votre développement).\n\n### test/ ###\nQuelques fichiers de tests qui vont de pair avec l'exemple du repo.\n\n### Makefile.in ###\nSpécification de la compilation: flags de compilation nécessaires.\n\n### Bug ###\nCf. le warning dans la fonction `main()` dans `main.cc` qui apparait au moins avec gcc 4.9.0.\n\n### Limitations ###\nUn seul appel à `p::pipeline::run()` est possible par instance de la classe `p::pipeline`.  \nPatch bienvenu :) Il faut réinitialiser les latchs pour pouvoir relancer le pipeline :)\n\n## Stats ##\n\n### 2014 ###\n\u003cimg alt=\"soutenance 2014\" src=\"https://docs.google.com/spreadsheets/d/1uihWUIxEVLblYx8Qz-Mt0GIlq18R0fo5nNCRMoQOLN4/pubchart?oid=387897233\u0026amp;format=image\"\u003e\u003c/div\u003e\n\n[1]: https://github.com/Julio-Guerra/mips/blob/master/doc/pipeline-reference.pdf\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulio-guerra%2Fmips","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjulio-guerra%2Fmips","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulio-guerra%2Fmips/lists"}