get(), get_next_item(), peek() 是阻塞的
try_next_item(), item_done(), and put() 是非阻塞的
1)
function get_drive_req();
forever begin
req = get();
req = get();
end
endfunction
2)
function get_drive_req();
forever begin
req = get_next_item();
req = get_next_item();
item_done();
end
endfunction
3)
function get_drive_req();
forever begin
req = peek();
req = peek();
item_done();
req = get();
end
endfunction
2是错的,因为不能在调用item_done之前两次调用get_next_item,它无法完成与sequencer的握手。
sequencer具有stop_sequences()方法,可用于停止所有sequence。但是,此方法不检查driver当前是否正在处理任何sequence_items。因此,如果driver调用item_done()或put(),则可能会出现致命错误,因为sequence指针可能无效。因此,用户需要注意,一旦调用stop_sequence(),就禁用了sequencer线程(如果在fork中启动)。
convert2string():建议实现此函数,该函数返回对象的字符串表示形式(其数据成员的值)。这对于将调试信息打印到模拟器脚本或日志文件很有用。
task body();
seq_item_c req;
start_item(req);
#10 ns;
assert(req.randomize());
finish_item(req);
endtask
应该避免在start_item和finish_item之间添加延迟。start_item返回后,该sequence将赢得仲裁并可以访问driver-sequencer。从那时起直到finish_item的任何延迟都将阻塞driver-sequencer,并且使得任何其他sequence都不能访问driver-sequencer。如果在一个接口上运行多个sequence,并且延迟很大,设计接口上有很多空闲时,这会造成很大的麻烦。
正确答案将在下一期公布,或者到下面的文章获取答案