IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> UVM学习整理——附录(部分组件源码) -> 正文阅读

[网络协议]UVM学习整理——附录(部分组件源码)

目录

部分组件源码

1.Driver和Sequencer

2.uvm_monitor

3.uvm_sequencer

4.uvm_scoreboard

5.uvm_agent

6.uvm_env

7.uvm_test


部分组件源码

这些组件源码,除了uvm_driver、uvm_agent、uvm_subscriber中增补定义了部分变量,以提高代码的可重用性之外,其余组件源码的内容基本一致,不存在太大变化。

1.Driver和Sequencer

Driver和Sequencer之间的握手机制:Driver的seq_item_port和Sequencer的seq_item_export:

uvm_driver的源代码:

// Definition of uvm_driver
class uvm_driver #(type REQ=uvm_sequence_item,
                   type RSP=REQ) extends uvm_component;
  // Port: seq_item_port
  // Derived driver classes should use this port to request items from the
  // sequencer. They may also use it to send responses back.
 
  uvm_seq_item_pull_port #(REQ, RSP) seq_item_port;
 
  // Port: rsp_port
  // This port provides an alternate way of sending responses back to the
  // originating sequencer. Which port to use depends on which export the
  // sequencer provides for connection.
 
  uvm_analysis_port #(RSP) rsp_port;
  REQ req;
  RSP rsp;
 
  // Rest of the code follows ...
 
endclass

uvm_sequencer的源代码:

// Definition of uvm_sequencer
class uvm_sequencer #(type REQ=uvm_sequence_item, RSP=REQ)
                                   extends uvm_sequencer_param_base #(REQ, RSP);
  // Variable: seq_item_export
  // This export provides access to this sequencer's implementation of the
  // sequencer interface.
 
  uvm_seq_item_pull_imp #(REQ, RSP, this_type) seq_item_export;
 
  // Rest of the class contents follow ...
 
endclass

Driver中的seq_item_port和Sequencer的seq_item_export的连接方式(和普通的TLM端口类似):

class my_agent extends uvm_agent;
  `uvm_component_utils (my_agent)
 
  my_driver      #(my_sequence_item)   m_drv;
  uvm_sequencer   #(my_sequence_item)    m_seqr;
 
  virtual function void connect_phase (uvm_phase phase);
    // Always the port is connected to an export
    m_drv.seq_item_port.connect(m_seqr.seq_item_export);
  endfunction
 
endclass

????????如果不想使用自带的成员变量,想加入改动,也可以由uvm_component来派生Driver等组件,然后自行定义uvm_seq_item_pull_port #(REQ, RSP)等类型的变量,名字可以不再是seq_item_port等,此外与Sequencer中的export的连接方式和上面相同。

1.Driver和Sequencer之间的通信方式属于TLM通信,传输的transaction应该是uvm_sequence_item或者其子类。UVM定义了专门的TLM端口供Driver和Sequencer使用:

????????uvm_seq_item_pull_port #(type REQ=uvm_sequence_item, type RSP=REQ)

????????uvm_seq_item_pull_export #(type REQ=uvm_sequence_item, type RSP=REQ)

????????uvm_seq_item_pull_imp #(type REQ=uvm_sequence_item, type RSP=REQ, type imp=)

2.由1可知这些端口默认传输的数据类型是uvm_sequence_item类型,如果在定义端口的时候没有声明用户所需的transaction类型,那么会有一个潜在的类型转换,会将transaction转换为uvm_sequence_item类型,这种情况下Driver从Sequencer中的FIFO中get到的req也是uvm_sequence_item,需要进行动态类型转换,转换成用户所需的transaction类型,才能获得里面的成员数据。

如果在Driver派生自uvm_driver的定义和Sequencer派生自uvm_sequencer的定义时就指明了用户定义的transaction类型(Sequence中也是如此),那么就不需要二次转换。

????????uvm_sequencer #(type REQ=uvm_sequence_item,RSP=REQ)

????????uvm_driver #(type REQ=uvm_sequence_item,RSP=REQ)

3.Driver和Sequencer之间的连接和对应关系就体现在两个TLM端口的connect上。多个Driver不能和一个Sequencer连接,多个Sequencer也不能和一个Driver连接,也就是说Driver和Sequencer是一对一的关系。实际上是一个seq_item_port只会connect一个seq_item_export,我们可以在一个Driver中(当然不能是派生自uvm_driver的Driver,自定义的)定义多个uvm_seq_item_pull_port,用来连接多个Sequencer,一个uvm_seq_item_pull_port与一个Sequencer的uvm_seq_item_pull_imp连接。

4.uvm_seq_item_pull_*类型的TLM端口含有许多特殊的可调用方法,Driver可以使用这些方法来从Sequencer的FIFO中得到transaction,告知transaction使用完毕,也可以将处理完的transaction返回给Sequence。

Driver中uvm_seq_item_pull_*内含的多种方法实现sequence->sequencer->driver的数据传输以及driver->sequence的反馈机制:

  • task get_next_item(output REQ req_arg):采取blocking的方式等待从sequence获取下一个item。
  • task try_next_item(output REQ req_arg):采取nonblocking的方式从sequencer获取item,如果立即返回的结果req_arg为null,则表示sequence还没有准备好。
  • function void item_done(input RSP rsp_arg=null):用来通知sequence当前的sequence
  • item已经消化完毕,可以有选择性地传递RSP参数,返回状态值。
  • task wait_for_sequences():等待当前的sequence直到产生下一个有效的item。
  • function bit has_do_available():如果当前的sequence准备好而且可以获取下一个有效的item,则返回1,否则返回0。
  • function void put_response(input RSP rsp_arg):采取nonblocking方式发送response,如果成功返回1,否则返回0。
  • task get(output REQ req_arg):采用get方式获取item。
  • task peek(output REQ req_arg):采用peek方式获取item。
  • task put(input RSP rsp_arg):采取blocking方式将response发送回sequence。

sk put(input RSP rsp_arg):采取blocking方式将response发送回sequence。

2.uvm_monitor

uvm_monitor源码:几乎没有做任何扩充。

3.uvm_sequencer

组织管理sequence。比uvm_component做了相当多的扩展。

4.uvm_scoreboard

与uvm_component比也没什么扩展。

5.uvm_agent

如果不考虑重用性,可有可无,最大改动多了个is_active。

6.uvm_env

也没做太多扩展。

7.uvm_test

任何从uvm_test派生的都要例化env,只有这样,在测试用例运行的时候,才能把数据正确发给DUT。也没怎么扩展。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:37:38  更:2021-11-28 11:38:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/6 7:59:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码