Hotdry.

Article

TD4 四位处理器:从 74 系列离散逻辑到 Verilog RTL 的逆向工程实践

全面拆解 TD4 四位微处理器的架构设计,涵盖从原始 74 系列 TTL 逻辑芯片到 Verilog RTL 的完整转换过程,深入分析指令集映射、状态机推导与微架构门级复现的工程实践。

2026-05-09systems

在处理器设计的历史长河中,TD4 是一个极具教学价值的起点。作为一款诞生于 1970 年代的四位微处理器,TD4 最初由 Masatoshi Shima 采用 74 系列 TTL 逻辑芯片构建完成。这种基于离散硬件的实现方式,使其成为理解计算机体系结构基本原理的理想载体。本文将系统性地剖析如何将这套基于分立元件的原始设计逆向工程为可综合的 Verilog RTL 代码,这一过程不仅重现了经典处理器的行为特性,更揭示了微架构设计背后的核心决策逻辑。

一、TD4 处理器架构总览

TD4 采用了经典的冯・诺依曼架构核心元素,但其设计目标聚焦于极简实现与四位数据路径的运算能力。从顶层结构来看,该处理器由五个主要功能单元组成:程序计数器(PC)负责指令流的寻址控制,指令寄存器(IR)捕获当前执行指令,四位累加器(A)作为隐式工作寄存器,通用寄存器组(B 和 C)提供临时存储能力,算术逻辑单元(ALU)执行加法与数据传输操作,而控制单元则依据指令解码结果生成时序控制信号。

数据路径宽度固定为四位,这意味着所有寄存器、算术运算和总线操作均以四比特为单位进行。地址空间同样受限于四位宽度,总共只能寻址 16 个字节的存储单元。这种极度受限的资源配置反而使得整个系统的行为完全可可视化追踪,为逆向工程提供了清晰的起点。

二、指令集映射与操作码解码

TD4 的指令集共包含 16 条指令,分为三大类别。第一类是数据传输指令,包括 MOV A, BMOV A, CMOV B, AMOV C, A,负责在寄存器之间搬运数据。第二类是算术指令,ADD A, B 将寄存器 B 的值加到累加器 A 上,ADD A, C 执行类似的加法操作。第三类是控制流指令,包含条件跳转 JC target(当进位标志为真时跳转)和无条件跳转 JMP target

每条指令的编码占用四个比特位,映射到 16 种可能的操作码空间。指令格式的设计遵循了高度的规律性:位 [3:2] 编码主操作类型(00 为数据传输,01 为算术运算,10 和 11 涉及控制流),位 [1:0] 则编码操作数选择或跳转目标。这种规整的编码方案大幅简化了解码逻辑的复杂度,使得控制单元可以用最少的组合逻辑实现指令识别。

在离散逻辑实现中,指令解码通常借助 74LS138 等 3-8 译码器将操作码转换为 16 条独立的指令使能信号。这些信号随后与时序信号相结合,生成各功能模块的选通与写入控制。以 MOV A, B 指令为例,解码输出会激活 A 寄存器的写入使能,同时将 B 寄存器的输出连接到内部数据总线,控制器则在下一个时钟周期完成数据搬运。

三、状态机推导与时序控制

从离散逻辑到 RTL 的转换过程中,正确建模时钟域与状态机行为是关键挑战。TD4 的控制单元采用了两相时钟方案,在每个指令周期内需要完成取指、解码、执行三个阶段。这种顺序执行模型非常适合用有限状态机(FSM)进行描述。

在取指阶段,程序计数器当前值被驱动到地址总线上,外部存储器据此返回指令字节至指令寄存器。此阶段的状态转换完全由时钟上升沿触发,无需额外的控制信号介入。解码阶段则组合逻辑地根据 IR 中的操作码生成各子操作的使能信号,这一过程在时钟上升沿后的短暂窗口内完成。最后的执行阶段将解码结果转化为寄存器写入、总线切换或 ALU 操作,完成指令的语义功能。

用 Verilog 描述这一行为时,典型的实现会维护一个 state 寄存器来跟踪当前处于取指还是执行阶段。状态转移在时钟上升沿触发,解码逻辑则作为组合进程依据 stateinstruction 输入产生所有控制信号。这种结构与原始离散设计中的时序电路形成了精确对应。

四、微架构门级复现实践

将离散逻辑转换为 Verilog 的过程需要识别原始设计中的功能模块并将其映射为可综合的描述。以寄存器组为例,TD4 使用 74LS273 或 74LS173 等 D 触发器芯片构建四位寄存器,每个芯片包含四个独立的边沿触发寄存器。在 RTL 中,这可以表达为:

module reg4 (
    input wire clk,
    input wire we,
    input wire [3:0] d,
    output reg [3:0] q
);
    always @(posedge clk) begin
        if (we) q <= d;
    end
endmodule

ALU 的实现同样需要与原始硬件行为精确对齐。TD4 的 ALU 仅支持加法操作,通过 74LS283 四位全加器级联实现。关键的实现细节在于进位标志的处理:加法结果的低三位用于正常的数据路径,而进位输出则被锁存到专用的进位标志寄存器中。条件跳转指令 JC 正是依据此标志决定是否修改程序计数器。

程序计数器的设计引入了另一个重要的设计权衡。由于地址空间仅 16 字,PC 本身也是四位宽度。递增操作由 74LS283 实现,跳转则通过多路选择器在递增结果与跳转目标之间选择。在 RTL 中,这种行为可建模为:

always @(posedge clk) begin
    if (reset) pc <= 4'b0;
    else if (jump_en) pc <= jump_addr;
    else pc <= pc + 1'b1;
end

五、控制器逻辑的 RTL 表达

控制单元是整个处理器中最复杂的部分,原始离散实现需要大量译码器、门电路和时序元件。在 RTL 中,这些功能可以通过 case 语句和组合逻辑编码实现。控制器接收当前指令的操作码和状态机的阶段信息,输出各模块的控制信号。

一个完整的指令周期控制器通常包含以下控制信号的生成逻辑:reg_we 控制寄存器的写入使能,alu_op 指定算术单元的操作类型,pc_load 决定是否加载跳转地址,bus_sel 选择当前驱动数据总线的源模块。这些信号在取指阶段与执行阶段具有完全不同的激活条件,FSM 状态机负责协调它们的时间序列。

对于 ADD A, B 这类算术指令,控制器在执行阶段需要依次完成:从 B 寄存器读取数据并驱动总线、将总线数据送入 ALU 的一个输入端、将累加器当前值作为另一个输入端、执行加法运算、将结果写回累加器。这一系列操作的时间协调通过 FSM 中的状态细分实现,每进入一个子状态即激活相应的控制信号。

六、验证与迭代修正

将离散逻辑实现转换为 RTL 后,验证工作的核心目标是确保行为完全等价。推荐的做法是构建一个验证平台,在相同的指令序列激励下比较原始离散设计与 RTL 实现的输出响应。首先需要在离散仿真器中记录关键节点的波形数据,然后在 RTL 仿真中重现相同测试用例,通过波形对比或自动检查脚本确认一致性。

测试用例的设计应覆盖指令集的完整空间,包括所有数据传输指令的寄存器组合、所有算术指令的进位场景、所有跳转指令的条件分支情况。此外,还需要注入一些边界条件,如从地址零执行、连续跳转指令、算术溢出等极端场景,以捕获潜在的隐含缺陷。

在实际项目中,发现的主要差异通常集中在时序细节上。原始离散电路中存在的门延迟、毛刺传播等问题在 RTL 级别往往被忽略,但在周期精确的验证框架下会暴露出来。这种差异的处理需要根据设计意图进行选择:若目标是重现原始行为,则需要在 RTL 中引入适当的延迟建模;若目标是获得可综合的现代实现,则这些差异属于正常的架构演进。

七、工程化要点与可综合约束

将学术性质的逆向工程转化为生产级 RTL 代码需要遵循可综合设计的基本约束。首先,所有 always 块应该只包含时序逻辑或纯组合逻辑的单一类型混用,这确保了综合工具能够正确推断硬件结构。其次,避免使用延迟语句(#delay)和未声明的线网类型,这些在可综合代码中没有意义。

模块划分应与原始架构的功能单元对应,便于后续的时序优化和布局布线。数据路径与控制路径的分离是提升时钟频率的关键:数据路径包含寄存器、运算单元和多路选择器,控制路径则通过 FSM 实现指令级别的状态转移。将这两部分置于独立的模块中可以支持综合工具对各自进行独立优化。

在整个 RTL 实现中保持对原始设计决策的忠实度是重要的质量标准。TD4 的设计者在资源受限的年代做出了特定的架构选择,这些选择在今天的先进工艺下可能并非最优,但它们共同构成了理解经典处理器设计的重要线索。

参考来源

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com