2012-04-05 3 views
1

ich die IEEE-Standard Verilog Hardware Description Language lese (speziell IEEE Std 1364-2001), die eindeutig definiert und diskutiert simulierbar Verilog. Leider berührt das Dokument nicht den Begriff der Synthese.Genaue Regeln, um zu bestimmen, was Verilog-Tool synthetisierbaren ist

Ich konnte keine ähnliche Referenz für synthetisch Verilog finden. Alles, was ich finde, sind vage Regeln oder unnötig einschränkende.

Wo kann ich die formale Sprache synthetisierbarer Verilog lernen?

+2

Ich glaube nicht, dass es eine formale Definition gibt. Es gibt einfach "was Synthesizer akzeptieren werden", was sich zwischen einem Synthesizer und dem nächsten etwas unterscheidet. Es gibt einige Dinge, von denen ich mir sicher bin, dass * kein * Synthesizer es schaffen wird, und andere werden sie alle, und einige Grauzonen, wo andere dies tun werden, andere nicht, und einige behaupten, sind aber nicht völlig zuverlässig/fehlerfrei . –

Antwort

3

IEEE 1364.1 ist eine Ergänzung zum Verilog-Standard 1364 mit dem Titel Verilog Register Transfer Level Synthesis, der versucht, eine gemeinsame synthetisierbare Untergruppe zu definieren. Jerry weist jedoch darauf hin, dass verschiedene Tools verschiedene Konstrukte unterstützen und dass Sie, um das werkzeugspezifische Verhalten zu bestimmen, die Werkzeugdokumentation konsultieren müssen.

Es gibt keine formale (BNF-Stil) Syntaxdefinition für synthetisierbare Verilog. Ob Code synthetisierbar ist, hängt sowohl von der Verwendung als auch von der Syntax ab. Zum Beispiel ist das von einem Konstrukt mit immer unvollständiger Empfindlichkeit beschriebene Verhalten, wie always @(a) o = a || b, nicht synthetisierbar. (Die meisten Werkzeuge diesen Code als synthetisieren, wenn die Empfindlichkeit Liste vollständig war, was zu einer möglichen Simulation/Synthese Mismatch.)

Strecke wie Verriegelungen Konstrukte und multiplizieren getriebene Netze können aus einer Verilog Beschreibung synthetisiert werden, sind aber nicht zulässig oder entmutigt unter den meisten Designregeln. Es gibt auch synthetisierbare Konstrukte, die bei der Wahl der Zielbibliothek nicht unterstützt oder nicht empfohlen werden. Beschreiben Sie beispielsweise ein RAM, das größer ist als das von einer gewählten FPGA-Technologie unterstützte Maximum, oder beschreiben Sie Tristate-Treiber, wenn sie nicht in der Zielbibliothek vorhanden sind.

Die allgemeinen Konstrukte für synthetisierbaren Verilog zu halten sind:

  • kombinatorische Logik mit kontinuierlichen Zuweisungen modelliert (assign Aussagen)
  • kombinatorische Logik mit immer Blöcke modelliert, welche Zuweisungen Blockierung verwenden sollte, und entweder eine vollständige Empfindlichkeitsliste oder always @*
  • Sequentielle Logik (Flip-Flops) modelliert mit immer Blöcke, die nicht blockierende Zuweisungen verwenden sollten, und haben entweder posegege Takt allein (für Sync-Reset oder nicht zurückgesetzt Flops) oder posegege Uhr und Pos Edge oder negedge reset (für asynchrone Reset-Flops) in der Empfindlichkeitsliste.

Die sicherste Art der Programmierung für sequentielle Logik ist nur codieren Reset-Logik in den sequentiellen immer Block:

always @(posedge clk or posedge reset) 
    if (reset) 
    q <= reset_value; 
    else 
    q <= next_value; 

Wenn Sie jedoch vorsichtig sind, können Sie zusätzliche kombinatorische Logik in dem sequentiellen Block codieren . Ein häufiger Fall, in dem es Sinn macht, dies zu tun, ist ein Mux vor einem Flop: