sysII-Lab6讲解
Lab6:综合实验讲解
先用一个简单的软件调试硬件,调通了再加其它功能
把软件调小:
rdtime 没必要先读m态再加上再写回,只要传入INTERVAL就行了
rand直接return 5也行,不重要,有个数就行,调通硬件再说
initialize = 1,全局变量如果是0放在bss段,load的时候全填,但现在没做CSR流水线,控制竞争不用管,数据竞争和RegFile的一样就行
写读写操作的时候模仿RegFile旁路,不走RegFile,直接加一条线,从边上走,bypass
就是kcgg说的那个,写回阶段的FWcsr_ret[0] 是s_ret,csr_ret[1]是m_ret,在CSRModule里
ret 异常 中断,要做状态切换,switch_mode
- 检测到异常:把这三个epc,ecase,tvalue(mtvalue和stvalue)寄存器,一路传到CSRModule
- 同时检测到多个异常,检测最早的异常(二路选择器,选这一拍和上一拍
- 如果flush(因为异常)和stall同时发生,flush就不做了,stall先做flush后做;也可以接到Race Controller,选择保留哪个输出哪个
- 如果异常发生了,有些东西要关掉,如mem发生异常,就不允许写内存,所以就要关掉读写内存信号
- 如果发生异常了,异常要切换,要读内存,如果已经在读内存了怎么办?mem的读信号与上switch_mode,前面阶段的,加上一个寄存器switch_flush,倘若外面来了switch_mode信号,但ram没读完,给switch_flush置1,然后这次的mem_data作废
IF阶段检测异常,时钟到了放到EX1,同时指令写进IF/ID,因此EX1_IF/ID是同一条指令的
仿真怎么做?
不下板的仿真: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核,只要****手动加进去就好了- build里有rom.hex elf.hex dummy.hex,绝对路径写好
- vivado仿真,用sim/testbench.sv,加进去就好了,在sim_1里找到他,设为顶层模块,然后在pipelineCPU里,找到Axi_lite_DDR,在后面加上_sim,就能仿真了,****仿真完记得改回去
- 一定要vivado里仿真一下,看看内存载进去了没有
- 头文件不能自动导入,手动加一下,design source file,把头文件导入
- 如果仿真出现红色,是因为读了一个C代码中没初始化的变量,想解决就去C代码中改一下,不解决也没关系
- 缺的两个IP核
- 第一个时钟200,第二个100
- 2.11之后一路到底,next就好
下板,时钟间隔0x1000000,唰一下唰一下(×
如果把Displayer.sv,VERILATE的注释打开,就会看到LED灯上缓慢的输出(不需要开如果下板,卡死在0x5C,是因为MIG出了问题,长按reset键复位,一般就行了
如果下板出错,有三个方法(×其实只有一个
- 玄学
- 硬件插桩
- 硬件调试
下板前把debug_mode打开,按reset键,再操作
希望我不需要学这个qaq