110 likes | 708 Vues
SimpleScalar 代码结构. 概述. 功能模拟器 sim-fast , sim-safe 功能仿真 sim-cache,sim-cheetah Cache 仿真 sim-profile,sim-eio 剖析性能 sim-bpred 分支预测 性能模拟器 sim-outorder 时序的乱序执行仿真. SimpleScalar 模拟器软件架构.
E N D
概述 • 功能模拟器 sim-fast,sim-safe 功能仿真 sim-cache,sim-cheetahCache仿真 sim-profile,sim-eio 剖析性能 sim-bpred 分支预测 • 性能模拟器 sim-outorder 时序的乱序执行仿真
SimpleScalar模拟器软件架构 Simulator core模块定义并实现了各个模拟器的行为方式,其余各个模块由各个模拟器共享,各个模拟器可根据自己的需要调用各个模块。这意味着如果要设计自己的模拟器,主要工作就是修改Simulator core模块。SimpleScalar提供的是一个建模框架,具有一定灵活性。每个模块具体由.h和.c文件构成。
SimpleScalar 源文件 • 其模块分两类,一类是计算机系统的组成模块,如:Cache、Memory、 regs等;一类是辅助模块:如程序加载模块loader等。 • sysprobe.c - host endian probe implementation
主程序的源代码 • 拟器主程序主要部分源代码: 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定义 }
Sim-outorder 程序结构 主函数sim_main()的程序结构表示如下: void sim_main(void) { for ( ; ; ) { ruu_commit();//提交 ruu_writeback();//写回 lsq_refresh();//LSQ队列刷新 ruu_issue();//发射执行 ruu_dispatch();//分配 ruu_fetch();//取指 sim_cycle++;//模拟器周期,统计程序执行周期 } }
Sim-outorder • for 循环执行一次代表流水线执行一个机器周期,每个ruu_*()函数代表流水线的一段, 采取反向执行顺序是为确保流水线各段之间的互锁同步,整个流水线共分为取指(Fetch)、分配(Dispatch)、发射(Issue&Execute )、回写(Writeback)、提交(Commit)五段。 • 乱序模拟器支持动态指令调度、指令乱序执行、指令预测执行、分支预测等现代微处理器的特性,而且还提供了一系列的工具,包括编译器、Benchmark、调试工具、流水线跟踪器等
SimpleScalar 主要数据结构 • RUU(Register Update Unit): 此结构将传统的保留站和排序缓冲站合并,实现了指令的 乱序执行按序提交,用于支持处理器精确中断和误预测的状态恢复。而RUU将这两个部件 合并可以减少硬件实现的花费。RUU被组织为循环队列,Head指向当前RUU中最先进入RUU 的指令RUU单元,tail指针指向待分配RUU单元。在指令分配阶段,按取指先后顺序为每 条指令分配RUU单元,指令在RUU中连续存放并且排列顺序与取指顺序一致,这使执行完 成的指令能够按序提交。在执行阶段,RUU中的指令是乱序执行的,只要指令的操作数准 备好,就可以将其送入RQ,为其分配执行单元执行指令。在回写段将执行结果广播到RUU ,并解除相关。
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。