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
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.
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.
- 1. Wie kann ich den Unterschied zwischen false und 0 feststellen?
- 2. Wie kann man den Unterschied zwischen dem vorherigen und nächsten Wert in React überprüfen?
- 3. Wie kann man den Unterschied zwischen class_eval() und instance_eval() verstehen?
- 4. Wie bekomme ich den Unterschied zwischen den Spalten in Sql
- 5. Wie kann ich den Unterschied zwischen einem Iterator und einem Iterablen unterscheiden?
- 6. Kann jemand den Unterschied zwischen Ajax und Ruhe erklären?
- 7. Unterschied zwischen den Ansichten und SELECT-Abfragen
- 8. Unterschied zwischen den Funktionstypen
- 9. Unterschied zwischen den Methoden PrintWriter.printf und PrintWriter.format
- 10. Kann jemand den Unterschied zwischen Schließungs- und anonymen Funktionen erklären?
- 11. Kann jemand den Unterschied zwischen GCM und Google Pub/Sub
- 12. Kann Javascript den Unterschied zwischen linker und rechter Umschalttaste erkennen?
- 13. Den Unterschied zwischen Design- und Stilattributen verstehen
- 14. Wie kann ich den Login und das Passwort editetexts überprüfen?
- 15. Finding den Unterschied zwischen Arrays und aktualisieren
- 16. Unterschied zwischen den Präprozessordirektiven #if und #ifdef
- 17. Unterschied zwischen den Tabellen und temporären Tabellen
- 18. Ich möchte den Unterschied zwischen rscss und bem wissen
- 19. Wie erhalte ich den Unterschied zwischen zwei Daten in JavaScript?
- 20. Fmap und Karte, kann ich den Unterschied nicht sehen
- 21. Wie kann ich einen Unterschied zwischen zwei Strings berechnen?
- 22. Wie finde ich den Unterschied zwischen zwei Listen von Wörterbüchern?
- 23. Unterschied zwischen den beiden Linien
- 24. Wie berechne ich den Unterschied zwischen (Kalender-) Wochen in PHP?
- 25. Wie finde ich den Unterschied zwischen zwei Daten mit Javascript
- 26. Unterschied zwischen Type.IsGenericTypeDefinition und Type.ContainsGenericParameters
- 27. Unterschied zwischen Outlook.Folder und Outlok.MAPIFolder
- 28. Unterschied zwischen int * i und int * ich
- 29. Wie bekomme ich den Unterschied zwischen zwei R benannten Listen?
- 30. Wie finde ich den Unterschied zwischen zwei Zeiten in c?
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
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. –