System verilog 使用for循环构造使用多个序列器时发生UVM错误
在我的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_
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