[libre-riscv-dev] ALU ported over from Verilog to nMigen

Luke Kenneth Casson Leighton lkcl at lkcl.net
Sun Aug 4 23:35:49 BST 2019


On Sun, Aug 4, 2019 at 11:16 PM Samuel Falvo II <sam.falvo at gmail.com> wrote:
>
> http://chiselapp.com/user/kc5tja/repository/kestrel-3/artifact/231dc2c2884b58d6
>
> The code has no accompanying tests yet (it will take some time to translate
> the Verilog unit tests over to nMigen).  But, might be worthy of a gander
> to those interested.

 niice - definitely.

> nMigen's code is significantly more verbose than Verilog in this case, even
> without considering the new set of comments to explain how the stuff works.

         lsh4 = Signal(xlen)
        with m.Switch(self.b[2]):
            with m.Case(Const(0)):
                comb += lsh4.eq(lsh2)
            with m.Case(Const(1)):
                comb += lsh4.eq(Cat(Const(0, 4), lsh2[0:xlen-4]))

could be:

                comb += Mux(self.b[2], lsh2, lsh4.eq(Cat(Const(0, 4),
lsh2[0:xlen-4])))

and there's nothing to stop you doing this:

    bin - self.b

or:

     bi = self.b

then reducing the line-length further:

                comb += Mux(bi[2], lsh2, lsh4.eq(Cat(Const(0, 4),
lsh2[0:xlen-4])))

also, likewise, you can declare some magic constants z1, z2, z4, z8, z16, z32:

z1 = Const(0, 1) # zero of length 1
z2 = Const(0, 2) # zero of length 2
z4 = Const(0, 4) # zero of length 4

and get it down *even more*:

            comb += Mux(bi[2], lsh2, lsh4.eq(Cat(z4, lsh2[0:xlen-4])))

and use those tricks everywhere, at which point you'll probably find
it starts to compact down to the same sort of size as the original
verilog.

before you do that: if you load the .il file into yosys then do this:

$yosys
> read_ilang alu.il
> proc
> opt
> show top

you'll find it extremely likely that the switch statements on
self.b[N] are in fact converted *to* Mux blocks.

l.



More information about the libre-riscv-dev mailing list