-DeeT
Guest
Fri May 13, 2011 7:43 pm
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
Alexander Bartolich
Guest
Sat May 14, 2011 10:02 pm
-DeeT wrote:
Quote:
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
Quote:
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
Tricky
Guest
Sun May 15, 2011 12:47 am
On May 13, 6:43 pm, -DeeT <d...@dt.prohosting.com> wrote:
Quote:
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) );