[Libre-soc-bugs] [Bug 485] Create I-Cache from microwatt icache.vhdl
bugzilla-daemon at libre-soc.org
bugzilla-daemon at libre-soc.org
Mon Oct 5 17:43:45 BST 2020
https://bugs.libre-soc.org/show_bug.cgi?id=485
--- Comment #56 from Cole Poirier <colepoirier at gmail.com> ---
(In reply to Jacob Lifshay from comment #53)
> The version of ispow2 isn't actually correct, you can pass in 0 and it
> returns True:
> def ispow2(n):
> return ((n << 32) & ((n-1) << 32)) == 0
>
> The correct code is (assuming the input is always a Python int, adjust for
> Signals):
> def ispow2(n):
> return n != 0 and (n & (n - 1)) == 0
>
> see https://stackoverflow.com/a/57025941
>
> AFAIK the original VHDL code is correct though, since to_unsigned causes an
> error for negative inputs, catching the case where n = 0.
>
> Also note (n << 32) is not how to translate to_unsigned, the translation is
> complicated, though it can often be just the identity function.
>
> It's also often just Value.cast(n).as_unsigned() or just n.as_unsigned() if
> n is already a Value/Signal.
>
> For the WIP version of to_unsigned, see:
> https://github.com/nmigen/nmigen/issues/464
Thanks for your help Jacob. Fixing it now.
--
You are receiving this mail because:
You are on the CC list for the bug.
More information about the libre-soc-bugs
mailing list