皋陶 发表于 2020-8-24 12:35:14

RISC-V的Spike模拟器

本帖最后由 皋陶 于 2020-8-27 15:30 编辑

今天遇到的问题,记录下来。
· 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.
· cache的失效率的模拟
这个部分还没有深入去看,cache模型的模拟应该是有模型的。
· 关于cycle 的问题
在riscv 中,时钟的获取可以通过特殊的system指令 CSR系列来读取。
1. 伪代码方式 asm volatile ("rdcycle %0":"=r"(cycle));
2. 在encoding.h中的实现也相差不多:
read_csr但是我有一个问题,就是pk、spike之间如何共享这些个CSR寄存器的值的?这个问题困扰我有一段时间了。希望稍后或者明天能解决。
伯克利中关于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函数

本篇完,感谢关注:RISC-V单片机中文网
页: [1]
查看完整版本: RISC-V的Spike模拟器