Systemc传输级建模从TLM_Generic_Payload提取两个整数

SystemC Transfer Level Modeling Extract Two Integers from tlm_generic_payload

本文关键字:整数 两个 提取 Generic 传输 建模 Systemc TLM Payload      更新时间:2023-10-16

我正在使用Systemc TLM库。我想将带有两个整数的有效载荷发送到一个模块,该模块将对这两个整数执行操作。我的问题只是如何设置和解码有效载荷。

doulos提供了有关在此处设置和解码的文档

设置

tlm::tlm_command cmd = static_cast(rand() % 2);
if (cmd == tlm::TLM_WRITE_COMMAND) data = 0xFF000000 | i;
trans->set_command( cmd );
trans->set_address( i );
trans->set_data_ptr( reinterpret_cast<unsigned char*>(&data) );
trans->set_data_length( 4 );
trans->set_streaming_width( 4 );
trans->set_byte_enable_ptr( 0 );
trans->set_dmi_allowed( false );
trans->set_response_status( tlm::TLM_INCOMPLETE_RESPONSE );
socket->b_transport( *trans, delay );

解码

virtual void b_transport( tlm::tlm_generic_payload& trans, sc_time& delay )
{
  tlm::tlm_command cmd = trans.get_command();
  sc_dt::uint64    adr = trans.get_address() / 4;
  unsigned char*   ptr = trans.get_data_ptr();
  unsigned int     len = trans.get_data_length();
  unsigned char*   byt = trans.get_byte_enable_ptr();
  unsigned int     wid = trans.get_streaming_width();

所以在我看来,您会将指针发送到编写两个整数的内存位置。

| ------------------------------------------------------------------------------------------------------------------------------------ | -----------------------------------------------------------int2 --------------------------------

| ptr 0x0 | ptr 0x(wid)| ptr 0x(2*wid)| ptr 0x(3*wid)|ptr 0x(4*wid)| ptr 0x(5*wid)| ptr 0x(6*wid)| ptr 0x

------------ |

(7*wid)|

我对本文档的解释是否正确?

如何获得前4个内存位置[3:0]并将它们组合成INT32?如何获得第二个4 [7:4]并将它们变成第二个整数?

所以在我看来,您会将指针发送到内存位置 有两个整数写的地方。 我对本文档的解释是否正确?

要使它们恢复原状,您只需要复制它们:

int32_t val0, val1;
memcpy(&val0, ptr, sizeof(int32_t));
memcpy(&val1, ptr + sizeof(int32_t), sizeof(int32_t));

或类似

的东西
int32_t val[2];
memcpy(val, ptr, sizeof val);

,但请确保引发器在指针下保持内存有效期足够长,例如最好避免在堆栈上使用数据。并且不要忘记检查有效载荷数据长度属性是否具有有效值 - 您想尽快检测这些问题。