значение лога в verilog - PullRequest
       26

значение лога в verilog

0 голосов
/ 22 апреля 2011

Может кто-нибудь сказать мне, как рассчитать лог-значение параметра в файле design ?

Я сталкиваюсь с такой ситуацией, когда у меня генерируется цикл, подобный этому:

parameter N=8;

genvar i,m;

generate
for(m=1;m<N;m=m*2)
begin :m_loop

    // I have an instance here
    // "in" is an input of N bits, "out" is an output N bits

    Inst u(in(i+log2(m)),in(i+1+log2(m)),out(i+log2(m)));     
end
endgenerate

Есть ли способ сделать log2 (m), где m изменяется как степени 2 (2 ^ 0,2 ^ 1,2 ^ 2, до N)? Если нет, то

Я думал о введении новой переменной, скажем, m1, которая равна 0,1,2, ... (т.е. log2 (m)).

В таком случае m1 должен меняться одновременно с каждым m, т. Е. Когда m = 1, m1 = 0; т = 2, m1 = 1;

т = 4, m 1 = 2; m = 8, m1 = 3 и т. д.

Ответы [ 2 ]

1 голос
/ 22 апреля 2011

Учитывая, что это, очевидно, не предназначено для синтеза, и что N равно только 8, вы могли бы просто сгенерировать (с парой вложенных для циклов) массив из 2 ^ N значений, каждое из которых содержит обратный лог - тогда вы могли быпросто укажите в нем «m», чтобы получить ответ.

Вы даже можете сгенерировать источник для таблицы, используя менее ужасный язык, чем Verilog, и просто загрузить его.

Обновление:

АДРЕСНАЯ ШИРИНА из RAM DEPTH также может иметь значение, если вас интересуют только ответы для точных степеней двух.

0 голосов
/ 02 июля 2013

То, что вы хотите, это потолок бревна 2.

Если ваш симулятор поддерживает IEEE 1364-2005 или любой IEEE 1800, используйте $clog2. Ex.:

Inst u(in[i+$clog2(m)], in[i+1+$clog2(m)], out[i+$clog2(m)]);  

Если вы ограничены IEEE 1364-2001, тогда используйте «чистую функцию» с известным параметром в качестве входа для назначения другого параметра. «Чистая функция» определяется как функция, выход которой рассчитывается только по ее входам. Ниже приведен фрагмент кода, основанный на примере из раздела IEEE 1800-2012 , раздел 13.4.3. Этот же пример используется во всех версиях Verilog (& SystemVerilog), начиная с 1364-2001. 1800-2012 - это единственная версия, которую можно бесплатно загрузить с IEEE.

parameter ram_depth = 256;
parameter addr_width=clogb2(ram_depth); // width is 8
/* ... */
function integer clogb2(input [31:0] value);
  value = value -1;
  for(clogb2=0; value>0; clogb2=clogb2+1)
    value = value >> 1;
endfunction

Та же самая функция clogb2() должна работать с типами genvar.

...