当我在程序中使用它时,会生成错误(不支持$clog2
)。但我在他们的程序中看到我们的StackOverflowers使用$clog2
任务。请告诉我如何使用它。
答案 0 :(得分:4)
$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)
$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,请参阅您的手册,其中可能包含启用它的选项。启用SystemVerilog是另一个选项,或者是sharvil111解决方案中描述的用户方法。