开发者生态
morning
z386:围绕原始微码构建的开源 80386
摘要
This is the fifth installment of the 80386 series。The FPGA CPU is now far enough along to run real software, and this post is about how it works。
the
and
like
The
FPGA
2026-05-23
1 阅读
约6分钟阅读
wicket
字号:
这是 80386 系列的第五部分。 FPGA CPU 现在已经足够运行真正的软件了,这篇文章将介绍它的工作原理。 z386 是围绕原始 Intel 微码构建的 386 级 CPU,与 z8086 的精神相同。该内核不是 RTL 中的逐指令仿真器。目标是重新创建足够多的原始机器,以便恢复的 386 控制 ROM 可以驱动它。如今,z386 可以启动 DOS 6 和 DOS 7,运行 DOS/4GW 和 DOS/32A 等保护模式程序,并玩《Doom》和《Cannon Fodder》等游戏。以下是针对 ao486 的一些粗略数据: 指标 z386 ao486 代码行数 (cloc) 8K 17.6K ALUT 18K 21K 寄存器 5K 6.5K BRAM 116K 131K FPGA 时钟 85MHz 90MHz 3DBench FPS 34 43 Doom(原始)FPS,最大细节 16.5 21.0 在当前版本中,z386 的性能类似于快速(~70MHz)缓存的 386 级机器或低端 486。它的运行时钟比历史上的 386 CPU 高得多,但 CPI(每条指令的周期)稍差。当前的缓存是 16 KB、4 路组关联统一 L1,部分选择是为了保持时钟为高电平。真正的高端 386 系统通常使用更大的外部缓存,通常在 32 KB 到 128 KB 范围内。 《毁灭战士 II》在 z386 上运行。前面四篇文章已经介绍了 386 微架构考古学的大部分内容:乘法/除法数据路径、桶式移位器、保护和分页以及内存管道。 z386试图既是一个教育重构,又是一个可用的FPGA CPU。它保留了许多类似 386 的结构:32 项分页 TLB、形状像原始的桶形移位器、ROM/PLA 式解码、保护 PLA 模型,以及最重要的 37 位宽、2,560 项微代码 ROM。同时,它在有意义的地方使用了 FPGA 友好的快捷方式,例如用于乘法的 DSP 模块和小型快速 L1 缓存。在这篇文章中,我将填写设计的其余部分:指令预取、解码、微码定序器、缓存设计、测试、z386 与 ao486 的不同之处,以及一些从启动中获得的经验教训。从 z8086 到 z386 首先介绍一些背景知识。去年我写了z8086,一个原始微码驱动的8086,基于reenigne的反汇编工作。该项目表明围绕恢复的微代码构建一个可工作的 CPU 是可能的。临近年底,我了解到 80386 微代码最近被提取出来,而 reenigne 和其他几个人(在本文末尾注明)正在进行反汇编。他们慷慨地与我分享他们的工作,z386 从那里开始。 386 与 8086 是一个非常不同的问题。指令集更大,内部状态更丰富,并且机器必须强制执行保护、分页、特权检查和精确故障。更重要的是,80386的微操作更密集、更上下文化。如果 8086 微代码读起来像一个简单的 C 程序,那么 386 微代码读起来更像是手工调整的汇编:简短、微妙,并且充满了有关隐藏硬件的假设。这个谜题花了大约四个月的晚上和周末。结果还不是完美的 386,但它现在已经足够运行真正的保护模式 DOS 软件了。 z386 - 高层视图 从高层来看,386 围绕八个主要单元进行组织。 z386 遵循相同的划分,足以使原始的 Intel 框图仍然是一个有用的图。 80386为八个合作单位。资料来源:英特尔,英特尔 80386 - 架构和实现,图 8。该图实际上很好地映射了实际的 386 芯片,尽管单元的相对位置不同。 80386 芯片上也有同样的八单元组织。基本图像:Intel 80386 DX 芯片,维基共享资源。以下是这些单元在 z386 中的作用: 1. 预取单元。保持内存中填充 16 字节代码队列。分支、故障、中断和段更改可以刷新并重新启动它。 2.解码器。使用指令字节、跟踪前缀、识别 ModR/M 和 SIB 形式、收集立即数和位移,并将指令映射到微代码入口点。 3.微码定序器。获取扩展的微码字,处理跳转、延迟槽、故障和运行下一条指令行为。 4. ALU 和移位器。实现算术、逻辑、标志、位运算、移位、旋转、乘法和除法支持。 5. 分段单元。计算逻辑到线性地址,应用段基址和限制,并存储隐藏的描述符缓存状态。 6.保护装置。重新创建 386 Protection PLA 行为以进行选择器和描述符验证。 7.寻呼单元。处理 TLB 查找、页面遍历、访问/脏更新、页面错误以及从线性地址到物理地址的转换。 8.BIU/高速缓存/内存路径。将 CPU 内存操作连接到分页、高速缓存、SDRAM、ROM、I/O 和周围的 PC 系统。这种组织方式与现代 RISC 型 CPU 通常显示的整洁管道有很大不同。 386 更好地被认为是几个大型的、部分独立的
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱