模块里的寄存器是用的sirv_gnrl_dfflr,同时读写的话,读到的是新写进去的值。csrrw这种指令会有问题吧 可能csrr csrw这种用法把这个问题掩盖了。我没环境验证这个问题,只是自己在做csr寄存器的时候遇到了这个问题,所以想问下
多谢(o^^o) 看了你发的文章,又回去看了下代码,是我弄错了。没跟到底,后面csr读出来后转了几个模块,最后写回rf了。
这个论坛我用不好,uuty也是我 登不上去了……
这个问题我也晕乎过。我写了个笔记记录这个问题,可以参考一下。 http://www.riscv.cn/d/6
dnxt和qout对应的是写和读吧,在csr模块里用在处理csrrw指令时,对应的就是read_csr_dat和wbck_csr_dat。
我还没全读懂整个core,还在学习,所以说的可能不准确。在e203_exu_csr模块里读写csr寄存器应该是同一个周期。拿mepc来说,寄存器只有一份,
read_csr_dat应该得到是wbck_csr_dat的值。dnxt和qout在上升延过后值是一样的。read_csr_dat后面也没有寄存器存,进了exu_alu
比如csrrw x2 mepc x1
rd x2会变成x1的值,而不是原来mepc的
csrrw是伪指令,编译出来是相当于多条指令,应该不是单纯的同时读写
csrrw是单独的指令,不是伪指令。
sirv_gnrl_dfflr,同时读写的话,读到的是新写进去的值?这个理解应该是不对的。csrrw没有问题。