从序列中获取响应以控制虚拟序列
Get response from sequence to control virtual sequence
我需要验证一个需要未知循环次数才能完成的函数。我可以通过读取一些寄存器并将它们的值与模型进行比较来确定它是完成的。
我有一个从 uvm_reg_sequence 扩展而来的序列,它执行此检查。我需要这个序列在我的虚拟序列的末尾 运行 ,如果检查失败,循环回到虚拟序列的开头以 运行 一些更多的循环。我会重复这个直到检查通过(或者我超时)。
我想我需要的是一种让虚拟序列从检查器序列获得响应以控制此循环的方法。推荐的实现方法是什么?
我能想到的最简单的事情就是寄存器序列中的一个简单 check_passed
字段":
class some_reg_sequence extends uvm_reg_sequence;
bit check_passed;
task body();
some_reg.read();
if (<pass_condition>)
check_passed = 1;
endtask
endclass
虚拟序列会在执行寄存器序列后检查这个字段:
class virtual_sequence extends uvm_sequence;
task body();
some_reg_sequence reg_sequence;
`uvm_create_on(reg_sequence, ...)
// do stuff
// ...
do
reg_sequence.start();
while (!reg_sequence.check_passed);
endtask
endclass
您还可以通过将 do..while
与 wait
语句一起包装在 fork...join_any
中来实现超时。
我需要验证一个需要未知循环次数才能完成的函数。我可以通过读取一些寄存器并将它们的值与模型进行比较来确定它是完成的。
我有一个从 uvm_reg_sequence 扩展而来的序列,它执行此检查。我需要这个序列在我的虚拟序列的末尾 运行 ,如果检查失败,循环回到虚拟序列的开头以 运行 一些更多的循环。我会重复这个直到检查通过(或者我超时)。
我想我需要的是一种让虚拟序列从检查器序列获得响应以控制此循环的方法。推荐的实现方法是什么?
我能想到的最简单的事情就是寄存器序列中的一个简单 check_passed
字段":
class some_reg_sequence extends uvm_reg_sequence;
bit check_passed;
task body();
some_reg.read();
if (<pass_condition>)
check_passed = 1;
endtask
endclass
虚拟序列会在执行寄存器序列后检查这个字段:
class virtual_sequence extends uvm_sequence;
task body();
some_reg_sequence reg_sequence;
`uvm_create_on(reg_sequence, ...)
// do stuff
// ...
do
reg_sequence.start();
while (!reg_sequence.check_passed);
endtask
endclass
您还可以通过将 do..while
与 wait
语句一起包装在 fork...join_any
中来实现超时。