0%

Champsim Simulation

Champsim Simulation

基类 operable

坐标: operable.h , operable.cc

各成员的作用

clock_period:
返回对象的时钟周期,单位ps

current_time:
返回对象当前已运行的时间,以全局时钟周期为单位

warmup:
记录该对象是否处于warmup phase下,以决定是否记录stat信息


operate_on(const champsim::chrono::clock& clock):
按照给定的时钟(一般是全局时钟),更新对象的 current_time ,并执行 operate()

派生类定义接口

initialize():
初始化操作,在champsim_main的最开始被调用

operate():
每个周期执行的操作,在champsim_do_cycle时调用operable::operate_on() 的内部被调用

begin_phase():
每个 phase 开始后(champsim_do_phase)最先执行的操作


end_phase(unsigned):
每个 phase 完成后(champsim_do_phase执行的操作


print_deadlock():
phase 触发 deadlock 时(champsim_do_phase)调用

仿真运行流程

坐标: main.cc , champsim.cc

main()

  1. 进入 main() 函数之前,根据配置初始化全局配置变量
  • 主要利用模板的偏特化,根据配置生成的 .csconfig/core_inst.inc.csconfig/core_inst.cc.inc 以初始化 configured_environment
  • 主要的实现在 .csconfig/core_inst.cc.inc ,初始化包括channels, DRAM, vmem, ptws, caches, cores,并建立引用,通过 xxx_view() 的API访问这些引用
  • 其中一个比较特殊的引用 operable_view() 包括了cores, caches, ptws 以及DRAM的引用,这也说明这些类都是 operable 的派生类
  1. 进入 main() 函数后,配置各种命令行参数后进入 champsim::main()
  • app接受命令行输入参数
  • 确定warmup指令数和sim指令数(如果warmup指令数未给定,默认为sim指令数的20%)
  • 初始化 trace reader
  • 初始化 phases:warmup phase 和 simulation phase
  • 执行 champsim::main() 并返回相应的phase_stat信息
  1. champsim::main()
  • 先初始化env中所有的 operable 对象: op.initialize();
  • 然后依次执行所有的phase:(事实上只有warmup和simulation两个phase) champsim_do_phase
  • 将phase的运行结果返回(warmup phase除外)

champsim::do_phase()

  1. Initialize phase
  • 先执行 env 中所有的 operable 对象的 begin_phase()
  • 计算所有 operable 对象中的最小时钟周期(往往是core主频周期)
  • 初始化活锁检测器
  1. Perform phase
  • 通过 phase_complete 记录所有 phases 的执行是否完成
  • while主循环:检查 phase_complete 是否均为true
    • 全局时钟 tick 上面计算出的最小周期,相当于Core内时钟的一个cycle
    • 执行 champsim::do_cycle()
    • 检测活锁
    • 检测死锁
      • 通过判断stall_cycles是否超过DEADLOCK_CYCLE(默认500)
      • 如果死锁, 调用每个 operable 的 <<operable_print_deadlock, print_deadlock()>> ,并调用 abort() 退出。
    • 检测phase是否已完成
    • 如果 cpu 的仿真指令数大于设置仿真指令数,则置位 phase_complete 中相应位
    • 如果已完成,执行每个 operable 的 <<operable_end_phase, end_phase()>>
  • 执行结束,收集stat信息
    • 输出CPU的执行信息
    • 返回各个module的stat信息
      • 所有cpu的sim_stats,roi_stats 分别插入到 stats.sim_cpu_stats 和 stats.sim_cpu_stats 中
      • 所有cache的sim_stats,roi_stats 分别插入到 stats.sim_cache_stats 和 stats.sim_cache_stats 中
      • 所有dram …

champsim::do_cycle()

  • 将 env 中所有的 operable 对象按 current_time 从小到大排序
    current_time 记录每个 operable 对象从复位开始执行的周期数
  • Operate:对每个 operable 对象执行 op.operate_on(global_clock)
    返回该 operable 对象执行的(progress)
  • Read from trace: 对于每个cpu,将 trace 读入input_queue

Utility Functions

get_span: 根据请求访问起始地址和允许的带宽大小确定允许访问的起始地址 (in span.h )

get_span_p: 在访问范围内,从开始地址向后找到第一个不满足函数要求的地址作为终止地址 (in span.h )