在verilog中生成随机数

gps*_*gps 2 random verilog

我在为项目编写测试平台时遇到了这个问题.我发现如何$random在verilog中使用但由于某种原因它会给我带来奇怪的结果.我有2个16位暂存器称为AB,我用随机数测试它0-10之间的每一个的第二输出是一个值,其是可以在具有16位的最大值.我想知道是否有其他人有类似的问题,可以提供帮助.谢谢

reg[15:0]a;
reg[15:0]b;

 integer seed,i,j;
 initial begin 


   for (i=0; i<6; i=i+1)
    begin
      a=$random%10; 
      #100;
      b=$random%20;
    $display("A %d, B: %d",a,b);    
   end 
$finish;
Run Code Online (Sandbox Code Playgroud)

e19*_*001 6

output是一个值,它是16位的最大值.

$random产生有符号的随机数.当您将其作为无符号数字打印时,负数将显示为大数字.

您发布的代码可能如下所示,并且不在0到10的范围内.

A     8, B: 65517
A 65527, B: 65527
A     7, B:    17
A 65535, B: 65522
A     1, B:     9
A     8, B:    17
Run Code Online (Sandbox Code Playgroud)

作为解决方案,用于$urandom生成期望在0到10和0到20之间的无符号随机数.

以下是您发布的代码的修改

module test;
   initial begin
      reg[15:0]a;
      reg [15:0] b;

      integer    seed,i,j;
      for (i=0; i<6; i=i+1)
        begin
           a=$urandom%10; 
           #100;
           b=$urandom%20;
           $display("A %d, B: %d",a,b);    
        end 
      $finish;
   end
endmodule
Run Code Online (Sandbox Code Playgroud)

上面的代码可能会产生如下输出:

A     8, B:     0
A     3, B:    10
A     7, B:    11
A     6, B:     3
A     2, B:     7
A     1, B:    10
Run Code Online (Sandbox Code Playgroud)

我想这就是你的期望.

可以在此处找到并运行代码.