如何解决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 的第二个操作数,控制信号 $t0
在 ALUSrc
和 Read Data 2
之间进行选择。对于 Sign Extended immediate
和 addm
,控制信号应为 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 File
的 addm
来自两种可能性之一,在 Write Data
的控制下,要么是 ALU 输出,或 Register File
来自数据存储器。 MemToReg
不是选择两个,而是添加第三个选择,通常这可以通过简单地使用两个常规 MUX 来完成(例如,简单地再添加一个 MUX),但也可以使用三个选择器 MUX 来完成选择在 ALU 输出、数据存储器读取值或新的 Read Data
加法器输出中,该行返回到寄存器文件。
以上为单循环,如图所示;几乎没有办法在单个周期内将主 ALU 重新用作新的加法器,因为主 ALU 已经在每条指令都在工作。
在多周期处理器中,我们可以重用主ALU而不是添加一个新的加法器,通过为addm
添加一个新的周期,这样新加法器在单周期中的功能被替换为使用主 ALU,但在后面的额外循环中。
在流水线处理器中,您将再次难以使用主 ALU,因为指令的重叠执行意味着 ALU 每个周期都很忙,因此我们可以为新的加法器添加一个流水线级,尽管这会减慢所有现有说明以适应 addm
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。