Pour une utilisation de code de comportement soit rtoi de $() ou realtobits $()
real in1;
integer a1;
wire [63:0] b1;
a1 = $roti(in1); //Truncates fractional part
b1 = $realtobits(in1); //Probably not what you want
Vous pouvez utiliser bitstoreal $() si vous avez besoin de jeter un vecteur de bits à un type réel. Donc, si je suis vos commentaires correctement, vous construisez un modèle d'ALU en virgule flottante qui fonctionne sur des valeurs de données 32 bits. Dans ce cas, vous pouvez utiliser réel types de données depuis Verilog peut gérer ce format nativement. Bien sûr, vous ne serez pas en mesure de détecter certaines situations
task [31:0] realAdd(input [31:0] in1, input [31:0] in2, output [31:0] out);
begin
real rIn1,rIn2,rOut;
rIn1 = $bitstoreal(in1);
rIn2 = $bitstoreal(in2);
rOut = rIn1 + rIn2;
out = $realtobits(rOut);
end
endtask
Ces fonctions utilisent tous la double précision de sorte que vous aurez besoin de faire quelques extensions peu trivial pour gérer les entrées de simple précision, et des limites non triviales contrôle/Troncature sur la sortie. Vous pouvez éviter cela en utilisant SystemVerilog, qui a les fonctions $ bitstoshortreal()/$ shortrealtobits() qui fonctionnent sur des valeurs de précision simple.
Si vous voulez du matériel pour cela, Computer Organization & Design a une description d'une implémentation multi-cycle. Comme Andy posté, il pourrait y avoir de meilleures ressources pour votre cas. Ce ne sont pas simples à concevoir.
Il existe un cœur flottant sur les opencores. Avez-vous une cible de synthèse, ou est-ce uniquement pour la simulation? Quel est votre format de sortie? Dans un commentaire ci-dessous, vous dites que vous voulez qu'il soit «exactement le même», ce qui nécessiterait un format de point fixe en utilisant des centaines de bits. – Andy
ceci est pour la simulation seulement. J'essaye d'écrire le code pour l'unité de point flottant de SPU du processeur de Cellule.En fonction de l'instruction, je dois effectuer différentes tâches sur des nombres à virgule flottante. Les nombres sont représentés par 32 bits. Je veux les ajouter, les soustraire ... et les stocker dans un autre champ de 32 bits. Dans l'extrait ci-dessus, j'ai converti in1 en a1. Je dois convertir in2 en a2 de manière similaire et faire a1 + a2 ou a1-a2 ou ... et le stocker en c2. Ensuite, je devrais être capable de le convertir à out1 qui est de 32 bits de large. J'espère que vous l'aurez compris. – Brahadeesh