Erkennt Register, die nicht zurückgesetzt werden

Beim Schreiben von Verilog verwende ich eine Vielzahl von "Linters", die Fehler und Warnungen ausgeben. Dies sind mein Simulator (ModelSim), mein Compiler (Quartus II), zusammen mit einem Linter (Verilator). Zusammen habe ich eine gute Abdeckung für häufige Fallstricke, wie z. B. Fehlanpassungen der Busgröße und abgeleitete Latches.

Leider erkennt keines der drei Tools Register, die nicht zurückgesetzt werden. Um zu verstehen, was ich meine, bedenken Sie Folgendes.

reg a;
reg b;

always @(posedge clk_i or posedge rst_i) begin
  if(rst_i) begin
    a <= 1'b0; // Reset a
    // Ooops, forgot to reset b
  end else begin
    // Do stuff with a and b
  end
end

Wie kann ich meine Tools automatisch Register erkennen lassen, die nicht zurückgesetzt werden?

"Register, die nicht zurückgesetzt werden" sind nicht unbedingt eine schlechte Sache (zumindest in einem Siliziumdesign), weshalb sie möglicherweise keine Warnungen in Flusenwerkzeugen sind. Im Allgemeinen möchten Sie nur die Register zurücksetzen, die zurückgesetzt werden müssen , da das Hinzufügen von Resets zu Flip-Flops deren Fläche und die Belastung des Reset-Netzwerks erhöht. Wenn Sie einen 256-Bit-Datenbus und ein 1-Bit-Gültig-Signal haben, müssen Sie die Daten nicht zurücksetzen, wenn Sie das gültige zurücksetzen.
Synplicity (Synthesewerkzeug) warnt vor solchen Dingen. Ärgerlich, weil sie oft beabsichtigt sind ... aber in Ihrer Situation hilfreich sein können (vorausgesetzt, Synplicity macht Verilog, ich habe es nie versucht)
Die Frage besagt, dass eine Vielzahl von Linters verwendet werden, ModelSim, Quartus II und Verilator. Diese Tools haben begrenzte Linting-Fähigkeiten und die Arten von Problemen, nach denen sie suchen, sind ziemlich eng.

Antworten (4)

Keines der von Ihnen erwähnten Werkzeuge ist ein echtes Fusselwerkzeug. Diese Werkzeuge sollen Ihnen keine gute Flusenabdeckung bieten.

Ich sah zwei kommerzielle Linting-Tools und beide hatten Regeln zum Erkennen von Non-Reset-Flops.

Ich sehe drei Möglichkeiten:

  1. Wenn die Antwort von David Kessner für Sie funktioniert - weiter so.
  2. Holen Sie sich ein anständiges Fusselwerkzeug, das die Arbeit erledigt.
  3. Schreiben Sie ein Skript, das Non-Reset-Flops erkennt.

Nun, Nr. 2 ist vielleicht nicht so einfach. Ich weiß nicht, ob es da draußen gute kostenlose Linters gibt, und die professionellen sind teuer und erfordern viel Zeit für die Einrichtung.

#3 ist der Ansatz, den ich verwenden würde. Wenn Sie irgendeine Skriptsprache (Perl, Python, ...) beherrschen, werden Sie höchstens einen Tag brauchen, um ein Skript zu schreiben, das nach nicht zurückgesetzten Flops sucht. Wenn Sie keine Skriptsprache kennen, gibt es StackOverflow , wo Sie um Hilfe bitten können - ein paar Tage und Sie sind fertig. Damit wird Ihr persönlicher Werkzeugkasten um ein weiteres Tool erweitert, das unter Frontend-Designern sehr geschätzt wird – das Schreiben von Textverarbeitungsskripten.

Viel Glück!

Wenn ich Modelsim auf meinen VHDL-Designs ausführe, gibt es mir Warnungen bei Time=0ps über Logik mit Eingangssignalen vom Typ „X“ oder „U“. Ich habe die genaue Warnmeldung vergessen. Das Durchlaufen dieser Warnungen kann mir sagen, was ich nicht initialisiert habe.

Ich verlasse mich dabei eher auf Funktionstests als auf Linting-Tools. Ich neige dazu, das Zurücksetzen umzuschalten und Teile des Prüfstands erneut abzuspielen. Wenn das Gerät nach dem Zurücksetzen korrekt funktioniert, haben Sie entweder den Zustandsraum ausreichend zurückgesetzt, oder Ihr Prüfstand ist nicht gut!

Manchmal geben die Designtools eine Reihe von Berichten aus, die Ihnen alle möglichen interessanten Informationen liefern. Xilinx nennt dies beispielsweise einen Zuordnungsbericht, der Ihnen mitteilt, welche logischen Komponenten welchen physischen Komponenten zugeordnet wurden.

Im obigen Beispiel würde reg a einem FDCE (Flipflop, D, mit asynchronem Löschen und Taktfreigabe) zugeordnet werden, während reg b einem FDE (Flipflop, D und Taktfreigabe) zugeordnet werden würde. Dies würde Ihnen sagen, dass reg b keinen Reset hat.