MyHDL中文手册(二)——背景

生成器与装饰器技术

先决条件

您需要对python有基本理解,以便使用MyHDL。如果您不了解python,请不要担心:它是学习最容易编程语言之一。学习python是工程专业人员能够做的最好的时间投资之一。

对于初学者来说,http:/docs.python.org/教程可能是在线教程最好的选择。备选办法见http:/wiki.python.org/moin/BeginnersGuide。

一种硬件描述语言如verilog或vhdl的工作知识也会很有帮助。

本手册中的代码示例有时为了清晰起见缩短了时间。完整的可执行示例可以在示例/手动/中找到。

生成器的小段教程

生成器在python 2.2中引入。因为生成器是的MyHDL关键概念,这里包含了一段小教程。
考虑以下不合理的函数:

def function():
    for i in range(5):
        return i

这不太有意义。一旦输入第一个循环迭代,函数返回:

>>> function()
0

返回对于函数调用来说是致命的。进一步循环迭代永远不会得到机会,当返回时函数调用中没有任何东西会被抛出。

为了将函数转换为生成器函数,我们用yield替换return

def generator():
    for i in range(5):
        yield i

现在我们得到了:

>>> generator()
<generator object at 0x815d5a8>

当调用生成器函数时,它返回生成器对象。生成器对象支持迭代器协议,这是一种高代价的方法,可以通过调用它的next方法来生成后续值:

>>> g = generator()
>>> g.next()
0
>>> g.next()
1
>>> g.next()
2
>>> g.next()
3
>>> g.next()
4
>>> g.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
StopIteration

现在我们可以根据需求从for循环生成后续值,直到它们耗尽为止。结果是,yield语句就像一个return,除了它不是致命的:生成器在yield语句执行生成后记住它的状态和代码中的位置。高阶代理器可以通过调用生成器next方法来决定何时获得下一个值。我们说生成器是可恢复的函数。

如果您熟悉硬件描述语言,那么这听起来很熟悉。在硬件仿真中,也有一个高阶代理,仿真器,它与这种可恢复函数相互作用; vhdl称为process过程, verilog成为always块。同样,python生成器提供了一种优雅高效的方法来建模并发,而不必依赖某种形式的线程。

使用生成器来建模并发性是MyHDL的第一个关键概念。第二个关键概念是一个相关的概念:在MyHDL中,所产生的值指定了生成器在恢复之前应该等待什么条件。换句话说,yield语句作为一般敏感性列表。

装饰器

python 2.4引入了一个名为装饰器的特性。MyHDL利用此特性定义一些有助于硬件描述的装饰器。然而,一些用户可能还不熟悉装饰器。因此,这里稍作介绍。

一个装饰器由函数声明前面的特殊语法组成。它指的是一个装饰函数。装饰函数自动将声明函数转换为其他可调用对象。

装饰功能装饰在装饰说明中使用如下:

@deco
def func(arg1, arg2, ...):
    <body>

此代码与下列代码等效:

def func(arg1, arg2, ...):
    <body>
func = deco(func)

注意,装饰语句直接在函数声明前面,并且函数名函数自动重用为最终结果。

MyHDL使用修饰符从本地函数定义创建现成的仿真生成器。他们的功能和用法后面将进一步描述。

猜你喜欢

转载自blog.csdn.net/zt5169/article/details/83577547