快速入门指南
本指南演示了如何在PyMTL3上执行算术运算比特对象,以及如何模拟简单的硬件组件,如一个全加法器和一个寄存器增量器。所有内容guide可以在Python >= 3.6交互式REPL中完成。
位算法
让我们从两个4位数字的简单加法开始。的
下面的代码片段导入了基本的PyMTL3功能
并创建两个4位对象 a
和 b
:
python
>>> from pymtl3 import *
>>> a = Bits4(4)
Bits4(0x4)
>>> b = Bits4(3)
Bits4(0x3)
Bits对象支持通用的算术和比较:
>>> a + b
Bits4(0x7)
>>> a - b
Bits4(0x1)
>>> a * b
Bits4(0xC)
>>> a & b
Bits4(0x0)
>>> a | b
Bits4(0x7)
>>> a > b
Bits1(0x1)
>>> a < b
Bits1(0x0)
全加器的例子
接下来,我们将使用全加法器进行实验。它已经是包含在PyMTL3代码库中,我们可以简单地导入它在REPL中使用它。
>>> from pymtl3.examples.ex00_quickstart import FullAdder
由于Python的检查特性,我们可以很容易地打印
输出全加法器的源代码。你可以看到
全加法器逻辑是在更新块upblk
中实现的
>>> import inspect
>>> print(inspect.getsource(FullAdder))
class FullAdder( Component ):
def construct( s ):
s.a = InPort()
s.b = InPort()
s.cin = InPort()
s.sum = OutPort()
s.cout = OutPort()
@update
def upblk():
s.sum @= s.cin ^ s.a ^ s.b
s.cout @= ( ( s.a ^ s.b ) & s.cin ) | ( s.a & s.b )
为了模拟完整的加法器,我们需要应用 DefaultPassGroup
,PyMTL通过。然后我们可以设置输入端口的值并进行模拟,通过调用fa.sim_tick
来实现完整的加法器:
>>> fa = FullAdder()
>>> fa.apply( DefaultPassGroup() )
>>> fa.sim_reset()
>>> fa.a @= 0
>>> fa.b @= 1
>>> fa.cin @= 0
>>> fa.sim_tick()
验证全加法器是否产生了正确的结果:
>>> assert fa.sum == 1
>>> assert fa.cout == 0
寄存器递增操作示例
与全加法器类似,我们可以执行以下操作来导入
注册增量器组件并打印其源代码:
>>> from pymtl3.examples.ex00_quickstart import RegIncr
>>> print(inspect.getsource(RegIncr))
模拟一个8位寄存器增量器:
>>> regincr = RegIncr( 8 )
>>> regincr.apply( DefaultPassGroup() )
>>> regincr.sim_reset()
>>> regincr.in_ @= 42
>>> regincr.sim_tick()
验证注册的输出确实是递增的:
>>> assert regincr.out == 43
本文是对PYMTL3说明文档入门部分的翻译,原文:
https://github.com/pymtl/pymtl3/tree/master/scripts