divider: Do absolute-value ops in divider instead of decode
authorPaul Mackerras <paulus@ozlabs.org>
Fri, 27 Sep 2019 22:55:08 +0000 (08:55 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Fri, 27 Sep 2019 22:55:08 +0000 (08:55 +1000)
commit25b9450475704ae58cddf44438248d3a3bb56f1e
tree645648b3147cbced445cc524e1b85744598155ae
parente6536d4b8bf93cdb5456b6cd97cfbc4ebc41f34c
divider: Do absolute-value ops in divider instead of decode

This moves the negation of negative operands for signed divide and
modulus operations out of the decode2 stage and into the divider.
If either of the operands for a signed divide or modulus operation
is negative, the divider now takes an extra cycle to negate the
operands that are negative.

The interface to the divider now has an 'is_signed' signal rather
than a 'neg_result' signal, and the dividend and divisor can be
negative, so divider_tb had to be updated for the new interface.

The reason for doing this is that one of the worst timing violations
on the Arty A7-100 at 100MHz involved the carry chain in the adders
that did the negation of the dividend and divisor in the decode stage.
Moving the negations to a separate cycle fixes that and also seems to
reduce the total number of slice LUTs used.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
common.vhdl
decode2.vhdl
divider.vhdl
divider_tb.vhdl