Libre RISC-V Mailing list Archives (accessible via public-inbox)
 help / color / Atom feed
From: bugzilla-daemon@libre-soc.org
To: libre-riscv-dev@lists.libre-riscv.org
Subject: [libre-riscv-dev] [Bug 216] LOAD STORE buffer needed
Date: Wed, 27 May 2020 11:10:54 +0000
Message-ID: <bug-216-13-aEUL5zJpse@https.bugs.libre-soc.org/> (raw)
In-Reply-To: <bug-216-13@https.bugs.libre-soc.org/>

https://bugs.libre-soc.org/show_bug.cgi?id=216

--- Comment #46 from Luke Kenneth Casson Leighton <lkcl@lkcl.net> ---
tobias, the DataMerger class looks good as a first cut: it looks like it
does the job.

couple of things:

----

+            for j in range(self.addr):

this should be self.array_size



----

+                with m.If(self.addr_match_i[j]>0):

instead of > 0, bool() can (should) be used:

                with m.If(self.addr_match_i[j].bool()):


-----

+                with m.If(self.addr_match_i[idx][j] && valid):

ah.  in nmigen, you can't use boolean operators (&& or ||) because
there is no operator-overload for "bool".  a PEP was actually raised
about this and, rather short-sightedly, turned down.

you therefore have to use the bit-wise operators, and make sure
that the things that you are comparing are only 1 bit wide.

                with m.If(self.addr_match_i[idx][j] & valid):

------

+            self.data_o.eq(0)

this line is not needed.  combinatorial circuits default to zero unless
you set some of the Signal initialisation arguments.



-----

+                    self.data_o.eq(self.data_i[j]|self.data_o)

this isn't python programming, unfortunately: you can't treat Signals in
a loop as "sequentially-accumulating variables".

this is why i said to use treereduce.  or, actually, now you can import
ortreereduce, from soc.regfile.regfile.

so do this instead:

            l = []
            for j in range(self.array_size):
                select = self.addr_match_i[idx][j] & valid)
                l.append(Mux(select, self.data_i[j], 0)
            self.data_o.eq(ortreereduce(l)

see how that works? because hardware is effectively "statically-assigned
variables", you can't really do dynamic-accumulation.  or... you can, but
it will create a massive chain of gates and the completion time will be
awful.

:)

so, use a Mux-in-a-loop, and tree-reduce them.  strictly speaking we
could hypothetically use the 2nd parameter of nmutil.utils.treereduce
to actually do the Mux there, reduce things down to maybe one or two
lines of code, however that's getting obtuse and "too clever" :)
too clever means the code becomes unreadable.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
libre-riscv-dev mailing list
libre-riscv-dev@lists.libre-riscv.org
http://lists.libre-riscv.org/mailman/listinfo/libre-riscv-dev

  parent reply index

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <bug-216-13@https.bugs.libre-soc.org/>
2020-04-19  9:51 ` bugzilla-daemon
2020-04-19  9:57 ` bugzilla-daemon
2020-04-19 15:22 ` bugzilla-daemon
2020-04-19 17:46 ` bugzilla-daemon
2020-04-20  9:10 ` bugzilla-daemon
2020-04-22 10:53 ` bugzilla-daemon
2020-04-22 12:17 ` bugzilla-daemon
2020-04-25 12:40 ` bugzilla-daemon
2020-04-26 11:28 ` bugzilla-daemon
2020-04-27 11:56 ` bugzilla-daemon
2020-04-29 11:16 ` bugzilla-daemon
2020-04-29 21:42 ` bugzilla-daemon
2020-05-01 13:27 ` bugzilla-daemon
2020-05-01 13:33 ` bugzilla-daemon
2020-05-04 10:21 ` bugzilla-daemon
2020-05-04 20:11 ` bugzilla-daemon
2020-05-06  0:33 ` bugzilla-daemon
2020-05-06  1:09 ` bugzilla-daemon
2020-05-06  1:11 ` bugzilla-daemon
2020-05-06  8:29 ` bugzilla-daemon
2020-05-06  8:42 ` bugzilla-daemon
2020-05-06 12:39 ` bugzilla-daemon
2020-05-06 13:12 ` bugzilla-daemon
2020-05-18  4:09 ` bugzilla-daemon
2020-05-23 15:17 ` bugzilla-daemon
2020-05-23 15:23 ` bugzilla-daemon
2020-05-24 19:29 ` bugzilla-daemon
2020-05-24 19:39 ` bugzilla-daemon
2020-05-25 10:36 ` bugzilla-daemon
2020-05-25 13:55 ` bugzilla-daemon
2020-05-26 12:50 ` bugzilla-daemon
2020-05-27 11:10 ` bugzilla-daemon [this message]
2020-05-28 12:35 ` bugzilla-daemon
2020-05-28 12:38 ` bugzilla-daemon
2020-05-28 13:07 ` bugzilla-daemon
2020-05-28 13:26 ` bugzilla-daemon
2020-05-28 20:34 ` bugzilla-daemon
2020-05-29 13:56 ` bugzilla-daemon
2020-05-29 16:17 ` bugzilla-daemon
2020-05-30 19:40 ` bugzilla-daemon
2020-06-02 18:26 ` bugzilla-daemon
2020-06-04 16:49 ` bugzilla-daemon
2020-06-05 19:17 ` bugzilla-daemon
2020-06-05 19:40 ` bugzilla-daemon
2020-06-07 23:42 ` bugzilla-daemon
2020-03-11 20:28 [libre-riscv-dev] [Bug 216] New: " bugzilla-daemon
2020-03-11 22:54 ` [libre-riscv-dev] [Bug 216] " bugzilla-daemon
2020-03-11 23:08 ` bugzilla-daemon
2020-03-12  1:54 ` bugzilla-daemon
2020-03-12 11:13 ` bugzilla-daemon
2020-03-12 13:35 ` bugzilla-daemon
2020-03-12 17:29 ` bugzilla-daemon
2020-03-13 11:50 ` bugzilla-daemon
2020-03-13 18:37 ` bugzilla-daemon
2020-03-13 20:16 ` bugzilla-daemon
2020-03-15 21:19 ` bugzilla-daemon
2020-03-16 17:25 ` bugzilla-daemon
2020-03-23 10:21 ` bugzilla-daemon
2020-03-24 13:55 ` bugzilla-daemon
2020-03-24 14:22 ` bugzilla-daemon
2020-03-24 18:00 ` bugzilla-daemon
2020-03-24 20:19 ` bugzilla-daemon
2020-03-24 20:27 ` bugzilla-daemon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-216-13-aEUL5zJpse@https.bugs.libre-soc.org/ \
    --to=bugzilla-daemon@libre-soc.org \
    --cc=libre-riscv-dev@lists.libre-riscv.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Libre RISC-V Mailing list Archives (accessible via public-inbox)

Archives are clonable: git clone --mirror https://inbox.libre-soc.org/libre-riscv-dev

Example config snippet for mirrors


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git