Menu Close

RISC-V EXU模块和CPU运行(1)rv32i_core模块(下)

主讲老师:William、Tim Zhuang、YVONNE

VIP专享视频
立即购买 升级VIP
%title插图%num
Posted in RISC-V教学视频

3 Comments

  1. wangff

    学习本节课后有几点收获,1、O_CPU_CS与O_CPU_PC信号代表执行load指令时的普林斯顿架构;2、状态机中的I_WB状态包括访存与回写2个过程;3、处理pc部分程序中与中断相关的有i_fch_pc <=mepc(中断返回)、i_fch_pc <=w_irq_pc(中断发生时的中断入口地址);4、instr_st==I_ROI 阶段时i_fch_pc <= res_pc (load取数完成,将指令pc返还);5、EXE_VLD <=1时表示与instr_st==EXE阶段同步;6、i_cpu_load_vld<=1'b1 ,用于寄存器回写模块,原因是双端口RAM的数据获取晚了2个clk(I_RO2阶段获取数据),比EXE阶段晚;7、双端口RAM的A端用于串口下载软件程序,B端用于调整指令pc指针;8、地址空间中存在普林斯顿架构的情况包括ITCM、JATG。

    在听课中发现几个问题,请老师解答:
    1、截取部分代码 else if(instr_st == I_FCH) exe_instr <= instr; 授课中威廉解释此处程序时,说是由于双端口RAM 获取pc地址后,数据会晚1个clk才会得到,也就是pc地址早于数据1个clk,所以需要将pc地址寄存一次,这样才能与获取数据的时间同步,我也赞同老师的这个解释,但是这里的“ exe_instr <= instr”是将获取的数据锁存了一次,而非是将pc地址锁存一次,请问老师这里的程序是否写错了,是否应该写成“ exe_pc <= i_fch_pc”,此处的i_fch_pc 假设为当前正在执行的pc地址,请问老师我的分析对吗?

    • William

      exe_instr <= instr”是将获取的数据锁存了一次,而非是将pc地址锁存一次 A: 将双端口的数据读出锁存一次, 目的是提高exe_instr的驱动能力,同时是和系统时钟对齐的输出。 注意,真正仿真的时候, 会发现双端口读出的数据,并不是和时钟同时输出的, 会比时钟稍微晚一点的时间输出, 仿真和实际在下板验证都是如此的。使用cpu没有错的. 值得注意的是: 在状态机逻辑中,确实是输出的pc 和输出的instr 不是同步的,但是也没有问题。原因是cpu 运行在状态机下, 有3个时钟周期可以使用,只要在I_EXE时,能拿到当前的时钟和指令既可. 推荐的文章中是可以看到的: https://www.icfedu.cn/archives/6519
      在流水线的版本中,执行模块的pc 和输出的instr是同步的(对齐的),在流水线版本中,对执行模块输出的信号,做了相应的锁存对齐.
      同学可以学习使用https://www.icfedu.cn/archives/6519这篇文章中的仿真工具, 对cpu的所有信号进行观察.

发表评论

相关链接