System verilog 问题$urandom\u rage在多个systemverilog任务中具有相同的值

System verilog 问题$urandom\u rage在多个systemverilog任务中具有相同的值,system-verilog,System Verilog,现在,我尝试在多系统值任务中获取随机值。 所以我只是按照下面的方法实现 module testa; task sendtransfer1 foreach (burst3.Data[ii1]) burst1.data[ii1] = $urandom_range (967295,0); end task task sendtransfer2 foreach (burst3.Data[ii2]) burst2.data[ii2] = $urandom_range (967295,0); e

现在,我尝试在多系统值任务中获取随机值。 所以我只是按照下面的方法实现

module testa;

task sendtransfer1

foreach (burst3.Data[ii1])
burst1.data[ii1] = $urandom_range (967295,0);

end task

task sendtransfer2

foreach (burst3.Data[ii2])
burst2.data[ii2] = $urandom_range (967295,0);

end task


task sendtransfer3

foreach (burst3.Data[ii3])
burst3.data[ii3] = $urandom_range (967295,0);

end task




initial begin
   for(int i = 0; i<1000; i++) begin
       sendtransfer1
    end
end

initial begin
   for(int ii = 0; ii<1000; ii++) begin
       sendtransfer2
    end
end

initial begin
   for(int iii = 0; iii<1000; iii++) begin
       sendtransfer3
    end
end

endmodule
模块测试;
任务发送转移1
foreach(burst3.Data[ii1])
数据[ii1]=$Uradom_范围(967295,0);
结束任务
任务发送转移2
foreach(burst3.Data[ii2])
数据[ii2]=$Uradom_范围(967295,0);
结束任务
任务发送转移3
foreach(burst3.Data[ii3])
数据[ii3]=$Uradom_范围(967295,0);
结束任务
初始开始

对于(inti=0;i这将有助于将您的代码放入。问题很可能是您的代码有局部变量(i,ii,iii)在三个for循环中声明,但在任务中引用ii1、ii2、ii3。您最好的选择是将值作为参数传递给每个任务。

我已按照您的建议进行了更改。但三个任务的随机输出值保持不变。是否需要三个单独的
初始
块?请创建一个MCVE。是的,因为我想测试3个主总线和3个从总线在相同的地址和随机数据中。所以我创建了3个独立的初始块。特别是我想控制每个主总线的每个任务。所以我创建了三个初始块。它不可能与$random系统函数一起工作吗?为什么它在所有3个循环中都
foreach*burst3*…
。@Serge foreach(burst1.data[ii])负荷1.数据[ii]=ii;实际上是在执行初始化,而不是依赖于它。动态数组burst1.data是由行中的8个元素构成的。我的意思是,尽管初始化了burst1、2和3,但在每个循环中都使用了burst3。我希望可以,但您提供的代码中没有支持证据。@Serge我从我不明白我还需要哪一段代码来支持?@Serge我不是systemverilog专家,但我是否需要对每个(burst3.Data[ii3])burst3.Data[ii3]=$Uradom\u range(967295,0)更为均匀的代码来生成一个随机值?
module testa;

int ii1;
int ii2;
int ii3;

task sendtransfer1
burst1 = new;
burst1.pInst = activeMaster1;


foreach (burst3.Data[ii1])
burst1.data[ii1] = $urandom_range (967295,0);

end task

task sendtransfer2
burst2 = new;
burst2.pInst = activeMaster2;

foreach (burst3.Data[ii2])
burst2.data[ii2] = $urandom_range (967295,0);

end task


task sendtransfer3
burst3 = new;
burst3.pInst = activeMaster3;

foreach (burst3.Data[ii3])
burst3.data[ii3] = $urandom_range (967295,0);

end task




initial begin
   for( ii1 = 0; ii1<1000; ii1++) begin
       sendtransfer1
    end
end

initial begin
   for( ii2 = 0; ii2<1000; ii2++) begin
       sendtransfer2
    end
end

initial begin
   for( ii3 = 0; ii3<1000; ii3++) begin
       sendtransfer3
    end
end

endmodule