2013-01-07 10 views
6

Mam rejestr zadeklarowane jako tak:arytmetyczne przesunięcie działa jako logicznej zmiany, niezależnie od podpisanej zmiennej

logic signed [15:0][2:0][15:0] registers; 

Kiedy umieścić 2 Numer komplement do tablicy i arytmetycznie przesunąć liczbę, zamiast tego logiczne przesunięcie:

registers[0][0] = 16'b1000000000000000; 
registers[0][0] = registers[0][0]>>>2; 

Najwyraźniej system przesunie logikę zamiast przesunięcia arytmetycznego, jeśli numer nie jest podpisany. Jak jednak widać, "rejestry" są z pewnością podpisane.

Czy ktoś wie, czego może mi brakować?

Dzięki!

Odpowiedz

10

Po wykonaniu Verilog, po wybraniu części, wynikiem jest unsigned. Użyj zadania systemowego $signed w części wybierz, aby podpisać.

res = $signed(registers[0][0]) >>> 2; 
+0

Niewiarygodne. Dziękuję Ci! – user1567095