当前位置: 首页 > 知识库问答 >
问题:

数据危险的具体情况(当连续两次LW之后出现R型指令时)

奚修伟
2023-03-14

我正在用Verilog设计一个类似MIPS的CPU,现在我正在处理数据危险。我有以下指示:

Ins[0] = LW r1 r0(100)
Ins[1] = LW r2 r0(101)
Ins[2] = ADD r3 r2 r1

问题是,当ADD指令到达阶段3(ALU应计算r1 r2)时,指令1(第二个LW)处于阶段4,尚未读取内存的r0 101地址,因此我应该暂停一个周期,然后Ins1到达最后一个阶段。

在这种情况下,第一个LW已经完成了它的工作,并且r1的新值不在dataPath中的任何位置,但我需要将此值传递给ALU的Input B。

(这被称为数据转发,因为当第三条指令处于阶段2时,r1的值还没有准备好,我应该从后面的阶段(从最后一个MUX出来的蓝线到ALU MUX)转发它,但由于第二个LW暂停,我没有r1的值。

谢谢你的帮助。

共有1个答案

慕和惬
2023-03-14

我犯了个错误。我的错误是,当LDM指令后面跟着RType时,我会在RType处于第3阶段而LDM处于第4阶段时暂停处理器。但相反,我应该在RType处于stage2(decode)和LDM处于stage3(exec)时,提前一个时钟检测依赖关系。

在这种情况下,我应该暂停管道。

因此,当Rtype处于阶段2,第二个LDM处于阶段3,第一个LDM处于阶段4时,我检测依赖关系并停止管道一个周期。

因此,在下一个时钟中,Rtype仍处于stage2,第二个LDM处于stage4,第一个LDM正在写回寄存器,因此,由于Rtype仍处于stage2,它可以读取写入寄存器文件的数据。(回写在时钟的负边缘完成。在posedge中,RType的第一个参数已准备就绪。)

 类似资料:
  • 问题内容: 我有一个包含三列()的表,我想知道如何 为每个lending_id检索最大的差距 。 对于以下示例: 我想知道如何检索: 因为对于71737,它将考虑从装置6到21(16),对于354226,将考虑8和15(8)之间的间隙。 问题答案: 这是一种基于模仿的方法,适用于不支持窗口功能的MySQL版本(计划将窗口功能包含在MySQL v8.x中)。 这种方法的结果将揭示有关最长序列的更多事

  • 考虑以下mips代码段 我知道指令1和2之间的$t1上存在WAW数据危险,但第1行是否存在战争危险,因为我们在一条指令中读取和写入$t1?

  • 问题内容: 在下面的查询中,我想在CASE的WHEN内以及在THEN之前添加AND条件,这是可能的吗? 例如WHEN’r’AND table1.name =“ jones”然后’非常高’ 问题答案: 您可以像这样重写语句以完成所需的操作 请注意,您需要在声明后删除。 这里的文件

  • 本文向大家介绍Python之eval()函数危险性浅析,包括了Python之eval()函数危险性浅析的使用技巧和注意事项,需要的朋友参考一下 一般来说Python的eval()函数可以把字符串“123”变成数字类型的123,但是PP3E上说它很危险,还可以执行其他命令! 对此进行一些试验。果然,如果python写的cgi程序中如果使用eval()而非int()来转换诸如年龄这样的输入框中的内容时

  • 对于每个查询,它都在n^2中运行。最大数组大小为8*10^3,最大查询数为10^5

  • 问题内容: 我正在使用gob将结构序列化到磁盘。有问题的结构包含一个接口字段,因此具体类型需要使用进行注册。 这里的难题是,进行灌装的图书馆应忽略所使用的混凝土类型。我希望即使调用者定义了自己的接口实现,也可以进行序列化。 我可以通过动态注册类型来成功编码数据(请参见下面的简单示例),但是在尝试重新读取数据时,gob拒绝接受未注册的类型。它令人沮丧,因为感觉好像所有数据都在那里- 如果gob 标记