CSerht / yamp-32

NSCSCC 2020 - Yet Another MIPS Processor

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

YAMP-32 (Yet Another MIPS Processor)

项目背景

NSCSCC2020-个人赛

设计思路

  • (1)建模:利用C++实现周期精确级模拟器(cpp-cpu-model)
  • (2)通过暴力搜索优化参数[1](自动调参)
  • (3)根据优化结果进行RTL设计
  • (4)若RTL无法满足模型假设,回到(1)修正模型
  • (5)若RTL满足设计要求,进行FPGA验证。

性能

在 120MHz时钟主频下,运行三组高负载基准程序[2],结果如下

测试名称 用时[3]
UTEST_STREAM 0.055s
UTEST_MATRIX 0.114s
UTEST_CRYPTONIGHT 0.245s

关键词

五级流水、猜测执行、分支预测、Cache、Write Buffer

Getting started

源码树:thinpad_top.srcs/sources_1/new 内各文件描述如下:

源文件 描述 详细
yamp32_parameters.vh parameters CPU全局参数定义
yamp32_biu.v BIU(Bus Interface Unit)总线接口单元 实现数据/指令接口的仲裁,实现SRAM读写时序
yamp32_core.v CPU核心 CPU顶层设计
yamp32_bpu.v BPU(Branching Prediction Unit)分支预测单元 目前只实现了最简单的动态分支预测
yamp32_icache.v I-Cache 指令高速缓存(四路组相关、LRU置换、全流水化)
yamp32_ifu.v IFU(Insn Fetching Unit) 取指单元
yamp32_idu.v IDU(Insn Decoding Unit) 译码单元
yamp32_exu.v EXU(Execution Unit) 执行单元,包括ALU等子部件
yamp32_lsu.v LSU(Load & Store Unit) 访存单元,包括Write Buffer
yamp32_wb_mux.v WB(Writing Back) 回写单元。实际上为寄存器写入端口提供仲裁
yamp32_regfile.v Regfile 寄存器堆
yamp32_ctrl.v Controller 流水线控制器。决定各级流水线暂停状态
yamp32_segmap.v Segment mapping 完成段映射
bypass_net.v 旁路网络 实现流水线操作数旁路
源文件 描述 详细
uart.v UART 带FIFO的通用异步收发器
fifo_fwft_sclk.v FWFT(First-word-Fall-Through) 实现FWFT模式的FIFO(无需读指令,而自动将操作数放到输出端口)
xpm_sdpram_bypass.v xpm简单双口RAM Xilinx参数化内存封装,增加一层旁路逻辑

如何使用C++模型

C++模型模拟MIPS指令的运行,精确计算Cache Miss或分支预测失败带来的开销,自动调参,输出统计信息,为微架构设计与优化提供量化依据。

下面是编译运行该C++模型的指南。

Phase 1: 编译

准备Linux环境(如果在Windows下,可以考虑使用Cygwin、WSL或MinGW),在源码根目录下运行如下命令:

cd cpp-cpu-model
mkdir build && cd ./build
cmake ..
make -j8

编译成功将在build目录生成可执行文件cpu(cpu.exe)。

Phase 2: 运行基准程序

在build目录使用如下命令启动模拟器。模拟器将模拟CPU运行,自动向监控程序的终端发送命令,启动基准程序。

./cpu kernel.bin STREAM

其中kernel.bin为监控程序supervisor的二进制映像。对于supervisor v2.01,可在其源码根目录中kernel/kernel.bin中找到。

STREAM为测试用例的名称,在NSCSCC2020中,共有STREAM、MATRIX、CRYPTONIGHT三个测试用例。

当检测到supervisor从终端返回的执行完毕状态后,模拟器将打印出各种统计信息,包括Cache命中率,分支预测命中率等,这些数据可为量化研究提供依据。

如下为程序运行结果的一个实例:

WARNING! unknown writing operation to UART.
Boot message:MONITOR for MIPS32 - initialized.
User program written
  Program Readback:

10 80 04 3c 40 80 05 3c 30 00 06 3c 21 30 86 00
05 00 86 10 04 00 a5 24 00 00 82 8c fc ff a2 ac
fb ff 00 10 04 00 84 24 08 00 e0 03 00 00 00 00

Program memory content verified
Data memory content verified
=======
Clks: 9831244
Secs: 0.0983124
=======
-------clk: 10355664
DCache
Cache dump:
        Hit: 787564
        Miss: 786509
                Writeback: 327765
        P(h) = 0.500335
ICache
Cache dump:
        Hit: 4723960
        Miss: 8
                Writeback: 0
        P(h) = 0.999998
==================
BPU dump:
        JR
        JR Hit:292
        JR Miss:2
        JR P(h):0.993197
        BCC
        BCC Hit:1573105
        BCC Miss:285
        BCC P(h):0.999819
sb_hit =0 sb_miss=393219

Phase 3:自动调参

若要使用自动调参功能,请手动修改cpu.cc,找到main() 函数中的如下函数调用:

函数 功能
optimise_icache() 优化ICache参数(P_WAYS、P_SETS、P_LINE)
optimise_dcache() 优化DCache参数(P_WAYS、P_SETS、P_LINE)

取消cpu.cc中相应注释,重新编译运行,开始自动调参。

读取输出结果。输出报告中P_WAYS、P_SETS和P_LINE的数值解释如下:

(1<<P_WAYS)路、(1<<P_SETS)行、每行(1<<P_LINE)字节。

实现细节

1. 自动调参目标函数

目前我们选取CPU运行三个测试用例所需时钟数之和作为目标函数。

2. 自动调参搜索边界

ICache参数搜索边界:

参数 最小值 最大值 步进
P_WAYS 1 4 1
P_SETS 1 13 1
P_LINE 1 13 1

DCache 参数搜索边界:

参数 最小值 最大值 步进
P_WAYS 1 7 1
P_SETS 1 20 1
P_LINE 1 20 1

在BRAM资源占用和调参程序运行时间可接受的情况下,您可以可适当增大搜索边界的范围,以期寻到更优解。

3. 自动调参局限性

自动调参只在有限的测试用例(STREAM、MATRIX和)中进行,只能确保这三个测试用例取得优化解。

Phase 4: 如何设置断点,拿到感兴趣的数据

请参考cpu.cc中cpu_clk()函数中”Set breakpoints here...“部分代码。

已知问题

为了尽可能提升主频,在MUL指令后设置了RAW延迟槽,也就是说MUL指令后的第一条指令不能存在相对于MUL结果的RAW相关,否则相关操作数取到的是MUL之前的值。

类似于控制转移指令的延迟槽,如果MUL存在上述情况,需要用其它合适的指令填充延迟槽。若找不到合适的指令,请使用nop填充。

指令集

实现MIPS isa32指令集的一个子集:

  1. ADDIU 001001ssssstttttiiiiiiiiiiiiiiii
  2. ADDU 000000ssssstttttddddd00000100001
  3. AND 000000ssssstttttddddd00000100100
  4. ANDI 001100ssssstttttiiiiiiiiiiiiiiii
  5. BEQ 000100ssssstttttoooooooooooooooo
  6. BGTZ 000111sssss00000oooooooooooooooo
  7. BNE 000101ssssstttttoooooooooooooooo
  8. J 000010iiiiiiiiiiiiiiiiiiiiiiiiii
  9. JAL 000011iiiiiiiiiiiiiiiiiiiiiiiiii
  10. JR 000000sssss0000000000hhhhh001000
  11. LB 100000bbbbbtttttoooooooooooooooo
  12. LUI 00111100000tttttiiiiiiiiiiiiiiii
  13. LW 100011bbbbbtttttoooooooooooooooo
  14. MUL 011100ssssstttttddddd00000000010
  15. OR 000000ssssstttttddddd00000100101
  16. ORI 001101ssssstttttiiiiiiiiiiiiiiii
  17. SB 101000bbbbbtttttoooooooooooooooo
  18. SLL 00000000000tttttdddddaaaaa000000
  19. SRL 00000000000tttttdddddaaaaa000010
  20. SW 101011bbbbbtttttoooooooooooooooo
  21. XOR 000000ssssstttttddddd00000100110
  22. XORI 001110ssssstttttiiiiiiiiiiiiiiii

延迟槽,无CP0、HI、LO寄存器,无异常、中断,无TLB

联系作者

如有疑问,欢迎开issues,或发邮件:diyer175@hotmail.com

Notes

参考资料

  • L. Hennessy, David A. Patterson. 计算机体系结构:量化方法(第5版). 机械工业出版社

About

NSCSCC 2020 - Yet Another MIPS Processor


Languages

Language:VHDL 75.4%Language:C 21.9%Language:Verilog 1.6%Language:V 0.9%Language:SystemVerilog 0.2%Language:C++ 0.1%Language:Python 0.0%Language:Assembly 0.0%Language:Tcl 0.0%Language:Makefile 0.0%Language:CMake 0.0%