Charger demi-mot et l'octet de charge en un seul cycle datapath
-
24-09-2019 - |
Question
Il y avait ce problème qui a été interrogé sur la mise en œuvre d'un octet de charge en un seul cycle datapath sans avoir à changer la mémoire de données, et la solution était quelque chose ci-dessous.
texte alt http://img214.imageshack.us/img214/7107/99897101. jpg
Il est en fait assez réaliste question; la plupart des systèmes de mémoire sont entièrement basée sur les mots, et individuel octets sont généralement uniquement traitées à l'intérieur du processeur. Quand vous voyez un « Erreur de bus » sur de nombreux ordinateurs, ce signifie souvent que le processeur a tenté pour accéder à une adresse mémoire qui était pas correctement aligné mot, et Système de mémoire a provoqué une exception. Quoi qu'il en soit, car les adresses d'octets pourrait ne pas être un multiple de 4, nous ne pouvons pas passer les à la mémoire directement. Toutefois, nous peut encore obtenir à tout octet, parce que chaque octet peut être trouvé dans certains mot, et toutes les adresses mot sont multiples de 4. La première chose que nous faire est de nous assurer d'obtenir le droit mot. Si l'on prend les 30 bits de poids fort l'adresse (à savoir, ALUresult [31-2]) et les combiner avec deux bits à 0 le bas (ce qui est ce que la « gauche Shift 2” unité fait vraiment), nous ont l'adresse octet du mot contient l'octet souhaité. C'est juste adresse de l'octet, arrondi vers le bas à un multiple de 4. Ce changement signifie que pv va maintenant aussi rond adresses vers le bas à des multiples de 4, mais c'est OK car les adresses non-alignés ne fonctionnerait pas pour pv de toute façon avec ce Unité de mémoire. OK, maintenant, nous obtenons les données mot de retour de la mémoire. Comment pouvons-nous l'octet que nous voulons en sortir? Bien, noter que l'octet de décalage octet dans le mot est juste donné par le d'ordre inférieur 2 bits de l'octet de adresse. Donc, nous utilisons simplement les 2 des bits pour sélectionner l'octet approprié hors du mot à l'aide d'un MUX. Noter la l'utilisation de la numérotation des octets big-endian, comme est approprié pour MIPS. Ensuite nous avoir à zéro étendre l'octet à 32 bits (à savoir, il suffit de le combiner avec 24 zéros à son extrémité haute), parce que le problème précise de le faire. Réellement, ce fut une petite erreur dans la question: en réalité, la LBU instruction zéro étend l'octet, mais lb-signe prolonge. Tant pis. Enfin, nous devons étendre la MUX-contrôle MemtoReg d'accepter un nouvelle entrée: l'octet zéro étendu pour le cas lb. Le contrôle MemtoReg signal doit être élargie à 2 bits. le d'origine 0 et 1 cas de changement 00 et 01, respectivement, et nous ajoutons une nouvelle boîtier 10 qui est utilisé uniquement dans le cas de livres.
Je ne comprends pas tout à fait en réalité sur la façon dont cela fonctionne même après avoir lu l'explication, en particulier sur le changement de gauche le résultat ALU par 2 donnerait l'adresse d'octet ... Comment est-ce possible ?? donc si je voudrais charger un demi-mot alors je ferais un quart de travail à gauche et je recevrais l'adresse du demi-mot ?? ce serait une meilleure façon de faire l'octet de charge, charge demi-mot en modifiant la mémoire de données? (La question met au-dessus des contraintes que nous ne pouvons pas modifier la mémoire de données)
La solution
L'auteur original semble être simplement l'ajout d'un multiplexeur d'octet des données de 32 bits en cours de lecture de la mémoire. Cette mémoire permet à un 32 bits pleine charge naturellement aligné (instruction lw) et le multiplexeur d'octet supplémentaire et zéro extension permet pour des instructions d'octets de charge et (instruction LBU).
Le décalage à gauche du résultat ALU donne une adresse de mot, pas une adresse d'octet, et représente le décalage vers la droite implicite par deux dans le routage du signal. Le résultat final est tout simplement les deux bits inférieurs du résultat ALU étant masquées (mise à zéro) avant d'être envoyé à la mémoire. Les deux bits de poids faible de la valeur ALU sont alimentés en aval de la mémoire au multiplexeur d'octet, permettant à la mémoire de mots pour lire des octets arbitraires.
Il n'y a pas de soutien direct dans la logique montré pour le chargement des demi-mots (16 bits), octets juste et mots entiers 32 bits. Vous pouvez toutefois modifier facilement l'octet d'adressage logique pour soutenir des mots au lieu d'octets (ou même les deux) en utilisant une approche similaire.