2017-06-21 1 views
2

Je développe un ISS RiscV et quand j'exécute la suite de vérification, j'obtiens une erreur avec l'instruction add. Je clouer le problème à cette partie du code (registre états lors de l'exécution sous forme de commentaires):erreurs dans une implémentation RiscV ISS

lui ra,0x80000 ;; ra = 0x80000000 
lui sp,0xffff8 ;; sp = 0xffff8000 
add t5,ra,sp  ;; t5 = 0x17fff8000 
lui t4,0xffff0 ;; t4 = 0xffff0000 
addiw t4,t4,-1  ;; t4 = 0xfffeffff 
slli t4,t4,0xf ;; t4 = 0x7fff7fff8000 
li gp,7   ;; gp = 7 
bne t5,t4,800005f0 <fail> ;; The program branches to fail :(

registres Il est évident que t5 et t4 ne présentent pas les mêmes valeurs lors de l'exécution et donc, les branches du programme à l'échec de routine .

Quelqu'un peut-il indiquer quelles instructions génèrent de mauvais résultats dans mon code?

Vive

Répondre

3

J'ai couru le même programme en épi pour comparer les résultats et a trouvé le bogue. Les instructions LUI et ADDIW manquaient l'extension de signe 32 bits. Merci pour ceux qui ont lu le post et réfléchi.

+0

Bonjour. Qu'est-ce que "l'ISS"? Est-ce public? Avez-vous vérifié riscvemu https://bellard.org/riscvemu/ par bellard et rv8 https://github.com/rv8-io/rv8 par michaeljclark? – osgx

+1

Salut, c'est un simulateur de jeu d'instructions que je construis juste pour m'amuser. Merci pour le lien. Je vais vérifier cela. –

0

Ce code est pour une implémentation RV64I (64 bits) je pense.

Le signe d'instruction LUI s'étend aux implémentations RV64I que vous n'avez pas effectuées sur les deux premières lignes.