有点令人困惑的标题,但我的任务是用高级语言编写一个4阶段MIPS处理器(IF,ID,EX,WB)(我最好知道python)。除了困难,我还没有开始尝试缓存和停顿,你如何采取应该并行运行的代码并使其顺序?请考虑此代码snippit。
pc = 0x0
IFinput, IDinput, EXinput, WBinput = None, None, None, None
while True:
IFinput = self.memory.getInstruction(pc)
if not IFinput: #No more instructions
break
self.IF.giveInput(IFinput)
self.ID.giveInput(IDinput)
self.EX.giveInput(EXinput)
self.WB.giveInput(WBinput)
instruction += 0x4
clock += 1
IDinput = self.IF.getOutput(clock)
EXinput = self.ID.getOutput(clock)
WBinput = self.EX.getOutput(clock)
result = self.WB.getOutput(clock)
result.printToFile()
我试图将事物的输入和输出分成两个不同的阶段,这样我就不会通过在执行“clock + = 1”命令之前获得输出来“欺骗”硬件。这是实现这个的正确方法吗?是否有任何适合此任务的python库?感谢。
答案 0 :(得分:1)
你快到了。功能名称有点令人困惑 - 我更喜欢capture()
和update()
。 memory.getIstruction()
肯定会隐藏在IF.capture()
内(如果作业是来获取指令,对吗?)。 PC更新似乎也属于IF阶段。
在现实生活中不会发生“不再指示”的情况,应予以放弃。打破循环的正确方法是EX阶段来引发异常(例如,来自非法范围的保留指令;请记住,其他异常可能并且将合法地提出)。
否则,看起来很好作为一个起点。
答案 1 :(得分:1)
评论中建议使用VHDL等特殊目的语言,但我想对于一些简单的练习,速度可能无关紧要,使用Python非常好。
你的代码看起来几乎没问题,我只是不明白为什么你的getOutput
函数需要clock
作为输入,因为据说块的功能是时不变的,只取决于它的输入。我认为你唯一需要做的就是制作处理器中存在的每个寄存器的两个版本,一个代表当前状态,一个代表一次点击后的状态。然后,模拟硬件的所有功能只应使用“当前”寄存器作为输入,并将其输出保存到“下一个”寄存器。然后在循环结束时,将所有下一个寄存器复制到当前寄存器中,然后重新开始。像这样:
pc = 0
IF2ID_cur, ID2EX_cur, EX2WB_cur = 0 # values of registers after a reset
while True:
instruction = memory[pc]
IF2ID_nxt = simulate_IF(instruction)
ID2EX_nxt = simulate_ID(IF2ID_cur)
EX2WB_nxt = simulate_EX(ID2EX_cur)
result = simulate_WB(EX2WB_cur)
pc += 1
IF2ID_cur, ID2EX_cur, EX2WB_cur = IF2ID_nxt, ID2EX_nxt, EX2WB_nxt
请注意,通过这种方式,所有“模拟”功能仅使用当前寄存器值,而不使用下一个时钟周期的任何值。因此,您可以在不更改结果的情况下更改执行顺序,就像它们全部并行运行一样。
答案 2 :(得分:1)