目录
人工智能芯片开发中的三维集成存储器技术是突破传统存储架构瓶颈、提升AI算力与能效的关键路径。三维集成 (3D Integration) 存储器技术是缓解存储器墙问题的一种关键手段。一般使用硅通孔技术 (Through-silicon-via,TSV),将多块带有宽输入输出接口 (Wide I/O Interface) 的存储器裸片在垂直方向上堆叠起来,以获得大存储容量 [4]。相比于传统的多片存储模块,三维集成的封装代价和功耗代价要小得多。被电子器件工程联合委员会 (Joint Electron Device Engineering Council,JEDEC) 规定为工业标准的高带宽存储器 (High-bandwidth Memory,HBM) 就是一种典型的三维集成存储器。
1.技术原理与核心架构
三维集成存储器通过垂直堆叠存储层与逻辑层,突破二维平面布局的物理限制。其核心技术包括:
3DNAND与HBM技术
3DNAND通过垂直堆叠存储单元(如SK海力士321层4DNAND),结合电荷俘获技术(CTF)提升密度与可靠性。高带宽存储器(HBM)则通过硅通孔(TSV)堆叠DRAM层,例如美光HBM3E 采用12层堆叠,带宽超1.2TB/s,功耗比竞品低30%美光科技。
HBM的基本结构如图所示,是在基底裸片上堆叠4个核心DRAM。其基底裸片是存储控制器和核心 DRAM之间的接口。核心DRAM采用异构结构,其核心裸片在传统DRAM的结构上增加了硅通孔。每个核心DRAM包含两个通道,每个通道具有1GB容量、128个I/O、8个独立的存储分区 (Bank0~Bank7,图中用B0~B7表示),具有独立的地址和点对点连接的数据硅通孔,使不同通道的操作被隔离开来。
存算一体架构:
将存储单元与计算逻辑直接集成,减少数据搬运功耗。例如华中科技大学团队开发的3D垂直阻变存储器(3D-V ReRAM)存算一体系统,通过堆叠4层ReRAM阵列实现FP32精度计算,能效达 11.5 TFLOPS/W,较NVIDIA H100 GPU提升132倍。
新型存储技术融合:
结合MRAM、ReRAM等新型存储,例如NEO Semiconductor的3D X-AI技术,将突触与神经元集成于300层存储芯片,单Die算力达10TB/s。
2.三维集成存储器技术的应用
训练端:高带宽需求场景
GPU加速:NVIDIA H200 GPU搭载美光HBM3E,支撑Transformer模型训练时的千亿级参数访问。
超算系统:3D堆叠的HBM与逻辑层结合(如CXL接口),可提升E级超算的存储-计算协同效率。
推理端:能效敏感场景
自动驾驶:3D NAND与MRAM结合的车载存储,满足L4级自动驾驶实时数据处理与低延迟需求(如铠侠332层3D闪存支持4.8 Gb/s接口速度)。
边缘AI:三维存算一体芯片(如华中科大的3D-V ReRAM系统)可在物联网设备上实现图像识别等任务的本地处理,功耗降低90%以上。
3.三维存储技术的Verilog实现
module three_d_memory_controller #(
parameter NUM_LAYERS = 4, // 存储堆叠层数
parameter LAYER_DEPTH = 1024, // 每层存储深度
parameter DATA_WIDTH = 128, // 数据宽度(模拟宽总线)
parameter ADDR_WIDTH = 10, // 地址宽度
parameter BANK_NUM = 8 // 每层Bank数量
)(
input clk,
input rst_n,
// 主机接口
input [ADDR_WIDTH-1:0] host_addr,
input [DATA_WIDTH-1:0] host_wdata,
output reg [DATA_WIDTH-1:0] host_rdata,
input host_we, // 写使能
input host_en, // 操作使能
output reg host_ready, // 操作完成
// 层间接口(模拟TSV连接)
output reg [NUM_LAYERS-1:0] layer_en,
output reg [ADDR_WIDTH-1:0] layer_addr,
output reg [DATA_WIDTH-1:0] layer_wdata,
input [DATA_WIDTH*NUM_LAYERS-1:0] layer_rdata,
output reg layer_we
);
// 地址解码:高位选层,低位选地址
wire [clog2(NUM_LAYERS)-1:0] layer_sel = host_addr[ADDR_WIDTH-1 : ADDR_WIDTH-clog2(NUM_LAYERS)];
wire [ADDR_WIDTH-clog2(NUM_LAYERS)-1:0] intra_addr = host_addr[ADDR_WIDTH-clog2(NUM_LAYERS)-1:0];
// Bank选择信号
wire [clog2(BANK_NUM)-1:0] bank_sel = intra_addr[ADDR_WIDTH-clog2(NUM_LAYERS)-1 : ADDR_WIDTH-clog2(NUM_LAYERS)-clog2(BANK_NUM)];
// 状态机定义
localparam IDLE = 2'b00;
localparam CMD_EXEC = 2'b01;
localparam DATA_RSP = 2'b10;
reg [1:0] current_state, next_state;
// 状态转移
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
current_state <= IDLE;
else
current_state <= next_state;
end
// 状态机逻辑
always @(*) begin
case (current_state)
IDLE:
next_state = host_en ? CMD_EXEC : IDLE;
CMD_EXEC:
next_state = DATA_RSP; // 简化模型:单周期执行
DATA_RSP:
next_state = IDLE;
default:
next_state = IDLE;
endcase
end
// 控制信号生成
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
layer_en <= 0;
layer_we <= 0;
layer_addr <= 0;
layer_wdata <= 0;
host_ready <= 0;
host_rdata <= 0;
end else begin
case (current_state)
IDLE: begin
host_ready <= 0;
if (host_en) begin
// 激活目标层
layer_en <= 1 << layer_sel;
layer_we <= host_we;
layer_addr <= intra_addr;
layer_wdata <= host_wdata;
end
end
CMD_EXEC: begin
layer_en <= 0; // 清除使能
end
DATA_RSP: begin
// 读取对应层的数据
if (!host_we) begin
host_rdata <= layer_rdata[DATA_WIDTH*(layer_sel+1)-1 : DATA_WIDTH*layer_sel];
end
host_ready <= 1;
end
endcase
end
end
// 辅助函数:计算对数(用于地址解码)
function integer clog2;
input integer value;
begin
value = value - 1;
for (clog2 = 0; value > 0; clog2 = clog2 + 1)
value = value >> 1;
end
endfunction
endmodule
// 存储层模块(模拟单DRAM核心)
module memory_layer #(
parameter DEPTH = 1024,
parameter DATA_WIDTH = 128,
parameter ADDR_WIDTH = 10,
parameter BANK_NUM = 8
)(
input clk,
input en,
input we,
input [ADDR_WIDTH-1:0] addr,
input [DATA_WIDTH-1:0] wdata,
output reg [DATA_WIDTH-1:0] rdata
);
// 内部Bank结构
reg [DATA_WIDTH-1:0] memory_bank [BANK_NUM-1:0][DEPTH/BANK_NUM-1:0];
wire [clog2(BANK_NUM)-1:0] bank_sel = addr[ADDR_WIDTH-1 : ADDR_WIDTH-clog2(BANK_NUM)];
wire [ADDR_WIDTH-clog2(BANK_NUM)-1:0] bank_addr = addr[ADDR_WIDTH-clog2(BANK_NUM)-1:0];
always @(posedge clk) begin
if (en) begin
if (we)
memory_bank[bank_sel][bank_addr] <= wdata;
else
rdata <= memory_bank[bank_sel][bank_addr];
end
end
function integer clog2;
input integer value;
begin
value = value - 1;
for (clog2 = 0; value > 0; clog2 = clog2 + 1)
value = value >> 1;
end
endfunction
endmodule
// 顶层测试模块
module top_3d_memory #(
parameter NUM_LAYERS = 4,
parameter DATA_WIDTH = 128,
parameter ADDR_WIDTH = 10
)(
input clk,
input rst_n,
input [ADDR_WIDTH-1:0] addr,
input [DATA_WIDTH-1:0] wdata,
output [DATA_WIDTH-1:0] rdata,
input we,
input en,
output ready
);
// 层间数据总线拼接
wire [DATA_WIDTH*NUM_LAYERS-1:0] layer_rdata_bus;
// 实例化控制器
three_d_memory_controller #(
.NUM_LAYERS(NUM_LAYERS),
.DATA_WIDTH(DATA_WIDTH),
.ADDR_WIDTH(ADDR_WIDTH)
) u_controller (
.clk(clk),
.rst_n(rst_n),
.host_addr(addr),
.host_wdata(wdata),
.host_rdata(rdata),
.host_we(we),
.host_en(en),
.host_ready(ready),
.layer_en(layer_en),
.layer_addr(layer_addr),
.layer_wdata(layer_wdata),
.layer_rdata(layer_rdata_bus),
.layer_we(layer_we)
);
// 实例化多个存储层
genvar i;
generate
for (i = 0; i < NUM_LAYERS; i = i + 1) begin : memory_layers
memory_layer #(
.DATA_WIDTH(DATA_WIDTH),
.ADDR_WIDTH(ADDR_WIDTH - clog2(NUM_LAYERS))
) u_layer (
.clk(clk),
.en(layer_en[i]),
.we(layer_we),
.addr(layer_addr),
.wdata(layer_wdata),
.rdata(layer_rdata_bus[DATA_WIDTH*(i+1)-1 : DATA_WIDTH*i])
);
end
endgenerate
function integer clog2;
input integer value;
begin
value = value - 1;
for (clog2 = 0; value > 0; clog2 = clog2 + 1)
value = value >> 1;
end
endfunction
endmodule