# time quantity in vhdl

Discussion in 'VHDL' started by Nav, Oct 1, 2003.

1. ### NavGuest

Hi,

could anyone help me out with this ? look at the following comments
inside the code.

constant cin:time := 20.0 fs;
constant r_p:time := 2000.0;
constant r_n:time := 2000.0;
begin
p1: process(x)
variable t:time;
begin
if(x'EVENT and x='1') then
--
--Can I assign a real value multiplication to a time quanity.

t := time(cin*r_n);
y <= (not x) after t ps;
else
-- This is working fine but the above t equation is not working.
t := 20.0*2.0 ps;
y <= (not x) after t;
end if;
end process p1;

thanks a lot.
naveen

Nav, Oct 1, 2003

2. ### David JonesGuest

In article <>,
Nav <> wrote:
>Hi,
>
>could anyone help me out with this ? look at the following comments
>inside the code.
>
>
> constant cin:time := 20.0 fs;
> constant r_p:time := 2000.0;
> constant r_n:time := 2000.0;

The last two declarations should be illegal, as they do not give a unit.

A physical type such as time is represented internally as an integer,
expressing a multiple of the base physical unit. So, if your simulation
time type starts off as fs, then 1 ns is represented as 1,000,000.

You are permitted to multiply and divide by scalars. The result is still
an integer, in the base unit. So, 1.5 * 3 fs is 4 fs or 5 fs, due to rounding
(the exact outcome is simulator-dependent.)

The other problem spot is that time quantities are often quantized to the
simulator time resolution. For example, if your simulation timestep is 1 ns,
then all time literals will be a multiple of 1,000,000 fs. At this point,
you get wierdness such as:

constant t1:time := 1 ps;
constant t2:time := 2 ps;

variable ratio: integer;

if (t1 = t2) then
-- Surprise! This branch executes if resolution is ns.
ratio := t2 / t1; -- And this halts due to divide by zero.
else
-- And this branch executes if resolution is ps.
ratio := t2 / t1; -- And this works fine, producing 2.
end if;

This is done to increase the dynamic range of time. The VHDL standard requires
that 1 fs be accepted as a time unit, but this allows simulation for only
18,445 seconds if time is to be tracked as a 64-bit integer. By quantizing
time to 64 bits, simulators permit much longer simulation runs while
sacrificing sub-ns precision which many users don't care about.

>begin
> p1: process(x)
> variable t:time;
> begin
> if(x'EVENT and x='1') then
>--
>--Can I assign a real value multiplication to a time quanity.
> t := time(cin*r_n);

If r_n were declared as:

constant r_n:real := 2000.0

then this is legal, and will result in 40,000 fs.

> y <= (not x) after t ps;
> else
>-- This is working fine but the above t equation is not working.
> t := 20.0*2.0 ps;
> y <= (not x) after t;
> end if;
> end process p1;
>
>thanks a lot.
>naveen

David Jones, Oct 1, 2003

3. ### NivGuest

It looks as if you've declared r_p & r_n as "time", so you're trying to
create "time_squared"
Make r_p & r_n of type INTEGER or NATURAL, then the multiply should work.

Niv.

"Nav" <> wrote in message
news:...
> Hi,
>
> could anyone help me out with this ? look at the following comments
> inside the code.
>
>
> constant cin:time := 20.0 fs;
> constant r_p:time := 2000.0;
> constant r_n:time := 2000.0;
> begin
> p1: process(x)
> variable t:time;
> begin
> if(x'EVENT and x='1') then
> --
> --Can I assign a real value multiplication to a time quanity.
>
> t := time(cin*r_n);
> y <= (not x) after t ps;
> else
> -- This is working fine but the above t equation is not working.
> t := 20.0*2.0 ps;
> y <= (not x) after t;
> end if;
> end process p1;
>
> thanks a lot.
> naveen

Niv, Oct 1, 2003
4. ### NavGuest

Hi Niv and dave,

Thanks for ur brief explanation into time....

I made one modification instead of defining r_p and r_n and c as time
I defined them as real. It makes sense since, if I define them all as
time then the varibale to which I assign this value will become time
squared which will make the physical quantity definition of t error.
I got it going... thanks to ur help....

keep it going folks,
Nav

"Niv" <niv**mines_a_pint_you_spamheads**@ntlworld.com> wrote in message news:<7bGeb.1615\$>...
> It looks as if you've declared r_p & r_n as "time", so you're trying to
> create "time_squared"
> Make r_p & r_n of type INTEGER or NATURAL, then the multiply should work.
>
> Niv.
>
> "Nav" <> wrote in message
> news:...
> > Hi,
> >
> > could anyone help me out with this ? look at the following comments
> > inside the code.
> >
> >
> > constant cin:time := 20.0 fs;
> > constant r_p:time := 2000.0;
> > constant r_n:time := 2000.0;
> > begin
> > p1: process(x)
> > variable t:time;
> > begin
> > if(x'EVENT and x='1') then
> > --
> > --Can I assign a real value multiplication to a time quanity.
> >
> > t := time(cin*r_n);
> > y <= (not x) after t ps;
> > else
> > -- This is working fine but the above t equation is not working.
> > t := 20.0*2.0 ps;
> > y <= (not x) after t;
> > end if;
> > end process p1;
> >
> > thanks a lot.
> > naveen

Nav, Oct 2, 2003