SimpleScalar 代码结构

10

description

SimpleScalar 代码结构. 概述. 功能模拟器 sim-fast , sim-safe 功能仿真 sim-cache,sim-cheetah Cache 仿真 sim-profile,sim-eio 剖析性能 sim-bpred 分支预测 性能模拟器 sim-outorder 时序的乱序执行仿真. SimpleScalar 模拟器软件架构. - PowerPoint PPT Presentation

Transcript of SimpleScalar 代码结构

Page 1: SimpleScalar 代码结构
Page 2: SimpleScalar 代码结构

功能模拟器sim-fast , sim-safe 功能仿真sim-cache,sim-cheetah Cache 仿真sim-profile,sim-eio 剖析性能sim-bpred 分支预测

性能模拟器sim-outorder 时序的乱序执行仿真

Page 3: SimpleScalar 代码结构

Simulator core 模块定义并实现了各个模拟器的行为方式,其余各个模块由各个模拟器共享,各个模拟器可根据自己的需要调用各个模块。这意味着如果要设计自己的模拟器,主要工作就是修改 Simulator core 模块。 SimpleScalar 提供的是一个建模框架,具有一定灵活性。每个模块具体由 .h 和 .c 文件构成。

Page 4: SimpleScalar 代码结构

其模块分两类 , 一类是计算机系统的组成模块,如:Cache 、 Memory 、 regs 等;一类是辅助模块:如程序加载模块 loader 等。

sysprobe.c - host endian probe implementation

Page 5: SimpleScalar 代码结构

拟器主程序主要部分源代码: main(int argc, char **argv, char **envp) {  

sim_check_options(sim_odb, argc, argv);// 检验命令行参数 , 并对个模块初始化 ,sim_*.c 定义 mem_init();// 程序加载前 Memory 初始化 ,mem.c 定义

ld_load_prog();// 程序加载 ,loader.c 定义 regs_init();// 寄存器初始化 ,regs.c 定义 mem_init1();// 程序加载后 Memory 初始化 ,mem.c 定义 sim_init();// 模拟器初始化 ,sim_*.c 定义 sim_main():// 模拟器执行入口函数 ,sim_*.c 定义 }

Page 6: SimpleScalar 代码结构

主函数 sim_main() 的程序结构表示如下: void sim_main(void) { for ( ; ; ) {     ruu_commit();// 提交 ruu_writeback();// 写回 lsq_refresh();//LSQ 队列刷新 ruu_issue();// 发射执行 ruu_dispatch();// 分配 ruu_fetch();// 取指 sim_cycle++;// 模拟器周期 , 统计程序执行周期 } }

Page 7: SimpleScalar 代码结构

for  循环执行一次代表流水线执行一个机器周期,每个ruu_*() 函数代表流水线的一段, 采取反向执行顺序是为确保流水线各段之间的互锁同步,整个流水线共分为取指( Fetch )、分配( Dispatch )、发射( Issue&Execute )、回写( Writeback )、提交( Commit )五段。

乱序模拟器支持动态指令调度、指令乱序执行、指令预测执行、分支预测等现代微处理器的特性,而且还提供了一系列的工具,包括编译器、 Benchmark 、调试工具、流水线跟踪器等

Page 8: SimpleScalar 代码结构
Page 9: SimpleScalar 代码结构

RUU(Register Update Unit) :此结构将传统的保留站和排序缓冲站合并,实现了指令的 乱序执行按序提交,用于支持处理器精确中断和误预测的状态恢复。而 RUU 将这两个部件 合并可以减少硬件实现的花费。 RUU 被组织为循环队列, Head 指向当前 RUU中最先进入 RUU 的指令 RUU 单元, tail 指针指向待分配 RUU 单元。在指令分配阶段,按取指先后顺序为每 条指令分配 RUU 单元,指令在 RUU 中连续存放并且排列顺序与取指顺序一致,这使执行完 成的指令能够按序提交。在执行阶段, RUU 中的指令是乱序执行的,只要指令的操作数准 备好,就可以将其送入 RQ ,为其分配执行单元执行指令。在回写段将执行结果广播到 RUU ,并解除相关。

Page 10: SimpleScalar 代码结构

LSQ  (Load/Store Queue) :用于处理 Store/Load 指令,其结构与 RUU 一致,一条 Store/Load 指令将被分成两个操作:地址计算和存取操作,地址计算操作作为加法运算放入RUU 中,而存取操作放入 LSQ 中,提交的时候 RUU 和LSQ 需要同步。

IFQ (Instruction Fetch Queue) :用于存放取指( Fetch )段取出的指令队列,它在一 个周期内尽可能多的取出指令,并保存取出指令的一些相关信息,如当前指令地址、预 测下一条指令地址等。

RQ (Ready Queue) :如果指令执行所需所有操作数已准备好,则将指令放入此队列准备执行,它只是作为一种映射机制存在,将 RUU 中已经准备好的指令串联成一组,它本身并 不保存任何信息,并且每当发射段运行一次后, RQ都被清空,准备在下一次运行分配段 ( Dispatch )的时候继续进行赋值。

EQ(Event Queue) :该队列记录已发射( Issue )指令何时执行完毕,回写段以此确定何 时将指令执行结果写回 RUU 。