Skip to content

这个任务要求交出三份互相吻合的记录:每次读依赖哪个物理版本,哪些指令在哪个周期发射和发布,以及每一时刻允许软件看见哪个顺序前缀。最终寄存器相同只是其中一项。

沿重命名到精确退休路线,先读物理版本,再读标签就绪,最后用ROB顺序退休封闭异常边界。

一、声明机器,避免借错指令集语义 ​

逻辑寄存器r0到r5初值为 [0,2,3,4,0,9],全部可写;内存是整数槽,槽0初值31。运算是精确整数,DIV向下取整,除零同步异常;不是RV32I。没有load、分支、设备、并发或地址转换故障。

取P=11、ROB容量Q=8。ALU处理CONST/ADD,另有MUL、DIV、STORE单元,延迟分别1、6、2、1,均从发射占用至发布。每周期按“退休→发布→发射→重命名”顺序,每步至多一项;发布选最老到期结果,发射选最老的源齐全且所需单元空闲项。

请先写下三个边界:新重命名项不能当周期发射;刚发布结果可以当周期喂已有消费者;刚发布项不能当周期退休。之后所有周期答案都按这个合同推导。

二、交出版本表与13周期正常轨迹 ​

运行:

text
I0: MUL   r1,r2,r3
I1: ADD   r4,r1,r2
I2: CONST r1,7
I3: ADD   r5,r1,r3
I4: STORE [0],r4

从最小空闲物理编号分配,I0至I3的新目的应为p6、p7、p8、p9,保存旧目的为p1、p4、p6、p5。源分别为 (p2,p3)、(p6,p2)、空、(p8,p3);I4读p7、不分配目的。

在周期5停一下:p8已经是7,p6仍未就绪;推测r1映到p8,提交r1仍映到p1,I1仍等待p6。这三个结论必须同时成立。若I1去取最新映射,它会误算7+3=10;正确值应为12+3=15。

完整关键时间如下:

指令 重命名 发射 发布 退休
I0 1 2 8 9
I1 2 8 9 10
I2 3 4 5 11
I3 4 5 6 12
I4 5 9 10 13

发布顺序是2、3、0、1、4;退休顺序是0、1、2、3、4。最后寄存器为 [0,7,3,4,15,11],内存槽0=15。周期10的STORE已经准备好,但内存仍31,到周期13才写入。

交出旧标签释放账:周期9释放p1,周期10释放p4,周期11释放p6,周期12释放p5。最终两映射均为 [p0,p8,p2,p3,p7,p9],空闲为 {p1,p4,p5,p6,p10}。请解释为何I2在周期5完成时不能立即释放它保存的旧p6。

三、让年轻故障等到正确报告边界 ​

恢复原初值,改成:

text
I0: MUL   r1,r2,r3
I1: DIV   r4,r2,r0
I2: CONST r1,99
I3: STORE [0],r3
I4: ADD   r5,r2,r3

DIV和CONST都在周期5到期,但只有一个结果发布槽。DIV较老,先记录除零;CONST留在ALU直到周期6。STORE周期7发布的是准备值4,不能写内存。I4周期7已经到期,先后让给I3与周期8到期的I0,到周期9才发布7。

交付以下证据:

  • 周期5发现内部故障时,架构r1仍为2,I0尚RUN,因此不能立即报告并清空
  • 周期8发布I0的12,架构r1仍为2;周期9退休后才为12
  • 周期10报告 (PC=1,division-by-zero),取消I1、I2、I3、I4
  • 最终寄存器 [0,12,3,4,0,9]、内存槽0=31;年轻99、4、7均没有架构数据效果
  • 两映射恢复为 [p0,p6,p2,p3,p4,p5],空闲集合为 {p1,p7,p8,p9,p10}

把“首次错误报告时刻”与“错误可对软件提交时刻”分别写进账本。若你只输出一个fault周期,就不能判断究竟是发现得早,还是恢复得太早。

四、迁移资源与延迟 ​

正常五条程序在 (P,Q)=(7,1),(7,8),(8,2),(11,8) 下分别需21、19、15、13周期。前端阻塞分别为ROB满13次、无物理位置11次、ROB满7次、零;检查顺序先ROB后free,不重复计同一周期。所有最终数值相同。

另用两个物理位置执行初值r0=3的两次 r0←r0+r0,最终12;这验证先读源、后改目的及退休后的编号复用。再用 DIV(-7,3)核向下取整结果−3,避免把别的指令集的截断约定偷带进来。

最后用初值 [8,2,0] 执行 DIV r0,r1,r2; MUL r1,r1,r1,把MUL延迟改30。它在周期3发射,本来周期33发布;周期5已因较老DIV异常被取消。交付恢复后ROB为空、单元完成记录为空、架构值仍 [8,2,0]。只取消队列里的指令,却保留周期33的写回事件,是不完整恢复。

五、提交失败证书和可重跑结果 ​

下载完整标准库参考器,直接运行 python foundation-renaming-retirement-check.py;加 -O仍执行相同显式检查。输出可与完整结果JSON对照。

五份破坏证据已经实际执行:先改目的再捕获自引用源导致等自身;临发射重新读名字使r4和内存变10;STORE提前写使异常后内存留4;首个年轻异常时报告只得到旧r1=2而非12;I2完成便释放p6触发生命周期错误。前四项分别交出错误状态,第五项交出仍需该标签的生产者和消费者。

公开1600组有限随机程序逐周期比较每个架构状态与顺序已退休前缀,包含不同容量、延迟、寄存器重写、负数及除零。它们不是任意程序正确性的自动证明;一般论证依赖三个正文给出的版本、就绪和前缀不变量。报告还应单列输入程序、物理文件、ROB、日志和测试用顺序快照的存储,不把验证工具的额外内存当作硬件结构所需空间。