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

From: Ryan, Ray <Ray_Ryan_at_.....>
Date: Wed Jun 10 2009 - 17:24:31 PDT
 
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.
Received on Wed Jun 10 17:25:51 2009

This archive was generated by hypermail 2.1.8 : Wed Jun 10 2009 - 17:26:01 PDT