2017-04-18 4 views
0

Ich versuche, ein größeres Programm zu debuggen, das ich schrieb, und ich extrahierte einen der Threads, der im Grunde ein Array von 24 Werten zu einem FIFO schreibt und das andere Ende ist ein anderer Thread, der lesen soll die Daten erst nachdem alles geschrieben wurde.Sc_inout <bool> Wert nicht ändern

Transmit.h

#include "stdafx.h" 
#include <iostream> 
SC_MODULE(Transmit){ 
    sc_inout <bool> ServerTx; 
    sc_fifo_out<int> PacketTx; 

    void Tx(); 

    SC_CTOR(Transmit){ 
     sc_fifo<int> PacketTx(24); 
     SC_THREAD(Tx){} 
    } 
}; 

Transmit.cpp

#include "stdafx.h" 
#include "Transmit.h" 

void Transmit::Tx(){ 
    int imageInfo[24] = { 1, 3, 2, 4, 1, 200, 600, 400, 800, 2, 400, 200, 600, 400, 3, 600, 400, 800, 600, 4, 800, 600, 1000, 800 }; 
    while (1){ 
     if (ServerTx == 0){ 
      cout << "ServerTx Before Write: " << ServerTx << endl; 
      for (int i = 0; i < 24; i++){ 
       cout << "Transmit Value: " << imageInfo[i] << endl; 
       PacketTx.write(imageInfo[i]); 
      } 
      ServerTx = 1; 
      cout << "ServerTx After Write: " << ServerTx << endl; 
     } 
     else{ 
      cout << "Done Transmitting Packet." << endl; 
     } 
    } 
} 

Main.cpp

#include "stdafx.h" 
#include "Transmit.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    sc_signal <bool> ServerTx; 
    sc_fifo<int> Packet(24); 

    Transmit t1("Transmit"); 
    t1.PacketTx(Packet); 
    t1.ServerTx(ServerTx); 

    ServerTx = 0; 
    sc_start(); 
    return 0; 
} 

was im Sehen ist, dass unabhängig von der Art i ServerTx, mein Signal erklären Es aktualisiert nie seinen Wert. Ich weiß nicht, ob es eine Verzögerung in System C gibt mit der Aktualisierung der Signalwerte oder nicht, aber ich habe keine Ahnung, was ich von hier aus tun soll. Ich erweitere dieses einfache Handshake in ein größeres Programm, das ich geschrieben habe, und wenn das nicht funktioniert, muss ich vielleicht die ganze Sache verschrotten.

Hier ist ein Debug-Ausdruck von was ich sehe. Ich erwartete ServerTx gleich 1, da ich nur seinen Wert eingestellt habe, aber es bleibt 0. Keine Ahnung, was passiert oder wenn ich etwas in SystemC missverstanden habe.

enter image description here

Update:

wait(SC_ZERO_TIME); Hinzufügen nach der while-Schleife bei der Veränderung der Wert von ServerTx gearbeitet, aber jetzt, wenn ich meine hinzufügen in Receive Code es ich folgende Fehlermeldung erhalten:

enter image description here

Hier ist mein Empfangscode:

#include "stdafx.h" 
#include "Receive.h" 

    void Receive::Rx(){ 
     while (1){ 
      if (ServerTx == 1){ 
       cout << "ServerTx before Read: " << ServerTx << endl; 
       for (int i = 0; i < 24; i++){ 
        imageInfo[i] = PacketRx.read(); 
        cout << "Receive Value: " << imageInfo[i] << endl; 
       } 
       ServerTx = 0; //Done reading server packet data 
       cout << "ServerTx after Read: " << ServerTx << endl; 
      } 
      else{ 
       wait(10, SC_NS); 
      } 
      wait(SC_ZERO_TIME); 
     } 
    } 

und ich änderte Main.cpp auf die folgenden:

#include "stdafx.h" 
#include "Receive.h" 
#include "Transmit.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    sc_signal <bool> ServerTx; 
    sc_fifo<int> Packet(24); 

    Receive r1("Receive"); 
    r1.PacketRx(Packet); 
    r1.ServerTx(ServerTx); 

    Transmit t1("Transmit"); 
    t1.PacketTx(Packet); 
    t1.ServerTx(ServerTx); 

    ServerTx = 0; 
    sc_start(); 


    return 0; 
} 

Antwort

1

In Ihrem Transmit :: Tx Thread Sie nicht die Kontrolle zurück an den Kernel SystemC erlaubt.

SystemC ist eine kooperative Multitasking-Simulationsumgebung. Dies bedeutet, dass Sie den Status der Simulation regelmäßig mit dem SystemC-Kernel synchronisieren müssen.

Versuchen Sie, diese Änderung in Transmit.cpp out für eine Delta-Verzögerung in Ihrer Simulation ergänzt:

#include "stdafx.h" 
#include "Transmit.h" 

void Transmit::Tx(){ 
    int imageInfo[24] = { 1, 3, 2, 4, 1, 200, 600, 400, 800, 2, 400, 200, 600, 400, 3, 600, 400, 800, 600, 4, 800, 600, 1000, 800 }; 
    while (1){ 
    if (ServerTx == 0){ 
     cout << "ServerTx Before Write: " << ServerTx << endl; 
     for (int i = 0; i < 24; i++){ 
      cout << "Transmit Value: " << imageInfo[i] << endl; 
      PacketTx.write(imageInfo[i]); 
     } 
     ServerTx = 1; 
     cout << "ServerTx After Write: " << ServerTx << endl; 
    } 
    else{ 
     cout << "Done Transmitting Packet." << endl; 
    } 
    wait(SC_ZERO_TIME); //< Delta Delay 
    } 
} 

Hinweise:

  1. Zum besseren Verständnis der Standard SystemC Sie die SystemC LRM verweisen .
  2. Wenn Sie von Ground Up (2nd Edition) auf die Hardcopy des SystemC zugreifen können.
    Refer: Kapitel 2 Abschnitt 2.4 Seite: 29 über den SystemC-Simulationskern. (oder schauen Sie sich die Google-Bücher Snapshot here an).
+0

Dies funktionierte. Nachdem ich jedoch den Receive-Teil meines Codes hinzugefügt habe, erhalte ich einen weiteren Fehler: Unhandled-Ausnahme bei 0x7777A932 in ConsoleApplication3.exe: Microsoft C++ - Ausnahme: sc_core :: sc_report am Speicherort 0x0161F324. ** Mein Empfangscode ist im Grunde der Das gleiche wie mein Sendecode, außer dass ich überprüfe, ob "ServerTx == 1" ist und wenn ja, lese ich die FIFO-Daten in ein Array. Sobald ich die FIFO-Daten gelesen habe, lösche ich 'ServerTx' und' ServerTx = 0; '. Innerhalb der else-Anweisungen habe ich eine Wartezeit von 5 ns hinzugefügt. Irgendwelche Ideen was ist los? Ich habe meine Frage aktualisiert, um dies zu berücksichtigen. – Javia1492

+0

Ihre Threads sind frei laufende Threads, die standardmäßig nicht auf SystemC-Ereignisse reagieren. Sie benötigen mindestens eine Wartungsanweisung in Ihrem SC_THREAD. Wenn Sie das Szenario näher erläutern oder auf eine frühere Frage zeigen könnten, die es einfacher macht, das Szenario zu identifizieren, das Sie mit SystemC modellieren möchten. – AmeyaVS

+0

Ich habe zwar Wartezeiten in meine Threads aufgenommen. Sehen Sie meine aktualisierte Frage für was ich versuche zu tun. – Javia1492