文章摘要
作者团队从零设计了一款自定义CPU,成功移植并运行了1993年的经典游戏《DOOM》,整个过程包括逻辑门级设计、外设连接、源码适配及FPGA实时部署,最终实现了从简单程序到完整商业游戏的跨越。
文章总结
好的,这是根据您的要求,对原文进行中文重述和精简后的版本:
标题:在自研CPU上运行《毁灭战士》并走红网络
核心内容:
《毁灭战士》是1993年发布的经典游戏,因其“万物皆可运行”的传说而闻名。我们最近成功在一款从零开始设计的CPU上运行了这款游戏,并发布了相关视频,获得了数百万的观看量。
我们设计了一款基于逻辑门级别的自定义CPU,为其连接了必要的外设,修改了《毁灭战士》的源代码使其能在我们的机器上运行,并最终部署到FPGA上实现了实时运行。在此之前,我们只运行过自己编写的简单程序,如《乓》和曼德勃罗集。现在,我们能够运行完整的商业游戏了,但实现这一目标的过程充满挑战。
主要挑战与解决方案:
内存与速度瓶颈:运行《毁灭战士》需要更大的内存和更快的处理速度。我们原有的设计只能使用FPGA上不到1MB的BRAM,而游戏数据文件就有14MB。同时,CPU的速度也远远不够。为此,我们分工合作:一位同事负责研究乱序执行以提升速度,而我则负责内存集成。
内存集成:原有的FPGA BRAM延迟低、接口简单。而DDR3内存延迟高、延迟不稳定且总线位宽大。为了解决速度问题,我们引入了缓存(Cache)机制,将活跃的内存区域存储在BRAM中,从而大幅提升访问速度。
CPU流水线设计:我们采用了标准的五级流水线架构(取指、译码、读寄存器、执行、写回)。其中,取指阶段需要处理因DDR内存带来的复杂重定向问题;读寄存器阶段增加了流水线层级并改进了“读后写”冲突的处理机制。
缓存与仲裁:为了支持同时进行指令和数据访问,我们设计了独立的指令缓存(ICache)和数据缓存(DCache)。当两个缓存同时请求内存时,由内存仲裁器进行调度,并优先处理数据缓存请求以避免死锁。
底层硬件与I/O:DDR3内存接口复杂,我们借助了Xilinx的MIG工具。此外,我们通过内存映射I/O(MMIO)实现了显示输出、硬件计时器、调试输出和键盘输入等外设功能。键盘输入最终通过UART从笔记本电脑转发按键信号实现。
移植《毁灭战士》与调试:
移植过程充满挑战,因为当程序出错时,很难判断是代码问题还是CPU本身的问题。我们借助了doomgeneric工具简化了移植,但仍遇到了文件系统、渲染和printf函数等众多问题。许多错误最终暴露了CPU本身的缺陷,例如缓存仲裁器丢失写回请求、立即数计算错误等。最棘手的一个问题是,硬件上的DDR内存未初始化为零,而《毁灭战士》的代码假设了这一点,导致程序崩溃。修复后,游戏终于能在硬件上以约0.7 FPS的帧率运行。
性能优化之路:
0.7 FPS显然无法游玩。我们进行了一系列优化:
* 将CPU主频从100MHz提升至125MHz。
* 优化取指阶段,减少对缓存的无效请求,帧率提升至约2.5 FPS。
* 添加乘法指令,帧率提升至3.5 FPS。
* 优化屏幕缓冲区数据拷贝方式,并流水线化缓存读取,帧率提升至约6.7 FPS。
* 最后,通过启用编译器优化(从O0改为O2),并修复因未将硬件计时器指针标记为volatile而导致的优化错误,游戏最终以15-20 FPS的流畅帧率运行,变得可玩且有趣。
总结与展望:
移植《毁灭战士》是一次有趣但也颇具挑战的经历,我们从中学习到了大量关于内存和缓存的知识,以及如何调试大型系统。我们发布的运行视频已获得数百万的观看量。未来,我们将继续研究乱序执行和更好的内存访问模式,以期达到30 FPS的目标,并考虑在更大规模的FPGA上运行,甚至移植《雷神之锤2》。
评论总结
根据评论内容,主要观点和论据如下:
1. 技术实现层面 - 核心观点:该项目基于RV32I-ZMMUL架构,并非完全自定义架构(评论1、8) - 关键引用:dmitrygr "This is an RV32I core";arghunter "This is just RV32I-ZMMUL not a custom architecture"
2. 项目评价与类比 - 正面评价:多数评论者认可项目价值,并分享类似经验(评论3、4) - 关键引用:Flex247A "Great work! This reminded me of a project I built a while back: a RV32IM emulator";paulmooreparks "Very cool! I just did the same thing"
3. 技术细节讨论 - 关于为何选择ZMMul而非完整M扩展的疑问(评论5) - 关键引用:terekhindc "why Zmmul and not full M — is it just fpga area"
4. 历史背景补充 - 提及Doom游戏与定制CPU的历史渊源(评论7) - 关键引用:_joel "SNES Doom shipped with a Super FX 2... a custom RISC chip with a pixel-plot instruction"
5. 其他技术实现 - 有评论者分享完全自研ISA的NPU项目(评论8) - 关键引用:arghunter "here is an NPU I built from scratch, without any premade ISA"
总结:评论整体认可项目价值,但指出其基于标准RISC-V架构而非完全自定义。部分评论者分享了类似项目经验,并讨论了技术选型(如ZMMul vs M扩展)及Doom游戏与定制硬件的历史关联。