[Libre-soc-isa] [Bug 560] big-endian little-endian SV regfile layout idea

bugzilla-daemon at libre-soc.org bugzilla-daemon at libre-soc.org
Wed Dec 30 23:55:52 GMT 2020


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

--- Comment #16 from Luke Kenneth Casson Leighton <lkcl at lkcl.net> ---
(In reply to Alexandre Oliva from comment #12)

> now, I don't know what LE SRAM really means. 

see the union datastructure.
https://libre-soc.org/openpower/sv/overview/#elwidths


> to me, the register file has
> no endianness whatsoever; 

in a scalar system you would be absolutely correct.

with the elwidth overrides effectively being a union of

uint8_t []
uint16_t []
uint32_t []
uint64_t []

now the underlying order *does* matter.

you set b[1] to 0x55 does that mean that w[0] contains 0xnnnn55nn?

if the underlying SRAM is treated as LE the answer is YES.

if the underlying SRAM of the regfile is treated as "a direct representation of
memory" i will be LITERALLY unable to cope with the complexity introduced due
to MASSIVE confusion as to what is now in which order.




> each register holds a number of bits, from least
> to most significant, that get ordered one way or another, depending on
> hardware configuration, when storing the register in memory, or when loading
> it from memory. 

yes.  and OpenPOWER has some strict rules that took 5 months to correctly
implement.

i am simply not going through that again.


> memory has endianness, because it's external to the cpu,
> and it can be accessed and addressed in different granularities; registers
> don't, because they are conceptually just a collection of flip-flops that
> are operated on as a coherent unit

in a scalar system yes.

in any other vectir system yes.

in our extremely unique system which is effectively a union typecast of
different c style arrays with an underlying uint8_t[8] array...

... no.


>  arguing about their bit order is like
> arguing whether the flip-flops have to be ordered left-to-right or
> right-to-left.  it doesn't matter, as long as the wiring connects each bit
> to the right place. 

again: this is correct for scalar ISAs, correct for normal vector ISAs, and
completely wrong for SV due to us using the 64 bit scalar regfile to store
sequential array overloads.


> having expressed this distinction on how I reason, hopefully it will be
> clear why your response is not an answer to my question. 

it allows me to highlight the error in that reasoning, yes 

> you don't get down
> to the memory addresses, you just number the bytes of the registers, which
> might be ordered by significance, 

no.  a decision has to be made as to which order the uint8[] array elwidth
override will place bytes into the underlying 8 bytes of the register.

this categorically and definitively decides in which order the byte-level
WRITEENABLE lines will be pulled and numbered: backwards or forwards.

i CANNOT COPE if those numbers are calculated by forcibly subtracting them from
7 in some cases, 3 in others, 1 for halfwords.

it's just an absolute recipe for disaster.

therefore the ordering *IS* LE SRAM order.



> or by corresponding memory address if
> stored.
> 
> now, does assuming "LE processor mode" imply we don't care about BE at all? 
> that would remove a lot of the potential complications I was running up
> against.

the decision has already been made to support Scalar OpenPOWER LE/BE and the
code is already in the repository with unit tests passing.

due to it taking 5 months to spot bugs i do not want to touch it again without
a damn good reason.

> or are you talking about code vs data endianness? (IIRC PPC can choose them
> separately)

it can.  we are not.

> 
> anyway, *my* suggestion was just that the iteration order over sub-register
> vector elements made it so that the first element matched the register when
> used as a scalar,

which is achieved by setting LE SRAM order in the underlying SRAM of the
regfile.

> so as to avoid the risk that loading a single byte, using
> a vector-prefixed scalar load, lands it in the MSByte of the register,
> unlike the byte-load instruction.  alas, with big endian, it looks like the
> natural whole-register array layout would map the first element to the
> most-significant end of the register instead.

correct.  hence why i consider it to be a dangerous idea, and had already
naturally assumed that the SRAM would be LE, such that the c-based union would
be an accurate and definitive representation.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


More information about the Libre-SOC-ISA mailing list