2016-07-01 20 views
0

Ich möchte den Unterschied zwischen sc_buffer und sc_signal überprüfen. Ich habe ein Modul codiert, das zwei Zufallszahlen hinzufügt und dann zwei parallele Tests durchführe: einen mit sc_buffer und den anderen mit sc_signal. Dennoch, wenn ich mit gtkwave überprüfe, sehe ich die gleichen Spuren für beide Beispiele, also denke ich, dass für diesen Fall es keinen Unterschied geben sollte. Wie kann ich den Unterschied prüfen? Oder sind diese beiden verschiedenen Kanalarten für unterschiedliche Anwendungen gedacht?Wie kann ich den Unterschied zwischen sc_buffer und sc_signal überprüfen?

Antwort

2

sc_buffer ist wahrscheinlich am nützlichsten bei der Modellierung auf einer abstrakten Ebene.

Betrachten Sie beispielsweise die Modellierung eines seriellen Kommunikationskanals. Der Sender könnte das gleiche Zeichen zweimal hintereinander senden. Wenn ein sc_signal als der Kanal verwendet wurde, würde der Empfänger das zweite Zeichen nicht erkennen, aber mit einem sc_buffer würde es.

#include <systemc> 
#include <iostream> 

using namespace sc_core; 
using namespace std; 

struct Transmitter : public sc_module { 

    sc_out<char> out; 

    Transmitter(sc_module_name name) : sc_module(name) { 
     SC_THREAD(transmit); 
    } 

    void transmit() { 
     wait(1, SC_NS); 
     out.write('x'); 

     wait(1, SC_NS); 
     out.write('x'); 

     wait(1, SC_NS); 
     out.write('y'); 
    }; 

    SC_HAS_PROCESS(Transmitter); 
}; 

struct Receiver : public sc_module { 

    sc_in<char> in; 

    Receiver(sc_module_name name) : sc_module(name) { 
     SC_METHOD(receive); 
     sensitive << in; 
     dont_initialize(); 
    } 

    void receive() { 
     cout << sc_time_stamp() << ": " << name() << " received " 
      << in.read() << endl; 
    } 

    SC_HAS_PROCESS(Receiver); 
}; 

int sc_main(int argc, char* argv[]) 
{ 
    sc_signal<char> signal; 
    sc_buffer<char> buffer; 

    Transmitter signal_transmitter("signal_transmitter"); 
    Receiver signal_receiver("signal_receiver"); 
    Transmitter buffer_transmitter("buffer_transmitter"); 
    Receiver buffer_receiver("buffer_receiver"); 

    signal_transmitter.out(signal); 
    signal_receiver.in(signal); 

    buffer_transmitter.out(buffer); 
    buffer_receiver.in(buffer); 

    sc_start(); 

    return 0; 
} 

Das obige Beispiel erzeugt diese Ausgabe:

1 ns: signal_receiver received x 
1 ns: buffer_receiver received x 
2 ns: buffer_receiver received x 
3 ns: signal_receiver received y 
3 ns: buffer_receiver received y 

Beachten Sie, dass signal_receiver nicht das Zeichen an ns 2 gesendet hat zu detektieren.

Sie werden keinen Unterschied in einer VCD-Kurve sehen, da die in den Kanälen sc_buffer und sc_signal gespeicherten Werte identisch sind. Der Unterschied ist, wenn der Empfänger ausgelöst wird.

0

Sie können die folgende Antwort auf die Unterschiede zwischen Puffer und sc_signal ansehen.

In SystemC, can the sc_signal_in/out type port be bound to the primary channel sc_buffer?

sc_buffer ist grundsätzlich aus sc_signal abgeleitet und es neu implementiert die Schreib- und Aktualisierungsfunktionen Benachrichtigung für jede Änderung zu erzeugen. Wenn Sie also neue Nummern generieren, die der vorherigen in den Kanal geschrieben sind, und Sie bei jeder Benachrichtigung eine Ausgabe ausgeben, sollten Sie einen Unterschied feststellen.

+0

danke, ich habe diesen Post schon gelesen, aber es ist mir immer noch nicht klar, unter welcher Situation es notwendig wäre zu wissen, ob ein Kanal geschrieben wurde. In dem Beispiel, das ich erwähnt habe, habe ich auch versucht, immer die gleichen zwei Zahlen zu addieren, so dass jedes Mal das gleiche Ergebnis erzielt wird. Wenn ich jedoch die Spuren in 'gtkwave' überprüfe, sehe ich dieselben Ergebnisse. Ich weiß nicht, ob das normal ist oder ob dies nicht der richtige Ort ist, um das Wertänderungsereignis zu überprüfen, wenn der Puffer geschrieben wird. – Marco

+1

Möglicherweise sehen Sie den Unterschied in der Wellenform nicht, da der Pufferwechseltrigger den gleichen Wert erzeugt und Ihre Methode genau die gleiche Ausgabe verarbeitet und erzeugt. => Der Eingang und der Ausgang bleiben weiterhin gleich, auch wenn ein Trigger vom Puffer erzeugt wurde und es scheint, dass er derselbe Ausgang ist wie das Signal sc_signal, das keine Änderung bewirkt hat. Wenn Sie eine Art von Anzeige (Cout) machen, sollten Sie eine zusätzliche Anzeige im Terminal sehen können, wenn der sc_buiffer verwendet werden kann. –