在Verilog/SystemVerilog中,(* ram_style = "ultra" *) 是一个Xilinx专用综合属性,用于指导Vivado工具将存储器推断为UltraScale+架构中的UltraRAM资源。
一、语法和作用
(* ram_style = "ultra" *) reg [width-1:0] memory [0:depth-1];
二、UltraRAM 特点
UltraRAM是Xilinx UltraScale+器件中的专用大容量RAM资源:
-
超大容量:每个UltraRAM 4K x 72位(288Kb)
-
专用资源:不占用块RAM或LUT资源
-
特定结构:同步读写、简单双端口
-
适用场景:超大容量存储应用
三、主要用途和示例
1. 基本UltraRAM实现
module ultra_ram_basic (
input wire clk,
input wire we,
input wire [11:0] addr, // 4K深度
input wire [63:0] din, // 64位宽度
output reg [63:0] dout
);
(* ram_style = "ultra" *) reg [63:0] ultra_ram [0:4095];
always @(posedge clk) begin
if (we)
ultra_ram[addr] <= din;
dout <= ultra_ram[addr];
end
endmodule
2. UltraRAM vs 块RAM容量对比
module ram_capacity_comparison (
input wire clk,
input wire we,
input wire [15:0] addr_block, addr_ultra,
input wire [63:0] din,
output reg [63:0] dout_block, dout_ultra
);
// 块RAM - 最大深度受限于块RAM资源
(* ram_style = "block" *) reg [63:0] block_ram [0:511]; // 512x64 = 32Kb
// UltraRAM - 超大容量
(* ram_style = "ultra" *) reg [63:0] ultra_ram [0:4095]; // 4Kx64 = 256Kb
always @(posedge clk) begin
if (we) begin
block_ram[addr_block[8:0]] <= din;
ultra_ram[addr_ultra] <= din;
end
dout_block <= block_ram[addr_block[8:0]];
dout_ultra <= ultra_ram[addr_ultra];
end
endmodule
3. 简单双端口UltraRAM
module simple_dual_port_ultra (
input wire clk,
input wire we,
input wire [11:0] waddr, raddr,
input wire [71:0] din, // 72位宽度充分利用UltraRAM
output reg [71:0] dout
);
(* ram_style = "ultra" *) reg [71:0] ultra_ram [0:4095];
always @(posedge clk) begin
if (we)
ultra_ram[waddr] <= din;
dout <= ultra_ram[raddr];
end
endmodule
四、实际应用场景
1. 大数据缓冲区
module large_data_buffer (
input wire clk,
input wire rst,
input wire wr_en, rd_en,
input wire [11:0] wr_addr, rd_addr,
input wire [63:0] wr_data,
output reg [63:0] rd_data,
output reg full, empty
);
parameter DEPTH = 4096;
(* ram_style = "ultra" *) reg [63:0] data_buffer [0:DEPTH-1];
reg [12:0] wr_ptr, rd_ptr;
reg [13:0] data_count;
assign full = (data_count == DEPTH);
assign empty = (data_count == 0);
always @(posedge clk) begin
if (rst) begin
wr_ptr <= 0;
rd_ptr <= 0;
data_count <= 0;
end else begin
// 写操作
if (wr_en && !full) begin
data_buffer[wr_ptr[11:0]] <= wr_data;
wr_ptr <= wr_ptr + 1;
end
// 读操作
if (rd_en && !empty) begin
rd_data <= data_buffer[rd_ptr[11:0]];
rd_ptr <= rd_ptr + 1;
end
// 更新计数器
case ({wr_en && !full, rd_en && !empty})
2'b10: data_count <= data_count + 1;
2'b01: data_count <= data_count - 1;
default: data_count <= data_count;
endcase
end
end
endmodule
2. 帧缓冲区(Frame Buffer)
module frame_buffer_ultra (
input wire clk,
input wire we,
input wire [11:0] pixel_x, // 0-4095
input wire [10:0] pixel_y, // 0-2047
input wire [23:0] pixel_data, // RGB各8位
output reg [23:0] pixel_out
);
// 4096x2048 像素的帧缓冲区
(* ram_style = "ultra" *) reg [23:0] frame_buffer [0:8191]; // 8K行,每行存储多个像素
wire [12:0] line_addr = pixel_y[10:3]; // 每行存储8个像素
wire [2:0] pixel_offset = pixel_y[2:0];
wire [15:0] combined_addr = {line_addr, pixel_offset, pixel_x[2:0]};
always @(posedge clk) begin
if (we)
frame_buffer[combined_addr] <= pixel_data;
pixel_out <= frame_buffer[combined_addr];
end
endmodule
3. 神经网络权重存储
module neural_weights_ultra (
input wire clk,
input wire we,
input wire [3:0] layer_sel,
input wire [11:0] weight_addr,
input wire [31:0] weight_data,
output reg [31:0] weight_out
);
// 存储多个神经网络的权重
(* ram_style = "ultra" *) reg [31:0] weight_memory [0:16383]; // 16K权重
wire [13:0] full_addr = {layer_sel, weight_addr};
always @(posedge clk) begin
if (we)
weight_memory[full_addr] <= weight_data;
weight_out <= weight_memory[full_addr];
end
endmodule
五、工具支持和限制
1. UltraRAM配置选项
module ultra_ram_configurable (
input wire clk,
input wire we,
input wire [1:0] config_mode,
input wire [11:0] addr,
input wire [71:0] din,
output reg [71:0] dout
);
(* ram_style = "ultra" *) reg [71:0] ultra_ram [0:4095];
// 根据配置模式选择不同的操作
always @(posedge clk) begin
case (config_mode)
2'b00: begin // 正常模式
if (we) ultra_ram[addr] <= din;
dout <= ultra_ram[addr];
end
2'b01: begin // 只读模式
dout <= ultra_ram[addr];
end
2'b10: begin // 初始化模式
if (we) ultra_ram[addr] <= 72'h0;
dout <= ultra_ram[addr];
end
default: begin
if (we) ultra_ram[addr] <= din;
dout <= ultra_ram[addr];
end
endcase
end
endmodule
六、使用建议和最佳实践
1. 容量规划示例
module memory_hierarchy_design (
input wire clk,
input wire we,
input wire [19:0] addr, // 1M地址空间
input wire [31:0] din,
output reg [31:0] dout
);
// 根据地址范围选择不同的存储器类型
wire [1:0] mem_region = addr[19:18];
// 小容量:寄存器实现(最高性能)
(* ram_style = "register" *) reg [31:0] fast_mem [0:255]; // 1K-256地址
// 中容量:分布式RAM
(* ram_style = "distributed" *) reg [31:0] medium_mem [0:1023]; // 1K-4K地址
// 大容量:块RAM
(* ram_style = "block" *) reg [31:0] large_mem [0:16383]; // 16K-64K地址
// 超大容量:UltraRAM
(* ram_style = "ultra" *) reg [31:0] huge_mem [0:262143]; // 256K-1M地址
always @(posedge clk) begin
if (we) begin
case (mem_region)
2'b00: fast_mem[addr[7:0]] <= din;
2'b01: medium_mem[addr[9:0]] <= din;
2'b10: large_mem[addr[13:0]] <= din;
2'b11: huge_mem[addr[17:0]] <= din;
endcase
end
case (mem_region)
2'b00: dout <= fast_mem[addr[7:0]];
2'b01: dout <= medium_mem[addr[9:0]];
2'b10: dout <= large_mem[addr[13:0]];
2'b11: dout <= huge_mem[addr[17:0]];
endcase
end
endmodule
七、UltraRAM的特定约束
1. 字节使能实现
module ultra_ram_byte_enable (
input wire clk,
input wire we,
input wire [7:0] byte_en, // 字节使能(针对72位数据)
input wire [11:0] addr,
input wire [71:0] din,
output reg [71:0] dout
);
(* ram_style = "ultra" *) reg [71:0] ultra_ram [0:4095];
reg [71:0] ram_read;
always @(posedge clk) begin
ram_read <= ultra_ram[addr];
if (we) begin
// 字节级写入
for (int i = 0; i < 8; i = i + 1) begin
if (byte_en[i])
ultra_ram[addr][i*9+:8] <= din[i*9+:8];
end
// 奇偶校验位处理(第9位)
if (byte_en[8])
ultra_ram[addr][71:64] <= din[71:64];
end
dout <= ram_read;
end
endmodule
八、属性取值对比
(* ram_style = "ultra" *) // UltraRAM(Xilinx UltraScale+超大容量) (* ram_style = "block" *) // 块RAM(通用大容量) (* ram_style = "distributed" *) // 分布式RAM(小容量,灵活) (* ram_style = "register" *) // 寄存器(极小容量,高性能) (* ram_style = "auto" *) // 工具自动选择
九、UltraRAM的特点总结
1. 优点
-
超大容量(每个288Kb)
-
专用硬件资源,不占用其他RAM
-
适合大规模数据存储
-
在UltraScale+器件中高效使用
2. 限制
-
Xilinx UltraScale+专用
-
特定端口配置(主要是简单双端口)
-
同步读写操作
-
深度和宽度有特定限制(主要是4K x 72)
3. 适用场景
-
大数据缓冲区
-
帧缓冲区
-
神经网络权重存储
-
数据库缓存
-
任何需要超大容量片上存储的应用
4. 注意事项
-
仅适用于Xilinx UltraScale+及以上架构
-
需要Vivado工具支持
-
检查器件是否包含UltraRAM资源
-
遵循UltraRAM的特定时序和配置要求
这个属性在需要超大容量片上存储的Xilinx UltraScale+设计中非常有用,可以充分利用器件的专用大容量RAM资源。
3270

被折叠的 条评论
为什么被折叠?



