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