minirvEMU的实现
minirvEMU的实现本次实验通过C语言模拟了minirv的功能,并通过AM框架模拟外设进行测试.下面进行详细介绍实现了lui jalr addi add sw lw sb lbu八条riscv指令实现了取指、译码、执行、更新PC等功能通过AM模拟外设进行验证主要代码介绍取值加译码模块void instruction_fetch(){ int inst M[PC2]; int opcode inst 0b00000000000000000111000001111111; if(inst 0x00100073){ ebreak(inst); } switch(opcode){ case 0b00000000000000000000000000010011: addi(inst); break; case 0b00000000000000000000000001100111: jalr(inst); break; case 0b00000000000000000010000000000011: lw(inst); break; case 0b00000000000000000100000000000011: lbu(inst); break; case 0b00000000000000000010000000100011: sw(inst); break; case 0b00000000000000000000000000100011: sb(inst); break; default: break; } opcode inst 0b11111110000000000111000001111111; switch(opcode){ case 0b00000000000000000000000000110011: add(inst); break; default: break; } opcode inst 0b00000000000000000000000001111111; switch(opcode){ case 0b00000000000000000000000000110111: lui(inst); break; default: break; } }指令执行模块void reg_write(int addr, int val){ if(addr 0) return; else R[addr] val; } void addi(int inst){ int rd (inst 0b00000000000000000000111110000000) 7; int rs (inst 0b00000000000011111000000000000000) 15; int imm (inst 0b11111111111100000000000000000000) 20; imm imm 20 20; reg_write(rd, R[rs] imm); } void add(int inst){ int rd (inst 0b00000000000000000000111110000000) 7; int rs1 (inst 0b00000000000011111000000000000000) 15; int rs2 (inst 0b00000001111100000000000000000000) 20; reg_write(rd, R[rs1] R[rs2]); } void lui(int inst){ int rd (inst 0b00000000000000000000111110000000) 7; int imm (inst 0b11111111111111111111000000000000) 12; imm imm 12; reg_write(rd, imm); } void lw(int inst){ int rd (inst 0b00000000000000000000111110000000) 7; int rs1 (inst 0b00000000000011111000000000000000) 15; int imm (inst 0b11111111111100000000000000000000) 20; imm imm 20 20; int addr (R[rs1] imm) 2; reg_write(rd, ROM[addr]); } void lbu(int inst){ int rd (inst 0b00000000000000000000111110000000) 7; int rs1 (inst 0b00000000000011111000000000000000) 15; int imm (inst 0b11111111111100000000000000000000) 20; imm imm 20 20; uint32_t sel (R[rs1] (int)imm) 0b11; uint32_t addr (R[rs1] (int)imm) 2; unsigned int val (unsigned int)ROM[addr]; if(sel 0) val val % 256; else if(sel 1){ val val 8; val val % 256; }else if(sel 2){ val val 16; val val % 256; }else{ val val 24; } reg_write(rd, val); } void sw(int inst){ int rs1 (inst 0b00000000000011111000000000000000) 15; int rs2 (inst 0b00000001111100000000000000000000) 20; int imm1 (inst 0b00000000000000000000111110000000) 7; int imm2 (inst 0b11111110000000000000000000000000) 25; int imm (imm2 5) imm1; imm imm 20 20; uint32_t addr (imm R[rs1]); if(addr 0x20000000 addr 0x20040000){ rgb[(addr-0x20000000) 2] R[rs2]; } else{ addr addr 2; ROM[addr] R[rs2]; } } void sb(int inst){ int rs1 (inst 0b00000000000011111000000000000000) 15; int rs2 (inst 0b00000001111100000000000000000000) 20; int imm1 (inst 0b00000000000000000000111110000000) 7; int imm2 (inst 0b11111110000000000000000000000000) 25; int imm (imm2 5) imm1; imm imm 20 20; uint32_t sel (R[rs1] imm) 0b11; uint32_t addr (R[rs1] imm) 2; uint32_t temp (uint32_t)ROM[addr]; uint32_t temp1 temp 0xff; uint32_t temp2 (temp 8) 0xff; uint32_t temp3 (temp 16) 0xff; uint32_t temp4 temp 24; uint32_t val; if(sel 0){ val (temp4 24) (temp3 16) (temp2 8) ((uint32_t)R[rs2] 0xff); }else if(sel 1){ val (temp4 24) (temp3 16) (((uint32_t)R[rs2] 0xff) 8) temp1; }else if(sel 2){ val (temp4 24) (((uint32_t)R[rs2] 0xff) 16) (temp2 8) temp1; }else if(sel 3){ val (((uint32_t)R[rs2] 0xff) 24) (temp3 16) (temp2 8) temp1; } ROM[addr] val; } void jalr(int inst){ int rd (inst 0b00000000000000000000111110000000) 7; int rs (inst 0b00000000000011111000000000000000) 15; uint32_t imm (inst 0b11111111111100000000000000000000) 20; imm imm 20 20; int temp PC; PC imm R[rs]; reg_write(rd, temp 4); jalr_en 1; } void output(int inst){ int rs (inst 0b00001100) 2; printf(R[%d]: %d\n, rs, R[rs]); } void ebreak(int inst){ if(R[10] 0){ printf(HIT GOOD TRAP\n); flag 0; }else{ printf(HIT BAD TRAP\n); flag 0; } }小技巧imm imm 20 20;通过int特性进行符号拓展寄存器写模块void reg_write(uint_t addr, uint_t val){ if(addr 0) return; else R[addr] val; }由于R[0]寄存器只能为0,故用此函数进行写操作对寄存器进行操作多用uint32_t数据类型,uint32_t用于模仿寄存器如uint32_t temp (uint32_t)ROM[addr]; uint32_t temp1 temp 0xff; uint32_t temp2 (temp 8) 0xff; uint32_t temp3 (temp 16) 0xff; uint32_t temp4 temp 24; uint32_t val;感觉很重要不同intuint32_t位宽位宽不固定由编译器/平台决定,可能16/32/64位标准强制32位对负数右移是算数右移,符号拓展高位补0溢出行为C标准是未定义行为,不同编译器结果随机模2³²自动环绕与硬件行为相同输出printf(“%d”, val)printf(“inst %“PRIx32”\n”, inst);

相关新闻

Windows 11终极清理指南:5分钟让系统更流畅、更私密、更高效

Windows 11终极清理指南:5分钟让系统更流畅、更私密、更高效

Windows 11终极清理指南:5分钟让系统更流畅、更私密、更高效 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter …

2026/7/12 1:12:16阅读更多 →
存储系统层次化设计:从Cache-主存到主存-辅存的3级优化实践

存储系统层次化设计:从Cache-主存到主存-辅存的3级优化实践

存储系统层次化设计:从Cache-主存到主存-辅存的3级优化实践在计算机体系结构中,存储系统的性能直接决定了整体系统的效率。随着处理器速度的指数级增长与存储器速度提升缓慢形成的"剪刀差"日益显著,存储系统的层次化设计已成为解决…

2026/7/12 1:12:16阅读更多 →
免费数字人平台从哪一步开始越用越贵?免费试用后最容易连续补钱的不是会员,而是克隆、导出、商用和直播

免费数字人平台从哪一步开始越用越贵?免费试用后最容易连续补钱的不是会员,而是克隆、导出、商用和直播

免费数字人平台从哪一步开始越用越贵?免费试用后最容易连续补钱的不是会员,而是克隆、导出、商用和直播 很多人一开始找免费数字人平台,脑子里只有一个问题: 先开个会员要多少钱? 但真正做过一轮内容的人,很…

2026/7/12 1:12:16阅读更多 →
页式存储管理 3 种页面置换算法对比:OPT、FIFO、LRU 在软考真题中的实战应用

页式存储管理 3 种页面置换算法对比:OPT、FIFO、LRU 在软考真题中的实战应用

页式存储管理三大置换算法实战解析:从OPT到LRU的软考解题精要当操作系统为进程分配的内存空间不足时,如何高效置换页面成为影响系统性能的关键因素。面对软考中频繁出现的页面置换算法应用题,许多考生常陷入机械记忆而难以把握本质差异。本文…

2026/7/12 2:22:30阅读更多 →
群晖DSM 7.1-7.2 2.5G网卡驱动安装:3种方法对比与SSH命令修复详解

群晖DSM 7.1-7.2 2.5G网卡驱动安装:3种方法对比与SSH命令修复详解

群晖DSM 7.1-7.2 2.5G网卡驱动安装全攻略:从原理到实战在当今数据爆炸的时代,千兆网络已经难以满足高速传输的需求。许多群晖NAS用户发现,当需要频繁传输大容量文件时,千兆网络的110MB/s速度成为了明显的瓶颈。升级到2.5G网络可以…

2026/7/12 2:22:30阅读更多 →
UML 2.5 类图实战:从 5 种关系到代码实现的完整映射指南

UML 2.5 类图实战:从 5 种关系到代码实现的完整映射指南

UML 2.5 类图实战:从 5 种关系到代码实现的完整映射指南在面向对象软件设计中,类图作为UML的核心建模工具,直接决定了系统架构的质量。本文将深入解析UML 2.5规范中最关键的5种关系类型,通过Java和Python双语言代码示例&#xff0…

2026/7/12 2:22:30阅读更多 →
JMeter 5.6.3 压力测试实战:单接口 1000 并发下 TPS 与 RT 的拐点定位

JMeter 5.6.3 压力测试实战:单接口 1000 并发下 TPS 与 RT 的拐点定位

JMeter 5.6.3 压力测试实战:单接口 1000 并发下 TPS 与 RT 的拐点定位在当今快速迭代的互联网产品开发中,性能瓶颈往往成为系统稳定性的隐形杀手。一次看似简单的接口调用,在高并发场景下可能引发连锁反应——从数据库连接池耗尽到服务器内存…

2026/7/12 2:22:30阅读更多 →
汽车整车出口供应链管理:合同、VIN台账、多口岸单证、退税的系统化解法

汽车整车出口供应链管理:合同、VIN台账、多口岸单证、退税的系统化解法

汽车整车出口、二手车出口、KD件出口的管理难点集中在四处:合同选配数据多次录入、车架号台账断线、多口岸单证版本混乱、结算与物流脱节。本文按业务流程逐段拆解,并给出系统化解法。 利益相关:外贸管理软件从业者,服务车辆行业客户多年,以下来自真实调研场景,细节做了脱敏合并…

2026/7/12 2:22:30阅读更多 →
大模型知识库集成:从原理到企业级问答系统实战

大模型知识库集成:从原理到企业级问答系统实战

在AI应用日益普及的今天,许多开发者和技术团队都面临一个共同难题:如何让大语言模型真正理解并有效利用我们的专业知识库?你是否曾经尝试过将整个项目文档、技术手册或代码库直接丢给AI,却发现它给出的回答要么泛泛而谈&#xff0…

2026/7/12 2:17:30阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/12 0:02:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/12 0:02:11阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/12 0:02:11阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/12 0:02:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/12 0:02:11阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/12 0:02:11阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/11 16:20:28阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/11 23:15:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/11 18:12:23阅读更多 →