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?
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.).
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!)
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