System verilog 在UVM_Sequencer运行阶段内获取事务
我想获取uvm_sequencer的run_阶段内的事务,以检查事务是否跨越4KB边界。如果它们跨越4KB边界,我希望将该事务拆分为多个事务,然后将其发送给驱动程序。当从驱动程序接收到响应时,所有拆分事务响应应合并回原始事务,并返回到生成原始事务的序列。有办法做到这一点吗?uvm_sequencer是做这项工作的合适地方吗?任何帮助都将不胜感激 编辑: 都铎的解决方案确实有效。我对他的代码(翻译顺序)添加了一些编辑,如下所示:System verilog 在UVM_Sequencer运行阶段内获取事务,system-verilog,uvm,System Verilog,Uvm,我想获取uvm_sequencer的run_阶段内的事务,以检查事务是否跨越4KB边界。如果它们跨越4KB边界,我希望将该事务拆分为多个事务,然后将其发送给驱动程序。当从驱动程序接收到响应时,所有拆分事务响应应合并回原始事务,并返回到生成原始事务的序列。有办法做到这一点吗?uvm_sequencer是做这项工作的合适地方吗?任何帮助都将不胜感激 编辑: 都铎的解决方案确实有效。我对他的代码(翻译顺序)添加了一些编辑,如下所示: up_sequencer.get_next_item(req); $
up_sequencer.get_next_item(req);
$cast(up_trans, req.clone());
// do the splitting.
start_item(up_trans);
finish_item(up_trans);
up_sequencer.item_done();
get_response(rsp);
rsp.set_sequence_id(req.get_sequence_id());
up_sequencer.put_response(rsp);
无法在sequencer中执行此操作,因为发送项目分为两个步骤:
start\u item(…)
和finish\u item(…)
。如果这只是一种方法,你就可以做到
国际海事组织(IMO)的做法是实施分层方案。上层是您开始序列的地方,您不关心事务的长度。第二层是最大长度为4K的层。交易流程将是:
您的序列->上层序列器->转换序列->总线序列器->驱动程序
这意味着在代理中,您需要两个序列器,其中只有一个连接到驱动程序。翻译序列可能如下所示:
class translation_sequence extends uvm_sequence #(some_trans);
uvm_sequencer #(some_trans) up_sequencer;
task body();
while (1) begin
some_trans up_trans;
up_sequencer.get_next_item(up_trans);
if (up_trans.size <= 4096) begin
`uvm_info("SPLIT", "No need to split", UVM_LOW);
start_item(up_trans);
finish_item(up_trans);
end
else begin
// implement the splitting
int unsigned size = up_trans.size;
while (1) begin
req = new();
req.size = size > 4096 ? 4096 : size;
start_item(req);
finish_item(req);
if (size < 4096)
break;
else
size -= 4096;
end
end
up_sequencer.item_done();
end
endtask
endclass
如果您想阅读更多关于分层的内容,请阅读上的这篇文章。非常感谢您让我了解这种方法。我试过了,它确实有效。当顶级序列等待驱动程序的get_响应()时,我遇到了一些问题。此外,在转换序列中使用get_next_item()中的req会导致无限循环,因为req的“m_sequencer”本身就是上层的_sequencer。所以我不得不使用“some_trans”(克隆)而不是“req”。我修改了翻译序列中的一些行,如下所示,并将其添加到代码的编辑部分。很高兴听到这个消息!我自己也在操场上试过,遇到了那个无限循环,但我没有弄明白为什么。谢谢你的提示。
class some_agent extends uvm_agent;
//...
// start the translation sequence
task run_phase(uvm_phase phase);
translation_sequence seq = new();
seq.up_sequencer = sequencer;
seq.start(bus_sequencer);
endtask
endclass