ШИРИНА АДРЕСА от ГЛУБИНЫ ОЗУ

Я реализую настраиваемую DPRAM, где RAM DEPTH является параметром.

Как определить ШИРИНУ АДРЕСА по ГЛУБИНЕ ОЗУ?

Я знаю отношение RAM DEPTH = 2 ^ (ADDRESS WIDTH)

т.е. ШИРИНА АДРЕСА = log (основание 2) ГЛУБИНА ОЗУ.

Как реализовать функцию журнала (база 2) в Verilog?


person Ashwini    schedule 11.03.2011    source источник


Ответы (2)


Системная задача $clog2 была добавлена ​​в расширение SystemVerilog для Verilog (IEEE Std 1800-2005). Это возвращает целое число, которое имеет значение верхнего предела логической базы 2. ГЛУБИНА не обязательно должна быть степенью 2.

module tb;

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

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

endmodule

При запуске моделирования отобразится следующее:

d=5, w=3

Однако я не знаю инструмента синтеза, который поддерживает $clog2. Если вам нужно синтезировать свой код, вы можете использовать function. Это было скопировано из IEEE 1364-2001 Std, но в сети есть и другие версии:

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

Мой опыт показывает, что использование function для синтезируемого кода - больше проблем, чем того стоит. Это вызвало проблемы для других инструментов в процессе проектирования (линтеры, средства проверки эквивалентности и т. Д.).

person toolic    schedule 11.03.2011
comment
Поскольку с момента публикации этого ответа прошло несколько лет, я хотел бы отметить, что (по крайней мере, некоторые) инструменты синтеза теперь поддерживают $ clog2. Если ваш инструмент не поддерживает его, я бы посмотрел, можете ли вы запросить его, поскольку это очень полезная функция. - person nguthrie; 15.12.2015
comment
Проверено, что ледяной шторм может синтезировать $clog2. - person jkschneider; 19.01.2017
comment
Последние версии Quartus это поддерживают. Но я видел проблемы с симуляторами, такими как Incisive IUS. - person sebs; 06.11.2017

Хотя $ clog2 - правильный ответ, пока производители инструментов не догонят вас, вы можете реализовать свою собственную функцию clog2 в виде макроса verilog-2001, который будет работать со всеми инструментами синтеза и моделирования.

Такие как:

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

Если последний «-1» используется для получения недопустимого значения, симулятор должен пометить его.

(Позднее редактирование: упс, исправлена ​​моя постепенная ошибка!)

person Jonathan Mayer    schedule 02.11.2013
comment
Он работает ... но он хакерский и небрежный; это напоминает мне фрагмент C, который я однажды видел, где программисту нужно было знать, было ли число четным, поэтому он сравнил его со всеми четными числами от 0 до 100 - person Kaiser Keister; 15.10.2019
comment
Небольшая разница, ваша первая версия вычисляет разрядность; в то время как ваше редактирование вычисляет потолок базы журнала 2. Итак, оба алгоритма полезны. Возможно, вы могли бы отредактировать свое сообщение, чтобы показать их оба, то есть CLOG2 (x) и BIT_WIDTH (x). - person tim; 20.06.2020