J'ai une déclaration dans Verilog ressemblant à Tous les commentaires appréciés! P> integer niveau = journal (n) code> (où n est un paramètre et un niveau à déterminer) mais je comprends que je ne peux pas faire des déclarations de mathématiques complexes dans Verilog , donc je me demande s'il y a une solution alternative au problème ci-dessus? P>
5 Réponses :
La réponse à largeur d'adresse de la profondeur de la RAM décrit quelques façons d'évaluer la constante logarithmes dans cette situation. P>
S'il s'agit d'une base de logarithme 2, vous essayez de le faire, vous pouvez utiliser la fonction intégrée $ clog2 () code>. p>
Mais je comprends que je ne peux pas faire de relevés de mathématiques complexes à Verilog P> blockQuote>
Verilog est avant tout une langue description du matériel. Quel matériel
log (n) code> est décrivant? Les FPGA modernes se composent de luts, de flops, de petits mémoires intégrés, des DSP simples qui implémentent des primitives Mac (multiplier-accumulation).
journal (n) code> et d'autres instructions de mathématiques complexes ne peuvent pas être cartographiés directement dans ces primitives. Il en va de même avec les asics. p>
par analogie,
journal (n) code> n'est pas exécuté par un processeur. Il appelle un tas d'instructions de montage de niveau inférieur pour le faire. Ces instructions de montage font partie de la bibliothèque
journal (n) code> (C, C ++, etc.) P>
Pour pouvoir synthétiser
journal (n) code> pour ASIC / FPGA, il nécessite une instance d'un journal
log (n) code> noyau IP. P>
Verilog a des fonctions pour le logarithme naturel ( Ce qui suit est synthétisable code Verilog: p> E.g. Après la synthèse RTL avec yosys (par exemple, $ ln () code>), logarithme décennier (
$ log10 () code>) et plafond du logarithme binaire (
$ clog2 ( ) code>). Dans des expressions constantes, elles doivent être synthétisables, mais la prise en charge réelle des outils varie.
YOSYS -P 'Prep; write_verilog -noattr' test. v code>): p>
J'aime penser à (Logarithm Base N de valeur) pour répondre à la question "Combien de chiffres de base n chiffres dois-je représenter des nombres indépendants" valeur "?" (Garder à l'esprit que 0 compte comme un numéro)
En pensant de cette façon, vous pouvez implémenter votre propre base de journal 2 dans SystemVerilog: P>
function bit [31:0] log_base_2 (bit [31:0] log_input); bit [31:0] input_copy; bit [31:0] log_out = 0; input_copy = log_input; while(input_copy > 0)begin input_copy = input_copy >> 1; log_out = log_out + 1; end log_out = log_out - 1; if(log_input != (1 << log_out)) log_out = log_out + 1; return log_out; endfunction
Quel genre de logarithme essayez-vous d'ordinateur? Une base de journal entier 2 est facile. Une base de journal de point flottante E est beaucoup plus difficile.
N est-il une constante de temps de compilation?
Oui! C'est un paramètre au module
Dans ce cas, c'est assez facile. Vous pouvez utiliser une table de recherche si N est faible et la vitesse est un problème. Si n peut devenir grand, vous pouvez simplement boucler sur les bits de n de gauche à droite, jusqu'à ce que vous trouviez un bit 1 bit.
Comment faites-vous une table de recherche? Aussi n caps sur 128 ou peut-être 256 mais c'est là
Vous pouvez trouver une explication et une implémentation dans SystemVerilog (assez similaire à Verilog) d'un logarithme de base 2 dans ce site Web: sistenix.com/logarithm.html Une fois que le log2 est plus simple d'être implémenté par rapport à d'autres bases, vous pouvez calculer d'autres logarithmes dans différentes bases, il suffit de multiplier le résultat de log2 par un nombre constant.
@Gabe voudriez-vous me laisser davantage comment je peux faire cela »si n peut devenir grand, vous pouvez simplement boucler sur les bits de n de gauche à droite, jusqu'à ce que vous trouviez un 1 bit."