微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ADDM指令(Assembly - MIPS Architectue)后的时钟周期如何简单解释?

如何解决ADDM指令(Assembly - MIPS Architectue)后的时钟周期如何简单解释?

lw ($t0),8($s1)(加载字)从内存中读取数据并将其写入寄存器。一个修改 lw 的版本是 addm,它从内存中读取数据,如 lw:例如 addm $t0,8($s1) 表示 $t0<-$t0 + 8 ($s1)。 如何知道应用这条指令后时钟周期发生了什么?不幸的是我找不到好的资源!

解决方法

在写入寄存器之前,addm 指令必须将内存读取的结果添加到寄存器的值中。

从根本上说,必须在数据存储器之后放置一个加法器(以处理其输出)。加法器的一个输入是内存读取的结果,另一个是另一个寄存器的值。

addm $t0,8($s1)中,(如lw)寄存器$s1向主ALU提供一个值,而符号扩展向主ALU提供另一个值8;主 ALU 在计算寻址时进行加法运算,并将该地址发送到数据存储器进行读取。但是,第一个区别是 addm 还需要源 $t0,而 lw 不需要(lw 仅针对 $t0,而 addm源和目标$t0)。

$t0 需要作为其输入之一输入到新的(上面提到的)加法器中,而这个新加法器的另一个输入是数据存储器读取值。

加法器的结果需要写入addm寄存器。

您可以看到,对于主 ALU 的第二个操作数,控制信号 $t0ALUSrcRead Data 2 之间进行选择。对于 Sign Extended immediateaddm,控制信号应为 1 以选择立即扩展符号。

让我们进一步注意,对于 lw 指令 b/c 的情况,Read Data 2 被转发到 Data Memory,因为 sw 是要写入内存的值(即在 Read Data 2 中,虽然 sw $t0,8($s1) 用于地址计算,但 $s1 不是,而是作为 $t0 转发到 Data Memory)。

该行已经有一个拆分(分叉,即一个输出馈送到多个输入),因此,将进一步拆分它并扩展同一行的新分叉(从 Write Data)到达新的加法器 Read Data 2 {1}} 放在 addm 之后。

然后,需要将Data Memory的新加法器的输出拼接到addm的{​​{1}}行中。

每当对框图进行拼接更改时,我们都希望现有功能保持原样,并拼接仅在我们遇到新指令时触发的新功能。这种拼接的想法是切断一根线并插入另一个输入,在新 MUX 的控制下加入新功能(如新加法器),这意味着新控制信号进入新 MUX 以在新行为和现有行为之间切换.这里的开关是在现有行为和 Write Data 的新加法器的输出之间进行选择。

作为一个例子,我们已经可以看到 Register Fileaddm 来自两种可能性之一,在 Write Data 的控制下,要么是 ALU 输出,或 Register File 来自数据存储器。 MemToReg 不是选择两个,而是添加第三个选择,通常这可以通过简单地使用两个常规 MUX 来完成(例如,简单地再添加一个 MUX),但也可以使用三个选择器 MUX 来完成选择在 ALU 输出、数据存储器读取值或新的 Read Data 加法器输出中,该行返回到寄存器文件。


以上为单循环,如图所示;几乎没有办法在单个周期内将主 ALU 重新用作新的加法器,因为主 ALU 已经在每条指令都在工作。

在多周期处理器中,我们可以重用主ALU而不是添加一个新的加法器,通过为addm添加一个新的周期,这样新加法器在单周期中的功能被替换为使用主 ALU,但在后面的额外循环中。

在流水线处理器中,您将再次难以使用主 ALU,因为指令的重叠执行意味着 ALU 每个周期都很忙,因此我们可以为新的加法器添加一个流水线级,尽管这会减慢所有现有说明以适应 addm

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。