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()
- 进入
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 的派生类
- 进入
main()
函数后,配置各种命令行参数后进入champsim::main()
- app接受命令行输入参数
- 确定warmup指令数和sim指令数(如果warmup指令数未给定,默认为sim指令数的20%)
- 初始化 trace reader
- 初始化 phases:warmup phase 和 simulation phase
- 执行
champsim::main()
并返回相应的phase_stat信息
- 先初始化env中所有的 operable 对象:
op.initialize();
- 然后依次执行所有的phase:(事实上只有warmup和simulation两个phase) champsim_do_phase
- 将phase的运行结果返回(warmup phase除外)
champsim::do_phase()
- Initialize phase
- 先执行 env 中所有的 operable 对象的
begin_phase()
- 计算所有 operable 对象中的最小时钟周期(往往是core主频周期)
- 初始化活锁检测器
- 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
)