Szerokość adresu od głębokości pamięci RAM

Implementuję konfigurowalny DPRAM, w którym parametrem jest głębokość pamięci RAM.

Jak określić szerokość adresu na podstawie głębokości pamięci RAM?

Znam relację RAM DEPTH = 2 ^ (address WIDTH)

Tj. szerokość adresu = log (baza 2) głębokość pamięci RAM.

Jak zaimplementować funkcję log (base 2) w Verilog?

Author: toolic, 2011-03-11

2 answers

Zadanie systemowe zostało dodane do rozszerzenia SystemVerilog do Verilog (IEEE Std 1800-2005). Zwraca liczbę całkowitą, która ma wartość pułapu podstawy dziennika 2. Głębokość nie musi być moc 2.

module tb;

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

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

endmodule

Uruchomienie symulacji wyświetli to:

d=5, w=3

Nie znam jednak narzędzia do syntezy, które wspiera $clog2. Jeśli chcesz zsyntetyzować swój kod, możesz użyć function. To zostało skopiowane z IEEE 1364-2001 Std, ale są inne wersje unosi się po sieci:

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

Z mojego doświadczenia wynika, że używanie function jest bardziej kłopotliwe niż jest warte dla kodu syntezowalnego. Spowodowało to problemy dla innych narzędzi w przepływie projektowym (lintery, sprawdzacze równoważności itp.).

 23
Author: toolic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-11 18:07:47

Podczas gdy $clog2 jest poprawną odpowiedzią, dopóki sprzedawcy narzędzi nie nadrobią zaległości, możesz zaimplementować własną funkcję clog2 jako makro verilog-2001, które będzie działać ze wszystkimi narzędziami do syntezy i symulacji.

Takie jak:

`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);

Gdzie ostateczne "-1" jest używane do wytworzenia nielegalnej wartości, którą powinien oznaczać symulator.

(późna edycja: oops, Naprawiono mój błąd off-by-one!)

 19
Author: Jonathan Mayer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-25 00:19:36