9
votes

LOGARITHM IN VERILOG

J'ai une déclaration dans Verilog ressemblant à integer niveau = journal (n) (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?

Tous les commentaires appréciés!


7 commentaires

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."


5 Réponses :


4
votes

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.


0 commentaires

10
votes

S'il s'agit d'une base de logarithme 2, vous essayez de le faire, vous pouvez utiliser la fonction intégrée $ clog2 () .


0 commentaires

2
votes

Mais je comprends que je ne peux pas faire de relevés de mathématiques complexes à Verilog

Verilog est avant tout une langue description du matériel. Quel matériel log (n) 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) 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.

par analogie, journal (n) 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) (C, C ++, etc.)

Pour pouvoir synthétiser journal (n) pour ASIC / FPGA, il nécessite une instance d'un journal log (n) noyau IP.


0 commentaires

3
votes

Verilog a des fonctions pour le logarithme naturel ( $ ln () ), logarithme décennier ( $ log10 () ) et plafond du logarithme binaire ( $ clog2 ( ) ). Dans des expressions constantes, elles doivent être synthétisables, mais la prise en charge réelle des outils varie.

Ce qui suit est synthétisable code Verilog: xxx

E.g. Après la synthèse RTL avec yosys (par exemple, YOSYS -P 'Prep; write_verilog -noattr' test. v ): xxx


0 commentaires

1
votes

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


0 commentaires