本节将对索尼CXD8530BQ进行剖析,它是这款游戏机的两大芯片之一。 在当今世界,我们称之为"片上系统"(System-on-Chip,SoC)。
起源
主处理器是一种"由y设计、基于z并从w处二次采购"的产品,这用几句话来概括有点过于冗长,所以我们何不从一些历史背景开始呢?
一点历史

一台Macintosh Quadra 700旁边的PowerPC升级卡。 正如许多采用摩托罗拉68k处理器的用户一样,90年代决定了必须转向基于RISC的CPU(苹果公司采用的是PowerPC)。
九十年代初,许多流行 CPU 的命运发生了变化。 曾经领先的8位CPU(如Z80和6502)已不再受人关注,而摩托罗拉著名的68000以及其他在80年代末获得成功的16位设计已成为取代它们的候选产品。 即使在此时的个人电脑领域,塔能鲍姆(A.S.Tanenbaum)在与托瓦兹(L.Torvalds)辩论的著名辩论中,也只给了英特尔的x86架构五年的时间到它退出家用市场。
初看起来,技术发展似乎在此时遇到了障碍。 但实际上,新一轮相对陌生的CPU浪潮正在涌入主流设备。 其中许多设计都源于学术界,因此是为了证明特定的设计理念而存在的。 那个时代的新型CPU包括:
- MIPS: 由硅谷图形(Silicon Graphics Incorporated, SGI)采用(针对图形工作站)。
- PowerPC: 被苹果公司采用(针对台式机发行)。
- SPARC:由太阳微系统(Sun Microsystems)创造(针对服务器和商务工作站)。
- ARM:由Acorn公司创造(最初面向消费市场,后来转向PDA和手机)。
- ......还有许多"微控制器"芯片尚未定型或被任何行业采用,如日立的SH或NEC的V810。 出乎他们意料的是,这些芯片后来分别被世嘉土星和任天堂Virtual Boy选用。
所有这些处理器都有一个共同点:它们都遵循精简指令集计算机(RISC)规则,这从根本上改变了这些芯片的设计和编程方式。 RISC CPU的一条规则规定,单条指令不能混合内存和寄存器操作,这样硬件设计人员就可以简化执行指令的电路......然后利用并行技术对其进行增强。
MIPS和索尼

SGI Iris 4D/80是一款采用双塔式设计的强大图形工作站。 4D系列为SGI计算机中的MIPS CPU揭开了序幕,这款特殊的机型还捆绑了 R2000。 这张照片是我于2019年6月参观计算机历史博物馆(加利福尼亚州圣何塞)时拍摄的。
MIPS 计算机系统公司起源于其创始人(斯坦福大学教师)将其研究成果转化为物理处理器的迫切愿望,80年代硅谷的风投资本家也急于投资于此[2]。 他们首次推出的中央处理器"MIPS R2000"被认为是第一个采用RISC设计的商用中央处理器;它在许多UNIX工作站中都占有一席之地。
然而,直到 1987 年,MIPS的芯片才成为人们谈论的话题,原因是它被SGI公司采用(且后来被收购),为其设备提供动力。 SGI是计算机图形市场上极具影响力的创新者,尤其是在硬件加速顶点流水线的开发方面,而顶点流水线的任务最初是由软件(CPU内部)完成的。 收购之后,SGI 在CPU和图形领域都占据了领先地位。
在开发 PlayStation 之前,MIPS 转而采用基于IP许可的商业模式,即以许可的形式出售其CPU设计,然后由被许可方自由定制和生产设计。 他们提供的部分产品包括R3000A CPU,它出现在他们的低端产品目录中。 因此,R3000A并不属于旗舰产品系列(不像另一家后来采用的R4000),但就成本而言,它是一项极具吸引力的投资。
回到正题,索尼自行设计了音频和图形芯片,但他们仍然需要能够驱动这两种芯片的领先芯片。 所选的CPU必须足够强大,以展示索尼芯片令人印象深刻的性能,同时价格也要合理,以保持游戏机的价格竞争力。
LSI和委托
与此同时,LSI Logic(一家半导体制造商)是MIPS许可证持有者,为企业提供"自己动手"CPU计划。 这项服务被称为CoreWare,客户可以通过选择一系列构建模块来构建自己的CPU包。 CoreWare库的一部分包括"CW33300"模块,这是一个从LSI LR33300衍生出来的CPU内核,LSI也将这种现成的CPU芯片商业化。
现在,我要把这些说到哪里去呢? 原来,LSI的LR33300和CW33300是MIPS R3000A系列的二进制兼容版本。 它们的架构在某些方面略有不同,但编程接口(MIPS I ISA)保持不变。
最后,索尼公司委托LSI公司为其开发CPU包。 他们选择了CW33000,更改了一些位,并将其与其他模块组合在一起,形成了PlayStation主板上的芯片。
产品

PlayStation主板上的SoC芯片,采用MIPS R3000A内核。
由此产生的CPU内核运行频率为33.87 MHz,具有以下特点:
- MIPS I ISA:MIPS指令集的第一个版本。 其中,字长为32位,指令集包括乘法和除法指令。
- 32个通用寄存器和2个乘除寄存器: 这些寄存器也是32位的。 其中一个通用寄存器始终为零(
R0),这在RISC处理器中很常见。 - 32位数据总线: 在PS1中,数据总线分为两条总线。
- 主总线(32位)->连接MDEC和GPU。
- 子总线(16/8位) -> 连接其他芯片和I/O。 该总线由总线接口单元桥接,还可以访问GPU和SPU的特殊端口。
- 32位地址总线: 最多可访问4 GB物理内存(即 RAM、内存映射I/O等)。
- 5级流水线:最多可同时执行五条指令(详细说明请参阅上一篇文章)。
- 4 KB指令高速缓存(Cache): 它也可以被"隔离",允许程序直接操作指令缓存。
- 奇怪的是,这里没有数据缓存。 通常用于数据缓存的1 KB内存被映射到一个固定地址。 这个区域也被称为Scratchpad(快速SRAM)。
为了做一些有意义的事情,索尼提供了2 MB的RAM供一般用途使用。 奇怪的是,他们在主板上安装了扩展数据输出(EDO)DRAM芯片。 这些芯片比典型的DRAM稍为高效,可获得更低的延迟。
接管 CPU
在某些情况下,任何子系统(图形、音频或CD)都需要快速处理大块数据。 然而,CPU并非总能满足需求。
因此,CD-ROM控制器、MDEC、GPU、SPU 和并行端口在需要时都可以访问专用DMA控制器。 DMA控制主总线并执行数据传输。 虽然仍需要CPU来设置DMA传输,但其传输速率要比依赖CPU快得多。
此外,请记住,一旦 DMA 启动,CPU 就无法访问主总线。 这意味着CPU将处于空闲状态,除非Scratchpad中的内容能让它保持忙碌!
补充内核
与其他基于MIPS R3000的CPU一样,CW33000支持多达四个协处理器的配置,索尼定制了三个:
系统控制协处理器
系统控制协处理器标识为"CP0",是MIPS CPU上的一个常见模块。 在基于R3000的系统(如本系统)中,CP0控制高速缓存的实现方式。 因此,可以直接访问数据高速缓存(以"Scratchpad"的形式)和指令高速缓存(使用"高速缓存隔离")。 控制协处理器还负责处理中断、异常和断点,后者在调试时非常有用。
等等,协处理器不是只能_扩展CPU_的功能吗? 为什么CP0与CPU紧密耦合?
事实上,R3000内核依赖系统控制协处理器才能使用许多组件,但这是否"合法"取决于对"协处理器"一词的解释。 根据MIPS的规定,协处理器并不是CPU的严格意义上的可选部件,它还可以指挥CPU的周围环境(高速缓存、中断等)。 因此,协处理器可以是系统不可分割的一部分。 在讨论与MIPS有关的系统时,这一点值得注意。
后来,基于R4000的系统将内存管理单元(MMU)和转译后备缓冲区(TLB)整合到了这个模块中,从而增强了它的功能并承担了新的角色。
几何变换引擎
"CP2"或几何变换引擎(GTE)是一种特殊的数学处理器,可加速矢量和矩阵计算。
虽然只能运行定点类型,但它仍能为 3D 图形提供有用的运算,例如:
- 矩阵或矢量乘法和加法;以及矢量平方。
- 透视变换(用于三维投影)。
- 两个或三个矢量的外积(后者用于剪切)。
- 许多使用不同参数的插值函数。
- 来自光源的深度提示和色彩值(用于照明和色彩操作)。
- Z值/深度平均值(我猜测这是用于"排序表",更多详情请参见"图形"部分)。
您不必记住所有这些信息就能理解文章的其余部分! 请记住,GTE将负责图形流水线的第一阶段,如3D投影、照明和剪切。 这将有助于生成所需的数据,并发送到GPU进行渲染。
运动解码器
运动解码器(Motion Decoder),也称为"MDEC"或"宏单元解码器",是 CPU 旁的另一个处理器。 这里,它将"宏单元"解压缩为GPU可以理解的格式。 宏单元是一种数据结构,其中包含与JPEG类似编码的图片。
MDEC一次解压8x8 24bpp像素的位图。 Walker的编程指南指出,MDEC每秒可计算9000个宏单元。 这样就能以30FPS的速度流式传输320x240像素的全动态视频 (FMV)。
DMA用于通过CD-ROM->RAM->MDEC发送压缩数据。 同样的路径在相反的方向上进行,不过在这种情况下,目的地是VRAM。
虽然该组件位于SoC内部并共享相同的数据总线,但它不是MIPS协处理器,因此CPU/DMA要通过内存映射访问它(而不是拦截指令)。
有关MDEC单元的更多信息,我建议查看Sabin和 Czekański的资源。
缺了个单元?
到目前为止,我们已经有了"CP0"和"CP2",但"CP1"在哪里?这是为浮点运算单元(FPU)预留的,恐怕索尼没有提供。 这并不意味着CPU不能进行十进制运算,只是速度不够快(软件模拟的FPU)或过于精确(定点运算)而已。
游戏逻辑(涉及物理、碰撞检测等)仍可使用定点运算。 定点编码以固定的小数位数存储十进制数。 这意味着在某些运算后会损失精度,但请记住,这是视频游戏机,而不是专业的飞行模拟器。 因此,在精度和性能之间进行权衡是可行的。
顺便说一句,如果你想重温一下"定点"、"浮点"、"十进制"和"整数"等概念,我建议你看看Gabriel Ivancescu的文章。
大量延迟
正如我们之前所见,CW33300是一款流水线处理器,这意味着它可以将多条指令排成队列,在不同阶段并行执行。 这极大地提高了指令吞吐量,但如果控制不当,就会导致流水线冒险,造成计算错误。
MIPS I架构就容易出现这种情况:
- 控制冒险: 指令可能在不该执行时被执行。
- 数据冒险: 指令可能在更新前使用过期数据运行。

在NO$PSX调试器上可视化的游戏《小龙斯派罗》(Spyro The Dragon)的指令。 请注意LW(从内存中加载字)、JAL(跳转和链接)和BNE(不相等时分支)后面都有一个延迟槽,以防止出现冒险。 红色标记的是填充指令(无用指令)。 蓝色标记的指令执行有意义的操作。
因此,MIPS I CPU表现出以下行为:
- 任何跟随"分支"或"跳转"类型操作码的指令都会被无条件执行: 因此,开发人员必须在分支或跳转后手动在流水线中填充适度的指令(如
计算0+0),以减少冒险。 这些填充物被称为分支延迟槽。- 现代CPU将这一现象转化为优势:分支预测。 通过增加额外的电路来检测冒险,如果不满足分支/跳转条件,CPU就会丢弃新的计算。 但如果满足了,CPU就节省了一些时间。
- "加载"指令不会使流水线停滞,直到检索到的数据可用: 流水线的第二阶段(称为
RD或"读取和解码")收集运算符,用于在第三阶段(ALU)执行计算。 第四阶段(MEM,源自"访问内存"(access MEMory))在内存(即主RAM、CD阅读器等)中查找数据。 现在,问题来了:当一条load(加载)指令从外部收集数据时,下一条指令已经获取了运算符。 这意味着,依赖于前一条load指令值的指令需要在中间进行填充,以便及时获取正确的运算符。
从示例中我们可以看到,一些延迟槽被有意义的指令填满,这些指令执行的计算不受冒险的影响。 因此,延迟槽并不总是意味着周期的浪费。
在解释了这些之后,你可能会问,为什么存在这些缺陷的处理器会被商业化。 关于RISC的一个理念是,CPU编程的负担从开发人员转移到了编译器。 特别是 MIPS,他们优先考虑制造高质量的编译器(包括汇编器)来配合他们的新CPU。 因此,开发人员可以使用更高级别的语言(例如C语言),而工具链则负责处理冒险(通过重新编排指令来填补空白;或添加无用的填充指令作为最后措施)。 因此,总而言之,虽然我不喜欢看到CPU充满气泡,但我认为MIPS以非常巧妙的方式解决了这个问题。