Verilog参数例化时自动计算位宽的函数

在工程中,参数化设计是非常常见的。模块接口的位宽,常见的有8位、16位、32位、64位和128位等;虽然功能相同,仅因为位宽不同,就要另外写一个模块,那设计工作就很繁复了。为此,我们可以采用参数化来实现,即用parameter来定义常数。
但是参数化会遇到一个问题,就是某些信号的位宽跟此参数有着密切的关系。例如,我们可以使用parameter来定义FIFO的深度,但是表示FIFO深度的信号usedw,其位宽是跟参数相关的。如果深度为512,usedw位宽是9位,如果深度为1024,其位宽是10位。这时如果此模块可以自己计算位宽那就再好不过了。

function integer clogb2(
    input           integer depth
    );
begin
    if(depth == 0)
        clogb2 = 1;
    else if(depth != 0)
        for(clogb2 = 0; depth > 0;clogb2 = clogb2 + 1)
            depth = depth >> 1;
end
endfunction

注意一下,该函数要求depth必须是2的N次方,否则会计算不正确。

你可能感兴趣的:(HDL与FPGA,verilog)