Hey Tristan,
I found an interesting (and annoying) bug in GHDL's handling of bit_vector rol
and ror. Basically, rol and ror work fine, except when the amount to rotate
exactly matches the length of the bit_vector, in which case it gets rotated
incorrectly by one place.
Attached is code to illustrate the problem.
Output looks like this:
$ ghdl -i *.vhdl
$ ghdl -m bit_vector_rol_ror_bug
analyze bit_vector_rol_ror_bug.vhdl
elaborate bit_vector_rol_ror_bug
$ ghdl --version | head
GHDL 0.29 (20100109) [Sokcho edition]
$ ./bit_vector_rol_ror_bug
bit_vector_rol_ror_bug.vhdl:20:3:@0ms:(assertion warning): ror 5 is broken
bit_vector_rol_ror_bug.vhdl:28:3:@0ms:(assertion warning): ror -5 is broken
entity bit_vector_rol_ror_bug is
end entity;
architecture ghdl_bug of bit_vector_rol_ror_bug is
begin
assert ((bit_vector'("11100") ror -8) = "00111") report "ror -8 is broken" severity warning;
assert ((bit_vector'("11100") ror -7) = "10011") report "ror -7 is broken" severity warning;
assert ((bit_vector'("11100") ror -6) = "11001") report "ror -6 is broken" severity warning;
assert ((bit_vector'("11100") ror -5) = "11100") report "ror -5 is broken" severity warning;
assert ((bit_vector'("11100") ror -4) = "01110") report "ror -4 is broken" severity warning;
assert ((bit_vector'("11100") ror -3) = "00111") report "ror -3 is broken" severity warning;
assert ((bit_vector'("11100") ror -2) = "10011") report "ror -2 is broken" severity warning;
assert ((bit_vector'("11100") ror -1) = "11001") report "ror -1 is broken" severity warning;
assert ((bit_vector'("11100") ror 0) = "11100") report "ror 0 is broken" severity warning;
assert ((bit_vector'("11100") ror 1) = "01110") report "ror 1 is broken" severity warning;
assert ((bit_vector'("11100") ror 2) = "00111") report "ror 2 is broken" severity warning;
assert ((bit_vector'("11100") ror 3) = "10011") report "ror 3 is broken" severity warning;
assert ((bit_vector'("11100") ror 4) = "11001") report "ror 4 is broken" severity warning;
assert ((bit_vector'("11100") ror 5) = "11100") report "ror 5 is broken" severity warning;
assert ((bit_vector'("11100") ror 6) = "01110") report "ror 6 is broken" severity warning;
assert ((bit_vector'("11100") ror 7) = "00111") report "ror 7 is broken" severity warning;
assert ((bit_vector'("11100") ror 8) = "10011") report "ror 8 is broken" severity warning;
assert ((bit_vector'("11100") rol -8) = "10011") report "ror -8 is broken" severity warning;
assert ((bit_vector'("11100") rol -7) = "00111") report "ror -7 is broken" severity warning;
assert ((bit_vector'("11100") rol -6) = "01110") report "ror -6 is broken" severity warning;
assert ((bit_vector'("11100") rol -5) = "11100") report "ror -5 is broken" severity warning;
assert ((bit_vector'("11100") rol -4) = "11001") report "ror -4 is broken" severity warning;
assert ((bit_vector'("11100") rol -3) = "10011") report "ror -3 is broken" severity warning;
assert ((bit_vector'("11100") rol -2) = "00111") report "ror -2 is broken" severity warning;
assert ((bit_vector'("11100") rol -1) = "01110") report "ror -1 is broken" severity warning;
assert ((bit_vector'("11100") rol 0) = "11100") report "ror 0 is broken" severity warning;
assert ((bit_vector'("11100") rol 1) = "11001") report "ror 1 is broken" severity warning;
assert ((bit_vector'("11100") rol 2) = "10011") report "ror 2 is broken" severity warning;
assert ((bit_vector'("11100") rol 3) = "00111") report "ror 3 is broken" severity warning;
assert ((bit_vector'("11100") rol 4) = "01110") report "ror 4 is broken" severity warning;
assert ((bit_vector'("11100") rol 5) = "11100") report "ror 5 is broken" severity warning;
assert ((bit_vector'("11100") rol 6) = "11001") report "ror 6 is broken" severity warning;
assert ((bit_vector'("11100") rol 7) = "10011") report "ror 7 is broken" severity warning;
assert ((bit_vector'("11100") rol 8) = "00111") report "ror 8 is broken" severity warning;
end architecture;_______________________________________________
Ghdl-discuss mailing list
[email protected]
https://mail.gna.org/listinfo/ghdl-discuss