verilog - 从 RAM 深度开始的地址宽度

标签 verilog system-verilog

我正在实现一个可配置的 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/

相关文章:

verilog - 如何确保 FPGA 中生成的硬件对于该特定代码段是正确的?

Verilog 预处理器字符串连接

verilog - `define Macro 中的 For 循环

audio - Nexys 4上的信号启用音频输出

loops - 如何在Verilog中打破always block ?

system-verilog - SystemVerilog 中的向上转型

arrays - SystemVerilog foreach 语法,用于循环遍历多维数组的低维

vhdl - 是否可以设计一个基于锁存器的 FIFO 而不是 FF?

stdout - 将 SystemVerilog $display 发送到 stderr

interface - 声明模块接口(interface)时出现 SystemVerilog 编译错误(未声明的标识符 [12.5(IEEE)])