1. TLM通信
系统原型一般是通过硬件功能描述文档来模拟硬件行为,而行为要求不同于RTL模型。系统原型可以提供一个准确到硬件比特级别,按照地址段落访问,不依赖于时钟周期的模型。
芯片验证实在RTL模型初步简历后,通过验证语言和方法学例如SV/UVM来构建验证平台。
组件之间的通讯基于TLM,而在driver与硬件接口之间需要将TLM抽象事务降解到基于时钟的信号级别。
系统原型阶段和芯片验证阶段均使用TLM通信方式。前者是为了更快的实现硬件原型之间的数据通信,后者是为了更快的实现组件之间的数据通信。
TLM作为一种提高数据传输抽象级的标准存在的。
提高系统模型的仿真性能,需要考虑两个方面:
一个是建模自身的运算优化,另外一个是模型之间的通信优化
前者需要依靠开发者的经验还有性能分析工具来逐步优化模型
后者则可以通过将通信频率降低,内容体积增大的方式,来减少由不同进程剑同步带来的资源损耗
TLM通信需要两个通信的对象,谁发起通信请求,谁就属于initiator,谁作为发起通信的响应方,谁就属于target。通信发起方并不代表transaction的流向起点,即不一定数据是从initiator流向target,也可能是从target流向了initiator
按照transaction的流向,将对象分为producer和consumer,数据从哪里产生,就属于producer,数据流向哪里,就属于consumer。
用户需要在target端定义TLM的通信方法,put()发送transaction,get()获取transaction
TLM通信步骤分为:
分辨出initiator和target,producer和consumer
在target中实现tlm通信方法
在两个对象中创建tlm端口
在更高层次中将两个对象的端口进行对接
从数据流向来看,传输方向分为单项(undirection)和双向(bidirection)
单向传输:由initiator发起request transaction
双向传输:由initiator发起request transaction ,传送至target,而target在消化了request transaction后,会发起response transaction,继而返回给了initiator
端口的按照类型划分为三种:
port:经常作为initiator的发起端,initiator凭借port才可以访问target的TLM通信方法
export:作为initiator和target中间层次的端口 (extern 延伸)
imp:只能作为target接收request的末端,它无法作为中间层次的端口,所以imp的连接无法再次延伸(终点)
UNIDIR单向端口 BIDIR双向端口
uvm_UNDIR_port #(trans_t)
uvm_UNDIR_export #(trans_t)
uvm_UNDIR_imp #(trans_t, imp_parent_t)
uvm_BIDIR_port #(req_trans_t, rsp_trans_t)
uvm_BIDIR_export #(req_trans_t, rsp_trans_t)
uvm_BIDIR_imp #(req_trans_t, rsp_trans_t, imp_parent_t)
class request extends uvm_transaction;
byte cmd;
int addr;
int req;
endclass
class response extends uvm_transaction;
byte cmd;
int addr;
int rsp;
int status;
endclass
class comp1 extends uvm_agent;
uvm_blocking_get_port #(request) bg_port;
`uvm_component_utils(comp1)
...
endclass
class comp2 extends uvm_agent;