System verilog 使用for循环构造使用多个序列器时发生UVM错误

System verilog 使用for循环构造使用多个序列器时发生UVM错误,system-verilog,uvm,System Verilog,Uvm,在我的UVM虚拟序列的正文中,我有以下代码: begin: for(int x=0; x<8; x++) begin fork begin automatic int x_idx = x; for(int i=0; i<100; i++) begin if(!my_sequence[x_idx].randomize() with {...} my_sequence[x_idx].start(p_

在我的UVM虚拟序列的正文中,我有以下代码:

begin:
  for(int x=0; x<8; x++) begin
    
    fork begin
      automatic int x_idx = x;
        for(int i=0; i<100; i++) begin
          if(!my_sequence[x_idx].randomize() with {...}
          my_sequence[x_idx].start(p_sequencer.my_sequencer[x_idx];
        end
    end join_none
  end
end
我还测试了代码,去掉了外部for循环,改为使用索引号,如下所示:

    fork begin
      automatic int x_idx = x;
        for(int i=0; i<100; i++) begin
          if(!my_sequence[0].randomize() with {...}
          my_sequence[0].start(p_sequencer.my_sequencer[0];
        end
    end join_none

    fork begin
      automatic int x_idx = x;
        for(int i=0; i<100; i++) begin
          if(!my_sequence[0].randomize() with {...}
          my_sequence[1].start(p_sequencer.my_sequencer[1];
        end
    end join_none
    ...
fork开始
自动整数x_idx=x;

对于(int i=0;i您的问题是将
x_idx
声明放在
begin/end
块中,该块位于
fork/join\u none
中。您不希望在并行线程开始执行时发生初始化;希望在for循环的每次迭代执行时发生初始化。您应该将其编写为

begin
  for(int x=0; x<8; x++)
    fork
      int x_idx = x;
      for(int i=0; i<100; i++) begin
         if(!my_sequence[x_idx].randomize() with {...}
         my_sequence[x_idx].start(p_sequencer.my_sequencer[x_idx];
      end
   join_none
end

在这两种情况下,每个循环迭代都有一个新的
x\u idx
实例,但是
fork/join\u none
中的语句直到所有迭代完成后才开始执行。

但是语句“int x\u idx=x”仍然在fork/join\u none块中。这不是我们想要避免的吗?请参阅添加的注释。
begin
  for(int x=0; x<8; x++)
    fork
      int x_idx = x;
      for(int i=0; i<100; i++) begin
         if(!my_sequence[x_idx].randomize() with {...}
         my_sequence[x_idx].start(p_sequencer.my_sequencer[x_idx];
      end
   join_none
end
begin
  for(int x=0; x<8; x++) begin
    int x_idx = x;
    fork
      for(int i=0; i<100; i++) begin
         if(!my_sequence[x_idx].randomize() with {...}
         my_sequence[x_idx].start(p_sequencer.my_sequencer[x_idx];
      end
   join_none
  end
end