UVM(十一)之各种port

UVM(十一)之各种port

UVM中内置了各种port,用于实现TLM级别的。

1. uvm_component之间的通信

如果要在两个uvm_component之间通信,如一个monitor和一个scoreboard之间通信:

最简单的方法就是使用全局变量,在monitor里对此全局变量进行赋值,在scoreboard里检测此全局变量值的改变。这种方法简单直接,不过就如前面一直强调的,要谨慎使用全局变量,要不然会造成灾难性的后果。

稍微复杂一点的方法,在scoreboard中有一个变量,这个变量设置为外部可以直接访问的,即非local类型的,然后在monitor中给这个变量赋值,如下图所示。要完成这个任务,那么要在monitor中有一个指向scoreboard的指针,否则虽然scoreboard把这个变量给设置为非local类型的,但是monitor依然无法该变。

这种方法的问题在于整个scoreboard里面的所有非local类型的变量都对monitor是可见的,而加入monitor的开发人员一不小心改变了scoreboard中的 一些变量,那么后果将会可能是致命的。

由于config机制的半全局变量的特性,我们可以相处第三种方法来。即专门的实例化一个config类,在此类中有monitor要传给scoreboard的变量。在base_test中,可以把这个config类set给scoreboard和monitor。当monitor要和scoreboard通信时,只要把此config类的相关变量的值改变既可。scoreboard中则检测变量值的改变,检测到之后做相应动作。这种方法比上面的两种方法都要好,但是仍然显得有些笨拙。一是要引入一个专门的config类,二是一定要有base_test这个第三方的参与。在大多数情况下,这个第三方是不会惹麻烦的。但是永远不能保证某一个从base_test派生而来的类会不会改变config类中某些变量的值。也就是说,依然存在一定的风险。而且,这种方法显得有些笨拙。

解决这个问题最好的方法就是在monitor和scoreboard之间专门建立一个通道,让信息只能在这个通道内流动,scoreboard也只能从这个通道中接收信息,这样几乎就可以保证scoreboard中信息只能从monitor中来,而不能从别的地方来。UVM中的各种port就可以实现这种功能。

2. TLM级别的通信

TLM是Transaction Level Modeling的缩写,所谓的transaction level是相对DUT中各个module之间信号线级别的通信来说的。TLM级别的通信中有几个常用的术语:

put操作:如下图所示,通信的发起者A把一个transaction发送给B。这个过程中,A称为“发起者”,而B称为“目标”。A具有的端口(用方框表示)称为端口PORT,而B的端口(用圆圈表示)称为EXPORT。这个过程中,数据流从A流向B。

get操作:如下图所示,A向B索取一个transaction,在这个过程中,A依然是“发起者”,B依然是“目标”,A上的端口依然是PORT,而B上的端口依然是EXPORT。这个过程中,数据流是从B流向A的。无论是get操作还是put操作,其发起者拥有的都是PORT端口,而不是EXPORT。

transport操作:如下图所示,transport操作相当于一次put操作加一次get操作,这两次操作的“发起者”都是A,目标都是B。A上的口依然是PORT,而B上的端口依然是EXPORT。在这个过程中,数据流先从A流向B,再从B流向A。在现实世界中,相当于是A传递给了B一个REQUEST,而B返回给A一个RESPONSE。所以这种transport操作也常常被称作request-response操作。

原文发布于微信公众号 - 瓜大三哥(xiguazai_tortoise)

原文发表时间:2017-10-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王亚昌的专栏

Way to Go

Go is designed from first principles to advance the practice of software enginee...

832
来自专栏PPV课数据科学社区

如何使用Python对Instagram进行数据分析?

我写此文的目的在于展示以编程的方式使用Instagram的基本方法。我的方法可用于数据分析、计算机视觉以及任何你所能想到的酷炫项目中。 Instagram是最大...

2847
来自专栏Ryan Miao

如何优化coding

如何优化coding 前言 最近一直在做修改bug工作,修改bug花费时间最多的不是如何解决问题而是怎样快速读懂代码。如果代码写的好的,不用debug就可以一眼...

4007
来自专栏葡萄城控件技术团队

如何使用MOQ进行单元测试

使用MOQ来伪装和隔离被依赖对象,从而提高被测对象的测试效果。 安装 通过http://code.google.com/p/moq可以下载MOQ的最新版本。在S...

2106
来自专栏FreeBuf

逆向实践:批量验证微信号是否存在

一、前言 xposed是一款安卓平台下强大的hook框架,我们可以用他来开发很多强大的插件,以此来帮助我们更方便地解决某些实际的问题。本文将尝试利用xposed...

3705
来自专栏微信小程序开发

python抓取头条文章

最近做了个项目,希望把运营同学在今日头条上发的文章自动发布到公司的官方博客中去,然后可以人工筛选需要发布的文章~ 很明显,要实现这功能,就需要程序自动抓取头条号...

6377
来自专栏码神联盟

碎片化 | 第四阶段-31-Struts2参数传出传入值-视频

如清晰度低,可转PC网页观看高清版本: http://v.qq.com/x/page/g0566v55efc.html Hello Struts2 1:St...

3586
来自专栏Crossin的编程教室

这段代码实例,见证了数万人入门编程

我的微信 Python 教程里有两个比较重要的代码实例,一个是前期的“猜数字”,这个例子演示了基本的输入输出、运算、类型、逻辑,之后的扩展又涉及到函数、数据结构...

1193
来自专栏Android群英传

实现 APK 保护时常见的坑和解决方案

1013

使用Apache Flink进行流处理

如果在你的脑海里,“Apache Flink”和“流处理”没有很强的联系,那么你可能最近没有看新闻。Apache Flink已经席卷全球大数据领域。现在正是这样...

3972

扫码关注云+社区

领取腾讯云代金券