我正在实现一个可配置的 DPRAM,其中 RAM DEPTH 是参数。
如何从 RAM DEPTH 确定地址宽度?
我知道关系 RAM DEPTH = 2 ^(地址宽度)
即地址宽度 = log (base 2) RAM DEPTH。
如何在 Verilog 中实现日志(基数 2)功能?
最佳答案
$clog2
系统任务已添加到 Verilog 的 SystemVerilog 扩展中(IEEE Std 1800-2005)。这将返回一个整数,其值为对数基数 2 的上限。 DEPTH 不必是 2 的幂。
module tb;
parameter DEPTH = 5;
parameter WIDTH = $clog2(DEPTH);
initial begin
$display("d=%0d, w=%0d", DEPTH, WIDTH);
#5 $finish;
end
endmodule
运行模拟将显示:
d=5, w=3
但是,我不知道支持
$clog2
的综合工具。 .如果你需要综合你的代码,你可以使用 function
.这是从 IEEE 1364-2001 Std 复制而来的,但网上还有其他版本:function integer clogb2;
input [31:0] value;
begin
value = value - 1;
for (clogb2 = 0; value > 0; clogb2 = clogb2 + 1) begin
value = value >> 1;
end
end
endfunction
我的经验是使用
function
对于可合成的代码来说,它比它的值(value)更麻烦。它给设计流程中的其他工具(短绒、等效检查器等)造成了问题。
关于verilog - 从 RAM 深度开始的地址宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5269634/