can I have unconstrained String as record element?

T

Tricky

Can I do what I asked, I suspect not, so Im thinking along the lines:

type my_record_type is
record
name : string(1 to 20);
....
end record my_record;

Basically, I want to be able to give the record name a constant string
when it is delcared like:

CONSTANT my_record : my_record_type := ( name => "Betty Swollocks",
--length only 15, complains unless I pad to 20 chars.
.......)

Or am I just going to have to pad the name with whitespace to make it
up to name'length?
 
K

KJ

Can I do what I asked, I suspect not, so Im thinking along the lines:

You suspect correctly, you can not have an unconstrained vector of any
type as a record element.
Basically, I want to be able to give the record name a constant string
when it is delcared like:

CONSTANT my_record : my_record_type := ( name => "Betty Swollocks",
--length only 15, complains unless I pad to 20 chars.
                                                                      .......)

Or am I just going to have to pad the name with whitespace to make it
up to name'length?

A cleaner way than simply typing in the extra whitespace is to define
a function that pads on the appropriate spaces and put that in the
same package where 'my_type' is defined.

function Padder(s: string) return string is
variable s0: string(1 to s'length) := s;
variable RetVal: string(my_record_type.name'range);
begin
RetVal := (others => ' ');
RetVal(s0'range) := s0;
...
end function Padder;

That way you can initialize constants like this...
CONSTANT my_record : my_record_type := ( name => Padder("Betty
Swollocks"),...

KJ
 
A

Andrew

Can I do what I asked, I suspect not, so Im thinking along the lines:

type my_record_type is
  record
    name    : string(1 to 20);
    ....
  end record my_record;

Basically, I want to be able to give the record name a constant string
when it is delcared like:

CONSTANT my_record : my_record_type := ( name => "Betty Swollocks",
--length only 15, complains unless I pad to 20 chars.
                                                                      .......)

Or am I just going to have to pad the name with whitespace to make it
up to name'length?

If you want variable length strings you can use an access type to
define a string pointer.

eg: type string_ptr is access string;

Your record would look something like this:

type my_record_type is
record
name : string_ptr;
....
end record my_record;

To set the string you use the "new" keyword to allocate memory.

my_record.name <= new string'("Betty Swollocks");

When you are done using my_record.name, you deallocate the memory
using the deallocate procedure.

Read up on access types.
 
R

Reuven

If you want variable length strings you can use an access type to
define a string pointer.

eg: type string_ptr is access string;

Your record would look something like this:

type my_record_type is
  record
    name    : string_ptr;
    ....
  end record my_record;

To set the string you use the "new" keyword to allocate memory.

my_record.name <= new string'("Betty Swollocks");

When you are done using my_record.name, you deallocate the memory
using the deallocate procedure.

Read up on access types.- Hide quoted text -

- Show quoted text -

Can a record containing access types be an entity port?
 
A

Andrew

Can a record containing access types be an entity port?

I don't think so... Signals and constants can't be declared as access
types. Access types are not synthesizable but they are incredibly
useful for testbenches.
 

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

Members online

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top