slice of signed = unsigned?

D

-DeeT

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
 
A

Alexander Bartolich

-DeeT said:
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);
 
T

Tricky

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) );
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top