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èquejournal (n) code> (C, C ++, etc.) P>Pour pouvoir synthétiser
journal (n) code> pour ASIC / FPGA, il nécessite une instance d'un journallog (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."