SystemC 传输级建模从 tlm_generic_payload 中提取两个整数

SystemC Transfer Level Modeling Extract Two Integers from tlm_generic_payload

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

Doulos 在此处提供了有关设置和解码的文档https://www.doulos.com/knowhow/systemc/tlm2/tutorial__1/

设置

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();

所以在我看来,你会发送一个指向写入两个整数的内存位置的指针。

|--------------------------------int1-------- --------------|-------------------------------- ---int2------------------------

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

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

(7*宽度)|

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

你怎么能得到前 4 个内存位置 [3:0] 并将它们组合成一个 int32,你怎么能得到第二个 4 [7:4] 并将它们变成第二个整数?

So it looks to me like you would send a pointer to a memory location where there are two integers written. Is my interpretation of this documentation correct?

要取回它们,您只需复制它们:

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);

但要确保启动器在指针下保持内存足够长的有效时间,例如最好避免在堆栈上使用保留数据。并且不要忘记检查有效负载数据长度属性是否具有有效值 - 您希望尽快检测到这些问题。