首页 百科知识 来隔离组件

来隔离组件

时间:2023-10-16 百科知识 版权反馈
【摘要】:使用通道,即channel,而不是依赖两个组件自身来管理initiator和target间的同步,使得去耦成为可能。FIFO缓存事务信息并被当作一个同步器来使用。它有一个叫做run()的进程,循环10次来产生10个随机数,通过put_port发送到target。一是这个组件从avm_threaded_component派生而来。第二点值得注意的是,put_port的声明。环境类可以当作是那些具有层次结构的命名组件的顶层,由它来统一控制验证平台如何按层次构造及如何执行。run()则负责控制验证平台的执行。

4.4 使用通道(channel)来隔离组件

在前面的章节中,我们讨论了一种简单的在两个进程间传递事务信息的机制。在这种机制中,initiator和target间使用事务接口的任务调用来同步,这是一种紧耦合。在这一节里,我们研究initiator和target间更松的一种耦合情况。使用通道,即channel(本例使用的是FIFO),而不是依赖两个组件自身来管理initiator和target间的同步,使得去耦成为可能。如图4-4所示,我们有两个组件:initiator A和target B,在加上一个FIFO来连接它们。

img126

图4-4 使用FIFO来隔离两个组件

在前面例子的两个组件中,其中一个组件有一个port而另一个组件则有一个export。拥有port的那个组件调用拥有export的组件的函数。而这个例子中,A和B都有port。不像前面的例子,initiator直接调用target的函数,现在是initiator和target都调用FIFO通道的函数。FIFO同时提供了initiator和target需要的函数。

initiator使用一个阻塞的put()函数来发送事务信息到FIFO,target则使用一个阻塞的get()函数从FIFO获取事务信息。FIFO缓存事务信息并被当作一个同步器来使用。initiator可以不断地往FIFO里写入事务信息,直到FIFO满为止。因为initiator使用的是阻塞的put()函数,所以当FIFO满时,initiator将阻塞。类似地,target由于使用的是阻塞的get()函数,所以当FIFO空时,它阻塞。本质上,本例子的producer和consumer与前面的例子是一样的。只是FIFO代替了target来提供producer和consumer间本来由port产生的满足接口需求的任务的实现。

让我们来看一下代码。这里我们第一次用到的AVM库。AVM库里有一个FIFO,叫tlm_fifo。它是一个参数化的类,并且有许多支持阻塞和非阻塞的不同的接口。

这个producer和前面的put一节的例子的producer有许多相同之处。它有一个叫做run()的进程,循环10次来产生10个随机数,通过put_port发送到target。

img127

有两点值得注意。一是这个组件从avm_threaded_component派生而来。avm_threaded_component是AVM库的一个为组件提供了最基本服务的基类,它让组件可以连接为一组具有层次结构的命名组件(named component)。同时提供run任务的进程控制。run任务在开始时刻被调起,并可以按意愿挂起或重新激活。

第二点值得注意的是,put_port的声明。在前面章节的简单例子中,我们自己构造纯虚接口来连接initiator和target。而AVM库提供了一组包装着纯虚接口引用的port和export对象,其名字都是可以望文生义的。它们提供了一个名为connect()的函数来在相关联的port和export间建立连接。这一点显然比直接用连接赋值语句好。

consumer也和get一节的例子没什么两样。

img128

为了连接producer,consumer和FIFO,我们使用一个环境类(environment)。环境类可以当作是那些具有层次结构的命名组件的顶层,由它来统一控制验证平台如何按层次构造及如何执行。

img129

connect()函数为producer和consumer的port,以及及对应的FIFO的export建立了关联。run()则负责控制验证平台的执行。本例是个简单的例子,我们让验证平台执行100ns,然后终止。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈