Re: [sv-bc] part selects on arbitrary expressions

From: Greg Jaxon <Greg.Jaxon_at_.....>
Date: Mon Mar 12 2007 - 11:17:42 PDT
Brad Pierce wrote:
> What should be displayed for the following simple test case?
> 
> //    6 6 4 ?
> //    0 6 4 ?
> //  17 17 4 ?
> module test;
>    logic [7:0] unpacked_array [17:11];
>    logic [17:11] [7:0] packed_array;
>    logic [3:7] bit_vector1;
>    logic [7:3] bit_vector2;
>    localparam U = $left(type(unpacked_array[17:11]));
>    localparam P = $left(type(  packed_array[17:11]));
>    localparam A = $left(type(bit_vector1+bit_vector2));
>    initial $display(U,P,A);
> endmodule
> 
> Until the LRM clearly specifies the values of the parameters U, P and A,
> we shouldn't be adding more complications.
> 
> [ In reply to http://www.eda-stds.org/sv-bc/hm/5684.html .]

The sensible answers, in my opinion, are either 0 6 4 or 17 17 4.

Let's call 0 6 and 4 the "normalized" left bound of the above testcases,
because it is the bound we have elsewhere specified that the language
delivers when it knows only the length of a given result dimension.

Although conservative instinct makes us wish that $left of
bit_vector2 + bit_vector2 would be "7", Brad immediately reminds us, with
bit_vector1 + bit_vector2, that consistency requires us to accept "4",
even when the operands had the same bounds (it might just be coincidence!).

I can only think of only one good reason that part select should yield a result
with normalized bounds on the selected dimension.

1) We need normalized bounds for the result of "slice" notation:  A[x-:L].
    The length L is constant whereas x may vary.  Here slice is acting
    like a typical operator - It seems 'consistent' to carry this rule
    over to traditional part-selects.

I can think of two reasons for part-select to retain the bounds it was given:

1) "Doing the math" to normalize them comes with some complications.
    A[MAX_INT: -1] requires us to construct MAX_INT+1 as an upper bound.
    You can snicker at this counter-example, but More's empty arrays can
    have such dimensions... and, in general, the precision needed to
    store any length is one bit wider than needed by its bounds, which
    might affect some implementers.

2) PARAMETER P = A;  is probably already well-defined so that P picks up
    the bounds declared for A, not normalized bounds (is this true?).
    In any case, part-selects of the whole array are easy to mistake for the
    array itself, and users might not appreciate a difference between
    "parameter P[17:11] = A;" and "parameter P = A[17:11];"  when those are
    the bounds declared for A.

The conservative rule - that the bounds of the part select A[L:R]
should be L and R - is seductive and a few systems may already do this (?).
But it's not so consistent with the view that part-select is one of the
"operators", which typically lose bounds info, not preserve it.

I regard the reasons for conserving bounds as more sentimental than formal.
So I favor 0 6 4 as the answer to Brad's question.
If saying so improves 17 17 4's chances in committee, I apologize.

Greg


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Mon Mar 12 11:17:59 2007

This archive was generated by hypermail 2.1.8 : Mon Mar 12 2007 - 11:18:15 PDT