RAM 深度的地址宽度

发布于 2024-10-21 13:10:32 字数 199 浏览 2 评论 0原文

我正在实现一个可配置的 DPRAM,其中 RAM DEPTH 是参数。

如何根据 RAM 深度确定地址宽度?

我知道关系 RAM DEPTH = 2 ^ (ADDRESS WIDTH)

即 ADDRESS WIDTH = log (base 2) RAM DEPTH。

如何在Verilog中实现log(以2为底)函数?

I am implementing a configurable DPRAM where RAM DEPTH is the parameter.

How to determine ADDRESS WIDTH from RAM DEPTH?

I know the relation RAM DEPTH = 2 ^ (ADDRESS WIDTH)

i.e ADDRESS WIDTH = log (base 2) RAM DEPTH.

How to implement the log (base 2) function in Verilog?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

中性美 2024-10-28 13:10:32

$clog2 系统任务已添加到 Verilog (IEEE Std 1800-2005) 的 SystemVerilog 扩展中。这将返回一个整数,其值为对数底数 2 的上限。深度不必是 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

但是,我不知道支持 $ 的综合工具堵塞2。如果您需要综合代码,可以使用函数。这是从 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 对于可合成代码来说,使用 function 带来的麻烦比其价值更大。它给设计流程中的其他工具(linter、等价检查器等)带来了问题。

The $clog2 system task was added to the SystemVerilog extension to Verilog (IEEE Std 1800-2005). This returns an integer which has the value of the ceiling of the log base 2. The DEPTH need not be a power of 2.

module tb;

parameter DEPTH = 5;
parameter WIDTH = $clog2(DEPTH);

initial begin
    $display("d=%0d, w=%0d", DEPTH, WIDTH);
    #5 $finish;
end

endmodule

Running a simulation will display this:

d=5, w=3

However, I do not know of a synthesis tool which supports $clog2. If you need to synthesize your code, you can use a function. This was copied from the IEEE 1364-2001 Std, but there are other versions floating around the web:

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

My experience has been that using the function is more trouble than it's worth for synthesizable code. It has caused problems for other tools in the design flow (linters, equivalence checkers, etc.).

你穿错了嫁妆 2024-10-28 13:10:32

虽然 $clog2 是正确的答案,但在工具供应商赶上之前,您可以将自己的 clog2 函数实现为 verilog-2001 宏,它将与所有综合和仿真工具一起使用。

例如:

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

parameter FOO_MAX_VALUE = 42;
parameter FOO_WIDTH = `CLOG2(FOO_MAX_VALUE);

当最后的“-1”用于产生非法值时,模拟器应进行标记。

(后期编辑:哎呀,修复了我的差一错误!)

While $clog2 is the correct answer, until the tool vendors catch up, you can implement your own clog2 function as a verilog-2001 macro, which will work with all synthesis and simulation tools.

Such as:

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

parameter FOO_MAX_VALUE = 42;
parameter FOO_WIDTH = `CLOG2(FOO_MAX_VALUE);

Where the final "-1" is used to produce an illegal value the the simulator should flag.

(late edit: oops, fixed my off-by-one error!)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文