返回列表 发帖

[求助] RISC-V指令求助

[求助] RISC-V指令求助

大家好,我最近在学习RISC-V,看了指令集并用SiFive的评估版的RTL(E34)做了做VCS仿真。遇到问题找不到是什么原因,麻烦对RISC-V了解比较深入的大牛能帮忙指明方向,多谢!
问题描述:
  现象1:用E34里面的program.hex文件来跑仿真,能正常跑起来。
  现象2:修改program.hex文件,只包含两行:
            4f0002b7
            0002a023
            其中4f0002b7为LW指令,表示向x5寄存器load一个32bit的值32‘h4f000000。
                 0002a023为SW指令,表示向x5寄存器中的值表示的地址写入x0的值。
            结果这两条指令不能顺利执行完
我想请教一下为什么这两条指令不能正常执行呢?麻烦大家了,再次感谢!

本帖最后由 xinkai132 于 2018-11-14 21:11 编辑

回复 1# duanwuqqqqqq
4f0002b7应该是lui指令吧
imm[31:12]   rd[11:7]    opcode[6:0]   Instruction
imm[19:0]     rd             0110111        LUI
20'h4f000      5'b00101   7'b0110111
[attach]725311[/attach]
->4f0002b7,将立即数32'h4f000000(低12位赋0)写入x5寄存器

0002a023
=32'b0000_0000_0000_0010_1010_0000_0010_0011
Store指令
imm[11:5][31:25]     rs2[24:20]     rs1[19:15]      funct3[14:12]   imm[4:0][11:7]     opcode[6:0]   Instruction
7’b0000000               5'b00000       5'b00101        3'b010              5'b00000              7'b0100011    SW
7'h0                          5'h0(x0)        5'h5(x5)                                 5'h0      
屏幕快照 2018-11-14 下午4.49.44.png
2018-11-14 16:40

->0002a023,将x0寄存器中的值写入Mem[x5]
综上,这两条指令完成功能是将x0的值(恒0)写入主存Mem[4f000000]中。

如果执行不了,我觉得可能几个问题:
1)配置的主存地址空间不够大越界了,地址范围没有4f000000这么大?
2)写x5和读x5寄存器存在写后读冲突,是不是需要stall几拍?
3)不负责任的想法:
如果将sw指令的rs1和rs2换个位置
这样就执行将4f000000写入Mem[0]空间了
第二条指令改成00502023试试?

TOP

回复 2# xinkai132
非常感谢您的回复。
4f0002b7时LUI指令,不是LW指令,是我写错了。
根据您提供的思路,我做了如下测试:

1)配置的主存地址空间不够大越界了,地址范围没有4f000000这么大?


4f00_0000这个地址是我根据E34评估版RTL附带的说明文档选取的。
SiFive E34 Core Complex Evaluation User Guide v1p0.pdf里面的表格:
userguide.PNG
2018-11-15 14:40

SiFive E34 Core Complex Manual v1p1.pdf里面的表格:
mannul.PNG
2018-11-15 14:43


另外代码里面有个lelease.txt文件,里面是这么写的:
release.PNG
2018-11-15 14:45

可见两个pdf和txt里面的描述是有不一致的地方的。
于是我试了下面两个地址
40001000->正常的store出去了
40002000->卡死
可见卡死的原因的确是地址越界了。

TOP

回复 2# xinkai132

2)写x5和读x5寄存器存在写后读冲突,是不是需要stall几拍?


我试了如下两种命令组合:


   1. 400012b7


       0002a023


       00010001 (NOP)


       00010001 (NOP)


       00010001 (NOP)


       ……


       00010001 (NOP)




   2.

400012b7


       00010001 (NOP)


       00010001 (NOP)


       00010001 (NOP)


       ……


       00010001 (NOP)



       0002a023


两种组合都能正常结束(接口上可以看到store的操作),可见应该不是读写冲突的问题。如果一个CPU还要软件来stall几拍来避免读写冲突,那这个CPU做的够差的,O(∩_∩)O~。


3)不负责任的想法:


如果将sw指令的rs1和rs2换个位置


这样就执行将4f000000写入Mem[0]空间了


第二条指令改成00502023试试?


我试过之后发现可以正常结束,只不过从CPU的接口上什么也看不到,因为按照SiFive E34 Core Complex Manual v1p1.pdf的描述:
zero.PNG
2018-11-15 14:59

0是个特殊的地址。如果不深入到RTL内部去看的话是看不到执行了哪些操作。

TOP

回复 4# duanwuqqqqqq

能找到卡死原因就好,哈哈。

TOP

返回列表

站长推荐 关闭


Keysight Engineering Education 2019课程详细介绍

Keysight Engineering Education 2019课程详细介绍


查看