生成 BRAM 模块模板(单端口/双端口/ROM),支持 $readmemh 初始化。用法:/verilog-bram <模块名> <类型:sp|dp|rom> [深度] [数据位宽] [初始化文件]
参数:$ARGUMENTS
| 参数 | 必填 | 默认值 | 说明 |
|---|---|---|---|
| 模块名 | 是 | — | 生成的模块名称 |
| 类型 | 是 | — | sp=单端口RAM,dp=双端口RAM,rom=只读ROM |
| 深度 | 否 | 1024 | 存储深度(条目数,建议为 2 的幂次) |
| 数据位宽 | 否 | 32 | 每条目位宽 |
| 初始化文件 | 否 | 无 | .hex 文件路径,用于 $readmemh |
ADDR_WIDTH = $clog2(深度)$readmemh 初始化块PL/source/verilog/<模块名>.vmodule <模块名> #(
parameter DATA_WIDTH = 32 ,
parameter DEPTH = 1024,
parameter ADDR_WIDTH = 10
) (
input wire clk , // 时钟
input wire en , // 使能
input wire we , // 写使能
input wire [ADDR_WIDTH-1:0] addr , // 地址
input wire [DATA_WIDTH-1:0] din , // 写数据
output reg [DATA_WIDTH-1:0] dout // 读数据(1拍延迟)
);
reg [DATA_WIDTH-1:0] mem [0:DEPTH-1];
// $readmemh 初始化(如有)
initial $readmemh("<初始化文件>", mem);
always @(posedge clk)
begin
if (en == 1'b1)
begin
if (we == 1'b1)
mem[addr] <= din;
dout <= mem[addr];
end
end
endmodule
两个独立时钟域端口 A(读写)/ B(读写),结构类似 sp,端口前缀分别为 a_ / b_。
无写端口,仅保留 clk、en、addr、dout,必须提供初始化文件($readmemh)。
.hex),每行一个数据条目