01signal.com

Vorzeichenbehaftete Arithmetik in Verilog: Die einzige Regel, die man kennen muss

Die goldene Regel lautet: Alle Operanden müssen vorzeichenbehaftet (signed) sein.

Verilog scheint stark zu vorzeichenlosen (unsigned) Zahlen zu neigen. Jeder der folgenden Fälle liefert einen vorzeichenlosen Wert:

Unterm Strich heißt das: Entweder verwendet man die Systemfunktion $signed, oder man deklariert die Wires und Register gleich als signed.

Wenn man beispielsweise ein vorzeichenbehaftetes Register mit einem vorzeichenlosen Register multiplizieren möchte, wobei das Ergebnis (natürlich) als vorzeichenbehaftet behandelt wird, kann man etwa so vorgehen:

reg         [15:0] a; // Unsigned
reg signed  [15:0] b;
wire signed [16:0] signed_a;
wire signed [31:0] a_mult_b;

assign signed_a = a; // Convert to signed
assign a_mult_b = signed_a * b

Man beachte, dass signed_a um ein Bit breiter ist als „a“, sodass Platz für das Vorzeichenbit bleibt, das hier immer Null ist. Gäbe es dieses zusätzliche Bit nicht, würde das MSB von a in signed_a als Vorzeichenbit behandelt (MSB = most significant bit).

Man könnte fälschlich annehmen, man müsse das MSB von signed_a explizit mit etwas wie {1'b0, a} festlegen, statt einfach „a“ zu verwenden. Der Verilog-Standard legt jedoch eindeutig fest, dass nur der Ausdruck darüber entscheidet, ob eine Zahl vorzeichenbehaftet oder vorzeichenlos ist. Die linke Seite hat darauf also keinen Einfluss. „a“ wird daher als vorzeichenloser Wert behandelt und dementsprechend mit Nullen aufgefüllt.

Diese Seite wurde maschinell aus dem Englischen übersetzt. Im Zweifelsfall siehe den Originaltext.
Copyright © 2021-2026. All rights reserved. (dcc38493)