RE: [sv-ec] Question about seeding $urandom

From: Arturo Salz <Arturo.Salz_at_.....>
Date: Wed Jun 10 2009 - 19:06:38 PDT
I just realize that the srandom method is missing from the process prototype in section 9.7.

Perhaps we should try to fix that as a typo for this LRM?

        Arturo

-----Original Message-----
From: owner-sv-ec@eda.org [mailto:owner-sv-ec@eda.org] On Behalf Of Clifford E. Cummings
Sent: Wednesday, June 10, 2009 5:43 PM
To: sv-ec@eda.org
Subject: RE: [sv-ec] Question about seeding $urandom

Hi, Ray -

This also helps! In fact, as I kept reading into section 18.14.2, I
found another working example of what I needed:

process::self.srandom(seed);

Your example (b) (below) is particularly interesting.

Essentially declare a process handle "p" and don't do anything with
it until we enter the initial block.

Once inside the initial block, grab a handle to the active initial
block p.self() (?? - is this analysis true) and assign the initial
block process handle to the declared "p" handle and then proceed to
seed the p-handle, which points to the active initial block process (??)

I appreciate the education. I was not getting it from the LRM.

Regards - Cliff

At 05:24 PM 6/10/2009, Ryan, Ray wrote:
>
>Cliff,
>
>The $urandom and $urandom_range methods both use the RNG(Random Number
>Generator)
>of the executing thread. Each thread has it's own RNG. The state of the
>RNG for
>a dynamic process (thread) is initially seeded with the next random
>number from the
>RNG of the executing thread when the a dynamic process is created. See
>18.14.1 for
>initialization of the RNG for static threads.
>
>The RNG state of a thread can be seeded by either:
>a) calling $urandom(seed). The value of the parameter is used to seed
>the internal
>    RNG state of the executing thread. The method then returns the next
>random
>    number from initialized RNG. For example:
>         $display( $urandom(10) );  // seed the thread RNG and print 1st
>the random number
>         $display( $urandom() );    // print the next (2nd) random number
>         $display( $urandom() );    // print the next (3rd) random number
>         $display( $urandom(1) );   // reset the RNG state based on the
>seed value 10
>         $display( $urandom() );    // print next, should be same 2nd
>value for seed 10
>         $display( $urandom() );    // print next, should be same 3rd
>value for seed 10
>    In contrast $random(seed) does not have an internal state, it simply
>uses the seed
>    parameter to compute a random number AND it also updates the
>parameter (which should
>    be a variable).
>    The updated seed variable can then be passed to $random(seed) to get
>the next random number.
>
>b) The RNG of a thread can also be seeded using the srandom method the
>of the process (class).
>    For example:
>         process p;
>         initial begin
>                 p = p.self();   // get handle to the 'process' class for
>the executing thread
>                 p.srandom(10);  // initialize the RNG of the thread with
>seed 10
>                 $display($urandom());
>                 $display($urandom());
>                 $display($urandom());
>    This should print the same sequence of 3 random number as above in
>a).
>
>
>- Ray Ryan
>
>
>
>
> > -----Original Message-----
> > From: owner-sv-ec@server.eda.org
> > [mailto:owner-sv-ec@server.eda.org] On Behalf Of Cliff Cummings
> > Sent: Wednesday, June 10, 2009 4:32 PM
> > To: sv-ec@server.eda.org
> > Subject: [sv-ec] Question about seeding $urandom
> >
> > Hi, All -
> >
> > I think random falls under EC, so at the bottom is the question.
> >
> > I was playing with $urandom and trying to seed it, and have
> > run into problems related to my understanding of seeding this
> > function.
> >
> > The following code is also in an attached file:
> > urandomtest.sv (I run the nine different iterations using
> > +define+RUN1 thru +define+RUN9)
> >
> > program urandomtest;
> >    logic [7:0] a;
> >    int         seed;
> >
> >    initial $monitor("a=%h", a);
> >
> >    initial begin
> >      `ifdef RUN1
> >      repeat(20) #1 a = $random();
> >      `elsif RUN2
> >      repeat(20) #1 a = $random(145);
> >      `elsif RUN3
> >      seed = 145;
> >      repeat(20) #1 a = $random(seed);
> >      `elsif RUN4
> >      repeat(20) #1 a = $urandom();
> >      `elsif RUN5
> >      repeat(20) #1 a = $urandom(145);
> >      `elsif RUN6
> >      seed = 145;
> >      repeat(20) #1 a = $urandom(seed);
> >      `elsif RUN7
> >      repeat(20) #1 a = $urandom_range(145);
> >      `elsif RUN8
> >      repeat(20) #1 a = $urandom_range(100,145);
> >      `elsif RUN9
> >      seed = 145;
> >      repeat(20) #1 a = $urandom_range(seed);
> >      `endif
> >    end
> > endprogram
> >
> > $random - normal Verilog behavior
> > RUN1 - $random() generates 20 random numbers
> >
> > RUN2 - generates the same random number 20 times, each time
> > using the seed value of 145.
> >
> > RUN3 - generates 20 random numbers with the first number
> > based on the "seed" value of 145.
> >
> > $urandom - a few surprises
> >
> > RUN4 - generates 20 urandom numbers.
> >
> > RUN5 - generates the same urandom number 20 times, each time
> > using the seed value of 145. In P1800-2009 Ballot Draft,
> > clause 18.13.1, last sentence in the paragraph after the
> > prototype function is a little misleading when it says: "The
> > random number generator (RNG) shall generate the same
> > sequence of random numbers every time the same seed is used."
> >
> > RUN6 - generates the same urandom number 20 times, each time
> > using the seed value of 145 (seeding behavior is different
> > than Verilog's $random from RUN3).
> >
> > $urandom_range - no big surprises
> >
> > RUN7 - generates 20 urandom_range numbers between 0-145
> >
> > RUN8 - generates 20 urandom_range numbers between 100-145
> >
> > RUN9 - generates 20 urandom_range numbers between 0-145
> >
> > Question - what is the correct way to seed the $urandom
> > function when used in procedural code outside of a class??
> >
> > Thanks for any feedback.
> >
> > Regards - Cliff
> >
> > ----------------------------------------------------
> > Cliff Cummings - Sunburst Design, Inc.
> > 14314 SW Allen Blvd., PMB 501, Beaverton, OR 97005
> > Phone: 503-641-8446 / FAX: 503-641-8486
> > cliffc@sunburst-design.com / www.sunburst-design.com Expert
> > Verilog, SystemVerilog, Synthesis and Verification Training
> >
> > --
> > This message has been scanned for viruses and dangerous
> > content by MailScanner, and is believed to be clean.
> >
> >
>
>--
>This message has been scanned for viruses and
>dangerous content by MailScanner, and is
>believed to be clean.

----------------------------------------------------
Cliff Cummings - Sunburst Design, Inc.
14314 SW Allen Blvd., PMB 501, Beaverton, OR 97005
Phone: 503-641-8446 / FAX: 503-641-8486
cliffc@sunburst-design.com / www.sunburst-design.com
Expert Verilog, SystemVerilog, Synthesis and Verification Training


--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Wed Jun 10 19:07:06 2009

This archive was generated by hypermail 2.1.8 : Wed Jun 10 2009 - 19:07:47 PDT