news 2026/4/6 9:00:08

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 1:02:58

GMV推进卫星导航技术助力自动驾驶运输与物流发展

据称这是加强英国和欧洲下一代定位、导航和授时(PNT)能力的重要进步,技术企业集团GMV获得了开发Beacon的合同,这是一个先进的波束成形天线和接收器系统,旨在增强来自低地球轨道卫星的C波段无线电导航信号的弹性。该合同…

作者头像 李华
网站建设 2026/4/5 4:54:34

树|regex正则

lc2047可以三解,复习了:模拟 状态机 正则正则istringstream处理这才是真正的代码😭正则表达式 (([a-z]-)?[a-z])?[!,.]? 的结构和匹配逻辑是:- 核心部分 ([a-z]-)?[a-z] :匹配“纯小写字母”(如 abc )或…

作者头像 李华
网站建设 2026/3/30 22:28:26

iOS 26.2让用户可再次调整液态玻璃透明度

苹果发布iOS 26.2系统更新,再次为用户提供降低液态玻璃透明度的工具。此次更新允许用户控制锁屏时钟的透明度。此前,苹果已推出一个滑块来控制整个操作系统中液态玻璃元素的不透明度,以回应用户对新设计影响iPhone和其他苹果设备可读性的抱怨…

作者头像 李华
网站建设 2026/4/6 4:36:58

landing page文案写作:LobeChat提升留资率

LobeChat:如何用一个聊天窗口,撬动落地页的留资转化? 在今天这个信息过载的时代,用户对网页的耐心越来越短。一个访客打开你的产品页面,3秒内没找到答案,大概率就会关掉浏览器——无论你花了多少心思写文案…

作者头像 李华
网站建设 2026/4/5 14:51:58

AutoML:自动化AI Agent的模型选择与优化

AutoML:自动化AI Agent的模型选择与优化 关键词:AutoML、自动化机器学习、模型选择、超参数优化、AI Agent、神经网络架构搜索、元学习 摘要:本文深入探讨了AutoML(自动化机器学习)技术在AI Agent开发中的应用&#xf…

作者头像 李华
网站建设 2026/4/4 20:05:42

ChinaAdminDivisonSHP地理数据项目完整使用指南

ChinaAdminDivisonSHP是一个提供中国行政区划地理数据的开源项目,包含从国家到县级的完整shapefile数据。本文将为GIS新手和开发者提供从安装部署到实战应用的全流程指导。 【免费下载链接】ChinaAdminDivisonSHP 项目地址: https://gitcode.com/gh_mirrors/ch/C…

作者头像 李华