2011-05-18 67 views
6

我目前正在學習我的暑期項目的MyHDL。 我有一個問題,它抓住yield語句的功能。儘管MyHDL是基於python的,但它以專門的方式使用yield語句。 的鏈接同樣是: http://www.myhdl.org/doc/current/manual/reference.html#myhdl.always蟒蛇和MyHDL的產量表之間的差異

它指出: MyHDL發電機是標準Python生成專門的產量報表。在硬件描述語言中,等效語句被稱爲靈敏度列表。在MyHDL生成器中,yield語句的一般格式爲: yield子句[,子句...] 當生成器執行yield語句時,其執行在該點處暫停。同時,每個子句是一個觸發器對象,它定義了發生器恢復的條件。但是,每次調用yield語句時,無論子句的數量如何,生成器都會恢復一次。這發生在發生的第一個觸發器上。

我不能理解它。有人能用簡單的話來解釋嗎?或者可能將我重定向到其他來源?

如果您能幫到,我將不勝感激。 謝謝!

問候

回答

3

首先也是最重要的:記住MyHDL實現是嚴格純粹的Python。從這個意義上講,MyHDL和Python中的yield語句之間沒有「差異」。

MyHDL確實是一種將Python用作HDL的方法。部分地,這是通過在稱爲myhdl的純Python包中實現一些硬件設計特定對象來完成的。例如,有一個myhdl.Simulation對象以適合硬件仿真的方式運行生成器。

另一部分是以硬件特定方式簡單解釋某些Python功能。例如,硬件模塊被建模爲一個返回生成器的Python函數。另一個例子是「yield」語句被解釋爲「等待」功能。

2

MyHDL使用yield語句來傳達的,當其中一人是True,將恢復發電機的運行條件的列表。例如,當時鍾從低電平轉換到高電平(0到1)時,發生器可能產生條件clock.posedge - 當時鍾發生此轉換時,發生器將恢復。

爲了模擬(大致)是如何工作的,在這裏是一個Python發生器,其被恢復時的其條件之一(參數是由3整除或7)被滿足:

def process(): 
    j = 0 
    while True: 
     yield (lambda x: x % 3 == 0, lambda x: x % 7 == 0) 
     j += 1 
     print 'process j=', j 

gen = process() 
conds = next(gen) 

for i in range(1, 11): 
    print 'i=', i 
    if any(cond(i) for cond in conds): 
     conds = next(gen) 

輸出:

i= 1 
i= 2 
i= 3 
process j= 1 
i= 4 
i= 5 
i= 6 
process j= 2 
i= 7 
process j= 3 
i= 8 
i= 9 
process j= 4 
i= 10 

更新 - 一些我使用的語法的更詳細一點:

我傾向於使用[next(gen, [default])]功能,因爲它比調用gen.next()更靈活。例如,如果您通過default參數,當發電機耗盡時,它將返回default而不是raising StopIteration

var conds指向包含條件的tuple。在這種情況下,它指向包含由process返回的2 lambda anonymous functionstuple

語法:

if any(cond(i) for cond in conds): 
    conds = next(gen) 

調用any built-in function,傳遞一個generator expression其循環遍歷conds和評估if cond(i) is True。它是寫作的簡寫:

for cond in conds: 
    if cond(i): 
     conds = next(gen) 
     break 
+0

@samplebias:非常感謝您回覆......但是請您在下面的代碼中解釋以下內容:1)conds = next(gen)意味着conds = gen.next()..對嗎? 2)你能解釋一下「cond cond in conds」是什麼意思...... conds不是我能解釋的列表。那麼我們如何迭代它呢?非常感謝! – Adwaitvedant 2011-05-19 08:33:28

+0

@samplebias:謝謝你的回覆!..忽略我最後的帖子...我仔細檢查了你的例子,並正確理解它!但是我仍然沒有得到答案...在Python中我們必須明確地調用next(conds )當我們想再次調用函數...在myhdl那不是這種情況....當yield語句中的對象「回火」時,它會自動觸發自己(這是他們在文檔中說過的)。這是如何實施的? – Adwaitvedant 2011-05-19 15:51:31

+0

@Adwait我相信他們正在使用Python代碼來生成其行爲不同的HDL。將一些[MyHDL Python源代碼](http://www.myhdl.org/doku.php/cookbook:sinecomp#design)與相應的[生成的Verilog代碼](http://www.myhdl.org/doku.php) /食譜:sinecomp#automatic_conversion_to_verilog)。請注意'yield clock.posedge'如何創建'always(..)'指令。 – samplebias 2011-05-19 16:10:13

2

yield語句用於創建生成器。反過來,這些發生器可以與MyHDL中的Simulation(...)對象一起使用或與轉換器功能一起使用。換句話說,通過將描述硬件行爲的所有生成器傳遞給模擬器,MyHDL中使用生成器。 Simulation.run()函數將使用「next()」。

在MyHDL手冊的RTL建模部分,http://www.myhdl.org/doc/current/manual/modeling.html#example是一些很好的例子,說明如何創建MyHDL生成器並在模擬中使用它們。

+0

非常感謝您的回覆!正是我在找什麼!你能告訴我在哪裏可以找到myhdl結構的python實現,如模擬等。在他們的網站上,對於Simulation對象,他們只給出了描述,但沒有實現..謝謝! – Adwaitvedant 2011-05-20 04:24:56

+1

@Adwaitvedant:MyHDL的最新版本可在[這裏](http://sourceforge.net/projects/myhdl/files/myhdl/)。訪問開發庫的指令可以在這裏找到(http://www.myhdl.org/doku.php/dev:repo)。在_Simulation.py中,粗略的第129行顯示使用「等待」隊列,準備運行的生成器(在等待隊列上),它們的下一個函數被調用。 – 2011-05-20 13:30:38