一、背景
tlm2.0中为了最大化互联互通性,定义了通用净核类tlm_generic_payload,不同的总线的读写事务,不同作者描述同一总线时,如果都是使用通用净核类表达事务对象,能够有效提高互联互通性。通用净核对象设置了命令属性、地址属性,指针属性,数据长度属性等,但有时上述属性不能满足使用要求时,通用净核类还提供了扩展属性,通过payload.set_extension()设置扩展信息,payload.get_extension()获取传输信息。我使用扩展机制主要是为了模块间通信时寻址提供便利。
二、实现方法
tlm2.0对扩展机制规定了相关格式,用户通过继承两种tlm库内的类,实现自定义扩展:tlm_extension<Typename>,和tlm_extension_base两种,其中第一种类继承于第二种类。
在tlm库中,两种类的定义如下:
class SC_API tlm_extension_base
{
public:
virtual tlm_extension_base* clone() const = 0;
virtual void free() { delete this; }
virtual void copy_from(tlm_extension_base const &) = 0;
protected:
virtual ~tlm_extension_base() {}
static unsigned int register_extension(const std::type_info&);
};
template <typename T>
class tlm_extension : public tlm_extension_base
{
public:
virtual tlm_extension_base* clone() const = 0;
virtual void copy_from(tlm_extension_base const &ext) = 0;
virtual ~tlm_extension() {}
const static unsigned int ID;
};
template <typename T>
const unsigned int tlm_extension<T>::ID
= tlm_extension_base::register_extension(typeid(T));
其中tlm_extension<T>中提供给用户extension ID,但我目前还未用到这个参数
实现扩展机制步骤如下:
1、创建项目所需extension结构体
其中,需要实现tlm2.0规定的两个纯虚函数:copy_from、clone
struct my_extension:public tlm::tlm_extension<my_tension>
{
my_extension(){};
virtual tlm_extension_base* clone() const
{
my_extension *ext = new my_extension;
ext->srcAddr = srcAddr;
ext->dstAddr = dstAddr;
return ext;
}
viture void copy_from(tlm_extension_base const &ext)
{
srcAddr = static_cast<my_extension const &>(ext).srcAddr;
dstAddr = static_cast<my_extension const &>(ext).dstAddr;
}
sc_dt::unit64 srcAddr;
sc_dt::unit64 dstAddr;
}
2、在源端通用净核类中定义extension
my_extension * extension_pointer;
extension_pointer = new my_extension;
extension_pointer->srcAddr = 0x00;
extension_pointer->dstAddr = 0xFF;
payload.set_extension(extension_pointer);
3、在目标端通用净核类中获取extension
my_extension * extension_pointer;
extension_pointer = new my_extension;
payload.get_extension(extension_pointer);
三、其他
1、在tlm_extension_base中定义的函数free会自动将new的空间删除,不需要手动释放new的空间
在函数结束后,会调用基类中的free函数,delete当前new的空间,但是具体原理时什么还不清楚,需要进一步学习
2、经过测试,extension并不会影响payload传递的data长度,不影响数据本身
3、上述过程知识自己的粗浅理解,作为一个c++新手,理解上可能有误,希望指正讨论。