web-dev-qa-db-fra.com

LARGEUR D'ADRESSE de RAM DEPTH

J'implémente une DPRAM configurable où RAM DEPTH est le paramètre.

Comment déterminer la LARGEUR D'ADRESSE à partir de RAM DEPTH?

Je connais la relation RAM DEPTH = 2 ^ (ADDRESS WIDTH)

i.e ADDRESS WIDTH = log (base 2) RAM DEPTH.

Comment implémenter la fonction log (base 2) dans Verilog?

23
Ashwini

Le $clog2 la tâche système a été ajoutée à l'extension SystemVerilog de Verilog (IEEE Std 1800-2005). Cela renvoie un entier qui a la valeur du plafond de la base de log 2. La PROFONDEUR n'a pas besoin d'être une puissance de 2.

module tb;

parameter DEPTH = 5;
parameter WIDTH = $clog2(DEPTH);

initial begin
    $display("d=%0d, w=%0d", DEPTH, WIDTH);
    #5 $finish;
end

endmodule

L'exécution d'une simulation affichera ceci:

d=5, w=3

Cependant, je ne connais pas d'outil de synthèse qui supporte $clog2. Si vous avez besoin de synthétiser votre code, vous pouvez utiliser un function. Cela a été copié à partir de la norme IEEE 1364-2001, mais il existe d'autres versions flottant sur le Web:

function integer clogb2;
    input [31:0] value;
    begin
        value = value - 1;
        for (clogb2 = 0; value > 0; clogb2 = clogb2 + 1) begin
            value = value >> 1;
        end
    end
endfunction

D'après mon expérience, l'utilisation de function est plus difficile que cela ne vaut pour du code synthétisable. Cela a causé des problèmes pour d'autres outils dans le flux de conception (linters, vérificateurs d'équivalence, etc.).

30
toolic

Bien que $ clog2 soit la bonne réponse, jusqu'à ce que les fournisseurs d'outils rattrapent leur retard, vous pouvez implémenter votre propre fonction clog2 en tant que macro verilog-2001, qui fonctionnera avec tous les outils de synthèse et de simulation.

Tel que:

`define CLOG2(x) \
   (x <= 2) ? 1 : \
   (x <= 4) ? 2 : \
   (x <= 8) ? 3 : \
   (x <= 16) ? 4 : \
   (x <= 32) ? 5 : \
   (x <= 64) ? 6 : \
   ..etc, as far as you need to go..
   (x <= 4294967296) ? 32 : \
   -1

parameter FOO_MAX_VALUE = 42;
parameter FOO_WIDTH = `CLOG2(FOO_MAX_VALUE);

Lorsque le "-1" final est utilisé pour produire une valeur illégale, le simulateur doit signaler.

(édition tardive: oups, correction de mon erreur de coup par coup!)

24
Jonathan Mayer