Verilog中的对数函数

9
我看到一个类似于以下的Verilog语句:integer level = log(N)(其中N是一个参数,level需要确定)。但是我知道在Verilog中不能使用复杂的数学语句,所以我想知道是否有解决上述问题的替代方案?
欢迎提供任何反馈!

你想计算什么类型的对数?整数以2为底的对数很容易计算。以e为底的浮点数对数则更加困难。 - Gabe
是的!这是一个模块的参数。 - Max Eastman
1
在这种情况下,这很容易。如果N很小且速度是一个问题,您可以使用查找表。如果N可能变得很大,您可以从左到右循环N的位,直到找到1位。 - Gabe
你如何创建查找表?同时,N的上限为128或256,但大概就是这样了。 - Max Eastman
@Gabe,你能告诉我如何实现这个功能吗?“如果N很大,你可以从左到右循环遍历N的位,直到找到一个1位。” - Carter
显示剩余2条评论
5个回答

11

如果您要进行基于2的对数运算,可以使用内置函数$clog2()


5

4

Verilog有自然对数函数($ln())、十进制对数函数($log10())和二进制对数上取整函数($clog2())。在常量表达式中,它们应该是可综合的,但实际支持工具的情况有所不同。

以下是可综合的Verilog代码:

module test(output [31:0] a, b, c);
  assign a = 1000 * $ln(123);
  assign b = 1000 * $log10(123);
  assign c = 1000 * $clog2(123);
endmodule

例如,通过Yosys进行RTL综合(例如:yosys -p 'prep; write_verilog -noattr' test.v)后:

module test(a, b, c);
  output [31:0] a;
  output [31:0] b;
  output [31:0] c;
  assign a = 32'd4812;
  assign b = 32'd2090;
  assign c = 32'd7000;
endmodule

2

但我知道在Verilog中无法进行复杂的数学运算。

首先,Verilog是一种硬件描述语言。硬件怎么描述log(N)语句呢?现代FPGA由LUT、flops、小型嵌入式存储器、实现MAC(乘累加)基元的简单DSP组成。不能直接将log(N)和其他复杂的数学语句映射到这些基元上。ASIC也是如此。

类比一下,处理器不会执行log(N)。它调用一堆低级汇编指令来执行。这些汇编指令是log(N)库(C、C++等)的一部分。

为了能够合成ASIC/FPGA的log(N),需要一个log(N) IP核实例。


1
我喜欢把(值的以n为底的对数)看作是回答问题“表示'值'独立数字需要多少个基于n的数字位?”的方式。(记住0也算作数字)
这样想,你可以在SystemVerilog中实现自己的以2为底的对数:
function bit [31:0] log_base_2 (bit [31:0] log_input);
  bit [31:0] input_copy;
  bit [31:0] log_out = 0;
  input_copy = log_input;

  while(input_copy > 0)begin
    input_copy = input_copy >> 1;
    log_out = log_out + 1;
  end
  log_out = log_out - 1;

  if(log_input != (1 << log_out))
    log_out = log_out + 1;

  return log_out;
endfunction

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接