1 / 23

John Aynsley , Doulos

The Finer Points of UVM: Tasting Tips for the Connoisseur. John Aynsley , Doulos. The Finer Points of UVM. Sequences and sequencers The arbitration queue Virtual sequences Request and response Multiple sequencer stacks. The Big Picture. uvm_test. uvm_test. uvm_env. Factory.

barney
Download Presentation

John Aynsley , Doulos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. The Finer Points of UVM:Tasting Tipsfor the Connoisseur John Aynsley, Doulos

  2. The Finer Points of UVM • Sequences and sequencers • The arbitration queue • Virtual sequences • Request and response • Multiple sequencer stacks

  3. The Big Picture uvm_test uvm_test uvm_env Factory config db uvm_scoreboard Virtual sequencer Register Layer uvm_agent uvm_sequencer uvm_agent uvm_agent uvm_agent uvm_monitor uvm_driver DUT

  4. Sequences and Sequencers Sequencer Sequence start_item(req); finish_item(req); Sequence TLM export TLM port Driver seq_item_port.get(req); DUT

  5. A Simple Sequence class my_seq extends uvm_sequence #(my_tx); `uvm_object_utils(my_seq) function new(string name = ""); super.new(name); endfunction: new task body; repeat(4) begin req = my_tx::type_id::create("req"); start_item(req); if (!req.randomize()) `uvm_error("", "failed to randomize") finish_item(req); end endtask endclass

  6. Nested Sequences class top_seq extends uvm_sequence #(my_tx); ... `uvm_declare_p_sequencer(my_seqr) ... task body; repeat(3) begin my_seqseq; seq = my_seq::type_id::create("seq"); if (!seq.randomize()) `uvm_error("", "failed to randomize") seq.start(p_sequencer, this); end endtask ... Variable that points to sequencer Sequencer Parent sequence

  7. Concurrent Sequences task body; fork begin seq1 = my_seq::type_id::create("seq1"); if (!seq1.randomize()) `uvm_error("", "failed to randomize") seq1.start(p_sequencer, this); end begin seq2 = my_seq::type_id::create("seq2"); if (!seq2.randomize()) ... seq2.start(p_sequencer, this); end begin ... seq3.start(p_sequencer, this); end join endtask Transactions will be strictly interleaved

  8. The Finer Points of UVM • Sequences and sequencers • The arbitration queue • Virtual sequences • Request and response • Multiple sequencer stacks

  9. The Arbitration Queue fork Arbitration queue start bodystart_item Sequencer First in finish_item start bodystart_item priority sequence priority sequence priority sequence finish_item FIFO start bodystart_item Arbitration finish_item join Driver begin seq_item_port.get(req); seq_item_port.get(req); seq_item_port.get(req); end

  10. Setting the Arbritration Algorithm task body; p_sequencer.set_arbitration( SEQ_ARB_STRICT_RANDOM); fork begin seq1 = my_seq::type_id::create("seq1"); if (!seq1.randomize()) `uvm_error("", "failed to randomize") seq1.start(p_sequencer, this, 1); end begin ... seq2.start(p_sequencer, this, 2); end begin ... seq3.start(p_sequencer, this, 3); end join endtask Priority (default 100)

  11. Arbitration Algorithms

  12. User-Defined Arbitration Algorithm class my_sequencer extends uvm_sequencer #(my_tx); ... function integer user_priority_arbitration( integer avail_sequences[$]); foreach (avail_sequences[i]) begin integer index = avail_sequences[i]; uvm_sequence_requestreq = arb_sequence_q[index]; intpri = req.item_priority; uvm_sequence_baseseq = req.sequence_ptr; if (pri > max_pri) ... end return max_index; endfunction endclass Could access properties of the sequence object

  13. The Finer Points of UVM • Sequences and sequencers • The arbitration queue • Virtual sequences • Request and response • Multiple sequencer stacks

  14. Virtual Sequences Can be null seqr0 Sequencer vseq.start(seqr0, null, priority) body fork seq1.start(seqr1, this) body start_item ... seq2.start(seqr2, this, 50) body start_item ... Virtual sequence No transactions priority seq1 seqr3 Blocks Inherits priority seqr2 Sequencer Sequencer seqr1 Sequencer Driver Driver Driver

  15. Sequencer Lock Important! seqr0 Sequencer vseq.start(seqr0, null) body begin this.lock(seqr1); seq1.start(seqr1, this); body start_item finish_item this.unlock(seqr1); ... Virtual sequence No transactions priority seqx priority seqy priority seq1 seqr1 Sequencer Driver

  16. Lock versus Grab Grabs inserted here Locks inserted here Virtual sequence Virtual sequence Virtual sequence vseq1.start body begin lock seq1.start unlock vseq2.start body begin lock seq2.start unlock vseq3.start body begin grab seq3.start ungrab priority seq2 priority seqy priority seq3 priority seqx lockreq vseq2 priority seq1 grab req vseq3 Sequencer Head Tail Driver

  17. The Finer Points of UVM • Sequences and sequencers • The arbitration queue • Virtual sequences • Request and response • Multiple sequencer stacks

  18. Request and Response start_item(req); finish_item(req); get_response(rsp); Sequencer Sequence TLM export req rsp TLM port Driver seq_item_port.get(req); seq_item_port.put(rsp); DUT The paper describes in detail how to code pipelined req/rsp and out-of-order responses

  19. Layered Sequencers start_item(req); finish_item(req); get_response(rsp); Sequencer Ptr to upper sequencer Sequence req rsp seqr_upper.get(req_up); start_item(req_lo); finish_item(req_lo); get_response(rsp_lo); seqr_upper.put(rsp_up); Could be one:one or one:many or many:one or many:many Sequencer Sequence req rsp Driver req:rsp = 1:1 seq_item_port.get(req); seq_item_port.put(rsp); The paper shows more detail DUT

  20. The Finer Points of UVM • Sequences and sequencers • The arbitration queue • Virtual sequences • Request and response • Multiple sequencer stacks

  21. Multiple Agents / Sequencer Stacks Sequencer Sequencer Sequence Sequence Communicate or synchronize? Sequencer Sequencer Analysis ports CallbacksEvents Barriers Sequence Sequence get(req) Driver Driver Must not block! Driven by the DUT interface timing DUT

  22. Driver calls try_next_item seq_item_port.try_next_item(req); if (req == null) begin dut_vi.idle <= 1; ... @(posedgedut_vi.clock); end else begin seq_item_port.item_done(); dut_vi.idle <= 0; ... @(posedgedut_vi.clock); ... seq_item_port.put(rsp); Wiggle pins for idle cycle Must be called in same time step Response can be pipelined

  23. The Finer Points of UVM Also in the paper • The UVM sequence library • Pipelined requests and responses • The response handler • UVM events and event pools • The configuration database

More Related