2017-12-19 2 views
0

ich mit der SystemC TLM Bibliothek arbeitete. Ich möchte eine Nutzlast mit zwei Ganzzahlen an ein Modul senden, das eine Operation für diese zwei Ganzzahlen ausführen wird. Meine Frage ist einfach, wie man die Nutzlast einrichtet und decodiert.SystemC Transfer Level Modellierung Extract zwei ganze Zahlen von tlm_generic_payload

Doulos vorgesehen Dokumentation sowohl auf die Einrichtung und Decodierung hier https://www.doulos.com/knowhow/systemc/tlm2/tutorial__1/

Setup-

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

Decode

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

So ist es mir sieht aus wie Sie einen Zeiger auf eine Speicherstelle senden würde wo zwei Ganzzahlen geschrieben sind.

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

ist meine Interpretation dieser Dokumentation korrekt?

Wie könnten Sie diese ersten 4 Speicherplätze [3: 0] erhalten und sie zu einem int32 kombinieren und wie könnten Sie die zweite 4 [7: 4] bekommen und in die zweite ganze Zahl verwandeln?

+0

Im Allgemeinen sollten Sie High-Level-Bibliotheken wie SCML verwenden, die benutzerfreundlicher APIs auf dem rohen TLM-2.0 liefern. Generische Nutzdaten sind für die Interoperabilität von Werkzeugen ausgelegt, Endbenutzer sollten besser die vom EDA-Anbieter bereitgestellten High-Level-APIs verwenden. – random

+0

ist SCML Open Source? wo sind die Include-Dateien in v2.3.2 –

+0

Es kann von https://www.synopsys.com/cgi-bin/slcw/kits/reg.cgi heruntergeladen werden. Es gibt andere ähnliche Bibliotheken, zum Beispiel greenlib: https://github.com/GreenSocs/greenlib – random

Antwort

0

So sieht es aus wie Sie würden einen Zeiger auf einen Speicherort senden, wo zwei Ganzzahlen geschrieben werden. Ist meine Interpretation dieser Dokumentation korrekt?

Ja

ihnen Um wieder Sie sie einfach kopieren müssen:

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

oder so etwas wie

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

Aber stellen Sie sicher, Initiator Speicher unter dem Zeiger gültig lange hält genug z Es könnte besser sein, die Verwendung von Daten auf dem Stapel zu vermeiden. Und vergessen Sie nicht zu prüfen, ob das Datenlängenattribut der Nutzdaten einen gültigen Wert hat - Sie möchten diese Probleme so schnell wie möglich erkennen.