RISC-V技术william hill官网
直播中

ben111

11年用户 2662经验值
擅长:MEMS/传感技术 嵌入式技术 模拟技术
私信 关注
[经验]

从零开始学RISC-V之初探IFU

  • 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功能的核心,需要注意。

更多回帖

发帖
×
20
完善资料,
赚取积分