Gibt es ein Flag / Pragma, das mir helfen kann, falsche Variablennamen in einer Moduldefinition zu erkennen?

[icarus verilog]

Gibt es ein Flag / Pragma, das mir helfen kann, falsche Variablennamen in einer Moduldefinition zu erkennen?

Betrachten Sie das folgende Codefragment ...

module binary_decoder_2to4
(
    input wire enable,
    input wire[1:0] a,
    output wire[3:0] y
);

assign y[0] =  en & ~a[1] & ~a[0];
assign y[1] =  en & ~a[1] &  a[0];
assign y[2] =  en &  a[1] & ~a[0];
assign y[3] =  en &  a[1] &  a[0];

endmodule

Wie Sie sehen können, habe ich port enin umbenannt enable, aber ich habe vergessen, den Modulkörper zu aktualisieren. Als Programmierer würde ich erwarten, dass der Compiler (iverilog) zumindest eine Warnung ausgibt. Stattdessen generiert der Compiler fröhlich eine Simulationsdatei mit dem Wert von enset to z.

Das einzige, was ich über Verilog weiß: "implicit none" ist dein Freund.
Was schreibe ich, um "implizit keine" zu erhalten?
Eigentlich ist das ein Tool-Bug. Implizite Netze sind nur dann implizit , wenn sie in einer Portliste oder auf der linken Seite einer fortlaufenden Zuweisung erscheinen. Hier enerscheint auf der rechten Seite und sollte nicht zu einer impliziten Erklärung werden.

Antworten (2)

Ja, es ist tatsächlich den -W-Warnflags sehr ähnlich, mit denen Sie wahrscheinlich vertraut sind, wenn Sie einen C-Compiler wie clang oder gcc verwenden.

Wenn Sie besonders vorsichtig sein wollen, übergeben Sie -Wall an Iverilog. Dadurch werden alle Warnungen aktiviert. Wenn Sie jedoch nur an der spezifischen Situation Ihrer Frage interessiert sind, handelt es sich lediglich um eine implizite Drahtdeklaration. Sie verwenden eine Leitung namens en, aber da es keine 'en'-Leitung im Modul gibt, wird sie dort, wo sie verwendet wird, auch implizit deklariert (was sicherlich nützlich ist, aber wie Sie festgestellt haben, auch Tippfehler verschleiern kann oder einfaches menschliches Versagen). Wenn Sie die Warnung dafür mit -Wimplicit einschalten, wird Iverilog Sie davor warnen.

Es gibt noch andere praktische Klassen, die Sie möglicherweise ebenfalls verwenden möchten oder nicht, und Sie können jede Kombination davon aktivieren, indem Sie einfach mehrere -W-Schalter ausgeben. Hier ist eine gute Aufschlüsselung der verfügbaren Optionen.

Hoffentlich ist es das, was Sie wollten. Viel Glück!

Verilog behandelt standardmäßig jede nicht deklarierte Variable als einzelne Bitleitung. Seit IEEE Std 1364-2001 (alias Verilog-2001) können Sie die Vorgabe mit dem `define_nettypeMakro überschreiben. Durch die Einstellung nonemüssen alle Netze explizit deklariert werden. Dies ist eine universelle Lösung, die auf allen modernen Simulatoren funktioniert; Die Basislinie ist die Einhaltung von IEEE Std 1364-2001.

Fügen Sie die Zeile `default_nettype noneam Anfang der ersten Datei hinzu, die kompiliert wird, und die Regel gilt für alle Dateien. Wenn Sie möchten, dass einige Module eine explizite Deklaration haben und andere eine implizite zulassen, müssen Sie für alle Module, die eine explizite Deklaration benötigen, `default_nettype noneüber und `default_nettype wireunter diesen Modulen stehen.

Weitere Einzelheiten zu default_nettype finden Sie in IEEE Std 1364-2001 § 19.2 `default_nettype oder IEEE Std 1800-2012 § 22.8 `default_nettype