From: Luke Kenneth Casson Leighton <lkcl@lkcl.net>
To: Libre-RISCV General Development <libre-riscv-dev@lists.libre-riscv.org>
Subject: Re: [libre-riscv-dev] Request for Scoreboard and Functional Units Update
Date: Sat, 30 May 2020 17:26:58 +0100
Message-ID: <CAPweEDxwQXzXpVzwY9fVAEeATVWfytpG5ccSE5vSorB7wekyGQ@mail.gmail.com> (raw)
In-Reply-To: <17CF5C16-41BC-496D-95DD-4384E78C7EBD@gatech.edu>
On Sat, May 30, 2020 at 3:59 PM Yehowshua <yimmanuel3@gatech.edu> wrote:
>
> So browsing through the codebase, it seems we have about 10ish functional units,
soc.fu.*:
* ALU (done)
* Logical (done)
* ShiftRot (done)
* MUL (not done - Jacob)
* DIV (not done - Jacob)
* Branch (done)
* TRAP (specified)
* SYS (specified)
* LDST ("odd one out")
* SPR (specified)
* CR - Condition Register (done)
of these:
* SYS, TRAP and SPR need writing (they've been defined, no unit test exists yet)
* MUL and DIV we're waiting for Jacob
* LDST depends on a functional L0CacheBuffer, however does not "fit"
the FU mould and kinda-qualifies as "partly complete" because the
majority of functionality is in the *Computation Unit* rather than an
actual "Pipeline".
> about 29 Scoreboard components. How many more scoreboard components and
> functional units are needed for August?
scoreboard components to be written: none. the entirety of the
scoreboard functionality was done well over a year ago, including
shadowing which covers branches, exceptions, traps, interrupts (and
predication when we add it).
the only reason i had to make changes (2 months ago) was for the
mutli-signal capability.
tying the components *together* is where the complexity lies.
Function Units: see above.
one additional absolutely critical blocker (which i *may* have solved,
today): the Computation Unit "Manager" <-> ALU interaction. this
*critically* relies on properly implementing the pipeline API... in
both the CompUnit (as sender *and* receiver) and the ALU (as receiver
and sender).
yes, the CompUnit "sends" (operands) to the ALU, then "receives" the
results (from the ALU). that's its job - its sole purpose. it's
basically as complex a FSM as any **PAIR** of interacting Wishbone or
AXI4 Bus Master Router-Arbiters, back-to-back, in the same code.
> All the functional units have some formal verification tests, how confident are we
> that the scoreboard works correctly?
strictly speaking: not in the slightest, until there exists full
formal verification for it (and for each component). there's a
special budget of EUR 6,000 *specifically* for that one task, because
it's (a) extremely involved and (b) actually covers quite a lot of
interaction(s) and components.
on a "proof-of-concept" level: reasonably confident.
score6600_multi.py is functional for ALU operations (including
overlapping ones, including parallel execution), and when i was
testing speculative branch operations (including cancellation either
way - correct / incorrect branches), that worked too. however that
was for "single read/write".
the complexity lies in the "allocation" of the required components, to
meet the register and FU allocation. i've defined the "regspec" API
to help meet that.
https://libre-soc.org/3d_gpu/architecture/regfile/
so this is why i said, last week, that it would be a good idea to take
an incremental approach:
https://bugs.libre-soc.org/show_bug.cgi?id=346
this allows us to "have something working" - complete, prove and bug
fix both the regfile *and* Function Units, get the "hello world" demo
out the door much faster than would otherwise be achievable, and
*then* add in the Dependency Matrices.
it works by only issuing one instruction, using the regfile buses
*exclusively* for that *ONE* Function Unit, waiting for that *ONE*
instruction to complete, before moving on to the next one.
this basically means that we would have an IPC of somewhere under...
0.3. as in: 3-5 cycles per instruction.
adding in the Dependency Matrices then becomes a straightforward
task... *if* we know full well that the Function Units properly comply
to the Pipeline API, interact properly with their Computational Unit
"Manager", properly read and write registers according to the Go_Read
/ Write - Req_Read / Req_Write protocol.
once added, the DMs bring us up to near a 1.0 IPC (branch prediction
being the key, there).
l.
_______________________________________________
libre-riscv-dev mailing list
libre-riscv-dev@lists.libre-riscv.org
http://lists.libre-riscv.org/mailman/listinfo/libre-riscv-dev
next prev parent reply index
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-30 14:58 Yehowshua
2020-05-30 16:26 ` Luke Kenneth Casson Leighton [this message]
2020-05-30 17:08 ` Yehowshua
2020-05-30 17:31 ` Luke Kenneth Casson Leighton
2020-05-30 21:34 ` Cole Poirier
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=CAPweEDxwQXzXpVzwY9fVAEeATVWfytpG5ccSE5vSorB7wekyGQ@mail.gmail.com \
--to=lkcl@lkcl.net \
--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