nanoFOX - un simple noyau compatible RISC-V

Une petite introduction:


L'idée d'écrire votre propre noyau est venue après avoir passé un séminaire-école sur les circuits numériques dans la ville de Tomsk . Lors de cet événement, familiarisation avec les langages de description du matériel actuels (Verilog HDL et VHDL), ainsi qu'avec un petit processeur core schoolMIPS . Pour comprendre la structure des noyaux, il a été décidé d'inventer leur propre vélo, en suivant le chemin du développement de schoolMIPS, mais en prenant un autre système de commande comme base. En raison de la popularité croissante de RISC-V et de l'ouverture de son système de commande (MIPS n'avait pas de système de commande ouvert au moment de l'écriture du noyau), un ensemble d'instructions RISC-V, à savoir RV32I, a été choisi pour le développement du futur noyau. RV32I possède un petit ensemble d'instructions de base (37 à l'exception des instructions spéciales) et, si vous le souhaitez, il peut être étendu, par exemple, en ajoutant des instructions de multiplication et de division entières (RV32M) ou la prise en charge des instructions compressées (RV32C). De plus, ce projet a été conçu comme éducatif, il a donc été décidé de maximiser la visibilité du noyau pour démontrer efficacement son travail.


Par analogie avec schoolMIPS, les versions de noyau suivantes ont été implémentées:


  1. Version à cycle unique (00_simple_risc_v_cpu).
  2. Une version à cycle unique avec prise en charge des instructions lw / sw (mot de chargement / mot de stockage) (01_simple_risc_v_cpu_lwsw).
  3. Version pipeline (convoyeur à 5 étages) (02_pipe_risc_v_cpu).

Actuellement, la prochaine version du noyau est décrite (03_pipe_risc_v_cpu_fc) avec un ensemble complet de commandes RV32I (sans prendre en compte certaines spéciales).


Brève information:


Au cours de la description du noyau, des moyens d'améliorer la visibilité du travail, le débogage et la vérification ont été pensés. Actuellement mis en œuvre les méthodes suivantes:


  1. Ajout d'un module VGA de texte de débogage (pour deux branches de noyau à cycle unique). L'inclusion de ce module vous permet de suivre simultanément la valeur de 32 registres sur l'écran du moniteur, ce qui n'est pas possible lorsque vous utilisez la sortie d'informations sur des indicateurs à sept segments. Dans les figures présentées ci-dessous, le noyau calcule les nombres Leonardo et affiche des informations sur le module de débogage correspondant;


    hex_display et DebugScreenCore

    Production d'informations sur les indicateurs à sept segments: image
    Sortie d'informations sur l'écran VGA: image


  2. Ajout de messages au terminal de simulation sur l'état du fichier de registre et l'exécution actuelle des instructions. Cette méthode vous permet de mieux analyser le fonctionnement du noyau dans les premiers stades de développement, mais n'est pas toujours pratique;


    Terminal

    Initialisation du fichier de registre: image
    Modifier la valeur sp: image


  3. Ajout de variables de chaîne à la forme d'onde avec l'affichage d'instructions exécutables. En utilisant ces variables de chaîne, le développeur peut suivre le réglage correct des signaux de contrôle à toutes les étapes du pipeline;


    Forme d'onde

    Initialisation du fichier de registre: image
    Modifier la valeur sp: image


  4. Ajout de la possibilité d'écrire des informations de débogage sur l'état du noyau dans un fichier texte. L'état du fichier de registre est présenté sous forme de tableau, et les instructions actuellement exécutées par le noyau sont également indiquées. C'est un analogue de 2 points, mais permet plus de manipulations avec les informations reçues;


    Fichier texte

    Initialisation du fichier de registre: image
    Modifier la valeur sp: image


  5. Ajout de la possibilité d'écrire des informations de débogage sur l'état du noyau dans un fichier HTML. L'état du fichier de registre est présenté sous forme de tableau avec des notes sur la modification des valeurs des cellules, ainsi que les instructions en cours d'exécution par le noyau sont affichées. Il s'agit d'un analogue des paragraphes 2 et 4, mais en plus de cela, il vous permet d'indiquer facilement une modification des données. Comme on peut le voir sur les images ci-dessous, si la valeur du registre n'a pas été définie, les registres sont surlignés en rouge (registres s0 / fp - t6). Au cycle 17, la valeur du registre s0 / fp change et la cellule est surlignée en vert.
    Au cycle 41, la valeur 0x00010000 est chargée dans le registre sp.


    Fichier HTML

    Initialisation du fichier de registre: image
    Modifier la valeur sp: image



Comparaison des branches du noyau:

Instructions du noyau actuellement prises en charge pour différentes branches:


Manuel d'instructions00_simple_risc_v_cpu01_simple_risc_v_cpu_lwsw02_pipe_risc_v_cpu
ajouter+++
et--+
sll--+
ou+++
addi+++
ori--+
slli+++
lw-++
jalr--+
lui+++
beq+++
bne--+
sw-++
jal--+
sous++-

Périphériques pris en charge:


Périphériques00_simple_risc_v_cpu01_simple_risc_v_cpu_lwsw02_pipe_risc_v_cpu
RAM-++
Pwm-++
GPIO-++
UART--+

Langues prises en charge pour l'écriture de programmes:


La langue00_simple_risc_v_cpu01_simple_risc_v_cpu_lwsw02_pipe_risc_v_cpu
Assembleur+++
C--+

Ressources FPGA requises pour le noyau (nf_cpu):


EP4CE22F17C6 (de0_nano):


01_simple_risc_v_cpu_lwsw02_pipe_risc_v_cpu03_pipe_risc_v_cpu_fc
Nombre total de bits de mémoire0/608 256 (0%)2.048 / 608.256 (<1%)2.144 / 608.256 (<1%)
Total éléments logiques3,645 / 22,320 (16%)1 739/22 320 (8%)2 058/22 320 (9%)
Fonctions combinatoires totales2,653 / 22,320 (12%)1 472/22 320 (7%)1 838/22 320 (8%)
Registres logiques dédiés1.055 / 22.320 (5%)575/22 320 (3%)606/22 320 (3%)

10M50DAF484C7G (de10_lite):


00_simple_risc_v_cpu01_simple_risc_v_cpu_lwsw02_pipe_risc_v_cpu03_pipe_risc_v_cpu_fc
Nombre total de bits de mémoire0/1 677 312 (0%)0/1 677 312 (0%)2 048/1 677 312 (<1%)2.144 / 1.677.312 (<1%)
Total éléments logiques2.851 / 49.760 (6%)2.881 / 49.760 (6%)1 629/49 760 (3%)1,927 / 49,760 (4%)
Fonctions combinatoires totales2,613 / 49,760 (5%)2,653 / 49,760 (5%)1 473/49 760 (3%)1 849/49 760 (4%)
Registres logiques dédiés1 055/49 760 (2%)1 055/49 760 (2%)575/49 760 (1%)606/49 760 (1%)

Développement de projet.


Ce qui devrait être fait à l'avenir:


  1. ajouter toutes les instructions RV32I (au stade de la description);
  2. implémenter le débogage;
  3. ajouter un contrôleur DMA (DMA);
  4. ajouter le support pour d'autres pneus AXI, Avalon, Wishbone;
  5. ajouter de la mémoire cache (cache);
  6. intégrer divers périphériques (SPI, TWI (I2C), Ethernet (10 base-t));
  7. ajouter un contrôleur d'interruption;
  8. porter différentes versions sur d'autres cartes de débogage;
  9. ajouter d'autres méthodes pour augmenter la visibilité du noyau;
  10. exécutant RTOS, par exemple zephyr .

Les recommandations et suggestions pour le développement du noyau sont également acceptées.


Lien vers le référentiel: nanoFOX .

Source: https://habr.com/ru/post/fr451388/


All Articles