你如何在Python中模拟硬件?

时间:2014-04-12 04:29:11

标签: python mips

有点令人困惑的标题,但我的任务是用高级语言编写一个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库?感谢。

3 个答案:

答案 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)

考虑特定于目的的语言,如VHDL或Verilog;可能使用PyHVLCocotb ..

等组合/扩展名

..但是,如果必须从头开始创建 和/或纯Python实现,请考虑使用与高级硬件语言相同的概念。特别要考虑反应式设计。 Verilog和VHDL都支持这一概念 - 输入的变化(如时钟)驱动行为和新的输出状态。

然后,每个“反应回调”简单地处于输入状态,并且与其他组件隔离地发出特定的输出状态。然后通过状态更改和响应周围的响应触发器建立依赖关系。

可能在触发器/警卫中使用的东西:

  • 行或数据更改状态
  • 信号事件
  • 周期盘点(例如最小值,后续值,随机值)