Veuillez consulter cette page à partir de l'interface principale.
YASEP16 vs YASEP32
Les différentes variétés de YASEP
L'architecture YASEP définit deux versions du processeur,
selon que le chemin de données est sur 16 ou 32 bits :
ce sont respectivement les versions YASEP16 et YASEP32.
Elles partagent approximativement 95% du comportement et on essaie
de garder un maximum de points communs entre les deux.
YASEP16 et YASEP32 diffèrent par la taille des mots de données
mais la taille des données est indépendante des instructions.
Les deux versions utilisent les mêmes formes courtes, longues et étendues (16 et 32 bits de large).
D'ailleurs, le format des instructions sur 32 bits est conçu pour
être facile à décoder même avec un bus mémoire sur 16 bits (voir le microYASEP).
Nous parlerons donc surtout des différences ici.
La première différence évidente est la taille des mots, qui destine
chaque version à des usages différents.
- YASEP16 va avoir du mal à travailler avec des valeurs sur 32 bits, donc il est adapté pour les
applications classiques des microcontrôleurs, par exemple, lorsque les données sont essentiellement des
octets ou des demi-mots.
- YASEP32 est plus à l'aise quand des flux de données rapides sont traités,
puisque les chemins de données sur 32 bits doublent la bande passante vers la mémoire.
YASEP32 peut donc être utilisé lorsqu'il y a du graphisme simple
ou des proctocoles un peu sophistiqués, tel TCP/IP.
La seconde différence est évidemment la taille du circuit intégré : YASEP16 utilise
environ deux fois moins de portes logiques que YASEP32.
Comme il est plus compact, YASEP16 laissera plus de place pour des circuits
périphériques que YASEP32 dans un FPGA.
De plus, à technologie identique, YASEP16 tourne à peu près 15% plus vite
puisque sa taille plus petite raccourcit les fils et les chemins critiques.
Une troisième différence existe au niveau de la mémoire.
La taille d'un programme est presque identique
(puisque les instructions sont les mêmes) mais on ne peut pas accéder
à la mémoire de la même manière.
-
Puisque ses pointeurs sont sur 16 bits seulement, YASEP16 ne peut accéder qu'à 64K
octets à la fois. Il est donc adapté aux petits programmes.
Un mécanisme d'extension d'adresses peut être réalisé pour étendre
la taille totale de mémoire adressable, et différents programmes
pourront alors accéder à différentes zones de mémoire (et même les partager)
mais un pointeur reste limité à 64K octets.
-
YASEP32 peut accéder à 4G octets par programme, ce qui permet de réaliser des
applications plus sérieuses.
Cependant il n'est pas prévu de supporter ou d'implémenter autant pour le moment
car on sort du domaine de l'embarqué...
La quatrième différence notable est dans le jeu d'instructions.
Celles qui peuvent travailler avec des mots entiers (sur 32 bits) n'ont
pas d'utilité dans le YASEP16, qui utilise des demi-mots (16 bits) pour tout.
Les instructions suivantes sont spécifiques au YASEP32 et peuvent déclencher une erreur quand elles sont
exécutées par le YASEP16 :
(aucune)
Et celles-ci sont spécifiques au YASEP16 :
(aucune)
Pour réduire les erreurs de programmation, les pseudo-instructions
YASEP32 et
YASEP16
ont été définies. Elles envoient un avertissement
quand une instruction assemblée est invalide pour le cœur utilisé.
Compatibilité
La similarité entre les deux versions du cœur permet de réaliser facilement
des séquences de code qui fonctionnent aussi bien sur le YASEP32 que le YASEP16,
tant qu'on fait attention à la taille des données et aux instructions.
Cela permet de détecter la taille du processeur, de partager du code source
entre projets, etc.
La plupart des mécanismes internes restent inchangés. Par exemple,
les registres spéciaux
ont les mêmes fonctions dans les premiers 65536 registres, le code peut donc être porté
facilement. Le mécanisme d'interruption (gestion des événements externes)
et d'exception (traitement des erreurs logicielles) a la même structure :
ces mécanismes sont configurés via les premiers registres spéciaux.
Détection
Pour le YASEP32, le bit de signe est à la position 31 dans les registres, et bit n°15 pour le YASEP16.
Sachant cela, il est facile de vérifier sur quelle variante un programme s'exécute :
le code écrit sur le bit n°15 et lit le bit de signe. C'est possible avec la forme IMM20 de l'instruction
MOV :
MOV 8000h R1 ; R1=8000h pour YASEP16 ou 00008000h pour YASEP32
ADD R2 R3 R4 MSB1 R1 ; exécute ADD si YASEP16
Cette information sera aussi contenue dans un des Registres Spéciaux,
parmi d'autres informations de configuration.