2013-03-12 5 views
12

Ich habe ein Präprozessor-Makro, das einen hierarchischen Pfad in mein Design darstellt.So erstellen Sie eine Zeichenfolge aus einem Makro vor dem Prozessor

Beispiel:

`define HPATH top.chip.block 

Ich brauche einen String zu erstellen, die den Wert von `HPATH hält, so in meinem Beispiel soll die Zeichenfolge top.chip.block gleich.

Gibt es eine Möglichkeit, eine solche Zeichenfolge zu konstruieren?

Keiner der folgenden Versuche gearbeitet:

string hpath; 
hpath = "`HPATH";  // Results in hpath = "`HPATH" 
hpath = \"``HPATH\"; // Doesn't compile 
hpath = `HPATH;  // Doesn't compile 

I hpath gleichwertig sein wollen diese Zuordnung zu tun hpath = "top.chip.block", aber wieder `HPATH statt eines festen Pfad.

Ich kann nicht %m verwenden, weil ich die Zeichenfolge innerhalb meiner Top-Level-UVM-Umgebung, nicht innerhalb eines Moduls benötigen.

Ein wenig mehr Hintergrund: Der Grund, warum ich dies tun möchte, ist, weil ich Backdoor-Register-Zugriff in der UVM-Klassenbibliothek verwenden. Die Backdoor-API erfordert das Festlegen des HDL-Pfads auf die Blöcke innerhalb des Designs als Zeichenfolge. Ich habe bereits definiert für die hierarchischen Pfade und versuche, diese bei der Angabe der hdl_paths wiederzuverwenden, so dass ich nicht denselben Pfad zweimal definiert habe. Meine Testbench verwendet den hierarchischen Pfad und den Zeichenfolgenpfad.

+0

Was haben Sie mit der Zeichenfolge zu tun, wenn Sie es haben? Wird dir der Spezifizierer '% m' helfen? – toolic

+0

@toolic - Ich habe die Frage mit etwas mehr Details aktualisiert.Ich brauche den Pfad sowohl als String (für UVM Backdoor reg access) als auch als hierarchischen Pfad (für einige andere Funktionen). '% m' wird nicht helfen, da ich den Pfad in einem Bereich außerhalb des Moduls brauche. – dwikle

Antwort

18

Es ist nicht möglich, ein Makro `define 'in einem Stringliteral zu verwenden. Gemäß SystemVerilog LRM:

Makrosubstitution und Argumentsubstitution darf nicht innerhalb von Stringliteralen auftreten.

jedoch ein String kann durch die Verwendung eines Makro konstruiert werden, die ein Argument nimmt und einschließlich der Anführungszeichen in dem Makro unter Verwendung von `` "`

Wieder vom LRM.

Ein "" überschreibt die übliche lexikalische Bedeutung von "und gibt an, dass die Erweiterung das Zitat Markierung, Ersetzung von tatsächlichen Argumenten und Erweiterungen von eingebetteten Makros enthalten soll. Dies ermöglicht Zeichenfolgenliterale aus Makroargumenten.

So funktioniert das:

`define STRINGIFY(x) `"x`" 
`define HPATH top.chip.block 
string hpath = `STRINGIFY(`HPATH); 
$display(hpath);      // Output: "top.chip.block" 

Das Codebeispiel kann hier ausgeführt werden: http://www.edaplayground.com/s/4/879

1

Ich denke, das ist, was Sie suchen.

`define HPATH `"top.chip.block`" 
string hpath = `HPATH; 

Wie toolic wies darauf hin, das% m-Escape-Sequenz finden Sie die aktuelle Hierarchie geben, wenn in einem $ Display-Anweisung verwendet, so dass eine bessere Option sein kann.

+0

Nicht genau - ich muss immer '\' HPATH' als eine hierarchische Referenz in einigen anderen Kontexten verwenden, so einfach die Makros als eine Zeichenfolge zu definieren wird nicht funktionieren. – dwikle