RISC-V
- 00_core和xf100_inst_ram两个模块,分别对于cpu core和IRAM。
- xf100_core包含xf100_ifu和其他模块(暂时用不到)。
例化完成之后,就可以执行加载与仿真了。
加载与仿真
- 首先在tb/tb_top.v文件里添加对IRAM的上电初始化操作。
// initial instruction ram.
`define INSTR_RAM u_xf100_soc.inst_ram.u_gnrl_inst_ram
integer i;
reg [7:0] instr_mem [0:16384*4-1];
initial begin
$readmemh("../../riscv-tools/riscv-tests/isa/generated/rv32ui-p-add.verilog",instr_mem);
for (i=0;i<16384*4;i=i+1) begin
`INSTR_RAM.ram_r = instr_mem;
end
end
- 修改vsim/Makefile中的install部分,让新建的.v代码文件能被编译工具识别。需要注意的是此处的路径千万不能出错,否则会在编译过程中出现模块未定义的错误。
install:
mkdir -p ${SIM_DIR}/install/tb
mkdir -p ${SIM_DIR}/install/rtl/${CORE}
cp ${SIM_DIR}/../tb/tb_top.v ${SIM_DIR}/install/tb/ -rf
cp ${SIM_DIR}/../../design ${SIM_DIR}/install/rtl/${CORE}/ -rf
- 其余改动,你可以根据自身使用工具的情况自行修改。再次提醒注意各个文件的路径,包括存储路径,或者编译过程中使用的其他路径。一般而言,出现模块未定基本上都是这类原因。
上述改动完成之后,就可以运行仿真并查看波形了。实例波形图如下:
从图中可以看出,Addr(注,此处只使用了15bit),按照步长4依次递增。同时从IRAM中返回该地址对应的指令数据。该数据可以与dump文件,也就是程序的反汇编文件对比,用于后续代码的调试。
下一步,我们将进入指令的执行模块,看看第一条加法指令到底是如何被执行的。
总结一下
- IFU主要功能是从指定地址获取指令数据,并自行预测下一次读取指令的地址。有可能会预测错误,所以会产生一定的代价,IFU的设计目标之一是减少预测的准确率,并同时降低错误预测代价。
- valid-ready握手机制在此处刚刚露了脸,但是由于仅仅只有IFU,因此其作用并未显现,但该机制是保证CPU功能的核心,需要注意。
更多回帖