2011-04-22 73 views
0

任何人都可以告訴我如何計算設計文件中參數的對數值?verilog中的日誌值

我碰到過這樣的情況,我有一個生成這樣的循環來:

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 

有沒有辦法做到的log 2(M),其中M爲2的冪變化(2^0,2^1,2^2,直到N)?如果沒有,

我正在考慮引入一個新的變量,m1,也就是說,它是0,1,2,...(即log2(m))。在這種情況下,m1應該隨着每個m同時變化,即,當m = 1時,m1 = 0; M = 2時,m1 = 1;

m = 4,m1 = 2; m = 8,m1 = 3等等。

回答

1

鑑於這顯然不是爲了合成,並且N只有8,你可以生成一個2^N值的數組(每個包含反向日誌) - 然後你可以用'm'來索引,以得到答案。

你甚至可以使用比Verilog更糟糕的語言生成表格的源代碼,並加載它。

更新:

ADDRESS WIDTH from RAM DEPTH可能是相關的也一樣,如果你只在兩個精確的權力答案感興趣。

+0

謝謝你,但我參數KS加法器。舉個例子,我在這裏保持N爲8。它可以取任何值,因爲它只是一個模擬。 – Nandhini 2011-04-22 08:20:16

+0

@Nandhini:答案是Will Dean的更新。在附註中,請接受您在SO上提出的所有問題的一些答案。 – toolic 2011-04-22 13:27:13

+0

@ Will,謝謝,我認爲這將是唯一的出路,我正在考慮這樣做,直到N = 256。 – Nandhini 2011-04-25 06:48:40

0

你想要的是日誌基地2

的天花板如果你的仿真器支持IEEE 1364至2005年或任何IEEE 1800,然後使用$clog2。例:

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

如果僅限於IEEE 1364-2001,然後用「純函數」有知識的參數作爲輸入指定另一個參數。 「純函數」被定義爲一個函數,其輸出只能通過輸入來計算。以下是基於IEEE 1800-2012第13.4.3節中的示例的snip。自1364-2001以來,所有Verilog(& SystemVerilog)版本都使用相同的示例。 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工種。