擅长:python、mysql、java
<p>在评论中有人建议使用一些特殊用途的语言,比如VHDL,但是我想对于一些简单的练习来说,速度可能并不重要,使用Python是非常好的。在</p>
<p>你的代码看起来几乎没问题,我只是不明白为什么你的<code>getOutput</code>函数需要<code>clock</code>作为输入,因为据说块的功能是时不变的,只依赖于它的输入。我认为你需要做的唯一技巧就是对你的处理器中存在的每个寄存器进行两个版本的创建,一个表示它们当前的状态,另一个表示单击一次后的状态。所有模拟硬件的函数都应该只使用“当前”寄存器作为输入,并将它们的输出保存到“下一个”寄存器。然后在循环结束时,将所有下一个寄存器复制到当前寄存器中,然后重新开始。像这样:</p>
<pre><code>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
</code></pre>
<p>注意,在这种情况下,所有的“模拟”功能只使用当前寄存器值,而不使用下一个时钟周期的任何值。因此,您可以在不更改结果的情况下更改它们的执行顺序,就像它们都是并行运行一样。在</p>