2017-09-12 1 views
2

Existe-t-il des fonctions système prenant en charge plus de 32 bits dans System Verilog? Je veux convertir une quantité réelle en une valeur intégrale contenant plus de 32 bits. La fonction système $ rtoi() fait exactement ce que je veux pour les valeurs qui peuvent être représentées en 32 bits ou moins. Y a-t-il un système intégré pour cela ou aurais-je besoin d'écrire le mien?La meilleure façon de convertir un nombre réel en valeur entière supérieure à 32 bits?

Pour un exemple concret, je voudrais être en mesure de faire quelque chose comme ce qui suit:

logic [41:0] test_value; 

initial begin 
    test_value = $rtoi($pow(2.0, 39.5)); 
end 

Si, au lieu de rtoi $(), j'utiliser l'inconnu recherché fonction du système. Étant donné la fonction correcte, je m'attendrais à ce que test_value soit initialisé avec la séquence de bits 42'b1011010100000100111100110011001111111001 ou éventuellement 42'b1011010100000100111100110011001111111010 si l'arrondi est pris en charge.

Je peux écrire ma propre fonction, mais je voudrais éviter de réinventer la roue sauf s'il n'y a pas de roue.

Répondre

3

Un casting implicite de réel intégrale vous donne ce que vous voulez avec l'arrondissement

test_value = 2.0**39.5; 

Ou vous pouvez utiliser un casting explicite

typedef logic [41:0] uint42_t; 

test_value = uint42_t'(2.0**39.5); 
+0

Merci pour votre réponse, @ dave_59. Ces deux ont travaillé pour moi. FYI: Il y a une faute de frappe dans votre type explicite, l'identifiant pour la déclaration est uint42_t et le casting a un underscore supplémentaire. J'ai essayé de le réparer, mais il ne m'a pas laissé parce que je n'ai pas changé à au moins 6 caractères. – hops