2R1W + 2R1W 并发访问:超标量的基础设施
单发射流水线每周期最多需要2个读端口 + 1个写端口(2R1W):一条指令最多读2个源寄存器、写1个目标寄存器。
但超标量处理器同时处理多条指令,端口需求成倍增长:
| 端口配置 | 读端口 | 写端口 | 面积(vs 2R1W) | 关键路径 |
|---|---|---|---|---|
| 2R1W | 2 | 1 | 1× | 1× |
| 4R2W | 4 | 2 | ~3× | ~1.5× |
| 8R4W | 8 | 4 | ~10× | ~2.5× |
| 16R8W | 16 | 8 | ~40× | ~4× |
多个写端口可能同时写同一个寄存器,需要优先级仲裁:
// Lesson 32: Multi-Port Register File (2R1W + 2R1W = 4R2W)
module register_file_multi #(
parameter ADDR_W = 5, DATA_W = 32, DEPTH = 32
)(
input wire clk, rst_n,
// Port A: 2R1W (Lane 0)
input wire [ADDR_W-1:0] ra0_addr_i,
output reg [DATA_W-1:0] ra0_data_o,
input wire [ADDR_W-1:0] ra1_addr_i,
output reg [DATA_W-1:0] ra1_data_o,
input wire [ADDR_W-1:0] wa_addr_i,
input wire [DATA_W-1:0] wa_data_i,
input wire wa_en_i,
// Port B: 2R1W (Lane 1)
input wire [ADDR_W-1:0] rb0_addr_i,
output reg [DATA_W-1:0] rb0_data_o,
input wire [ADDR_W-1:0] rb1_addr_i,
output reg [DATA_W-1:0] rb1_data_o,
input wire [ADDR_W-1:0] wb_addr_i,
input wire [DATA_W-1:0] wb_data_i,
input wire wb_en_i
);
reg [DATA_W-1:0] mem [0:DEPTH-1];
// 组合逻辑读:x0硬连线为0
always @(*) begin
ra0_data_o = (ra0_addr_i == 5'd0) ? 0 : mem[ra0_addr_i];
ra1_data_o = (ra1_addr_i == 5'd0) ? 0 : mem[ra1_addr_i];
rb0_data_o = (rb0_addr_i == 5'd0) ? 0 : mem[rb0_addr_i];
rb1_data_o = (rb1_addr_i == 5'd0) ? 0 : mem[rb1_addr_i];
end
// 时序逻辑写:Port B优先级高于Port A
always @(posedge clk) begin
if (wa_en_i && wa_addr_i != 5'd0)
mem[wa_addr_i] <= wa_data_i;
if (wb_en_i && wb_addr_i != 5'd0)
mem[wb_addr_i] <= wb_data_i; // 覆盖Port A
end
endmodule
在28nm工艺下,4R2W寄存器堆的面积约为2R1W的3倍。8R4W则增长到约10倍。这解释了为什么高端处理器(Apple M1的8发射)需要使用集群式(Banked)寄存器堆或分布式物理寄存器堆来降低面积和延迟。