当前位置: 首页 > news >正文

tinyriscv执行模块讲解4(访存指令)

1、32位访存指令介绍

指令格式作用伪代码形式
LB rd,offset(rs1)加载字节,符号扩展rd ← s8[rs1 + offset]
LH rd,offset(rs1)加载半字,符号扩展rd ← s16[rs1 + offset]
LW rd,offset(rs1)加载字rd ← s32[rs1 + offset]
LBU rd,offset(rs1)加载字节,零扩展rd ← u8[rs1 + offset]
LHU rd,offset(rs1)加载半字,零扩展rd ← u16[rs1 + offset]
SB rs2,offset(rs1)存储字节(rs2低8位)u8[rs1 + offset] ← rs2
SH rs2,offset(rs1)存储半字(rs2低16位)u16[rs1 + offset] ← rs2
SW rs2,offset(rs1)存储半字(rs2低16位)u32[rs1 + offset] ← rs2
  • 符号扩展为将符号位扩展到32位,0扩展为用0扩展到32位。
  • riscv访存地址为:基地址(rs1)+ 偏移地址(offset)

2、模块接口定义

// from idinput wire[`INST_BUS]inst_i,// 指令内容input wire[`INST_ADDR_BUS]inst_addr_i,// 指令地址input wire reg_we_i,// 是否写通用寄存器input wire[`REG_ADDR_BUS]reg_waddr_i,// 写通用寄存器地址input wire[`REG_BUS]reg1_rdata_i,// 通用寄存器1输入数据input wire[`REG_BUS]reg2_rdata_i,// 通用寄存器2输入数据input wire[`MEM_ADDR_BUS]op1_i,input wire[`MEM_ADDR_BUS]op2_i,// from meminput wire[`MEM_BUS]mem_rdata_i,// 内存输入数据// to memoutput reg[`MEM_BUS]mem_wdata_o,// 写内存数据output reg[`MEM_ADDR_BUS]mem_raddr_o,// 读内存地址output reg[`MEM_ADDR_BUS]mem_waddr_o,// 写内存地址output wire mem_we_o,// 是否要写内存output wire mem_req_o,// 请求访问内存标志// to regsoutput wire[`REG_BUS]reg_wdata_o,// 写寄存器数据output wire reg_we_o,// 是否要写通用寄存器output wire[`REG_ADDR_BUS]reg_waddr_o,// 写通用寄存器地址
  • op1为基地址,op2为偏移地址,即访存地址为op1+op2

3、半字读取(LB)

`INST_LB:begin jump_flag=`JUMP_DIS;hold_flag=`HOLD_DIS;jump_addr=`ZERO_WORD;mem_wdata_o=`ZERO_WORD;mem_waddr_o=`ZERO_WORD;mem_we=`WRITE_DIS;mem_req=`RIB_REQ;mem_raddr_o=op1_add_op2_res;case(mem_raddr_index)2'b00:begin reg_wdata={{24{mem_rdata_i[7]}},mem_rdata_i[7:0]};end2'b01:begin reg_wdata={{24{mem_rdata_i[15]}},mem_rdata_i[15:8]};end2'b10:begin reg_wdata={{24{mem_rdata_i[23]}},mem_rdata_i[23:16]};enddefault:begin reg_wdata={{24{mem_rdata_i[31]}},mem_rdata_i[31:24]};end endcase end

其中(mem_raddr_index)的值为:

assign mem_raddr_index=(reg1_rdata_i+{{20{inst_i[31]}},inst_i[31:20]})&2'b11;

其本质为取地址低2位,用于字节对齐判断。riscv内存为4字节对齐,若低两位为00则取第一个字节,01则第二个字节,10第三个字节,11第四个字节,再往后则为下一个四字节对齐空间。

-({{24{mem_rdata_i[7]}}, mem_rdata_i[7:0]})该表达式的作用为将从内存中载入的有效8位数据按符号扩展到32位。

4、其他访存指令

  • 剩余七条指令与LB指令类似,代码如下:
`INST_TYPE_L:begincase(funct3)`INST_LB:begin jump_flag=`JUMP_DIS;hold_flag=`HOLD_DIS;jump_addr=`ZERO_WORD;mem_wdata_o=`ZERO_WORD;mem_waddr_o=`ZERO_WORD;mem_we=`WRITE_DIS;mem_req=`RIB_REQ;mem_raddr_o=op1_add_op2_res;case(mem_raddr_index)2'b00:begin reg_wdata={{24{mem_rdata_i[7]}},mem_rdata_i[7:0]};end2'b01:begin reg_wdata={{24{mem_rdata_i[15]}},mem_rdata_i[15:8]};end2'b10:begin reg_wdata={{24{mem_rdata_i[23]}},mem_rdata_i[23:16]};enddefault:begin reg_wdata={{24{mem_rdata_i[31]}},mem_rdata_i[31:24]};end endcase end `INST_LH:begin jump_flag=`JUMP_DIS;hold_flag=`HOLD_DIS;jump_addr=`ZERO_WORD;mem_wdata_o=`ZERO_WORD;mem_waddr_o=`ZERO_WORD;mem_we=`WRITE_DIS;mem_req=`RIB_REQ;mem_raddr_o=op1_add_op2_res;if(mem_raddr_index==2'b0)begin reg_wdata={{16{mem_rdata_i[15]}},mem_rdata_i[15:0]};endelsebegin reg_wdata={{16{mem_rdata_i[31]}},mem_rdata_i[31:16]};end end `INST_LW:begin jump_flag=`JUMP_DIS;hold_flag=`HOLD_DIS;jump_addr=`ZERO_WORD;mem_wdata_o=`ZERO_WORD;mem_waddr_o=`ZERO_WORD;mem_we=`WRITE_DIS;mem_req=`RIB_REQ;mem_raddr_o=op1_add_op2_res;reg_wdata=mem_rdata_i;end `INST_LBU:begin jump_flag=`JUMP_DIS;hold_flag=`HOLD_DIS;jump_addr=`ZERO_WORD;mem_wdata_o=`ZERO_WORD;mem_waddr_o=`ZERO_WORD;mem_we=`WRITE_DIS;mem_req=`RIB_REQ;mem_raddr_o=op1_add_op2_res;case(mem_raddr_index)2'b00:begin reg_wdata={24'h0,mem_rdata_i[7:0]};end2'b01:begin reg_wdata={24'h0,mem_rdata_i[15:8]};end2'b10:begin reg_wdata={24'h0,mem_rdata_i[23:16]};enddefault:begin reg_wdata={24'h0,mem_rdata_i[31:24]};end endcase end `INST_LHU:begin jump_flag=`JUMP_DIS;hold_flag=`HOLD_DIS;jump_addr=`ZERO_WORD;mem_wdata_o=`ZERO_WORD;mem_waddr_o=`ZERO_WORD;mem_we=`WRITE_DIS;mem_req=`RIB_REQ;mem_raddr_o=op1_add_op2_res;if(mem_raddr_index==2'b0)begin reg_wdata={16'h0,mem_rdata_i[15:0]};endelsebegin reg_wdata={16'h0,mem_rdata_i[31:16]};end enddefault:begin jump_flag=`JUMP_DIS;hold_flag=`HOLD_DIS;jump_addr=`ZERO_WORD;mem_wdata_o=`ZERO_WORD;mem_raddr_o=`ZERO_WORD;mem_waddr_o=`ZERO_WORD;mem_we=`WRITE_DIS;reg_wdata=`ZERO_WORD;end endcase end `INST_TYPE_S:begincase(funct3)`INST_SB:begin jump_flag=`JUMP_DIS;hold_flag=`HOLD_DIS;jump_addr=`ZERO_WORD;reg_wdata=`ZERO_WORD;mem_we=`WRITE_EN;mem_req=`RIB_REQ;mem_waddr_o=op1_add_op2_res;mem_raddr_o=op1_add_op2_res;case(mem_waddr_index)2'b00:begin mem_wdata_o={mem_rdata_i[31:8],reg2_rdata_i[7:0]};end2'b01:begin mem_wdata_o={mem_rdata_i[31:16],reg2_rdata_i[7:0],mem_rdata_i[7:0]};end2'b10:begin mem_wdata_o={mem_rdata_i[31:24],reg2_rdata_i[7:0],mem_rdata_i[15:0]};enddefault:begin mem_wdata_o={reg2_rdata_i[7:0],mem_rdata_i[23:0]};end endcase end `INST_SH:begin jump_flag=`JUMP_DIS;hold_flag=`HOLD_DIS;jump_addr=`ZERO_WORD;reg_wdata=`ZERO_WORD;mem_we=`WRITE_EN;mem_req=`RIB_REQ;mem_waddr_o=op1_add_op2_res;mem_raddr_o=op1_add_op2_res;if(mem_waddr_index==2'b00)begin mem_wdata_o={mem_rdata_i[31:16],reg2_rdata_i[15:0]};endelsebegin mem_wdata_o={reg2_rdata_i[15:0],mem_rdata_i[15:0]};end end `INST_SW:begin jump_flag=`JUMP_DIS;hold_flag=`HOLD_DIS;jump_addr=`ZERO_WORD;reg_wdata=`ZERO_WORD;mem_we=`WRITE_EN;mem_req=`RIB_REQ;mem_waddr_o=op1_add_op2_res;mem_raddr_o=op1_add_op2_res;mem_wdata_o=reg2_rdata_i;enddefault:begin jump_flag=`JUMP_DIS;hold_flag=`HOLD_DIS;jump_addr=`ZERO_WORD;mem_wdata_o=`ZERO_WORD;mem_raddr_o=`ZERO_WORD;mem_waddr_o=`ZERO_WORD;mem_we=`WRITE_DIS;reg_wdata=`ZERO_WORD;end endcase end

https://gitee.com/liangkangnan/tinyriscv

http://www.cnnetsun.cn/news/93971.html

相关文章:

  • 显卡驱动彻底清理指南:3步用DDU解决残留问题
  • Java毕设项目推荐-基于JavaWeb的心聘求职平台的设计与实现求职就业平台设计与实现【附源码+文档,调试定制服务】
  • XUnity自动翻译插件:零基础入门到实战精通指南
  • OBS直播优化全攻略:从新手到专家的配置进阶之路
  • 面试问题预测:LobeChat模拟真实考场
  • LobeChat能否对接冥王星地形图?柯伊伯带天体特征科普
  • TegraRcmGUI:Nintendo Switch自定义payload注入的图形化解决方案
  • FlutterOpenHarmony商城App倒计时组件开发
  • Beyond Compare 5终极激活指南:3分钟快速生成永久授权密钥
  • 5分钟搞定Android投屏:QtScrcpy零门槛操作指南
  • Windows 11安装蓝屏终结者:MediaCreationTool.bat实战指南
  • BGE-Large-zh-v1.5终极指南:快速上手文本嵌入模型部署
  • tensorflow 零基础吃透:tf.sparse.SparseTensor 与核心 TensorFlow API 的协同使用
  • tensorflow 零基础吃透:TensorFlow 张量切片与数据插入(附目标检测 / NLP 实战场景)
  • windows用户态到内核态
  • 嵌入式系统(基于FreeRTOS)串口命令行调试工具
  • Qwen3-VL-8B中文多模态实测:懂语境更懂中国用户
  • Axios网络请求优化(缓存)
  • 通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究附Matlab代码
  • 无人机启用的无线传感器网络中的节能数据收集附Matlab代码
  • [特殊字符]️ 羽毛球检测数据集介绍-1686张图片 运动赛事分析 智能健身设备 自动裁判系统 体育视频内容分析 机器人运动训练
  • AI 论文辅助对决!虎贲等考 AI:全流程赋能,稳坐毕业论文 “最强辅助” 宝座
  • 查重 + AIGC 双检测通关!虎贲等考 AI 降重功能,解锁论文原创新境界
  • BetterNCM插件安装终极指南:解锁网易云音乐隐藏功能
  • 百度网盘直链解析:告别龟速下载的技术革命
  • TranslucentTB启动故障修复指南:快速解决任务栏透明工具无法运行问题
  • 速藏!AI大模型工程师进阶手册:从入门到实战的全攻略
  • NVIDIA Profile Inspector终极优化指南:解锁显卡隐藏性能
  • Ubuntu执行apt-get update报错:W: 无法下载 http://cn.mirrors.ustc.edu.cn/ubuntu/dists/bionic/InRelease 连接失败
  • LobeChat能否对接古籍数据库?中华传统文化智能问答系统