[Libre-soc-dev] [OpenPOWER-HDL-Cores] mfocr and mtocrf v3.0B spec ambiguity
    Luke Kenneth Casson Leighton 
    lkcl at lkcl.net
       
    Sat Aug 29 14:26:08 BST 2020
    
    
  
On Sat, Aug 29, 2020 at 2:20 AM Paul Mackerras <paulus at ozlabs.org> wrote:
>
> On Fri, Aug 28, 2020 at 11:50:36AM +0100, Luke Kenneth Casson Leighton wrote:
>
> > i will need to alter the pseudocode so that it no longer has
> > "undefined" behaviour, simply selecting the highest priority (one-hot)
> > and always placing a value into CR. there should be no need to have a
> > new field (modify section 1.6.9).
> >
> > likewise the mfocrf pseudocode would need altering to ignore "if count
> > = 1" and always select a one-hot.
> >
> > am i right in thinking that the for-loop does not need altering?  that
> > it can just be this:
> >
> >     do i = 0 to 7
> >       if FXM[i] = 1 then
> >         n <- i
> >     CR[4*n+32:4*n+35] <- (RS)[4*n+32:4*n+35]
> >
> > or does it need to be:
> >
> >     do i = 7 to 0       # inverted order
> >       if FXM[i] = 1 then
> >         n <- i
> >     CR[4*n+32:4*n+35] <- (RS)[4*n+32:4*n+35]
>
> Assuming the indexing of FXM uses big-endian bit numbering, then you
> want the second version, since n will be set to the index of the last
> bit that the loop sees is set, and you want that to be the most
> significant set bit.
ok.  so that's a LSB priority picker.
> Strictly speaking you should have a test that FXM is non-zero as well,
> otherwise n would be undefined.  I don't know what P9 does with
> FXM=0.
we'll have to find out.
> The comment in microwatt's fxm_to_num implies that existing
> hardware will update cr7 in that case.
crhelpers.vhdl.  ah... the default is zero?
        -- If no fields are set (undefined), also match existing
        -- hardware by returning cr7.
        return 7;
    end;
    function num_to_fxm(num: crnum_t) return crmask_t is
    begin
        case num is
            when 0 =>
                return "10000000";
            ....
            ....
            when others =>
                return "00000000";  <----- zero, here
> Initializing n to 7 in your
> pseudocode would match that behaviour.
got it.
l.
    
    
More information about the Libre-soc-dev
mailing list