2015-02-20 19 views
5

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

Odpowiedz

2

Argumenty operatora dodawanie musi być przedłużony do wielkości po lewej stronie (lub maksymalnej szerokości dwóch liczb, zależnie od kontekstu) przed dodawanie zostało zakończone.

W tym przypadku mode_u2 należy rozszerzyć do 32 bitów. Nie mogłem znaleźć odniesienia do tego, ale wygląda na to, że rozszerzenie bitu ma pierwszeństwo przed operatorem ~. Oznacza to, że:

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

Wynik ! operatora, jednak z definicji jest pojedynczy bit, i wydaje mi się, że rozszerzenie nieco zdarza się dwa razy:

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

Podobnie dla mode:

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

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

+0

@toolic: Dzięki. Naprawiony. – Ari

+0

@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

Powiązane problemy