2011-05-18 31 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