预备打工人之SystemC学习 (五) 事务级建模库

TLM2.0基本概念

在前面说了很多特有的行为建模语法。在十几种,这些语法能够帮助你高效地建模实际系统,但不要受限于新语法。

片上系统建模时SystemC的核心功能之一。TLM2.0库的设计目标是使得不同提供商的模型相互兼容。在基于总线的片上系统中,最近的通信模式由以一个主设备发起一次总线访问,被访问者做出相应的相应。

发起事务的模块被称为发起者,而接受 钙食物并做出相应的木块被称为目标。发起者和目标之间通过套签字连接。发起者和目标木块必须遵守一定的接口标准才能互联互通,这个接口在TLM2.0预定义了恶一个通过净核类和相应的基础协议,以进一步保障不同提供商提供的模型互联互通。TLM2.0还定义了实用工具、分析接口和端口。

核心接口包括阻塞和非阻塞传送接口、直接存储器接口和调试传送接口。

如图所示,构建SystemC核心库的基础上。为了最大化可互操作性,特别是建模存储器映射类型的互联模型,TLM2.0核心接口、发起者和目标套字、通用金河和基础协议通常一起使用。当然,TLM2.0核心接口、发起者和目标嵌套字、通用净核和基础协议都可以单独使用。

实用工具、分析接口和端口并不是必须的,但是为了保持风格的连续性和建模的一致性,在建模时应尽量使用。

下面是库文件目录结构

松散定时建模

松散定时建模使用阻塞传送接口。在建模中,阻塞的意义是一个调用请求发出购,知道请求被处理完成该调用才返回。。因此在这种模型中,每一个事务处理对应了两个时间点,即事务处理的开始点和结束点。在TLM基础协议中,这两个时间点与请求相位的开始和相应相位的开始相对应。正常情况下,事务处理的结束时间点要晚于事务处理的开始时间点,但有时候可以相同。

松散定时建模风格支持 “时间解耦”,是松散定时模型的一个显著特征。具体的说,模型的一部分可以在当前仿真时间之前运行,直到一个需要与其他部分同步的一个同步点。时间解耦降低了进程允许的仿真精度,但是有效地提高了仿真速度。

“全局量子时间”是一个进程提前与当前仿真时间运行的时间上限。它反映了仿真精度和仿真速度之间的权衡。

松散定时模型的两个核心特征为:

  • 阻塞调用
  • 基于全局量子时间的时间解耦

近似定时模型

近似定时建模通过非阻塞传送接口支持,主要用于体系结构探索和性能分析。在一个非阻塞传送中存在多个定时点,不同传送相位可以分别用时间标注。在近似定时建模中,一个事务被划分为多个相位,由不同的时间点即兴分割。在基础协议汇总,基本的时间点包括请求的开始和结束、应答的开始和结束。特定的协议可以进一步包括更多的时间点,但可能导致与通用净核失去兼容。

在近似定时建模时,一般不使用时间解耦。这是因为考虑到定时精度的需求。在近似定时建模时,每一个进程根据SystemC调度器的时间 进行执行。在近似定时建模时,通过使用两种延迟:目标延时和发起延时。发起延时也可以看做目标接收延时。

近似定时建模和松散定时建模的使用

不同模型适合的应用场景是不一样的。

  • 周期精确模型什么都可以做,它仿真速度是很慢的
  • 非定时模型仿真速度最快,包括的信息较少,适合定义设计规范和做软件开发
  • 松散定时模型主要用于软件开发和软件性能评估,也可以做体系结构分析。

发起者、目标、套接字和桥

TLM2.0 支持在发起者和目标之间传递事务。发起者能够发起事务,即创建一个新的事务对象,并通过TLM核接口定义的方法进行传递。目标是一个事务的目的地。发起者和目标之间可以直接相连,也可以通过互联组件提供互联。互联组件是一个模块,它可以访问事务,但不是事务的发起者或者目标。典型的互联组件包括路由器、总线和仲裁器。

在TLM2.0中定义了发起者套接字和目标套接字,他们支持使用通用净核来简历前项、返回、反向路径。除了传送接口,套接字还封装了DMI和调试传送接口。

DMI和调试传送结构

直接存储器接口(DMI)和调试传送接口是不同于一般传送接口的专门接口,可以直接访问和调试一个目标所拥有的的一片存储区域。它们一般不通过互联单元的算术接口而是进行存储器直接访问。

DMI一般用于松散模型中,加速正常的存储器事务处理器。调试传送接口用于调试访问,无延迟也无负效应。DMI包括前向和后向接口,而调试接口只有前向接口。

合并接口和套接字

在标准的发起者和目标套接字中,阻塞、非阻塞传送接口、DMI和调试传送接口被合并在一起。所有的四个类型的结构可以在一个给定的目标中并行使用。

名字空间和头文件

TLM2.0包括tlm和tlm_utils两个名字空间。tlm名字空间包括了支持TLM建模的四种传送接口等核心类。

为了编译通过,一个TLM2.0项目必须包括上述两个目录。它还必须包换systemc.h之前定义SC_INCLUDE_DYNAMIC_PROCESSES宏。

通用净核类

进行事务处理级建模,核心是描述事务以及事务的传递过程。可以定义很多中不同的C++类来表示事务。对于32位总线读写事务,一种的C++类为:

Class bus_payload
{
public:
  unsigned int address;
  unsigned int data_in;
  unsigned int data_out;
  bool[4] sel;
  bool we;
  bool cyc;
  bool stb;
  bool ack;
  bool err;
  bool rty;
};

一个总线读写事务为:
bus_payload bp;
对于不同的总线,总线读写事务类的定义不同。

定义

通用净核用于提高存储器映射类型总线模型的互联互通性。通用净核提供了创建存储器映射类型总线模型所需要的基本属性,对于创建多数抽象总线模型已经足够。另一方面,它还提供了一个扩展机制以满足某些总心啊标准的特定需求。

通用净核针对存储器映射类型总线模型而设计,包括了命令、地址、数据、时能、单字传输、突发传输等属性。它支持阻塞和非阻塞传送接口,也支持DMI和调试传送接口。

在使用通用净核作为食物对象传递前,发起者需初始化数据指针和字节使能属性指针。数据智针可以指向静态、自动或者动态分配的存储空间。

通用净核支持两种管理存储区的方法:引用计数和发起者随机管理。两个方法可以同时使用。

存储区管理器是一个用户定义的类,至少实现tlm_mm_interface的free方法。这样一个类的设计目的是提高一个从一个存储池分配通用净核事务对象的方法。

只有存在一个存储管理器的时候,set_mm,acquire,get_ref_count和reset方法才能使用。缺省条件下,通用净核对象没有存储器管理器。set_mm方法啊用于设置一个通用净核的村处理器管理器。

构造、赋值和析构函数

缺省构造函数将通用净核的属性设置为缺省值。
在这里插入图片描述
tlm_generic_payload将通用净核的属性设置为缺省值,并初始化存储器管理器。通用净核不支持拷贝构造函数和赋值操作。

通用净核对象的属性

set_command设置命令属性,即读和写。Get_comand返回当前的命令属性。Set_read和set_write分别将命令属性设置为TLM_READ_COMMAND和TLM_WRITE_COMMADN。

大端和小端

大端和小端是常见的问题。被建模的发起者和目标的大小端方向与主机的大小端方向是有关的。

阻塞传送接口

核心接口概述

核心接口包括四种:

  • 阻塞
  • 非阻塞传送接口
  • DMI
  • 调试传送接口

其中阻塞和非阻塞传送接口是发起者、目标和互联组件之间进行事务处理的基本接口。阻塞、非阻塞传送接口都支持定时标注和时间解耦。则色传送接口没有事务处理器相位参数,阻塞传送接口与非阻塞传送接口的事务处理器相位的任何对应都是名义上的。非阻塞传送接口返回一个值指示返回路径是否已使用。

阻塞传送接口定义

阻塞传送接口主要支持松散时间建模。发起者通过调用一个函数就可以完成一个非阻塞事务处理。

非阻塞事务处理接口如下:

namespace tlm{
template <typename TRANS = tlm_generic_paylpoad>
class tlm_blocking_transport_if:public virtual sc_core:: sc_interface{
public:
  virtual void b_transport(TRANS &trans,sc_core::sc_time &t)=0;
};
}

b_transport()是非阻塞事务处理接口的唯一方法。Trans为一个事务,t是一个双向时间参数。当发起者通过其访问目标是,t为事务处理器发起的时间。当目标返回时,t为事务处理结束时间。TRANS参数默认值为tlm_generic_payload。用户也可以根据需要修改具体类型。
调用规则如下:

  • 可以直接或者间接调用wait;
  • 只能在线程类型的进程中调用,而不能在方法进程中调用。
  • 发起者可以重用一个事务对象,从一个调用送到另一个调用,也可以跨传送接口,包括DMI和调试传送接口。
  • 调用时送入的时间参数为事务发起时间,而返回的时间为事务完成时间
  • 时间标注产生允许定时点与仿真时间不同
  • 事务对象一般不携带时间信息
  • 是否可以调用一栏具体规则协议

阻塞调用实例

阻塞调用的流程如图所示,第一次立即返回,第二次在50ns后返回。
在这里插入图片描述

时间解耦阻塞调用示例

一个时间解耦的发起者可以提前与仿真时间允许,这时发起者和目标都需要一个本地名义时间。本地名义时间包括本地绝对名义时间和本地相对名义时间。b_transort里调用挂了wait时,本地相对名义时间被复位为0.

量子时间阻塞示例

所有的时间结构的发起者增加本地相对时间知道量子时间被超出。
在这里插入图片描述

非阻塞传送接口

相位

tlm_phase是非阻塞传送接口模板的缺省相位类型。tlm_phase对象采用无符号整数表示相位。类tlm_phase的值有五个。

tlm_phase的缺省值是UNINITIALIZED_PHASE。方法tlm_phase(unsigned in)、操作符=和操作符unsigned int可以用来设置和获取tlm_phase对象的值。

操作符<<可以用来显示当前相位的ASCII文本。宏DECLARE_EX-TENDED_PHASE创建一个单态类tlm_phase_arg,继承与tlm_phase,它有一个公有方法get_phase返回它所创建的静态对象的引用。

大多数情况下,使用预定义的相位就可以完成建模。

基础协议类型

在TLM2.0中广泛使用了基础协议类型tlm_base_protocal_types,其定义如下

namespace tlm{
  struct tlm_base_protocol_types{
    typedef tlm_generic_payload tlm_payload_type;
    typedef tlm_phase tlm_phase_type;
  };
}

其中 tlm_generic_payload是通用净核。

非阻塞传送接口定义

非阻塞传送接口用于支持建模近似时间模型。近似时间模型建模用于藐视发起者和目标之间的事务查理过程的多相位的细节。,每一个相位都有一个明确的定时点。

如果将时间点越是为两个,非阻塞接口就可以用于建模松散时间模型。非阻塞传送接口同时使用前向路径和反向路径,因此非阻塞传送该接口有两个。

与阻塞传送接口类似,非阻塞传送接口需要传送事务对象的应用和相对本地名义时间信息。此外,非阻塞传送接口还需要一个枚举便令表示交易的状态,并返回同一个枚举便令标志是否发生了事务处理相位的改变。

为了与基础协议兼容,在实际建模中尽量使用tlm_phase和tlm_generic_payload以保持不同模型的兼容性。

前向非阻塞接口类tlm_fw_nonblocking_transport_if的接口函数nb_transport_fw在前向路径中调用,反向非阻塞接口类tlm_bw_nonblocking_transport_if的接口。视线中都不允许使用wait函数,因此他们也都可以在线程类进程和方法进程中使用。

nb_trasport_fw和nb_transport_bw中补鞥呢调用b_transport。对于基础协议,simple_target_socket类实现了nb_transport_fw、nb_transport_bw与b_transport的自动转换。

TRANS& trans参数的使用于阻塞接口一样。

PHASE& phase参数引用一个相位对象,相位的变化表明时间的前进。

非阻塞传送接口使用示例

在这里插入图片描述

发起者首先调用nb_transport_fw(trans,BEGIN_REQ,0)来发起请求。当使用反向链路时,可能目标并不能立刻计算出下一个相位切换时的事务对象的状态,因此返回TLM_ACCEPTED。发起者此时应该通过调用wait或者sync来进行同步,以使得目标中的进程可以得到执行。

当目标得到执行,它调用nb_transport_bw(trans,END_REG,0)来对nb_transport_Fw来做响应。而目标在执行时,发起者中的相应进程也无法得到执行,同样发挥了TLM_ACCEPTED,此前目标应该通过调用wait或者sync来进行同步。

直接存储器接口

直接存储器接口(DMI)允许发起者使用指针直接访问而不是使用传输接口访问目标拥有的一片存储区域。DMI回避了对阻塞和非阻塞传送接口的多次调用,DMI能够有效提高仿真速度。

DMI接口有两个,一个用于从发起者到目标的前项路径调用,另外一个用于目标到发起者的反向路径调用。前向路径调用返回一个类型为tlm_dmi的引用对象,发起者可以通过该应用范围给位于目标的存储器区域。反向路径被目标用于使通过前向路径建立的引用无效。前向和反向路径都可以穿越0、1或者多喝互联单元,但是前向和反向路径必须穿越互联单元的集合必须相同。

DMI缺省的事务对象的类型为tlm_generic_payload,也可以根据需要进行拓展。

DMI接口定义如下:

namespace tlm{
class tlm_dmi{
public tlm_dmi(){init();}

}
}

调试传送接口

调试攒送接口为发起者提供一个与其他传送接口具有相同的前向路径的读写方法,但是对其他传送接口的操作没有任何影响,即调试传送接口操作对于其他传送接口来讲是非入侵式的。调试传送接口可以让发起者在仿真过程中对存储器内容进行以诊断为目的扫描。

namespace tlm{
template <typename TRANS=tlm_generic_payload>
class tlm_transport_dbg_if :public virtual sc_core::sc_interface{
 public:
    virtual unsigned int transport_dbg(TRANS& trans)=0;
 };
}

合并的传送接口

发起者和目标套接字

发起者和目标套接字

一个套接字讲一个端口和一个导出端口相连接。一个发起者至少有一个前向路径端口和一个反向路径导出端口,而一个目标有一个反向路径端口和一个前向路径导出端口。

在TLM2.0中预定义了一些套接字

简单套接字

简单套接字就是使用简单方便,它们从tlm_initiator_socket和tlm_target_socjer继承而来,所以能够直接与这些类型的套接字绑定。每一个简单套接字都提供了注册回调方法的方法。

全局量子时间和量子看守者

“时间解耦”允许SystemC进程可以提前于仿真时间运行,二允许提前的最大仿真时间称为量子时间。全局量子时间由单态tlm_global_quantum来定义,而类tlm_quantumkeeper则提供了管理全局量子时间的方法。

SystemC片上习题建模辅助学习材料.pdf SystemC 片上系统设计》 辅助材料 (包括本书释疑和更正 SystemC Mail list 编译工具入门 SystemC 习题及答案) 1.写在前面................................................................................................................................3 2.关于 SystemC China Maillist................................................................................................3 3.《SystemC 片上系统设计》释疑........................................................................................3 3.1 教材第 26 页,第2.2节上面那一小段中,还请您详细解释一下为什么不需要析 构函数...............................................................................................................................3 3.3 我编译 systemc master-slave 时,vc 报告出现错误............................................4 3.4 第2.4.15节能否说一下“fs(x-iT)”是什么意思。................................................4 3.5. 第62 页全加器例子中,为什么要用到#ifdef和#endif语句?...........................5 3.6. 此页例子中没有敏感量表,wait()语句怎么起作用?..........................................5 3.7. 能否解释一下第 70页例子中哪里体现了信号 rst.delayed()会有高低的变化?5 3.8. 第78 页例子中的 NAME 后面的“+”是什么意思?..........................................5 3.9. 第78 页倒数第三行“sc_signal<int>*v”中的“*”号是否应为“&”?.........5 3.10 SystemC_win 下载不到?.......................................................................................5 3.11 在 Redhat 9 上开发 SystemC 可以么?....................................................................6 4.《SystemC 片上系统设计》更正........................................................................................6 4.1 教材第 13 页在 Debug 目录下应该改为 Nand2目录..............................................6 4.2 教材第 31 页怎么是两个 ctrl_alu?............................................................................6 4.3 教材第 46 页-0.5q 应写成 0.5q...............................................................................6 4.4 shifter编译通不过,您帮我看看..............................................................................7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值