ET创芯网论坛(EETOP)

您现在是游客状态

请您   登录   或  注册  享受更多权益

电子书:《模拟对话》,共50卷,数百篇精品文章,下载即奖励400信元!
查看: 683|回复: 4

[求助] RISC-V指令求助

[复制链接]
发表于 2018-11-12 17:44:10 | 显示全部楼层 |阅读模式
大家好,我最近在学习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的值。
            结果这两条指令不能顺利执行完
我想请教一下为什么这两条指令不能正常执行呢?麻烦大家了,再次感谢!
发表于 2018-11-14 16:46:35 | 显示全部楼层
本帖最后由 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

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

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

使用道具 举报

 楼主| 发表于 2018-11-15 14:52:31 | 显示全部楼层
回复 2# xinkai132
非常感谢您的回复。
4f0002b7时LUI指令,不是LW指令,是我写错了。
根据您提供的思路,我做了如下测试:
1)配置的主存地址空间不够大越界了,地址范围没有4f000000这么大?

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

另外代码里面有个lelease.txt文件,里面是这么写的:
release.PNG
可见两个pdf和txt里面的描述是有不一致的地方的。
于是我试了下面两个地址
40001000->正常的store出去了
40002000->卡死
可见卡死的原因的确是地址越界了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-15 15:04:24 | 显示全部楼层
回复 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
0是个特殊的地址。如果不深入到RTL内部去看的话是看不到执行了哪些操作。
回复 支持 反对

使用道具 举报

发表于 2018-11-15 21:39:48 | 显示全部楼层
回复 4# duanwuqqqqqq

能找到卡死原因就好,哈哈。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

小黑屋|手机版|Archiver|ET创芯网 ( 京ICP备:10050787号 京公网安备:110105001212 )

GMT+8, 2019-3-27 05:10 , Processed in 0.063204 second(s), 11 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表