ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

微指令格式详解:微命令分组、控制字段编码与微程序字长计算

微指令格式详解:微命令分组、控制字段编码与微程序字长计算 1. 微指令格式到底在解决什么问题微指令格式这个词第一次听确实有点抽象。但只要你在计算机组成原理的实验箱前面坐过一个下午看着一堆控制信号灯一个个亮起来就会明白它到底在干什么。简单说微指令格式就是一个时钟周期里CPU 内部哪些部件该动、动完之后下一条微指令去哪这件事的编码约定。它决定了控制存储器的字长、微程序的长度最终决定了这台机器跑得快不快、控制器做得贵不贵。学软件的同学也别急着划走编译器后端做指令调度、体系结构课讲流水线、甚至你调试时看到的那些信号名追到最底层都和这套东西有关联。我带过几届学生的组成原理实验也帮人改过期末设计题发现一个很普遍的现象大家能把微程序控制器由控制存储器、微指令寄存器、微地址寄存器组成背得滚瓜烂熟可一旦给出数据通路图让你设计微指令格式、算控制字段位数立刻就卡壳。问题不在记性而在于没有把微命令—微指令—微程序这条链条真正串起来。这篇文章我就按自己平时带实验、讲题的思路把微指令格式拆开揉碎讲一遍从微命令怎么分组、字段怎么编码、下地址怎么形成一直算到一条微指令到底占多少位、控制存储器要多大。文中那个数据通路的例子是我自己在实验箱模型上常用的简化版本你可以直接照着复现。1.1 一条机器指令背后藏着多少微命令先从最朴素的层次说起。一条机器指令比如ADD (addr)它能被执行是因为 CPU 内部在若干个节拍里依次做了这么几件事把程序计数器的值送到地址寄存器、启动主存读、把读回来的数据送指令寄存器、解析出操作数地址、再去主存取一次数、最后送进 ALU 做加法并把结果写回累加器。每一个这样的小动作都对应一个微命令——也就是控制器输出的一根控制线上的有效电平。这些微命令的英文写法通常是一串信号名比如PCout、ARin、R、ADD你在实验箱的指示灯面板上能直接看到它们对应的 LED。关键在于微命令是同一时刻意义上的东西。一个节拍里可能有多个微命令同时有效比如PC 输出到总线和总线输入到 AR这两个信号必须同时拉高数据才走得通。这就带来了第一个约束微命令之间要么可以并行要么互斥。而微指令就是在一个节拍内同时有效的若干微命令打包起来的结果。一条微指令执行完数据通路上完成一步操作然后进入下一拍。那么一条机器指令需要多少条微指令保守估计取指阶段至少 2 到 3 条地址计算 1 到 2 条取操作数 1 到 2 条执行 1 到 2 条写回 1 条。合起来八到十条很常见。这还只是一条指令如果一个指令系统有几十条指令微程序的规模一下就上去了。这就是为什么微指令格式值得单独拿出来研究格式设计得省一位控制存储器就能省一大块面积。1.2 微指令格式的三段式骨架不管教材怎么分类一条微指令的字段组成基本跑不出三大块。第一块是操作控制字段也叫微命令字段负责描述本拍要产生哪些微命令。第二块是顺序控制字段负责指定下一条微指令的地址或者说明这一拍要不要做条件判断。第三块是夹在中间的判别测试字段它告诉微地址形成部件本次转移到底按什么条件走——是按指令操作码分支还是按进位标志分支还是干脆不测、直接顺延。这三块的划分方式就是微指令格式设计的全部内容。操作控制字段用哪种编码顺序控制字段采用增量还是断定判别字段留几位几项决定互相牵制。举个最直观的对比操作控制字段如果每位对应一个微命令那么字长等于微命令总数优点是零译码、速度快如果做字段编码字长能压到原来的三分之二甚至一半代价是每条微指令都要过一次译码器多出一级延迟。我个人的经验是先把数据通路图和微命令表列清楚再动手谈格式。很多同学一上来就想我要几位控制字段结果列到一半发现漏了两个微命令或者把两个本来互斥的信号分到了两个字段里最后微指令字长算错了整道题就废了。顺序应该是反过来的先穷举微命令再判互斥再分组编码最后才算位数。1.3 格式设计的本质是一场字长与速度的博弈有人会问那有没有一种最优格式答案是没有只有取舍。全水平型直接编码微指令字长最长可能到几十位甚至上百位但每一拍所有微命令都能直接送到控制线上没有任何译码延迟微程序也最短。字段直接编码把字长压下来可是字段内互斥的微命令没法同时用。字段间接编码还能再省几位代价是要经过二次译码延迟更大设计也更绕。这个权衡在真实处理器里体现得很明显。早期的 CISC 机器指令系统复杂一条指令要几十拍才能跑完控制器普遍采用微程序实现而微指令格式倾向于字段编码图的是控制存储器别太大。到了 RISC 时代指令规整、格式统一控制逻辑干脆用硬布线实现压根不走微程序这条路。所以你在学的时候要有一个判断微指令格式是微程序控制器的内部细节它的设计目标永远是在满足并行需求的前提下让控制存储器尽量小。理解了这一点后面所有的编码方式就都不难了。它们不过是用不同的手段在同一个目标上做不同程度的妥协而已。2. 控制字段的四种编码方式与选型依据操作控制字段怎么编是微指令格式里信息量最大的一块。教材上一般列四种直接编码、字段直接编码、字段间接编码、混合编码。这四种不是并列关系而是从完全不做压缩到压得很狠的一个谱系。我按从简单到复杂排一遍每一种都配上它适合的场景你可以对照自己的实验箱或者期末题去套。2.1 直接编码最直白也最费位直接编码也叫不译码方式、全水平型编码。规则极简单每一个微命令占一位这一位为 1 就表示该微命令有效为 0 表示无效。不需要译码器微指令寄存器里的控制字段直接连到各部件的控制端。它的好处是并行能力拉满。你想让多少微命令同时有效都行只要它们物理上不冲突。速度也是最快的从 μIR 取到信号、到部件响应中间没有组合逻辑延迟。这在时序紧张的设计里非常值钱。坏处同样明显字长等于微命令总数。假如你的数据通路有 30 个微命令控制字段就是 30 位加上判别和下地址微指令可能接近 40 位。控制存储器如果有 128 个单元那就是 128 × 40 5120 位也就是 640 字节。放在今天看不多但在早期用 ROM 实现控制器的年代这个面积直接决定成本。还有一点容易被忽略直接编码会产生大量冗余位。很多微命令是互斥的一个节拍里只可能有一个有效可每一位都得实打实地留着。比如PC→BUS和AR→BUS这两条永远不可能同时为 1却各占一位利用率极低。这正是字段编码要解决的问题。注意判断是否互斥要看两个微命令在物理上能不能同时成立。像PC→BUS和BUS→AR是数据通路上下游关系可以同时而两个→BUS的信号因为总线同一时刻只能有一个源必然互斥。2.2 字段直接编码把互斥微命令塞进同一字段字段直接编码的思路很聪明既然互斥的微命令不可能同时有效那何必各给一位把它们编在一组共用一个字段字段值经译码器后产生对应的微命令。字段长度按组内微命令个数来定公式是字段位数 ceil(log2(组内互斥微命令个数 1))那个1特别关键它代表本字段不选中任何微命令的空操作状态。少了它你就没法表示这一拍这组微命令一个都不用。按这个公式一组 5 个互斥微命令需要 ceil(log2 6) 3 位一组 3 个需要 2 位一组 2 个也需要 2 位。比起直接编码的 5 位、3 位、2 位压缩效果在组内个数多的时候最明显。字段划分的依据就是互斥性实践中我会按数据通路的功能模块来分组总线源选通组PC→BUS、AR→BUS、DR→BUS、IR→BUS、AC→BUS、ALU→BUS互斥。总线目的选通组BUS→PC、BUS→AR、BUS→DR、BUS→IR、BUS→AC互斥。存储器操作组读、写互斥。ALU 功能组ADD、SUB、AND、PASS互斥。移位器组左移、右移、直传互斥。组内互斥、组间可以并行这就是字段直接编码能同时保证字长和并行性的原因。同一组的两个微命令不能出现在同一条微指令里这是它唯一的硬约束。代价是多了一级译码延迟而且微程序汇编时要注意如果你在同一拍里既写了PC→BUS又写了AR→BUS汇编器要么报错要么按优先级只保留一个行为就和你预期的不一样了。这也是实验里最常见的翻车点后面第 5 章会专门讲。2.3 字段间接编码再省几位代价是延迟字段间接编码是在字段直接编码基础上再压一层。做法是某个字段的译码输出还要受另一个字段间接编码字段的控制经过二次译码才能得到最终微命令。也就是说同一组编码在不同上下文下解释成不同的微命令。能省多少理论上可以接近再压一半。但它的缺点也很突出第一译码层次多延迟进一步增加微指令周期被拉长第二同一条微指令内可并行的微命令更少第三设计复杂度上来了微汇编器不好写手工编码几乎不可能不出错。我在实际教学里很少让学生用字段间接编码做设计题因为它更多是一个知道有这回事的知识点。真正需要它的是那些微命令数量极多、又极度在意控制存储器体积的场景。考试里它通常以简答或选择题形式出现问的就是哪种编码方式需要二次译码、并行性最差。心得如果一道题没有明确要求尽量减少字长我一般建议用字段直接编码作答理由是逻辑清晰、位数可算、容易检查。字段间接编码能算对的人不多性价比低。2.4 混合编码与四种方案的横向对比混合编码就是前几种的混搭对速度敏感的微命令用直接编码单独占位对面积敏感的大批互斥微命令用字段编码。真实的控制器这么做的居多因为数据通路里总有几个信号需要随时能拉高把它塞进字段反而碍事。比如 PC 自增信号PC1它经常需要和PC→BUS、BUS→AR在同一拍发生跟谁都不互斥那就必须单独给一位。同理停机信号、中断允许信号这类全局标志也适合独立一位。把四种方式摆在一起对比选型的时候就一目了然了编码方式控制字段长度并行能力译码延迟适用场景直接编码等于微命令总数最长最强任意组合无微命令少、追求速度字段直接编码各互斥组位数之和明显缩短较强组内互斥组间并行一级译码通用微程序控制器字段间接编码最短弱可并行微命令少二级译码极度在意控制存储器体积混合编码介于直接与字段编码之间兼顾部分译码真实处理器设计看到这张表你就明白为什么我说没有最优解了。选型时先问自己三个问题微命令总数是多少哪些必须能并行控制存储器容量有没有硬约束三个问题的答案基本就把方案定下来了。3. 顺序控制字段微地址是怎么形成的操作控制字段管的是这一拍干什么顺序控制字段管的是下一拍去哪。这一块经常被忽略但它其实决定微程序能不能写下去。因为微程序不是从头到尾顺排的它有分支、有循环、有按操作码散开的多路转移微地址的形成方式必须撑得住这些需求。3.1 增量方式靠计数器顺序往下走增量方式也叫计数器方式核心部件是微程序计数器 μPC。每执行完一条微指令μPC 自动加 1指向下一条。需要转移的时候由微指令里的下地址字段把目标地址装进 μPC。它的结构非常像程序计数器 PC 的工作方式理解成本低。微指令里只需要一个下地址字段和一个是否转移的标志位就够了格式简洁。但增量方式有两个短板。第一微程序必须尽量连续存放否则跳来跳去会浪费控制存储器的空间。第二遇到多路分支就麻烦了——比如取指结束后要按操作码跳转到各条指令的执行微程序用增量方式得先算出一个偏移量再叠加到 μPC 上逻辑不干净。实验箱上如果用的是增量方式你会看到面板上有一个 μPC 的计数显示每次单步执行它加一遇到转移指令才跳变。这个现象很直观也方便排查问题如果 μPC 该加一没加多半是时钟或者计数使能出了问题。3.2 断定方式下地址字段直接指定断定方式干脆把 μPC 去掉每条微指令的下地址字段直接给出后继微地址。顺序执行时下地址字段填的就是下一条的地址需要分支时微地址形成部件把下地址字段和判别测试结果做一次组合得到真正的目标地址。这种方式的优点是微程序可以任意分布不用连续控制存储器的空间利用率高。多路转移也更好实现因为分支地址本来就在字段里写着微地址形成部件只需要用测试条件去替代下地址中的若干位就行。代价是每条微指令都得背上一个完整的下地址字段。如果控制存储器有 128 个单元那就是 7 位每条微指令都带 7 位逃不掉。而且微程序不能自动顺序执行一旦下地址写错跑到别的地方去了排查起来比增量方式费劲。我个人的偏好是微程序规模小、结构规整用增量方式多路分支多用断定方式。教学模型机上两种都常见具体看实验指导书怎么规定。3.3 混合方式与多路转移混合方式把两者结合起来顺序执行时用 μPC 加 1需要转移时用下地址字段。前面第 3.1 节里我说增量方式的短板是多路分支混合方式其实没解决这个问题只是把两者的优点各取一半——微指令里保留下地址字段但只在转移时使用。多路转移是微程序里最需要动脑筋的地方。典型的场景有两个一是取指结束后根据指令操作码跳到不同指令的执行微程序入口二是执行过程中根据标志位进位、零、溢出决定走哪条支路。实现多路转移的常见做法是下地址字段分两部分用高位固定低位由测试结果填充。比如操作码有 8 种就用 3 位测试结果替换下地址的低 3 位高 4 位由微指令给定这样一次测试就能散到 8 个入口。这个替换低位的技巧在期末题里出现频率很高算地址的时候一定要看清楚是替换哪几位。注意多路转移的入口地址必须按低位对齐排布否则替换低位会跳到错误的单元。设计时先把入口表的地址列出来再回头确定下地址字段的高位该填什么。3.4 判别测试字段与微地址形成部件判别测试字段有些教材叫条件选择字段是顺序控制里的开关。它有一定位数每次选中一个测试条件送给微地址形成部件。常见的测试条件有这几类P0无测试下地址直接作为后继地址对应无条件顺序执行。P1按指令操作码测试用于取指结束后的散转。P2按进位标志测试用于条件转移类指令。P3按结果是否为零测试同样用于条件转移。P4按中断请求测试用于中断响应。几个测试条件就需要几位3 个条件加一个无测试是 4 种状态2 位够用8 种状态就要 3 位。这个位数直接加进微指令字长所以也不能随便多留。微地址形成部件是硬件它的输入是判别测试字段的译码结果和下地址字段输出是真正的微地址。在断定方式下它本质上是一组多路选择器在混合方式下它还要负责 μPC 的装载控制。理解它的作用不需要多深的电路知识你只要记住一句话它是把下地址和测试结果拼成真地址的那块逻辑。4. 手算一遍从微命令表到微指令字长前面三章都是概念这一章我们动笔算。我会先约定一个简化但自洽的数据通路然后一步一步把微指令格式算出来最后用这套格式写一段真实可跑的微程序。你拿一张纸跟着算一遍比看十遍教材都管用。4.1 先约定一个可复现的数据通路为了便于复现我用一个单总线结构的教学模型机。部件包括程序计数器 PC、地址寄存器 AR、数据寄存器 DR、指令寄存器 IR、累加器 AC、算术逻辑单元 ALU、主存 M以及微程序控制器控制存储器 CM、微指令寄存器 μIR、微地址寄存器 μAR、微地址形成部件。数据通路上只有一条总线 BUS任何时刻只能有一个部件往总线上输出也只能有一个部件从总线接收。ALU 的 A 端固定接 ACB 端接总线运算结果可以通过ALU→BUS这一路回送到总线。主存的读写通过 AR 和 DR 完成读出的数据经 DR 送上总线。这个结构跟多数实验箱的模型机接近也不影响我们要讨论的格式问题。微命令的具体信号名和个数不同教材会略有差别但分组思路完全一致你换成自己教材的那套微命令表算法照搬即可。4.2 微命令互斥性分组与字段位数计算先把微命令穷举出来一共 19 个分成 5 组第 1 组总线源选通互斥6 个PC→BUS、AR→BUS、DR→BUS、IR→BUS、AC→BUS、ALU→BUS。第 2 组总线目的选通互斥5 个BUS→PC、BUS→AR、BUS→DR、BUS→IR、BUS→AC。第 3 组主存操作互斥2 个读 R、写 W。第 4 组ALU 功能互斥4 个ADD、SUB、AND、PASS。第 5 组独立位互不排斥3 个PC1、停机、中断允许。现在算字段位数。第 1 组 6 个互斥微命令加一个空操作共 7 种状态ceil(log2 7) 3 位。第 2 组同样 516 种ceil(log2 6) 3 位。第 3 组 213 种2 位。第 4 组 415 种ceil(log2 5) 3 位。第 5 组三个信号互不排斥必须各占一位3 位。控制字段总长 3 3 2 3 3 14 位。如果换成直接编码控制字段就是 6 5 2 4 3 20 位。字段编码省了 6 位压缩率 30%差别相当可观。再算顺序控制字段。判别测试条件我留 3 位可以覆盖 8 种测试状态够用。下地址字段要看控制存储器容量假设 CM 有 128 个单元需要 7 位。于是微指令总字长 14 3 7 24 位。如果控制字段用直接编码总字长就是 20 3 7 30 位多了整整 6 位。4.3 微指令字长与控制存储器容量核算算出字长之后控制存储器容量就好算了。容量 微指令条数 × 每条位数。假设这台模型机的控制存储器有 128 个单元采用字段直接编码时CM 容量 128 × 24 bit 3072 bit 384 Byte如果用直接编码则是 128 × 30 3840 bit 480 Byte多出将近 100 字节。早期的控制器 ROM 是按位算成本的这个差距不能忽视。还要核算微程序条数。假设这套指令系统有 8 条机器指令取指公共段用 3 条微指令每条指令的执行段平均 4 条微指令中断处理段 2 条那么总条数大约是 3 8×4 2 37 条远小于 128说明 128 个单元的控制存储器够用下地址字段 7 位是合理的。这里有个容易出错的地方下地址字段的位数按 CM 的总容量算不是按微程序的长度算。CM 有 128 个单元就要 7 位哪怕你只用了 40 个单元。有的同学按 37 条去算位数得出 6 位结果一遇到地址超过 63 的单元就跳不过去了这是典型的低级失误。4.4 用这套格式写一段 ADD 指令的微程序格式定下来接下来写微程序。假设取指公共段从微地址 0000000 开始ADD 指令的执行段入口由操作码散转到 0010000。约定下地址字段在顺序执行时直接写后一条的地址转移时用测试条件替换低位。; 微程序ADD (AC) (addr) - AC ; 控制字段 14 位 判别 3 位 下地址 7 位 24 位 ; --- 取指公共段 --- 0000000: PC-BUS, BUS-AR, PC1, 下地址 0000001 ; PC 送地址寄存器同时 PC 自增 0000001: READ, BUS-DR, 下地址 0000010 ; 启动主存读数据经 DR 上总线M-DR 0000002: DR-BUS, BUS-IR, 测试P1, 下地址 0xxxxxx ; 指令送 IR按操作码散转到各指令执行段 ; --- ADD 执行段入口 0010000 --- 0010000: IR(addr)-BUS, BUS-AR, 下地址 0010001 ; 取形式地址送 AR 0010001: READ, BUS-DR, 下地址 0010010 ; 读操作数到 DR 0010010: DR-BUS, ADD, 下地址 0010011 ; 操作数送 ALU 的 B 端与 AC 相加结果暂存 0010011: ALU-BUS, BUS-AC, 测试P0, 下地址 0000000 ; 结果写回 AC然后回到取指段这里我做了一个简化处理真实单总线模型里ALU 的运算可能需要一个节拍稳定结果所以第 0010010 条只负责送操作数和启动加法第 0010011 条才把结果回送。这个拆法在实验箱上是标准的因为 ALU 的输出不能和 DR 同时占用总线。写完微程序之后还要回头核对两件事。第一每一条微指令内部有没有同一字段的两个微命令同时出现比如第 0010000 条里IR(addr)→BUS和别的源选通信号不能并存现在是唯一的没问题。第二每条微指令的下地址有没有超出 7 位能表示的范围检查一遍都在 0 到 127 之间也 OK。如果你要把它落成二进制码就是把每条微指令的控制字段按分组规则拼起来。第 0010000 条的控制字段是源选通选 IR编码 100目的选通选 AR编码 010主存无操作00ALU 功能选 PASS编码 101独立位 PC1 为 0、停机为 0、中断允许为 0编码 000。拼起来是100 010 00 101 000加上判别000和下地址0010001就是一条完整的 24 位微指令。这一步在实验报告里通常要求手写慢是慢但写两遍你就把格式彻底记住了。5. 常见问题与排查实录这一章写的是真踩过的坑。微指令格式这块公式不难难的是细节。我按问题类型整理了几类高频故障附上排查路径做实验或者做题的时候可以照着对。5.1 字段划分踩坑互斥性判断错一次全盘皆输最典型的一种错误是把两个本来互斥的微命令分进了不同的字段。比如把PC→BUS和AR→BUS分别放进两个独立字段乍一看没问题微指令也能编码仿真的时候却会发现当这两条微命令同时有效时总线上出现了两个源的冲突波形上表现为电平拉不高、数据不确定。这种错误在纯做题时不明显,一到仿真或者上机就暴露。排查方法很简单把数据通路图上所有能往总线输出的部件列出来它们必然属于同一组。凡是共用一条物理通路的信号都要塞进同一个字段。同理所有从总线接收数据的部件也归一组。这样分组物理上的冲突就从根本上被排除了。还有一种相反的错误把两个不互斥的微命令硬塞进一个字段。比如把PC1和BUS→PC放进同一组理由是都跟 PC 有关。这就错了因为实际的取指过程里PC 送地址寄存器的同时 PC 自增是常见操作这两个信号需要同时有效塞进一个字段就永远做不到了。判断标准只有一个看它们在真实微程序里有没有同时出现的机会。心得分组完成后把微程序里所有的微指令列一遍检查每条里有没有同字段多信号。这一步能抓出九成以上的分组错误。5.2 下地址字段与微程序跳转的常见故障下地址这块的坑主要是位数不够和转移逻辑写错。位数的问题前面提过按 CM 容量算就行。转移逻辑的坑更隐蔽我遇到过的有这么几种。第一种条件转移的下地址填成了目标地址的绝对值但微地址形成部件实际上是要替换低几位的结果计算出来的地址错位。解决办法是先确认微地址形成的规则是整体装载还是高位固定低位替换。规则不同下地址字段的填法完全不同。第二种多路转移的入口地址没对齐。假设用低 3 位表示操作码8 个入口的地址必须是xxx0000、xxx0001……这种连续排布。如果你把第二个入口放在xxx1000替换低 3 位后就永远跳不到它。这个错误在做题时特别常见因为图省事随手标了地址。第三种判别字段选错测试条件。比如该测进位的写了测零标志程序跑起来逻辑完全对不上但波形上看不出硬件故障只能靠逐步单步执行、对照微程序发现。排查这类问题我一般会把每条微指令实际产生的中断、当前 μAR 值、下地址字段值都记下来逐条比对预期两三条之内就能定位。5.3 实验台上的典型现象与排查路径在实验箱上做微程序控制器实验现象比纯仿真丰富得多。把几种常见现象列出来方便你快速定位。现象一单步执行时微地址不前进。这多半是时钟信号或者微程序计数器的使能出了问题也可能是 μPC 的进位链断了。先量时钟再看计数使能最后查进位。现象二微地址乱跳。先看下地址字段写入 μAR 的时机是否与时钟配合如果是断定方式检查微地址形成部件的多路选择控制端有没有选对。有时候是判别字段的译码结果没送到位。现象三某条指令结果错其他指令正常。这种局部故障基本可以断定是该指令执行段的微程序写错了重点查控制字段编码尤其是字段内是否出现了本该互斥的两个微命令。现象四所有指令都在取指段卡死。检查取指段的散转是不是没生效或者散转目标地址全落在同一个地方。这种通常是操作码到微地址的映射逻辑接错了。现象五主存读写正常但结果回不到 AC。查 ALU→BUS 这条路的选通编码以及 BUS→AC 的目的选通编码两组编码要同时正确才行。5.4 微指令格式设计速查表把上面这些问题整理成一张表做题或者上机时可以对照着过一遍故障现象最可能原因排查顺序总线数据冲突、电平异常互斥微命令被分到不同字段检查源选通组分组某拍操作做不全不互斥微命令被塞进同一字段检查字段内信号能否并行转移地址错位下地址字段填法不符合地址形成规则确认是装载还是低位替换多路转移跳不过去入口地址未按低位对齐重排入口地址表条件转移行为不符预期判别字段选错测试条件核对 P 字段编码表微地址不前进或乱跳μPC 或微地址形成部件时序问题先量时钟再查使能微指令字长超寄存器位宽未做字段编码或分组过细重新分组压缩字长控制存储器放不下全部微程序微指令条数估算偏少重新核算条数与容量这张表不是万能的但它覆盖了我见过的大多数问题。真正上手的时候先把这张表过一遍能省下大量盯着波形发呆的时间。6. 期末与实验里的典型考法微指令格式这块内容在期末试卷里出现的形式其实很固定摸清套路之后拿分不难。这一章我按题型拆一下顺便说说实验环节怎么应对。6.1 期末常考的五种题型第一种给数据通路图和微命令表要求设计微指令格式并计算控制字段位数、微指令字长、控制存储器容量。这是最主流的题型考的就是第 4 章那套流程。做题顺序别乱先分组再算位数再定判别字段和下地址字段最后汇总。第二种给定微程序片段要求写出对应的二进制微指令码。这种题考的是编码映射的细心程度错一位就全错。建议先在草稿纸上画一张控制字段的位分布图逐字段填填完再拼。第三种比较水平型微指令和垂直型微指令的区别。这属于概念题答题要点是水平型并行能力强、字长长、微程序短、执行速度快垂直型类似机器指令、字长短、并行能力弱、微程序长、速度慢。两者没有优劣看设计目标。第四种问下地址的形成方式。要能说清增量方式、断定方式、混合方式各自的特点和适用场景最好能画出结构上的区别。有的题目会要求说明判别测试字段的功能。第五种给出微指令格式图问某个字段的某位为 1 时表示什么。这类题看着简单但很容易被编码表绕进去。做题时把编码表抄在题目旁边逐条对照不要凭记忆。6.2 实验箱上手工写微指令码的流程实验环节最常见的任务是按照给定的数据通路设计微指令格式然后把一段微程序手工编码并烧进控制存储器验证机器指令能否正确执行。我按自己的操作顺序写一遍。第一步先在纸上把微命令表和分组表列全算出每组字段位数和总字长。这份表是整个实验的基准后续所有编码都对着它查。第二步把微程序的每一条微指令写成信号名 下地址的形式先不管编码。写完之后通读一遍检查逻辑是否连贯有没有漏掉某一拍的操作。第三步逐条把信号翻译成字段编码。这一步最容易出错建议一个字段一个字段地填不要跳着填。填完一条就立刻检查有没有同字段多信号下地址有没有越界。第四步在实验箱的输入界面上按位写入。这里有个实用技巧把每条微指令的编码列成表格写的时候用笔在表格上打勾避免重复或遗漏。第五步单步执行验证。先从取指段开始一条一条走每走一步对照预期检查数据通路上的指示灯。取指段通了再验证每条指令的执行段。第六步跑连续执行。单步都对之后切换到连续模式运行一段小程序看结果是否符合预期。这时候如果出错问题往往不在微指令本身而在时序配合上。提示实验报告里最好附上完整的微命令表、字段分组表、微程序清单和关键微指令的编码对照这几样东西齐全分数基本就稳了。6.3 水平型与垂直型的判断题套路关于水平型和垂直型的判断题出题点集中在三个维度并行能力、字长、微程序长度。这三者之间是联动的理解了因果关系就不会答错。水平型微指令一次可以定义并执行多个并行的微命令所以它的并行能力最强。为了表达这些并行信号字长必然长。反过来因为一条微指令能做的事多完成同一条机器指令所需的微指令条数就少微程序短执行速度快。它进一步又分为全水平型、字段直接编码型、字段间接编码型和混合型区别就在于编码压缩的程度。垂直型微指令则相反它的结构类似机器指令一次只能完成一个或很少几个微操作需要靠微指令序列一步步堆出来。字长短、并行能力弱、微程序长、执行速度慢。但它的优点是微指令规整、容易设计控制器硬件也简单。如果题目追问哪种更好标准答法是取决于设计目标追求速度选水平型追求控制存储器体积小和设计简单选垂直型实际设计中常见的是混合形式。这样答既准确又不会跑偏。最后分享一个我在实际操作里的小体会微指令格式这套东西看教材容易觉得抽象但只要你亲手把一个微命令表变成字段分组、再把一段微程序编成二进制码整个链条就通了。我建议你找一张白纸把文章中那个 19 个微命令的例子自己重算一遍然后再换个微命令数量比如 25 个重新分组算位数。算过两遍之后期末题里再出现微指令格式你基本就是拿分的那个了。这个内容后续还能往两个方向扩展一个是深入去看条件转移和微中断的微程序实现另一个是把微程序和指令流水线结合起来看控制信号的时序配合有兴趣的话可以顺着这两条线继续往下挖。
返回列表