slice of signed = unsigned?

D

-DeeT

Guest
If you take a slice of a signed vector which doesn't include the sign
bit, is that slice considered to be signed or unsigned? Here's an
illustration:

signal v : signed(7 downto 0);
alias a is v(3 downto 0);
variable i : integer;
i := to_integer(a);

In the above scenario, what is the range of possible values for 'i'?
Is it 0 to 15, or -8 to +7?

I ask because a compiler upgrade broke some of my code, by changing
this behavior (which admittedly I shouldn't have counted on either
way!).

Thanks in advance for your thoughts...
-DT
 
-DeeT wrote:
If you take a slice of a signed vector which doesn't include the sign
bit, is that slice considered to be signed or unsigned? Here's an
illustration:

signal v : signed(7 downto 0);
alias a is v(3 downto 0);
variable i : integer;
i := to_integer(a);
IEEE Std 1076-1993 (Revision of IEEE Std 1076-1987), page 75

# 4.3.3.1 Object aliases
# [...]
# The name must be a static name (see 6.1) that denotes an object. The
# base type of the name specified in an alias declaration must be the
# same as the base type of the type mark in the subtype indication (if
# the subtype indication is present); this type must not be a multi-
# dimensional array type. When the object denoted by the name is
# referenced via the alias defined by the alias declaration, the following
# rules apply:
# - If the subtype indication is absent or if it is present and denotes
# an unconstrained array type:
# - If the alias designator denotes a slice of an object, then the
# subtype of the object is viewed as if it were of the subtype
# specified by the slice
# - Otherwise, the object is viewed as if it were of the subtype
# specified in the declaration of the object denoted by the name

In the above scenario, what is the range of possible values for 'i'?
Is it 0 to 15, or -8 to +7?
To my understanding the alias is equivalent to a declaration like

signal a: signed(3 downto 0);

--
host -t mx moderators.isc.org
 
On May 13, 6:43 pm, -DeeT <d...@dt.prohosting.com> wrote:
If you take a slice of a signed vector which doesn't include the sign
bit, is that slice considered to be signed or unsigned?  Here's an
illustration:

signal v : signed(7 downto 0);
alias a is v(3 downto 0);
variable i : integer;
i := to_integer(a);

In the above scenario, what is the range of possible values for 'i'?
Is it 0 to 15, or -8 to +7?

I ask because a compiler upgrade broke some of my code, by changing
this behavior (which admittedly I shouldn't have counted on either
way!).

Thanks in advance for your thoughts...
-DT
Signed and Unsigned are two completely different types, so slicing
them just returns a subtype of the base type. But they are similar
types, so you can cast from one type to the other without a conversion
function.

So you could write this instead:

i := to_integer( unsigned(a) );
 

Welcome to EDABoard.com

Sponsor

Back
Top