如何用Python模拟硬件?

2024-10-04 03:19:17 发布

您现在位置:Python中文网/ 问答频道 /正文

标题有点混乱,但我的任务是用高级语言编写一个4阶段的MIPS处理器(IF、ID、EX、WB)(我可能最了解python)。除了我还没有开始尝试缓存和暂停的困难之外,您如何获取应该并行运行的代码并使其成为连续的?考虑一下这个代码片段。在

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库?谢谢。在


Tags: 代码selfnoneidif阶段exwb
3条回答

你快到了。函数名有点混乱-我更喜欢capture()和{}。memory.getIstruction()一定要隐藏在IF.capture()(如果作业来获取指令,对吗?)。PC更新似乎也属于IF阶段。在

现实生活中不存在“不再指示”的情况,应予以放弃。在另一个阶段中,可以合法地提出一个异常(或者说,在另一个阶段中引发一个异常,可以说是一个非法的循环)。在

否则,看起来不错。在

在评论中有人建议使用一些特殊用途的语言,比如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

注意,在这种情况下,所有的“模拟”功能只使用当前寄存器值,而不使用下一个时钟周期的任何值。因此,您可以在不更改结果的情况下更改它们的执行顺序,就像它们都是并行运行一样。在

考虑特定用途的语言,如VHDL或Verilog;可能带有组合/扩展,如PyHVL或{a2}。。在

。。但是,如果这个必须从头创建和/或纯Python实现,请考虑使用与高级硬件语言中相同的概念。特别是考虑一个反应性设计。Verilog和VHDL都支持这个概念,即对输入(如时钟)的更改将驱动行为和新的输出状态。在

然后,每个“反应式回调”只接受输入状态,并发出与其他组件隔离的特定输出状态。然后通过状态变化和围绕变化的反应性触发器建立依赖关系。在

触发器/防护装置中可能用到的东西:

  • 线路或数据更改状态
  • 发信号事件
  • 循环计数(例如最小值、之后、随机)

相关问题 更多 >