0

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

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

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 以此类推。

4

2 回答 2

1

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

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

更新:

如果您只对 2 的精确幂的答案感兴趣,则来自 RAM DEPTH 的地址宽度也可能是相关的。

于 2011-04-22T08:17:16.233 回答
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类型。

于 2013-07-01T23:11:12.833 回答