Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > VHDL > uniform does not give required results

Reply
Thread Tools

uniform does not give required results

 
 
indu
Guest
Posts: n/a
 
      08-25-2008
Hi All


Im using ncvhdl version 6.11. For some reason, the uniform function
suddenly does not work as required. The seed value does not change on
different calls to the uniform function. I have debugged my program to
find out the error but have not been successful. So, I have to write a
random generator function (that need not be synthesized). Could
somebody please tell me what algorithm to use for the same?


Thanks,

PS: This is not part of any homework/school work
 
Reply With Quote
 
 
 
 
Mike Treseler
Guest
Posts: n/a
 
      08-25-2008
indu wrote:

> Im using ncvhdl version 6.11. For some reason, the uniform function
> suddenly does not work as required. The seed value does not change on
> different calls to the uniform function.



http://groups.google.com/groups/?q=v...clare+variable
 
Reply With Quote
 
 
 
 
indu
Guest
Posts: n/a
 
      08-25-2008
Thanks. I have initialised it but the seed does not seem to be
changing.

Im pasting a snippet of my code.

procedure random_vector(
variable seed1 :inout integer;
variable seed2 :inout integer;
variable vmax : in integer;
variable result : out integer ) is

variable x : real;
begin
UNIFORM(seed1,seed2,x);
i := integer(x) mod vmax;
result := i;
end procedure random_vector;
begin
xx: process is
....
....
variable seed1, seed2 : integer := 1
random_vector(seed1 => seed1, seed2 => seed2, vmax, x=>x);

....
end process

When I run this behavorial code, I see that the value of seed does not
change between calls. Am I doing something wrong here?

Thanks,


On Aug 25, 2:31 pm, Mike Treseler <(E-Mail Removed)> wrote:
> indu wrote:
> > Im using ncvhdl version 6.11. For some reason, the uniform function
> > suddenly does not work as required. The seed value does not change on
> > different calls to the uniform function.

>
> http://groups.google.com/groups/?q=v...clare+variable


 
Reply With Quote
 
Mike Treseler
Guest
Posts: n/a
 
      08-25-2008
indu wrote:
> Thanks. I have initialised it but the seed does not seem to be
> changing.


Your procedure is out of process scope.
Maybe test it without a procedure first.

-- Mike T

xx: process is
variable ...
-- <----procedure declaration goes here
-- other declarations
begin
-- ...
 
Reply With Quote
 
Tricky
Guest
Posts: n/a
 
      08-26-2008
On 25 Aug, 20:29, indu <(E-Mail Removed)> wrote:
> Thanks. I have initialised it but the seed does not seem to be
> changing.
>
> Im pasting a snippet of my code.
>
> procedure random_vector(
> * variable seed1 :inout integer;
> * variable seed2 :inout integer;
> * variable vmax * : in integer;
> * variable result : out integer ) is
>
> * *variable x : real;
> * *begin
> * * * * UNIFORM(seed1,seed2,x);
> * * * * i := integer(x) mod vmax;
> * * * * result := i;
> * end procedure random_vector;
> begin
> xx: process is
> ...
> ...
> variable seed1, seed2 *: integer := 1
> random_vector(seed1 => seed1, seed2 => seed2, vmax, x=>x);
>
> ...
> end process
>
> When I run this behavorial code, I see that the value of seed does not
> change between calls. Am I doing something wrong here?
>
> Thanks,
>


The seed values have to be possitive, but this should only throw an
error rather than not work at all, but you have a problem with the x
output from the UNIFORM function.

> UNIFORM(seed1,seed2,x);
> i := integer(x) mod vmax;
> result := i;


X is a real value that will be a value between 0 and 1. casting it to
and integer will then just result in 0 or 1, and overall your "result"
value will end up just being 0 or 1, regardless of VMAX. You need to
take the returned x value and use that the scale the return value to
something more meaningful. It is best to work with real types until
the very end.

In the words of blue peter: here's one I prepared earlier:

procedure rand_int( variable seed1, seed2 : inout positive;
min, max : in integer; --
boundaries for the random result (inclusive)
result : out integer) is
variable rand : real;
begin
uniform(seed1, seed2, rand);
result := integer(
real(min) --set the base
+ (rand * (real(max)-real(min)) ) -- add in the random
offset from the base, over a given range.
);
end procedure;
 
Reply With Quote
 
indu
Guest
Posts: n/a
 
      08-26-2008
Thanks Tricky. You are right. I dint realise that at all.

On Aug 26, 10:12 am, Tricky <(E-Mail Removed)> wrote:
> On 25 Aug, 20:29, indu <(E-Mail Removed)> wrote:
>
>
>
> > Thanks. I have initialised it but the seed does not seem to be
> > changing.

>
> > Im pasting a snippet of my code.

>
> > procedure random_vector(
> > variableseed1 :inout integer;
> > variableseed2 :inout integer;
> > variablevmax : in integer;
> > variableresult : out integer ) is

>
> > variablex : real;
> > begin
> > UNIFORM(seed1,seed2,x);
> > i := integer(x) mod vmax;
> > result := i;
> > end procedure random_vector;
> > begin
> > xx: process is
> > ...
> > ...
> >variableseed1, seed2 : integer := 1
> > random_vector(seed1 => seed1, seed2 => seed2, vmax, x=>x);

>
> > ...
> > end process

>
> > When I run this behavorial code, I see that the value of seed does not
> > change between calls. Am I doing something wrong here?

>
> > Thanks,

>
> The seed values have to be possitive, but this should only throw an
> error rather than not work at all, but you have a problem with the x
> output from theUNIFORMfunction.
>
> > UNIFORM(seed1,seed2,x);
> > i := integer(x) mod vmax;
> > result := i;

>
> X is a real value that will be a value between 0 and 1. casting it to
> and integer will then just result in 0 or 1, and overall your "result"
> value will end up just being 0 or 1, regardless of VMAX. You need to
> take the returned x value and use that the scale the return value to
> something more meaningful. It is best to work with real types until
> the very end.
>
> In the words of blue peter: here's one I prepared earlier:
>
> procedure rand_int(variableseed1, seed2 : inout positive;
> min, max : in integer; --
> boundaries for the random result (inclusive)
> result : out integer) is
> variablerand : real;
> begin
> uniform(seed1, seed2, rand);
> result := integer(
> real(min) --set the base
> + (rand * (real(max)-real(min)) ) -- add in the random
> offset from the base, over a given range.
> );
> end procedure;


 
Reply With Quote
 
indu
Guest
Posts: n/a
 
      08-26-2008
Thanks Tricky. You are right. I dint realise that at all.

On Aug 26, 10:12 am, Tricky <(E-Mail Removed)> wrote:
> On 25 Aug, 20:29, indu <(E-Mail Removed)> wrote:
>
>
>
> > Thanks. I have initialised it but the seed does not seem to be
> > changing.

>
> > Im pasting a snippet of my code.

>
> > procedure random_vector(
> > variableseed1 :inout integer;
> > variableseed2 :inout integer;
> > variablevmax : in integer;
> > variableresult : out integer ) is

>
> > variablex : real;
> > begin
> > UNIFORM(seed1,seed2,x);
> > i := integer(x) mod vmax;
> > result := i;
> > end procedure random_vector;
> > begin
> > xx: process is
> > ...
> > ...
> >variableseed1, seed2 : integer := 1
> > random_vector(seed1 => seed1, seed2 => seed2, vmax, x=>x);

>
> > ...
> > end process

>
> > When I run this behavorial code, I see that the value of seed does not
> > change between calls. Am I doing something wrong here?

>
> > Thanks,

>
> The seed values have to be possitive, but this should only throw an
> error rather than not work at all, but you have a problem with the x
> output from theUNIFORMfunction.
>
> > UNIFORM(seed1,seed2,x);
> > i := integer(x) mod vmax;
> > result := i;

>
> X is a real value that will be a value between 0 and 1. casting it to
> and integer will then just result in 0 or 1, and overall your "result"
> value will end up just being 0 or 1, regardless of VMAX. You need to
> take the returned x value and use that the scale the return value to
> something more meaningful. It is best to work with real types until
> the very end.
>
> In the words of blue peter: here's one I prepared earlier:
>
> procedure rand_int(variableseed1, seed2 : inout positive;
> min, max : in integer; --
> boundaries for the random result (inclusive)
> result : out integer) is
> variablerand : real;
> begin
> uniform(seed1, seed2, rand);
> result := integer(
> real(min) --set the base
> + (rand * (real(max)-real(min)) ) -- add in the random
> offset from the base, over a given range.
> );
> end procedure;


 
Reply With Quote
 
Tricky
Guest
Posts: n/a
 
      08-27-2008
No Problem

One thing I didnt realise till yesterday - MIN and MAX are inclusive
boundaries, but do not have the same distribution as the other values.
eg:

MIN = 0, MAX = 5

over 100 repetitions, mean distribution is:

0 = 10
1 = 20
2 = 20
3 = 20
4 = 20
5 = 10

To make it evenly distributed, you'll need to + or - 0.5 from the end
result before converting to an integer. This will make it exclusive of
min (+0.5) or max (-0.5). For most useful purposes, it shouldnt really
matter though.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Does shuffle() produce uniform result ? tooru honda Python 30 09-10-2007 07:52 AM
FAQ Topic - Why does simple decimal arithmetic give strange results? FAQ server Javascript 2 08-17-2007 07:16 AM
Does c++ have an uniform class library? JTL C++ 38 12-07-2006 05:38 PM
Uniform vector class, inheriting from Array: How to make sure thatmethods return a Vector and not an Array? Thomas Ruby 7 05-23-2005 04:21 PM
Give us 3 minutes; we give you the whole library lib Computer Support 0 01-27-2005 07:52 AM



Advertisments