0

我有一个测试台,其中有两个序列:sequenceA 和 sequenceB 及其对应的序列项(sqitemA 和 sqitemB)。sequenceA 被输入到我的 DUT 并随机生成 sqitemA 的值。

现在,我需要在 sqItemA 中访问其中一些生成的随机字段,以便为我的 sequenceB 创建相关的 sqItemB。

UVM 是否提供了一种机制来做到这一点?

例如:

class sequenceA extends uvm_sequence;
  rand logic[31:0] address;
  rand bit         enable;

  // skipping constructor 

  task body;
      this.randomize();
      // do body stuff
  endtask
endclass

class sequenceB extends uvm_sequence;
  rand logic[31:0] address;
  rand bit         enable;

  // skipping constructor

  task body;
      // here I want this.address to match the address randomly generated in sequenceA
      // wait_till_sequenceA randomization is complete
      // this.address = sequenceA.address (??);
      // do body stuff
  endtask
endclass

关于最好的方法的任何线索?

4

2 回答 2

2

如果要跨多个序列同步流量,最好的办法是使用虚拟序列:

class virtual_seq extend uvm_sequence;
  sequence_a seq_a;
  sequence_b seq_b;

  `uvm_declare_p_sequencer(virtual_sequencer)

  task body();
    // create sequence A
    // ...

    // start sequence A on appropriate sequencer
    fork
      seq_a.start(p_sequencer.seqr_a);
    join_none

    // wait until seq_a's item finishes
    // 'end_event' is built into uvm_transaction and is trigger
    // when the driver calls item_done()
    seq_a.seq_item_a.end_event.wait_trigger();

    // create sequence B based on seq_a.seq_item_a
    // ...

    // start sequence B
    fork
      seq_b.start(p_sequencer.seqr_b);
    join_none
  endtask
endclass

该类virtual_sequencer包含两个总线定序器的句柄。我们在这里实现了同步,让序列 A 执行一个项目,然后才启动序列 B。请注意,序列 A 在我们执行此操作时会继续运行,因为我们还没有杀死它。您可以在此处实现任何类型的同步,例如seqr_a在序列 B 执行中暂停序列 A 直到某个点等。要了解更多详细信息,请查看 UVM 用户指南。

如果你只想等到它被seq_a创建并随机化seq_item_a,你必须在其中定义一个钩子事件:

class sequence_a extends uvm_sequence #(sequence_item_a);
  event item_randomized;

  task body();
    // create 'seq_item_a'
    // ...

    seq_item_a.randomize();
    -> item_randomized;
  endtask
endclass

在虚拟序列码中,不是等待end_event,而是等待item_randomized

您还可以将item_randomized事件作为序列项本身的一部分并从以下位置触发它post_randomize()

class sequence_item_a extends uvm_sequence_item;
  event item_randomized;

  function post_randomize();
    -> item_randomized;
  endfunction
endclass
于 2014-12-15T20:33:29.397 回答
0

执行此操作的正确方法是从序列主体中删除随机化部分(如果可能)并在 Tudor 的答案中显示的 seq.start 方法之前对其进行随机化。

class virtual_seq extend uvm_sequence;
  sequence_a seq_a;
  sequence_b seq_b;

  `uvm_declare_p_sequencer(virtual_sequencer)

  task body();
    // create sequences
    // ...

     // randomize seq A
     seq_a.randomize();
     //randomize seq  B 
     seq_b.randomize() with {address = seq_A.address;} 
     // start sequences
     // ...

  endtask
endclass
于 2014-12-17T04:00:28.613 回答