综合项目:双核乱序处理器
项目目标
设计一个完整的双核 SoC,每个核心都是乱序双发射处理器!
项目要求
核心规格
每个核心:
- 乱序执行(Tomasulo)
- 双发射超标量
- 分支预测(GShare + BTB)
- L1 Cache(16KB I$ + 16KB D$)
系统规格
- 2 个核心
- MESI 一致性协议
- 共享 L2 Cache(256KB)
- AXI 互连
- 完整外设(UART、Timer、PLIC、DMA)
性能目标
- 单核 IPC > 1.4
- 双核加速比 > 1.8
- CoreMark > 6.0/MHz
系统架构
┌─────────────┐ ┌─────────────┐
│ 核心 0 │ │ 核心 1 │
│ (乱序双发射) │ │ (乱序双发射) │
├─────────────┤ ├─────────────┤
│ L1 I$ + D$ │ │ L1 I$ + D$ │
└──────┬──────┘ └──────┬──────┘
│ │
└────────┬───────┘
│ MESI 一致性
┌──────┴──────┐
│ L2 Cache │
│ (256KB) │
└──────┬──────┘
│ AXI
┌───────────┼───────────┐
│ │ │
UART PLIC DMA
设计步骤
步骤 1:核心设计
复用 B 级的乱序双发射核心:
- ROB(32 项)
- 保留站(ALU×4, MUL×2, LSU×2)
- 寄存器重命名(64 物理寄存器)
步骤 2:MESI 一致性
// L1 Cache 控制器
always @(*) begin
case (cache_state)
MODIFIED: if (snoop_read) begin
flush_to_l2();
state_next = SHARED;
end
SHARED: if (local_write) begin
send_invalidate();
state_next = MODIFIED;
end
endcase
end
步骤 3:L2 Cache
// 256KB, 8 路组相联
l2_cache #(
.SIZE(256*1024),
.WAYS(8)
) l2 (
.core0_req(core0_l2_req),
.core1_req(core1_l2_req)
);
步骤 4:AXI 互连
使用 Crossbar 连接所有组件。
步骤 5:外设集成
- UART:串口通信
- PLIC:中断路由到两个核
- DMA:减少 CPU 负担
测试验证
功能测试
// 多核同步测试
void test_sync() {
if (core_id == 0) {
lock(&spinlock);
shared_data++;
unlock(&spinlock);
}
}
性能测试
# CoreMark 双核
./coremark_dual.elf
# 预期结果
Core 0 IPC: 1.45
Core 1 IPC: 1.43
Speedup: 1.85
评分标准
- 功能正确:60 分
- 单核 IPC > 1.4:20 分
- 双核加速比 > 1.8:20 分
恭喜你完成全部课程!你已经掌握了从零到多核处理器的完整设计!