Verilog HDL是否支持$ clog2任务?

时间:2016-09-12 06:18:36

标签: verilog fpga system-verilog

当我在程序中使用它时,会生成错误(不支持$clog2)。但我在他们的程序中看到我们的StackOverflowers使用$clog2任务。请告诉我如何使用它。

2 个答案:

答案 0 :(得分:4)

Verilog不支持

$clog2。这是一个 SystemVerilog 系统任务。此外,系统任务无法合成

但是,您可以创建一个函数/宏,它输出给定数字的log bsae 2值。以下是用户定义实现的一些示例:

使用宏:

`define CLOG2(x) \
   (x <= 2) ? 1 : \
   (x <= 4) ? 2 : \
   (x <= 8) ? 3 : \
   (x <= 16) ? 4 : \
   (x <= 32) ? 5 : \
   (x <= 64) ? 6 : \
   ..etc, ..
   (x <= 4294967296) ? 32 : \
   -1

parameter MAX_VALUE = 42;
parameter MAX_WIDTH = `CLOG2(MAX_VALUE);

使用function

function [31:0] log2;
   input [31:0] value;
   integer i;
   reg [31:0] j;
   begin
      j = value - 1;
      log2 = 0;
      for (i = 0; i < 31; i = i + 1)
        if (j[i]) log2 = i+1;
   end
endfunction

initial
 begin
  $display("10 = %d", log2(10));
 end

上述两个例子都会产生可综合的代码。用户可以根据最大位宽要求扩展此代码。

因此,您可以更改编译器以编译SystemVerilog代码或实现上述函数以生成用户定义的日志代码。

答案 1 :(得分:3)

Verilog支持

$clog2 ,但仅限Verilog-2005(IEEE Std 1364-2005)。由于Verilog-2005与IEEE的SystemVerilog同时发布,因此通常被认为是SystemVerilog增强版。以下是两个源文档$clog2作为Verilog-2005功能:

Verilog-2005主要是最终合并Verilog和SystemVerilog的中间版本(发生在IEEE Std 1800-2009)。一些模拟器可能没有植入Verilog-2005,因为其中的所有内容都包含在SystemVerilog中。如果您的模拟器默认情况下不运行Verilog-2005,请参阅您的手册,其中可能包含启用它的选项。启用S​​ystemVerilog是另一个选项,或者是sharvil111解决方案中描述的用户方法。