W poniższym uproszczonym kodu Verilog:Verilog "~" operator operacja dodawania umożliwia niepożądany rezultat
wire [31:0] depth;
wire mode_u2 = 1'h0;
assign depth = 'h80 + (~mode_u2);
jeśli do wyświetlacza o głębokości i symulacji to VCS (2014.12-1)
$display("depth is 0x%2x", depth);
Otrzymuję 0x7f
, zamiast oczekiwać 0x81
. wygląda na to, że ~ mode_u2 jest traktowane jako minus 1.
Jeśli zmienię ~mode_u2
na !mode_u2
. Otrzymuję 0x81 zgodnie z oczekiwaniami.
co bardziej interesujące jest to, jeśli zrobić wire mode = ~mode_u2
a następnie assign depth = 'h80 + (~mode)
zamiast 0x80
, ja dostać 0x7e
Am I brakuje czegoś tutaj?
Czy ktoś może wyjaśnić, dlaczego ~
zachowuje się w ten sposób w operacji +
? A może ta jedna z tych symulacji i syntez to inna sytuacja?
Wielkie dzięki!
Willie
Myślę, że jesteś na dobrej drodze, ale 32-bitowe rozszerzenie 0 to '32'h0000_0000', a jego bitowa negacja to' 32'hffff_ffff'. – toolic
@toolic: Dzięki. Naprawiony. – Ari
@Ari: Myślałem o tym samym, to powinno być jedyne możliwe wyjaśnienie. Jednak warto wspomnieć, że jeśli robi się 0x80 + wszystkie fs, to kiedy wydrukuję 33 bity głębokości wyniku, MSB NIE jest 1? a także, gdy robisz tryb + (~), dlaczego dodaje ~ 32'h0000_0001, a nie ~ 32'ffffffffffff, ponieważ tryb to ~ mode_u2. – shakimura