Global constants definition problem

W

Weng Tianxiang

Guest
Hi,
Help is needed.

I have some global constants shared among several modules, so I
set up a file to define a global package like the following:

Package MG_x_Constant is
constant DATA_BITS : integer := 16;
constant DATA_RANGE : real := (2.0**16);
-- constant DATA_BITS : integer := 64;
-- constant DATA_RANGE : real := (2.0**64);


-- used in all test bench
constant DATABITS : integer := DATA_BITS;

end MG_x_Constant;

Package body MG_x_Constant is
....
end MG_x_Constant;

In other modules, DATA_BITS, DATABITS are freely used.

This morning I found a problem:
when I changed DATA_BITS from 16 to 64, the ModelSim
sim window still shows constant DATABITS = 16 and it never changed,
even though I tried to delete the module from library and
re-compile it again. constant DATABITS = 16 doesn't change.

IN compilation order, the global package definition file is always the
first one.

I though if the global constant definition changes, all its appearance
should change, but it doesn't. Why?

What is wrong with the above statements?

Thank you.

Weng
 
Hello,
Try to recompile ALL sources which references to this package. I think
about modelsim don't check & update referenced variables under
compilation process in other sources.

Best regards

Weng Tianxiang wrote:
Hi,
Help is needed.

I have some global constants shared among several modules, so I
set up a file to define a global package like the following:

Package MG_x_Constant is
constant DATA_BITS : integer := 16;
constant DATA_RANGE : real := (2.0**16);
-- constant DATA_BITS : integer := 64;
-- constant DATA_RANGE : real := (2.0**64);


-- used in all test bench
constant DATABITS : integer := DATA_BITS;

end MG_x_Constant;

Package body MG_x_Constant is
...
end MG_x_Constant;

In other modules, DATA_BITS, DATABITS are freely used.

This morning I found a problem:
when I changed DATA_BITS from 16 to 64, the ModelSim
sim window still shows constant DATABITS = 16 and it never changed,
even though I tried to delete the module from library and
re-compile it again. constant DATABITS = 16 doesn't change.

IN compilation order, the global package definition file is always the
first one.

I though if the global constant definition changes, all its appearance
should change, but it doesn't. Why?

What is wrong with the above statements?

Thank you.

Weng
 
Jozsef wrote:
Hello,
Try to recompile ALL sources which references to this package. I think
about modelsim don't check & update referenced variables under
compilation process in other sources.

Best regards

Weng Tianxiang wrote:
Hi,
Help is needed.

I have some global constants shared among several modules, so I
set up a file to define a global package like the following:

Package MG_x_Constant is
constant DATA_BITS : integer := 16;
constant DATA_RANGE : real := (2.0**16);
-- constant DATA_BITS : integer := 64;
-- constant DATA_RANGE : real := (2.0**64);


-- used in all test bench
constant DATABITS : integer := DATA_BITS;

end MG_x_Constant;

Package body MG_x_Constant is
...
end MG_x_Constant;

In other modules, DATA_BITS, DATABITS are freely used.

This morning I found a problem:
when I changed DATA_BITS from 16 to 64, the ModelSim
sim window still shows constant DATABITS = 16 and it never changed,
even though I tried to delete the module from library and
re-compile it again. constant DATABITS = 16 doesn't change.

IN compilation order, the global package definition file is always the
first one.

I though if the global constant definition changes, all its appearance
should change, but it doesn't. Why?

What is wrong with the above statements?

Thank you.

Weng
Hi Jozsef,
I re-compiled every modules, but the constants in global package don't
change as if they were compiled once and never re-compiled again.

I even deleted all work directory contents, recompile every modules,
but constants in the global package still don't change.

That is what I have experienced.

Any other ideas?

Weng
 
Weng Tianxiang wrote:

I even deleted all work directory contents, recompile every modules,
but constants in the global package still don't change.
Maybe they are declared in more than one place.

-- Mike Treseler
 
Mike Treseler wrote:
Weng Tianxiang wrote:

I even deleted all work directory contents, recompile every modules,
but constants in the global package still don't change.

Maybe they are declared in more than one place.

-- Mike Treseler
Hi MIke,
Never!

I tried to move all constant definitions from package entity module to
package body module, all constants usage are errors.

Weng
 
Weng Tianxiang wrote:
Mike Treseler wrote:
Weng Tianxiang wrote:

I even deleted all work directory contents, recompile every modules,
but constants in the global package still don't change.

Maybe they are declared in more than one place.

-- Mike Treseler

Hi MIke,
Never!

I tried to move all constant definitions from package entity module to
package body module, all constants usage are errors.

Weng
Hi,
Is it possible that the error happens because I have used 2 levels of
constants:

constant DATA_BITS : integer := 16; <-- I change this value,
constant DATABITS : integer := DATA_BITS; <-- this value doesn't
change

Weng
 
On 6 Sep 2006 08:07:21 -0700, "Weng Tianxiang" <wtxwtx@gmail.com> wrote:

Jozsef wrote:
Hello,
Try to recompile ALL sources which references to this package. I think
about modelsim don't check & update referenced variables under
compilation process in other sources.

I have some global constants shared among several modules, so I
set up a file to define a global package like the following:

Package MG_x_Constant is
....
end MG_x_Constant;

This morning I found a problem:
when I changed DATA_BITS from 16 to 64, the ModelSim
sim window still shows constant DATABITS = 16 and it never changed,
even though I tried to delete the module from library and
re-compile it again.

I re-compiled every modules, but the constants in global package don't
change as if they were compiled once and never re-compiled again.

I even deleted all work directory contents, recompile every modules,
but constants in the global package still don't change.
I've just been through something similar. What happened in my case was:

the package was compiled into a library, and included in my desigh via
"Library/Use" statements.

The library was mapped into a particular Modelsim directory, and this
mapping was stored in modelsim.ini, in the directory where I was working
on the package.

Later, when I worked on the design, I found it using an OLD version of
the package - because its mapping for that library was in a DIFFERENT
modelsim.ini file (because the design was in a different place from the
package).

I got into this mess because this project was a combination of two older
ones, and not a fresh start.

This may not be your problem, but it's worth checking the library
mapping paths in ALL relevant versions of modelsim.ini are what you
expect.

- Brian
 
Brian Drummond wrote:
On 6 Sep 2006 08:07:21 -0700, "Weng Tianxiang" <wtxwtx@gmail.com> wrote:


Jozsef wrote:
Hello,
Try to recompile ALL sources which references to this package. I think
about modelsim don't check & update referenced variables under
compilation process in other sources.

I have some global constants shared among several modules, so I
set up a file to define a global package like the following:

Package MG_x_Constant is
...
end MG_x_Constant;

This morning I found a problem:
when I changed DATA_BITS from 16 to 64, the ModelSim
sim window still shows constant DATABITS = 16 and it never changed,
even though I tried to delete the module from library and
re-compile it again.

I re-compiled every modules, but the constants in global package don't
change as if they were compiled once and never re-compiled again.

I even deleted all work directory contents, recompile every modules,
but constants in the global package still don't change.

I've just been through something similar. What happened in my case was:

the package was compiled into a library, and included in my desigh via
"Library/Use" statements.

The library was mapped into a particular Modelsim directory, and this
mapping was stored in modelsim.ini, in the directory where I was working
on the package.

Later, when I worked on the design, I found it using an OLD version of
the package - because its mapping for that library was in a DIFFERENT
modelsim.ini file (because the design was in a different place from the
package).

I got into this mess because this project was a combination of two older
ones, and not a fresh start.

This may not be your problem, but it's worth checking the library
mapping paths in ALL relevant versions of modelsim.ini are what you
expect.

- Brian
Hi,
Thank you everyone who gave me an answer.

The problem is resolved, I would like to share the lesson
I learned from this experience.

1. Original code:
DATABITS_16_32_64 <= 64 when DATABITS = 64 else
32 when DATABITS = 32 else
16; -- for data bits between 4-16

BlockRAM_A: for I in 0 to 2 generate
BlockRAM_0: BlockRAM
generic map (
DATABITS => DATABITS_16_32_64,
DEPTH => LEVEL_X)
port map (
...
);
end generate;

The problem is the following statement:
DATABITS_16_32_64 <= 64 when DATABITS = 64 else
32 when DATABITS = 32 else
16; -- for data bits between 4-16

I thought DATABITS_16_32_64 was assigned value before it was used
in generic map, but it is wrong.

Because block BlockRAM_A and DATABITS_16_32_64 assignment statement
are in concurrent area, DATABITS_16_32_64 in generate map (...)
doesn't use the value it is assigned to in the above statement.
When loading, ModelSim immediately reports
error for situation of DATABITS = 16 so that it seems to me that
global variable DATABITS doesn't change.

1. The answers everyone gave show unanimously that
the grammar I used in global file is right;
2. So I abandoned my original idea to search for other clues.
3. Luckyly, I found the error after one day rest about the problem.

The following is the right coding for the segment:

BlockRAM_A: for I in 0 to 2 generate
BlockRAM_64 : if DATABITS = 64 generate
BlockRAM_0: BlockRAM
generic map (
DATABITS => 64,
DEPTH => LEVEL_X)
port map (
...
);
end generate;

BlockRAM_64 : if DATABITS = 32 generate
BlockRAM_0: BlockRAM
generic map (
DATABITS => 32,
DEPTH => LEVEL_X)
port map (
...
);
end generate;

BlockRAM_64 : if(DATABITS /= 64 and DATABITS /= 32) generate
BlockRAM_0: BlockRAM
generic map (
DATABITS => 16,
DEPTH => LEVEL_X)
port map (
...
);
end generate;
end generate;

Thank you.

Weng
 
Weng Tianxiang:


1. Original code:
DATABITS_16_32_64 <= 64 when DATABITS = 64 else
32 when DATABITS = 32 else
16; -- for data bits between 4-16

Why do you make DATABITS_16_32_64 a signal? All your problems derive from
that. It looks like a constant to me.

Something like this would evaluate before the generic maps:
constant DATABITS_16_32_64: integer := (((DATABITS-1)/16)+1)*16;

DATABITS 4 to 16 : DATABITS_16_32_64 is 16
DATABITS 32 : DATABITS_16_32_64 is 32
DATABITS 64 : DATABITS_16_32_64 is 64.

Other cases irrelevant, I assume.

--
jr
 
jr wrote:
Weng Tianxiang:


1. Original code:
DATABITS_16_32_64 <= 64 when DATABITS = 64 else
32 when DATABITS = 32 else
16; -- for data bits between 4-16


Why do you make DATABITS_16_32_64 a signal? All your problems derive from
that. It looks like a constant to me.

Something like this would evaluate before the generic maps:
constant DATABITS_16_32_64: integer := (((DATABITS-1)/16)+1)*16;

DATABITS 4 to 16 : DATABITS_16_32_64 is 16
DATABITS 32 : DATABITS_16_32_64 is 32
DATABITS 64 : DATABITS_16_32_64 is 64.

Other cases irrelevant, I assume.

--
jr
Hi Jr,
Wow! Wonderful !!!

Your answer is very clever and absolute better than mine. I will use
your code immediately without any conditions.

I learned a trick from you.

Thank you very much.

Weng
 

Welcome to EDABoard.com

Sponsor

Back
Top