十四年的时间跨度足以改变技术的演进轨迹,但在硬件调试的语境中,它更像是认知的迷雾 —— 当工程师不知道自己真正在测试什么时,实验数据的意义便悬浮在理解的真空地带。本文从一个保加利亚的「共产主义 Apple II」故事出发,探讨复古计算机硬件调试中的非典型问题,并延伸至 EDA 领域一段被低估的传奇:ISCAS-85 基准电路在长达十四年里无人知晓其真正功能的历史。

Правец 82:铁幕之后的苹果克隆

在保加利亚首都索非亚的技术网络与机器人研究所(ИТКР),工程师伊万・马拉戈佐夫于 1979 年制造了 IMKO-1—— 这是保加利亚第一台个人计算机,同时也是一个几乎完整的 Apple II 克隆体。这里所说的「克隆」并非隐喻:ROM 相同、原理图相同、MOS 6502 CPU 以相同的 1 MHz 时钟频率运行。差异体现在物理层面 —— 金属机箱沉重到可作为压舱物使用、线性电源的重量足以纳入健身器材的范畴,以及将小写拉丁字母替换为大写西里尔字母 —— 因为在铁幕之后,西里尔字母表的地位不容协商。

关于这些计算机如何进入保加利亚的传闻比事实更为生动。据称,保加利亚情报部门派遣特工前往西方采购 Apple II—— 与其说是詹姆斯・邦德式的行动,不如说是卡通角色带着满腔美元和装满列弗(保加利亚货币)的箱子试图用浓重口音购买计算机的滑稽场景。另一个更为引人入胜的版本是:索非亚的一个研究所承担了 decap(开封)集成电路、在显微镜下提取网表、并用社会主义光刻技术复现这些设计的工作 —— 设备很可能来自荷兰。

然而,真正的问题在于:既然从零设计一个算术逻辑单元(ALU)并非如此困难,为什么这些工程师要如此大费周章?答案或许在于,逆向工程本身就是一种学习方式 —— 理解一个设计足够透彻以至于能够复制和适配,这正是整整一代工程师学习计算的方式。保加利亚没有斯坦福或 MIT 的资源,但他们有原理图、焊接烙铁,以及对知识产权法持 cheerful disregard(欢快的漠视)的态度 —— 公平地说,这在哲学上与其经济体系是一致的。

到 1980 年代中期,保加利亚生产了 COMECON(经济互助委员会)国家使用的个人计算机的 40%。这个国家曾由托多尔・日夫科夫领导 —— 一个农民的儿子,后来成为印刷学徒,靠着苏联的支持和「 absence of anyone more threating」的便利在党内平步青云。日夫科夫出生在村庄的名称最终被用于命名这些计算机。Правец 这个曾经无关紧要的小村庄在 1960 年代被日夫科夫下令改为城镇,到 1980 年代已成为东欧旗舰技术的装配中心。

ISCAS-85:十四年的功能盲区

如果说 Правец 的故事展示的是「在封闭环境中通过逆向工程建立计算基础设施」,那么 ISCAS-85 基准电路的故事则揭示了另一个极端:当研究者获得了测试电路,却对其功能一无所知。

ISCAS-85 基准由 Franc Brglez 和 Hisashi Fujiwara 于 1985 年发布,是数字设计研究的标准测试电路。如果你从事测试生成、故障诊断、综合或时序分析,你必然使用过它们。这些是门级描述的「中性网表」—— 剥离了具体应用背景的 10 个组合基准电路,供研究社区作为通用测试基准使用。

但有一个问题始终存在:没有人告诉研究社区这些电路究竟「做什么」。

在长达十四年的时间里,数以千计的研究者在 c432、c499、c880、c1355、c2670、c3540、c5315、c6288 和 c7552 上运行实验。他们生成测试模式、诊断故障、时序综合、映射到 FPGA、发表论文。而在这十四年里,没有任何一个人 ——Absolutely Nobody—— 知道这些电路实际上应该计算什么。

1999 年,密歇根大学的马克・汉森、哈坎・雅尔辛和约翰・P・海斯完成了本应从一开始就做的事情:逆向工程。他们在 IEEE Design & Test 上发表的论文《Unveiling the ISCAS-85 Benchmarks: A Case Study in Reverse Engineering》是一项侦探工作的杰作。他们将每个门级网表划分成标准 RTL 块,识别每个块的功能,并重建高级架构。方法论非常实际:海斯将每个电路分配给一个博士生。廉价劳动力,而且几乎可以肯定的是,每个洞见的成本比 LLM 低得多。

结果令人震惊。c432 实际上是一个 27 通道中断控制器。c880 是一个 8 位 ALU。c6288 是一个 16×16 乘法器。c7552 是一个 32 位加法器 / 比较器。c499 和 c1355 都是 32 位单纠错电路 —— 相同的功能,不同的实现。这些不是抽象的数学构造 —— 它们是从真实硬件中剥离出来的真实设计,而研究社区却像考古学家研究陶器碎片一样研究了它们:知道形状,却不知道用途。

海斯的贡献是深刻却未被充分重视的。通过恢复行为规范,他给予社区从未拥有过的东西:在功能层面进行测试的能力、根据预期行为验证综合结果的能力、以及利用层次结构进行更高效测试生成的能力。

调试的本质:诊断即综合

将这两个故事联系在一起的线索是逆向工程与硬件调试之间的深层结构关联。当海斯看到 c6288 并推断它是一个乘法器时,他正在做的是 —— 凭借非凡的耐心,手动完成 —— 一个诊断引擎自动做的事情:给定一个电路及其行为,确定其功能。当马拉戈佐夫看到 Apple II 并构建 IMKO-1 时,他正在做的是通过结构分析进行技术转移。而当 Johan de Kleer 描述综合是「诊断一个电路进入存在」时,他指出数学机制在两个方向上是相同的:从一个损坏的规范开始(什么都不工作,每个门都是「故障」),问:什么样的「修复」(门的位置)集合会让电路计算期望的功能?

这是我在 LyDiA 和 qbf-designer 项目中所做工作的基础。诊断、综合和逆向工程是同一形式对象的三张面孔。唯一的区别在于你固定哪些变量以及求解哪些变量。ISCAS-85 基准恰好是 LyDiA 诊断的电路。当我在 c432 上演示基于模型的诊断时,我正在诊断一个 27 通道中断控制器 —— 只是在我博士最初几年并不知道这一点。感谢海斯教授。

非典型调试问题的工程启示

这个故事对当代硬件调试的启示在于:理解被测对象的语义与执行测试本身同样重要。十四年的 ISCAS-85 研究产生了大量论文和实验数据,但在缺乏功能规范的情况下,这些数据的解释空间是开放的 —— 同一个故障模型可能对应多种功能假设,而验证假设的正确性需要反向恢复设计意图。

对于复古计算机硬件而言,挑战在于原始文档的稀缺和知识的断裂。保加利亚的 Правец 机器虽然基于 Apple II 的公开原理图,但本土化的字符集处理和电源设计带来了独特的调试场景。调试者不仅需要理解 6502 架构和 Apple II 的周边设备时序,还需要处理社会主义工业体系中特有的器件替换 —— 苏联克隆的芯片与原始美国器件在电气特性上的差异可能成为隐藏的故障源。

这意味着复古硬件调试需要一种双重能力:既要对原始设计有足够深入的理解,又要能够识别本土化修改带来的非标准行为。ISA 总线和内存映射的差异、时钟频率的微小调整、乃至字符编码表的本地化 —— 每一个细节都可能成为调试过程中的盲点。

资料来源

本文核心内容参考自 Alexander Feldman 发布于 llama.gs 的博客文章《A Communist Apple II and Fourteen Years of Not Knowing What You're Testing》,该文详细叙述了保加利亚 Правец 计算机的历史以及 ISCAS-85 基准电路的逆向工程过程。ISCAS-85 基准电路的功能解析可参见 Mark Hansen、Hakan Yalcin 和 John P. Hayes 于 1999 年在 IEEE Design & Test 上发表的论文《Unveiling the ISCAS-85 Benchmarks: A Case Study in Reverse Engineering》。