Lab6:综合实验讲解

  1. 先用一个简单的软件调试硬件,调通了再加其它功能

  2. 把软件调小:

  3. rdtime 没必要先读m态再加上再写回,只要传入INTERVAL就行了

  4. rand直接return 5也行,不重要,有个数就行,调通硬件再说
    initialize = 1,全局变量如果是0放在bss段,load的时候全填,但现在没做

  5. CSR流水线,控制竞争不用管,数据竞争和RegFile的一样就行
    写读写操作的时候模仿RegFile

  6. 旁路,不走RegFile,直接加一条线,从边上走,bypass
    就是kcgg说的那个,写回阶段的FW

  7. csr_ret[0] 是s_ret,csr_ret[1]是m_ret,在CSRModule里

  8. ret 异常 中断,要做状态切换,switch_mode

    1. 检测到异常:把这三个epc,ecase,tvalue(mtvalue和stvalue)寄存器,一路传到CSRModule
    2. 同时检测到多个异常,检测最早的异常(二路选择器,选这一拍和上一拍
    3. 如果flush(因为异常)和stall同时发生,flush就不做了,stall先做flush后做;也可以接到Race Controller,选择保留哪个输出哪个
    4. 如果异常发生了,有些东西要关掉,如mem发生异常,就不允许写内存,所以就要关掉读写内存信号
    5. 如果发生异常了,异常要切换,要读内存,如果已经在读内存了怎么办?mem的读信号与上switch_mode,前面阶段的,加上一个寄存器switch_flush,倘若外面来了switch_mode信号,但ram没读完,给switch_flush置1,然后这次的mem_data作废
  9. IF阶段检测异常,时钟到了放到EX1,同时指令写进IF/ID,因此EX1_IF/ID是同一条指令的

  10. 仿真怎么做?
    不下板的仿真:kernel放到testcode/kernel,make sim
    make sim会把rom编译成一个文件,把kernel编译成一个文件,build里看到3个文件,make就能跑了
    时钟中断需要改小,不然跑不出来了,arch/riscv/kernel/clock.c,TIMECLOCK的值改小,用0x10000,再大就跑不出来结果了,太短还没循环就跳进中断里了
    make 2> log,在终端里能看到printk,在log里能看到指令流
    下板:把kernel和minisbi打包压缩(7k)放到buffer(16k),rom改成boot loader,最后跳到DDR执行
    下板执行make board,就能生成代码;make board_sim,做下板的仿真,会比较慢
    core写完了,软件有了,只差外围了,make bitstream,按理会生成整个工程,但是现在只能生成工程,文件都拷进去,综合的时候缺俩ip核,只要****手动加进去就好了

    1. build里有rom.hex elf.hex dummy.hex,绝对路径写好
    2. vivado仿真,用sim/testbench.sv,加进去就好了,在sim_1里找到他,设为顶层模块,然后在pipelineCPU里,找到Axi_lite_DDR,在后面加上_sim,就能仿真了,****仿真完记得改回去
    3. 一定要vivado里仿真一下,看看内存载进去了没有
    4. 头文件不能自动导入,手动加一下,design source file,把头文件导入
    5. 如果仿真出现红色,是因为读了一个C代码中没初始化的变量,想解决就去C代码中改一下,不解决也没关系
    6. 缺的两个IP核
      1. 第一个时钟200,第二个100
      2. 2.11之后一路到底,next就好

    下板,时钟间隔0x1000000,唰一下唰一下(×
    如果把Displayer.sv,VERILATE的注释打开,就会看到LED灯上缓慢的输出(不需要开

  11. 如果下板,卡死在0x5C,是因为MIG出了问题,长按reset键复位,一般就行了

  12. 如果下板出错,有三个方法(×其实只有一个

    1. 玄学
    2. 硬件插桩
    3. 硬件调试
      下板前把debug_mode打开,按reset键,再操作
      希望我不需要学这个qaq