2015-02-20 6 views
5

Im folgenden vereinfachten Verilog-Code:Verilog "~" Operator zusätzlich Betrieb gibt unerwünschtes Ergebnis

wire [31:0] depth; 
wire mode_u2 = 1'h0; 

assign depth = 'h80 + (~mode_u2); 

wenn ich eine Anzeige auf Tiefe und simulieren sie mit VCS (2014.12-1)

$display("depth is 0x%2x", depth); 

Ich bekomme statt erwartet 0x81. es scheint, dass ~ mode_u2 als minus 1 behandelt wird.

Wenn ich ~mode_u2 zu !mode_u2 ändere. Ich bekomme 0x81 wie erwartet.

was mehr interessant ist, ist, wenn ich wire mode = ~mode_u2 tun und dann assign depth = 'h80 + (~mode) statt 0x80, bekomme ich 0x7e

Fehle ich etwas hier?

Kann jemand erklären, warum sich ~ auf diese Weise in einem + Betrieb verhält? Oder ist dies eine der Situationen, in denen Simulation und Synthese eine andere sind?

Vielen Dank !!

Willie

Antwort

2

Die Operanden des Add Bediener müssen auf die Größe der linken Seite (oder der maximalen Breite der beiden Operanden, abhängig vom Kontext) ausgefahren werden, bevor die Zugabe durchgeführt wird. In diesem Fall muss mode_u2 auf 32 Bits erweitert werden. Ich konnte keine Referenz dafür finden, aber es sieht so aus, als hätte die Bit-Erweiterung Vorrang vor dem Operator ~. Das heißt:

depth = 'h80 + (~mode_u2) = 
     32'h0000_0080 + (~32h0000_0000) = 
     32'h0000_0080 + 32'hffff_ffff = 
     32'h0000_007f 

Das Ergebnis ! Betreiber jedoch per Definition ein einzelnes Bit, und meine Vermutung ist, dass die Bit-Erweiterung geschieht zweimal:

depth = 'h80 + (!mode_u2) = 
     32'h0000_0080 + (!32'h0000_0000) = 
     32'h0000_0080 + 1'h1 = 
     32'h0000_0080 + 32'h0000_0001 = 
     32'h0000_0081 

Ebenso für mode:

depth = 'h80 + (~mode) = 
     32'h0000_0080 + (~32'h0000_0001) = 
     32'h0000_0080 + 32'hffff_fffe = 
     32'h0000_007e 
+0

Ich denke, Sie sind auf der richtigen Spur, aber 32-Bit-Erweiterung von 0 ist '32'h0000_0000' und seine bitweisen Negation ist' 32'hffff_ffff'. – toolic

+0

@toolic: Danke. Fest. – Ari

+0

@Ari: Ich dachte über das gleiche nach, das sollte die einzig mögliche Erklärung sein. Allerdings ist eine erwähnenswerte Sache, dass, wenn es 0x80 + alle fs macht, wenn ich 33 Bits der Ergebnistiefe drucke, das MSB NICHT 1 ist? und wenn du + (~ Modus) machst, warum fügt es ~ 32'h0000_0001 hinzu, nicht ~ 32'hffff_ffff, da der Modus ~ mode_u2 ist. – shakimura