verilog中的日志值

问题描述 投票:0回答:2

谁能告诉我如何计算设计文件中参数的日志值?

我遇到这样一种情况,我有一个像这样的循环生成:

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; M = 2时,m1 = 1;

M = 4,M 1 = 2; m = 8,m1 = 3,依此类推。

for-loop verilog instantiation logarithm
2个回答
1
投票

鉴于这显然不是要合成的,并且N只有8,你是否可以生成(带有一对嵌套的for循环)一个2 ^ N值的数组,每个都包含逆对数 - 然后你可以直接索引到用'm'来得到答案。

您甚至可以使用比Verilog更糟糕的语言生成表的源,并加载它。

更新:

ADDRESS WIDTH from RAM DEPTH也可能是相关的,如果你只对2的确切权力的答案感兴趣。


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节中的示例的剪辑。从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类型一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.