项目目标

设计一个完整的双核 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 分

恭喜你完成全部课程!你已经掌握了从零到多核处理器的完整设计!

更新时间: