UVM——TLM2通信
TLM2通信
TLM2.0多用于SystemC,与TLM1.0相比,2.0的优势包括:
- 双向的阻塞或非阻塞接口
- 时间标记
- 统一的数据包
TLM2.0使得接口之间的通信更趋于标准化,更容易为系统构建抽象模型。
接口实现
TLM2的传输是双向的,一次完整的数据传输包含request和response类型,与TLM1 transport端口传输方式类似。TLM2支持blocking和nonblocking两种transport方式:
- blocking传输方式要求在一次传输过程中,完成request和response的传输
- nonblocking传输方式则将request和response的传输分为了两个独立的单向传输,两次传输整体视为完成一次握手传输
//两种传输方式对应的UVM方法
task b_transport(T t, uvm_tlm_time delay); //blocking传输方式
function uvm_tlm_sync_e nb_transport_fw(T t, ref P p, input uvm_tlm_time delay); //nonblocking传输方式
function uvm_tlm_sync_e nb_transport_bw(T t, ref P p, input uvm_tlm_time delay);
T代表统一的传输数据类uvm_tlm_generic_payload;P代表在nonblocking传输方式中用来做状态同步的类型。
在定义TLM2的过程中,仍然有initiator和target的概念,也有port、export、imp端口类型。对于port类型,它是用来发起请求并调用target一端的传输方法,export用来传导这一要求,最后由imp端口所在的组件来实现数据传输方法。
TLM2的端口类型称之为socket,有port、export、imp组合而成。一个socket首先是双向传输的,例如TLM1de双向传输端口transport可以用来做单次完成的双向传输,master和slave端口用来完成多次的双向传输。
socket按照blocking和nonblocking的传输方式,组合initiator或target的发起端区别,可以分为以下端口类型:
uvm_tlm_b_initiator_socket
uvm_tlm_b_target_socket
uvm_tlm_nb_initiator_socket
uvm_tlm_nb_target_socket
uvm_tlm_b_passthrough_initiator_socket
uvm_tlm_b_passthrough_target_socket
uvm_tlm_nb_passthrough_initiator_socket
uvm_tlm_nb_passthrough_target_socket
socket类型都继承于uvm_port_base,具有同TLM1端口一样的基础函数,在socket内部,它们是通过例化port、export、imp、来实现数据双向传输。
TLM2的port、export、imp与TLM1的区别:
- TLM2的这些端口类型都是新引入的类,例如uvm_tlm_b_transport_port、uvm_tlm_b_transport_export、uvm_tlm_b_transport_imp。
- 不同端口类型之间的连接关系虽然没有改变,但是端口类型名所匹配的方法不再是put()、get()、peek()而是b_transport()、nb_transport_fw()、nb_transport_bw()。
数据传输
TLM1传送的数据类型由用户自行定义,这带来了一系列的限制。例如端口数据类型不同,则端口无法连接;传输不同数据类型的TLM端口,传送方法要进行调整。这不利于组件的连接和平台的搭建。
TLM2对传送的数据类型提出了一致化的要求,统一的数据类型由uvm_tlm_generic_payload表示,即传输方法中使用的数据类型都应该为uvm_tlm_generic_payload。
TLM2的统一数据格式按照总线数据的内容来定义:
- bit [63:0] m_address:数据的读写地址。
- uvm_tlm_command_e m_command:数据的读写命令。
- byte unsigned data[]:写入的数据或者读出的数据,有byte unsigned的类型构成动态数组,这是按照总线传输的最小粒度进行划分,便于target体侧进行数据整合。
- int unsigned length:data数组的长度, 该数值应与data数组的实际容量保持一致。
- uvm_tlm_response_status_e m_response_status:由target返回的状态值,表示数据传输是否完成和有效。
- byte unsigned m_byte_enable[]:用来标记写入数据的有效性,标记那个byte应该被写入。
- int unsigned m_byte_enable_length:该数值应该等于m_byte_enable数组的容量值。
- m_stream_width:用来表示连续传输时的数据传输长度。
- uvm_tlm_extension_base m_extension[uvm_tlm_extension_base]:如果一些数据域不在上面的部分,那么可以在这个数据延伸域中添加。
对于一般总线传输而言,包含的数据信息已经足够,如果还需传输其它数据内容,可通过以下方式:
- 将要传输的内容合并作为数据成员data数组中的一部分
- 创建新的uvm_tlm_extension类,将额外的数据成员装入到该数据延伸对象中,通过uvm_tlm_generic_payload::set_extension(uvm_tlm_extension_base ext)
来添加这一部分的数据。
此外,uvm_tlm_extension提供了do_copy()、do_compare()、do_print()等回调函数。
时间标记
不同的时间标记间隔是SystemC构建不同时间精度模型的重要手段。在TLM2传输中,由于可以标定延迟时间,这使得target端可以模拟延迟,并且在准确的延迟时刻做出响应。
为了便于标记延迟时间,例如实数范围的延迟1.1ns,UVM新建了一个时间类uvm_tlm_time。这个时间类的便携之处再与用户可以随时设置它的时间单位(默认为1ps),并且进行时间的增减操作。同时这个类的存在,也是为了解决在不同模块或数据包之间出现的不同时间单位和精度单位的问题。
//实例
class comp1 extends uvm_component;uvm_tlm_b_initiator_socket b_ini_skt;`uvm_component_utils(comp1)...task run_phase(uvm_phase phase);byte unsigned data[] = {1, 2, 3, 4, 5, 6, 7, 8};uvm_tlm_generic_payload p1 = new("p1");uvm_tlm_time delay = new("delay");p1.set_address('h0000F000);p1.set_data_length(8);p1.set_data(data);p1.set_byte_enable_length(8);delay.incr(0.3ns, 1ps);`uvm_info("INITRSP", $sformatf("initiated a trans at %0d ps", $realtime()), UVM_LOW);b_ini_skt.b_transport(p1, delay);endtask: run_phase
endclassclass comp2 extends uvm_component;uvm_tlm_b_target_socket #(comp2) b_tgt_skt; //指明参数类型所在的组件`uvm_component_utils(comp2)...task b_transport(uvm_tlm_generic_payload p1, uvm_tlm_time delay);`uvm_info("TGTTRSP", $sformatf("recieved a trans at %0d ps", $realtime()), UVM_LOW)p1.print();#(delay.get_realtime(1ps)); //生成一个时间并等待该时间长度p1.set_response_status(UVM_TLM_OK_RESPONSE); //修改rsp状态为OK`uvm_info("TGTTRSP", $sformatf("completed a trans at %0d ps", $realtime()), UVM_LOW)p1.print();endtask
endclass
UVM——TLM2通信相关推荐
- (4)UVM TLM2.0
UVM TLM2.0 概述 接口实现 传送数据 时间标记 示例 概述 TLM是一种为了构建更高级抽象模型的传输方式.虽然SV语言本身没有原生的TLM传输方式,但是TLM在UVM很好地集成进来,并且在组 ...
- UVM TLM2.0简单介绍
文章目录 前言 一.UVM TLM2.0 二.Blocking Transport 2.1 Blocking Initiator 2.2 Blocking target 三.Non-Blocking ...
- UVM——TLM通信
UVM--TLM通信 1. 概述 2. 基本概念 3. 分类 4. 端口的使用 1. 概述 在芯片开发流程中,系统原型和芯片验证对项目的助推起到了关键作用 系统原型,一般是通过硬件功能描述文档来模拟硬 ...
- UVM通信篇之五:TLM2通信
本文转自:http://www.eetop.cn/blog/html/28/1561828-5940102.html 在本章之前的部分中,读者们认识了TLM是一种为了构建更高级抽象模型的传输方式.虽然 ...
- UVM TLM2: SystemC和SV 通信
TODO 不完整,有时间再更新 SystemC 介绍 SystemC不是一门新的语言,而是基于C++开发的library TLM2 介绍 如果都是SV code的话,结构上类型TLM1 TLM2 提供 ...
- UVM——TLM通信(1)
目录 TLM的定义 通信的端口定义和所在的组件 单向通信 定义 通信流程 多向通信 定义 通信流程 通信管道 定义 通信流程 前言:基于<UVM实战>和路科讲解的TLM通信,总结一下 TL ...
- UVM TLM通信简介
1.UVM put/get通信 在UVM中一对一的TLM有很多种类型,以sequencer和driver为例. driver是请求端,在driver列化了两种端口(在uvm_driver中列化,可直接 ...
- UVM通信篇之一:TLM通信概论
本文转自:http://www.eetop.cn/blog/html/28/1561828-5940098.html 在目前SoC设计的几大挑战当中,最令人关注的莫过于: 爆炸性增长的复杂度(然而被互 ...
- 芯片漫游指南(3)-- UVM通信
目录 1.TLM通信 1.1 概述 1.2 基本概念 1.3 分类 1.4 端口的使用 2. 单向通信 2.1 概念 2.2 方法 2.3 示例 3.双向通信 3.1 概述 3.2 分类 3.3 tr ...
最新文章
- Oracle根据日期区间查询Date类型的数据
- 漫话:如何给女朋友解释什么是 Git 和 GitHub?
- MySQL修改字段名、字段类型
- Adb connection Error:远程主机强迫关闭了一个现有的连接
- w7计算机不显示cdf盘,微软确认Win7SP1再现黑屏错误
- php mysql 条件查询语句_where 查询条件-Medoo - 高效的轻量级PHP数据库框架, 提高开发效率!...
- settype COM_LOCAT_ADDR出现在CRM change document里的原因
- 基于FPGA的电机控制设计(PWM)
- 【转】C#命名空间大全详细教程
- 程序员面试金典 - 面试题 16.06. 最小差(排序+双指针)
- Java8新特性:Stream介绍和总结
- cf1114 D. Flood Fill
- 五款提高工作效率的在线工具【神器】
- 线程同步--事件内核对象
- SVNQuery–如何创建更新索引并查询
- java设置环境变量win7_Windows7系统配置java环境变量的详细教程
- 医院耗材管理系统开发_14
- 支持向量回归预测怎么做_使用支持向量回归进行Facebook股票预测
- 硬盘数据恢复软件免费版有免费使用的吗
- [影评]《大话西游》之:你看,那人好像一只狗耶(外一篇:我们都是那只流泪的猴子。)
热门文章
- java getinstance 反射_Java 基础篇之反射
- Windows10系统VC++6.0安装教程
- 一文看懂用word制作电子公章,2分钟就能搞定!
- Python程序来计算球体的体积和面积
- ? 精美图文带你掌握 JVM 内存布局
- matlab编写的卡农,matlab 编的卡农
- 【智能制造】全球人工智能与制造业融合的现状及思考
- CentOS 7 中Tomcat7注册成服务
- Java语言每日一练—第14天:银行收入计算
- Word 安装Mathtype后无法使用CTRL+C和CTRL+V【一次性解决】