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