废品机械师吧 关注:24,395贴子:116,138

【长期项目|随缘更新】挑战在游戏中建造32位CPU

只看楼主收藏回复

我想要做出什么?
在《Scrap Mechanic》(废品机械师)这款游戏中“独自”建造一个32位RISC-V架构CPU。
实现RV32E指令集(但不包括ebreak和fence指令)。
5级流水线,有数据转发、分支预测、中断功能。
基本的输入输出设备,如手柄布局的按键输入,一个16*16大小的显示屏。
能运行贪吃蛇、生命游戏等小型程序。
不打算实现cache或超标量以及更高级的结构,因为这些内容对我来说过于深入,没必要在游戏中实现。


IP属地:重庆1楼2022-01-29 07:10回复
    目的以及意义
    乐趣,以及分享乐趣。


    IP属地:重庆2楼2022-01-29 07:11
    回复
      为什么选择RISC-V架构?
      开源,简单,有现成的汇编工具。
      自己设计架构的话还需要编写配套的汇编工具,但这不在我的计划内。
      我觉得设计已有指令集的微架构要比自己造指令集要难一点并且更有实际意义。
      RISC-V指令集只有32位和64位,虽然8位或16位CPU所消耗的逻辑门更少,
      但与32位指令集不兼容,没有现成汇编工具可用。


      IP属地:重庆3楼2022-01-29 07:11
      收起回复
        为什么要在游戏中造?
        之所以不直接在FPGA上实现,因为我想做一些和本职工作内容不一样的东西,这样才有乐趣。
        在游戏中造出来带来的成就感远大于仿真实现或FPGA实现。
        CPU在游戏中的实现方式和在FPGA中实现方式完全不同,我需要针对游戏特性进行专门的优化。
        选择《废品机械师》而不是《我的世界》是因为前者不需要布线,并且实现起来体积要小得多。
        可能有其它游戏更适合造CPU,但我不打算换游戏了。
        虽然已经有mod可以实现计数器、存储器、加减乘除等各种算术运算,
        但使用mod对我来说如同开挂一样,会极大地降低游戏乐趣。


        IP属地:重庆4楼2022-01-29 07:12
        回复
          可能遇到的麻烦
          我目前用的笔记本电脑比较旧了
          处理器:6核12线程,Intel(R) Core(TM) i7-8750H CPU @2.20GHz
          显卡:NVDIA GeForce GTX 1050Ti
          打算今年(2022)六月份换一台顶配台式机。
          在那之前,可能出现游戏帧率极低,甚至卡死的情况,无法保证低帧率下的逻辑门输出正常。
          可能因为各种各样的原因无法完成。


          IP属地:重庆5楼2022-01-29 07:12
          回复
            多久完成?
            完全无法预估,起码以月为单位,因为这只是个娱乐项目,不能玩物丧志。
            我一天最多抽出晚上的2~3小时,而且不一定每天都有时间,因此更新会非常缓慢。
            烂尾的可能性也是有的,但我不希望发生。


            IP属地:重庆6楼2022-01-29 07:12
            回复
              大体计划
              主要分为4章:
              原型验证:在Logisim中进行系统级仿真,可使用软件自带的库元件。
              门级实现:在Logisim中仅用逻辑门设计实现所有子模块并完成仿真验证。
              蓝图接口:开发一个能够在游戏中自动生成电路的程序。
              游戏建造:在游戏中实际进行建造。


              IP属地:重庆7楼2022-01-29 07:12
              回复
                参考资料
                《Computer Organization and Design - The Hardware Software Interface [RISC-V Edition]》


                IP属地:重庆8楼2022-01-29 07:13
                回复
                  大佬加油,已加精!


                  IP属地:山东来自iPhone客户端9楼2022-01-29 14:40
                  回复
                    压力测试-0
                    我想知道以我目前的笔记本大概可以承受多大规模的电路,这将影响RAM的大小。
                    首先我将游戏画质所有选项调到最高,打开录制软件,新建一个平坦世界,
                    最高画质下平坦世界,在刚建立时的帧率为120。
                    利用蓝图功能和焊接器,造一个逻辑门延时链。(以后会开发一个蓝图生成器,不然复杂连线会累死人)
                    门数量为32768时,帧率为60,使用连接工具时为20.
                    门数量达到65536时,我的电脑开始吃不消了,帧率只有16,使用连接工具时帧率只有8。而且建造蓝图以及撤掉起重器时会卡死好几秒。
                    我将画质改为最低,帧率几乎没有提升,说明影响帧率的不是图形渲染,而是逻辑门的更新。


                    IP属地:重庆10楼2022-01-29 17:35
                    回复
                      压力测试-1

                      一望无际的延时链(大小为64*1024,远距离的门方块不再被渲染)
                      蓝图文件大小为13.2MB,平均每个逻辑门0.2KB。
                      (逻辑门下面的砖块在蓝图文件中的占用空间可以忽略不计)


                      IP属地:重庆11楼2022-01-29 17:37
                      回复
                        压力测试-2
                        不知为何,包含65536逻辑门的蓝图无法建造(点击起重器的建造按钮没有反应)
                        为了建造更大的延时链,我只能将32768门的延时链直接焊接到刚造好的65536门延时链上(焊接时卡死数秒)
                        门数量是98304时,帧率为12,手持连接工具时帧率为6,
                        门数量是131072时(2的17次方),帧率为8,手持连接工具时帧率为3,
                        我想这应该是极限了,不知道换一台新电脑会不会有改善。
                        不出所料,包含如此多逻辑门的蓝图,无法在起重器上直接生成,
                        这意味着如果我想上传蓝图到创意工坊,必须控制方块数量。
                        如果超出蓝图限制,只能直接上传存档文件。


                        IP属地:重庆12楼2022-01-29 17:39
                        收起回复
                          压力测试-3


                          128*1024个逻辑门方块


                          IP属地:重庆13楼2022-01-29 17:42
                          回复
                            压力测试-4/4
                            经过验证,即使门方块没有被渲染,其输出仍然在更新(渲染和逻辑运算是分开的)
                            可建造的蓝图最多究竟可容纳多少逻辑门?
                            经过测试,最多33461个门,原因不明。
                            不清楚连线复杂度、电路结构、电脑性能会不会影响最大逻辑门数量。


                            IP属地:重庆14楼2022-01-29 17:43
                            回复
                              其它说明-1
                              在之后的内容将按照“章-节-小节”的形式发布。
                              对于百度贴吧这种以“楼”为单位的形式,将在小节的后面标明“楼”的序号。
                              如“C1.1.1-1”表示当前“楼”是第1章第1节第1小节的第1楼,
                              如果当前楼层是当前小节的最后一楼,那么会在最后添加当前小节的总楼数,如“C1.1.1-5/5”。
                              如果中间出现了序号不连续的情况,说明发生了“吞楼”。


                              IP属地:重庆15楼2022-01-30 19:57
                              回复