为什么我需要 运行 这个函数两次才能得到预期的输出?
Why do I need to run this function twice to get the expected output?
在 system-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
出于某种原因,我第一次 运行 这个(以及第三个和第五个......等等)它 returns 一个零值,即使一个数字是正确生成的。
我是这样称呼它的:
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_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 只对可能阻塞的例程使用任务。
上面的代码不起作用的原因是您没有在 if 条件的前半部分分配 rand_frms = rand_num;
。所以只有 50% 的时间 read_frm 会有一个值。 [50% 只是近似值]。
在 system-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
出于某种原因,我第一次 运行 这个(以及第三个和第五个......等等)它 returns 一个零值,即使一个数字是正确生成的。
我是这样称呼它的:
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_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 只对可能阻塞的例程使用任务。
上面的代码不起作用的原因是您没有在 if 条件的前半部分分配 rand_frms = rand_num;
。所以只有 50% 的时间 read_frm 会有一个值。 [50% 只是近似值]。