Die Handhabung der Parametrierung in SystemVerilog-Pakete
SystemVerilog Hinzugefügt-Pakete zu bieten namespaces für gemeinsame code-Teile (Funktionen, Typen, Konstanten, etc.). Aber da die Pakete nicht instanziiert werden, Sie können nicht parametrisiert werden, so dass der Umgang mit parametrisierten Mitglieder ist problematisch. In der Praxis ich habe festgestellt, dass dies ziemlich eingeschränkt, da sehr oft meine benutzerdefinierte Typen haben einige Parameter, die diktieren, Feldbreite usw..
Ich in der Regel beschäftigen sich mit dieser durch die Verwendung von Parametern mit default-Werten und nur das Verständnis, dass ich muss zurück zu gehen, ändern Sie die package-source-code für einige Anwendungen, die offenbar sehr falsch für mich. Aber ich habe noch einen Weg zu finden, um dieses mehr sauber. Zum Beispiel:
package my_pkg;
parameter ADDR_MSB = 7;
parameter DATA_MSB = 31;
typedef struct {
logic [ADDR_MSB:0] address;
logic [DATA_MSB:0] data;
} simple_struct_t;
endpackage
Hat jemand gefunden, ein sauberer Umgang mit diesem? Ich würde gerne hören, über Sie, seit ich denken Pakete sind eine sehr leistungsstarke Ergänzung zu SV Aktivierung sicherer code wiederverwenden, aber diese Einschränkung ist ziemlich schwerwiegend.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, ich bin einverstanden. Das ist ein missing-feature-Pakete.
Nur spitballin' hier, aber Sie konnte Ihre abstrakten Parameter in ein secod-Paket, und verwenden Sie die Rechte zur compile-Zeit, um zu zwicken, Ihr Paket. Ich weiß, dass ist nicht das, was Sie wirklich wollen, aber es könnte Sie schließen.
Ich glaube, ich würde nur am Ende mit mehreren Paketen ist für jede Konfiguration, wenn ich vor diese in mein Projekt.
Habe ich ein paar Gedanken. Zuerst würde ich in Richtung lean modeling meine Daten mit Klassen anstatt structs. Klassen können parametrisiert werden, wird dynamisch zugewiesen, randomisierte, enthalten covergroups, etc. Ich benutze nur Strukturen, wenn ich will, eine gepackte Struktur. Verpackt Strukturen sind wunderbar, weil Sie Ihnen zuweisen können, wie ein normaler Vektor und dann Zugriff auf die Daten mit den benannten Feldern. Sehr schön. 🙂
Zweitens, selbst wenn es möglich wäre, neu zu definieren, package-Parameter zurück, es ist nur eine "Instanz" eines Paketes in der simulation; es können nicht mehrere Spezialisierungen mit unterschiedlichen parameter-Werte, wie es sein kann für Module oder Klassen. So scheint es mir, dass zu tun, Weg mit dem parameter und mit einem makro, stattdessen ist eine brauchbare Lösung. Obwohl ich nicht wie die Verwendung von Makros, die es ermöglichen würden, Sie neu zu kompilieren mit den neuen Werten, ohne den Quellcode ändern zu müssen.
Könnten Sie der Verwendung von parametrisierten Makros, um dem Namen eine Art mit besonders breiten:
Dann, in einen Ort, in Ihrem code definieren Sie die Struktur(en), die Sie benötigen:
Und dann verwenden Sie es, wo immer Sie es brauchen, mit nur den Namen:
Dies kann kann oder nicht anwenden, je nach genau das, was Sie im Sinn haben, um in das Paket, aber Schnittstellen können parametrisiert werden und sind synthetisierbare wenn das Werkzeug unterstützt es.
Es ist ein Beispiel http://www.doulos.com/knowhow/sysverilog/tutorial/interfaces/
Ich hatte die gleiche Frage und ein Mitarbeiter vorgeschlagen, die folgenden:
//definiert.sv:
//mod_sub.sv:
//mod_top.sv:
Glaube ich, dass System-Verilog-Pakete sind durchdacht, bevor Sie alle Module, damit deren Inhalt nicht geändert werden kann, indem die Parameter bei der Kompilierung.
Ich würde nicht sagen, dass es eine fehlende Funktion. Was Sie versuchen zu tun, wurde mit Makros in Verilog für Jahrzehnte. Problem ist, du hast ziemlich einzigartig in der Art und Weise, Sie nennen die Dinge zu vermeiden, die Konflikte zwischen den Paketen. Es ist nicht schön, aber es funktioniert.
Parameter sind etwas anders. Sie sind für die Anpassung auf eine Instanz von Instanz-basis (wie VHDL-generics). Entweder on-Module für die Logik, oder Klassen, die für test-Bänke. Mein einziger Kritikpunkt von Ihnen ist, sobald Sie starten Sie mit Ihnen, neigen Sie dazu, Sie zu verbreiten überall Ihre Hierarchie, und die syntax ist nicht gerade kompakt. Sehr gewaltig und groß für code-Wiederverwendung.
defines but neither works when different areas in the design require different param values for the same type (e.g. like a different address width). In theory you could use
definieren und erinnern Sie sich zurück oder undef, wenn die Kompilierung Einheit, doch sich darauf zu verlassen, dass ist ärger in meiner Erfahrung.Ich weiß, dass dies ein sehr Alter post, aber ich habe schon zu kämpfen mit diesem Problem seit einiger Zeit. Ich glaube, ich habe die passende Lösung gefunden, aber ich habe derzeit nicht das toolset zu überprüfen, ob dies synthetisieren kann, erfolgreich.
Siehe Abschnitt 5.6.7, in: http://www.sutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdf
Durch die Verwendung einer statischen parametrisierte Klasse mit statischen Funktionen, die Sie aufrufen können unterschiedliche Parametrisierungen eines jeden Daten-Typ, auf die Sie Fliegen und halten Sie Sie einzigartig für jede Instanziierung.
Kann jemand überprüfen, ob dies ist eine praktikable Lösung? Danke!