Почему $ urandom дает одинаковое значение даже при использовании seed (int или любого другого) в качестве переменной? - PullRequest
2 голосов
/ 06 апреля 2019

Я использовал $ random, чтобы получить другое число, но теперь мне нужно случайное число без знака, поэтому я меняю $ random на $ urandom.

module Tb();
   int seed;
   integer num;
  initial begin
      $display("========================================================");
       begin
         $display("$RANDOM: With Seed Value = 2  With Variable");
           seed = 2;
           repeat (5) begin 
             num = $random(seed);
             $display("seed = %d |num  = %d ",seed, num);
           end
       end
      $display ("------------------------------");
       begin
         $display("$U-RANDOM: With Seed Value = 2  With Variable");
           seed = 2;
           repeat (5) begin 
             num = $urandom(seed);
             $display("seed = %d |num  = %d ",seed, num);
           end
       end
      $display ("========================================================");
   end
endmodule

Вот результаты: (как отображение добавлено в коде).

========================================================
$RANDOM: With Seed Value = 2  With Variable
seed =      138139 |num  = -2147345408 
seed =   951188000 |num  = -1196295055 
seed =  1784212385 |num  =  -363270956 
seed = -1731404562 |num  =   416079665 
seed = -1607270249 |num  =   540214080 
------------------------------
$U-RANDOM: With Seed Value = 2  With Variable
seed =           2 |num  =  -541627016 
seed =           2 |num  =  -541627016 
seed =           2 |num  =  -541627016 
seed =           2 |num  =  -541627016 
seed =           2 |num  =  -541627016 

Ожидаемые результаты: значения seed и num должны измениться в $ urandom. Как меняется в случае случайного $.

Я что-то упускаю из-за того, "как $ urandom работает с seed?" В случае $ random это входной порт для начальной переменной.

Ответы [ 2 ]

3 голосов
/ 06 апреля 2019

Поведение

x = $urandom(seed);

эквивалентно

process p;
p = process::self();
p.srandom(<urandom_seed>);
x = $urandom;

Аргументом $urandom является только input, тогда как аргументом $random является inout,Эта информация нуждается в уточнении в LRM.Смотри https://accellera.mantishub.io/view.php?id=5902

2 голосов
/ 06 апреля 2019

Аргумент $urandom инициализирует генератор.Это означает, что с учетом аргумента он всегда будет возвращать одно и то же значение.$urandom(seed) должен быть вызван один раз, а последующие вызовы должны быть вызваны без начального числа.Пример из LRM 2012 года, раздел 18.13.1:

bit [64:1] addr;
bit [ 3:0] number;
addr[32:1] = $urandom( 254 ); // Initialize the generator,
// get 32-bit random number
addr = {$urandom, $urandom }; // 64-bit random number
number = $urandom & 15; // 4-bit random number
...