[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