RISC-V的Spike模拟器

今天遇到的问题,记录下来。
· CPI 始终等于1。这显然是不正确的。 cycle和instruction以及CPI的计算都是由PK来完成的。
pk -s 中的 sys_exit
也就是说,pk中计算的CPI和cache模型中计算失效率是不想关的。

As you are debugging, please note that spike is not meant to be a cycle-accurate simulator of the assembly code. When spike runs, memory operations “magically” resolve in a single cycle, and branches are always evaluated without delay. The ISA simulator can evaluate the functional correctness of programs, but it is not a good way to measure how long they will take to run. Such cycle-accurate simulation requires a target hardware implementation such as the one that you will compile later in the lab. [1]
· cache的失效率的模拟
这个部分还没有深入去看,cache模型的模拟应该是有模型的。
【RISC-V的Spike模拟器】· 关于cycle 的问题
在riscv 中,时钟的获取可以通过特殊的system指令 CSR系列来读取。
1. 伪代码方式 asm volatile ("rdcycle %0":"=r"(cycle));
2. 在encoding.h中的实现也相差不多:
read_csr
但是我有一个问题,就是pk、spike之间如何共享这些个CSR寄存器的值的?这个问题困扰我有一段时间了。希望稍后或者明天能解决。
[1] 伯克利中关于RISC-V的实验课程
  • 关于 spike中的 csrrs 指令的执行,在 riscv-isa-sim/riscv/insns/cssrs.h 中实现了 具体cssrs所执行的操作:
    bool write = insn.rs1() != 0;
    int csr = validate_csr(insn.csr(), write);
    reg_t old = p->get_csr(csr);
    if (write) {
    p->set_csr(csr, old | RS1);
    }
    WRITE_RD(sext_xlen(old));
    如上所示,其实是调用了processor_t这个类中的get_csr函数。
    具体的函数连接 : get_csr函数实现
    其实就是读取的state_t类中的参数,state_t模拟的是processor中的各种状态和寄存器们。
  • 而关于pk中的读取,也有一个自己的实现和计算:
    emulation.c中实现的emulate_read_csr函数

    推荐阅读