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
有没有办法做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,m1 = 2; m = 8,m1 = 3等等。     
已邀请:
鉴于显然不打算将其合成,并且N只有8,您是否可以生成(带有一对嵌套的for循环)2 ^ N个值的数组,每个值都包含反向对数-那么您可以索引到用'm \'得到答案。 您甚至可以使用比Verilog少的可怕语言来生成表的源,然后将其加载。 更新: 如果您只对精确的2的幂的答案感兴趣,那么RAM DEPTH中的ADDRESS WIDTH也可能是相关的。     
您想要的是日志库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)版本都使用同一示例。唯一可以从IEEE免费下载的版本是1800-2012。
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
相同的“ 4”功能应与“ 5”类型一起使用。     

要回复问题请先登录注册