1. 程式人生 > >MyHDL中文手冊(二)——背景

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使用修飾符從本地函式定義建立現成的模擬生成器。他們的功能和用法後面將進一步描述。