System verilog 在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); $

我想获取uvm_sequencer的run_阶段内的事务,以检查事务是否跨越4KB边界。如果它们跨越4KB边界,我希望将该事务拆分为多个事务,然后将其发送给驱动程序。当从驱动程序接收到响应时,所有拆分事务响应应合并回原始事务,并返回到生成原始事务的序列。有办法做到这一点吗?uvm_sequencer是做这项工作的合适地方吗?任何帮助都将不胜感激

编辑: 都铎的解决方案确实有效。我对他的代码(翻译顺序)添加了一些编辑,如下所示:

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