Random 为什么我需要运行此函数两次才能获得预期的输出?

Random 为什么我需要运行此函数两次才能获得预期的输出?,random,verilog,system-verilog,Random,Verilog,System Verilog,在系统verilog中,我有一个如下的随机数生成器: task set_rand_value(output bit [7:0] rand_frms, output bit [13:0] rand_bcnt); begin bit [7:0] rand_num; // Set the random value between 2 and 254 rand_num=$urandom_range(254,2); rand_bcnt=$urandom_r

在系统verilog中,我有一个如下的随机数生成器:

task set_rand_value(output bit [7:0] rand_frms, output bit [13:0] rand_bcnt);
   begin

     bit [7:0]  rand_num;
     // Set the random value between 2 and 254
     rand_num=$urandom_range(254,2);
     rand_bcnt=$urandom_range(2047,1);

     // Check to ensure number is even
     if ((rand_num/2)*2 != rand_num) begin
        rand_num=rand_num+1;
        $display("Generated %d frames. 8'h%h", rand_num, rand_num);
        $display("Packets generated with 0x%4h bytes.", rand_bcnt);
     end

     // Set the random frame number
     else begin
        rand_frms = rand_num;
        $display("Generated %d frames. 8'h%h", rand_num, rand_num);
        $display("Packets generated with 0x%4h bytes.", rand_bcnt);

     end
   end
endtask // set_rand_value
bit [ 7:0] num_frms;
bit [13:0] size_val;

  // Generate random values
  set_rand_value(num_frms, size_val); // Run twice to correct initial write error
  $display("Error correction for packets sent: 0x%h", num_frms);
  set_rand_value(num_frms, size_val);
  $display("The number of packets being sent: 0x%h", num_frms);
出于某种原因,我第一次运行这个(以及第三次和第五次…等等),它返回一个零值,即使正确生成了一个数字

我这样称呼它:

task set_rand_value(output bit [7:0] rand_frms, output bit [13:0] rand_bcnt);
   begin

     bit [7:0]  rand_num;
     // Set the random value between 2 and 254
     rand_num=$urandom_range(254,2);
     rand_bcnt=$urandom_range(2047,1);

     // Check to ensure number is even
     if ((rand_num/2)*2 != rand_num) begin
        rand_num=rand_num+1;
        $display("Generated %d frames. 8'h%h", rand_num, rand_num);
        $display("Packets generated with 0x%4h bytes.", rand_bcnt);
     end

     // Set the random frame number
     else begin
        rand_frms = rand_num;
        $display("Generated %d frames. 8'h%h", rand_num, rand_num);
        $display("Packets generated with 0x%4h bytes.", rand_bcnt);

     end
   end
endtask // set_rand_value
bit [ 7:0] num_frms;
bit [13:0] size_val;

  // Generate random values
  set_rand_value(num_frms, size_val); // Run twice to correct initial write error
  $display("Error correction for packets sent: 0x%h", num_frms);
  set_rand_value(num_frms, size_val);
  $display("The number of packets being sent: 0x%h", num_frms);
这给了我这个输出:

Generated 214 frames. 8'hd6
Packets generated with 0x05b2 bytes.
Error correction for packets sent: 0x00

Generated 252 frames. 8'hfc
Packets generated with 0x011f bytes.
The number of packets being sent: 0xfc
0x80fc011f // Expected number

我已经尝试了很多方法来纠正它,但出于某种原因,我能让它按照我期望的方式运行的唯一方法是每次需要使用它时只运行两次。

如果随机数为偶数,则只设置
num\u frms
。为什么不直接做呢

function void set_rand_value(output bit [7:0] rand_frms, output bit [13:0] rand_bcnt);
   begin
     // Set the random value between 2 and 254
     rand_frms=$urandom*2;
     rand_bcnt=$urandom_range(2047,1);
endfunction

p.S仅对可能阻塞的例程使用任务

上述代码不起作用的原因是您没有分配
rand\u frms=rand\u num。因此,只有50%的时间read_frm会有一个值。[50%只是近似值]

谢谢你的推荐。我现在把它改成了
功能
。不完全确定为什么你的代码修复了我和我的问题,但我接受它!谢谢你,我现在看到那个错误了。。。我完全错过了,真不敢相信我会那么做。我没有人在这里验证我的代码,所以没有人能够指出:)有另一双眼睛看代码总是好的。