当我在程序中使用它时,会生成一个错误(不支持$clog2
)。但是我看到我们的StackOverflowers在他们的程序中使用$clog2
任务。请告诉我怎么用。
发布于 2016-09-12 08:37:55
Verilog不支持$clog2
。这是一个SystemVerilog系统任务。此外,系统任务是不可综合的。
但是,您可以创建一个function/macro,它输出给定数字的log 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代码,或者实现上面的函数来生成用户定义的日志代码。
发布于 2016-09-12 12:23:57
$clog2
is由Verilog支持,但只支持Verilog-2005 (IEEESTD1364-2005).由于Verilog-2005是在IEEE的SystemVerilog发布的同时发布的,它通常被认为是一种SystemVerilog增强。下面是将$clog2
文档作为Verilog-2005特性的两个源代码:
Verilog-2005主要是Verilog和SystemVerilog最终合并的中间版本(发生在IEEESTD18000-2009年)。一些模拟器可能还没有植入Verilog-2005,因为它中的所有内容都包含在SystemVerilog中。如果模拟器在默认情况下不运行Verilog-2005,请参考您的手册,其中可能包含一个选项来启用它。启用SystemVerilog是另一种选择,也就是sharvil111 111的解决方案中描述的用户方法。
发布于 2022-03-23 20:50:49
我只想指出,$clog2是一个可综合的结构,可以被大多数工具处理。它并不仅仅因为它是一个系统任务而变得不可综合。
例如,下面是一个可综合的语句:
logic [$clog2(WIDTH) - 1 : 0] addr;
https://stackoverflow.com/questions/39444335
复制相似问题