1 / 26

by Rich Edelman and Raghu Ardeishar Verification Technologists Mentor Graphics

Sequence, Sequence on the Wall, Who’s the Fairest of Them A ll? Using SystemVerilog UVM Sequences for Fun and Profit. Questa Verification Platform. by Rich Edelman and Raghu Ardeishar Verification Technologists Mentor Graphics. thefreedictionary.com/fairest . Who’s the fairest?

gianna
Download Presentation

by Rich Edelman and Raghu Ardeishar Verification Technologists Mentor Graphics

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. Sequence, Sequence on the Wall, Who’s the Fairest of Them All?Using SystemVerilog UVM Sequences for Fun and Profit Questa Verification Platform by Rich Edelman and Raghu Ardeishar Verification Technologists Mentor Graphics

  2. thefreedictionary.com/fairest • Who’s the fairest? • fair 1  (fâr)adj.fair·er, fair·est • 1. Of pleasing appearance, especially because of a pure or fresh quality; comely. • 2. a. Light in color, especially blond: fair hair. • b. Of light complexion: fair skin. • 3. Free of clouds or storms; clear and sunny: fair skies. • 4. Free of blemishes or stains; clean and pure: one's fair name. • 5. Promising; likely: We're in a fair way to succeed. • 6. a. Having or exhibiting a disposition that is free of favoritism or bias; impartial: a fair mediator. • b. Just to all parties; equitable: a compromise that is fair to both factions. • 7. Being in accordance with relative merit or significance: She wanted to receive her fair share of the proceeds. • 8. Consistent with rules, logic, or ethics: a fair tactic. • 9. Moderately good; acceptable or satisfactory: gave only a fair performance of the play; in fair health. • 10. Superficially true or appealing; specious: Don't trust his fair promises. • 11. Lawful to hunt or attack: fair game. • 12. Archaic Free of all obstacles.

  3. Overview - Smorgasbord • UVM Review • Agents • Transactions • Sequences • Drivers • Sequence API • start_item • finish_item • start • grab • priority • Hierarchy/Constraints • Dice/roll • Words/Sentence • Special Sequences • Task interface • Command line (+SEQ=seqA) • Reading from a file • C code • Out-of-Order

  4. Agents • Agent manages an interface • Driver wiggles the pins • Monitor monitors pin wiggles • Sequencer arbitrates access to the driver • Sequence generates transactions and sends them to the driver AGENT trans SEQ SEQ Interface: Pins & Pin Wiggles SEQ SEQ SEQ SEQ MON SQR DRVR trans

  5. Fun Sequence/Sequencer/Driver • The sequence, sequencer and driver communicate one transaction at a time with each other. • The sequence creates (constructs) a transaction and sends it to the driver. • The sequencer arbitrates amongst multiple sequences • Finally the driver gets the transaction and acts on it 1 transA 3 SEQA AGENT 2 SEQB SQR DRVR SEQC

  6. Transactions – here’s three • Transaction as a payload classtrans_c extendsuvm_sequence_item; `uvm_object_utils(trans_c) randbitrw; randbit[31:0] addr; randbit[31:0]data; endclass classpacket extendsuvm_sequence_item; `uvm_object_utils(packet) randbit[7:0] som; randbit[7:0] addr; randbit[7:0] payload [8]; bit[7:0] checksum; randbit[7:0] eom; constraintval { som == '0;eom == '1; foreach(payload[i]) payload[i]inside{[0:100]}; } functionvoidpost_randomize(); checksum =0; foreach(payload[i]) checksum =f(checksum, payload[i]); endfunction endclass typedef enum { DICE1=1,DICE2,DICE3,DICE4,DICE5,DICE6 } dice_t; classdice_item extendsuvm_sequence_item; `uvm_object_utils(dice_item) randdice_t value; ... endclass

  7. Sequences • Sequences are functors • a class wrapper around a body() task • A sequence can have two jobs • Generate a sequence of transactions • Start other sequences … SEQA AGENT SEQB DRVR SQR SEQC classdice_item extends uvm_sequence_item; randdice_t value; ... endclass classroll_sequence extendsuvm_sequence#(dice_item); randinthow_many; taskbody(); dice_item t; for(inti=0;i< how_many;i++)begin t = dice_item::type_id::create(...); if(!t.randomize())begin `uvm_fatal("SEQ","Randomize failed") end start_item(t); finish_item(t); end endtask endclass create randomize start_item finish_item

  8. Sequences – “virtual sequences” • Start other sequences classaxx_basic_sequence extendsuvm_sequence_base; `uvm_object_utils(axx_basic_sequence) axx_env env; task body(); abc_sequence seq1; xyz_sequence seq2, seq3; seq1 =abc_sequence::type_id::create("seq1"); seq2 = xyz_sequence::type_id::create("seq2"); seq3 = xyz_sequence::type_id::create("seq3"); fork seq1.start(env.agent1.sequencer); seq2.start(env.agent2.sequencer); seq3.start(env.agent3.sequencer); join endtask endclass

  9. Sequences with grab • Get exclusive use of the sequencer SEQA AGENT classroll_sequence extendsuvm_sequence#(dice_item); `uvm_object_utils(roll_sequence) randinthow_many; constraintval { how_many >70; how_many <100;} task body(); dice_item t; grab(); for(inti=0;i< how_many;i++)begin t = dice_item::type_id::create($sformatf("t%0d",i)); if(!t.randomize())begin `uvm_fatal("SEQ","Randomize failed") end start_item(t); finish_item(t); end ungrab(); endtask endclass SEQB DRVR SQR SEQC

  10. Transactions with priority • Default priority is 100. • Higher numbers are better. • Don’t forget to change the sequencer mode sqr.set_arbitration(SEQ_ARB_STRICT_FIFO); SEQA AGENT SEQB DRVR SQR SEQC classroll_sequence extendsuvm_sequence#(dice_item); `uvm_object_utils(roll_sequence) randinthow_many; constraintval { how_many >70; how_many <100;} task body(); dice_item t; for(inti=0;i< how_many;i++)begin t = dice_item::type_id::create($sformatf("t%0d",i)); if(!t.randomize())begin `uvm_fatal("SEQ","Randomize failed") end start_item(t, 1000); finish_item(t); end endtask endclass

  11. Driver • Driver handshake with the sequence classdriver extendsuvm_driver#(dice_item); `uvm_component_utils(driver) // Simple counter for each face seen intdistribution[dice_t]; task run_phase(uvm_phase phase); forever begin dice_item t; seq_item_port.get_next_item(t); distribution[t.value]++; `uvm_info("DRVR", $sformatf(" Got %s [%p]", t.convert2string(), distribution),UVM_MEDIUM) // Send to BUS... seq_item_port.item_done(); end endtask endclass SEQA AGENT SEQB DRVR SQR SEQC

  12. Tasks Wrapping Sequences • Sequence wrapped with a simple task • Task does ‘seq.start(sequencer)’ taskread(inputbit[7:0] addr,outputbit[7:0] data); read_seq seq; seq = read_seq::type_id::create("read",,get_full_name()); seq.addr = addr; seq.start(seqr); data =seq.data; endtask classread_seq extendsuvm_sequence#(trans); `uvm_object_utils(read_seq) randbit[7:0] addr;// Input bit[7:0] data;// Output taskbody(); trans t; t = trans::type_id::create("t",,get_full_name()); t.rw =1; t.addr = addr; start_item(t); finish_item(t); data = t.data; endtask endclass classtrans extendsuvm_sequence_item; `uvm_object_utils(trans) randbitrw; randbit[7:0] addr; randbit[7:0] data; ... endclass

  13. Command line - +SEQ=<seqA> taskrun_phase(uvm_phase phase); stringsequence_name; uvm_object obj; simple_value_base_class seq; stringlist_of_sequences[$]; uvm_cmdline_processor clp; clp = uvm_cmdline_processor::get_inst(); clp.get_arg_values("+SEQ=", list_of_sequences) foreach(list_of_sequences[n])begin sequence_name = list_of_sequences[n]; phase.raise_objection(this); obj = factory.create_object_by_name(sequence_name); if(obj ==null) /* Handle Error */ if(!$cast(seq, obj))/* Handle Error */ seq.env= env; seq.start(null); phase.drop_objection(this); end endtask <SIM> +SEQ=seqA +SEQ=seqB

  14. Reading from a file - +FILE=<file> classread_sequence_from_file extendsuvm_sequence#(value_item); `uvm_object_utils(read_sequence_from_file) task body(); intfd, count; stringfilenames[$], sequence_name; uvm_object obj; simple_value_base_class seq; uvm_cmdline_processor clp; clp = uvm_cmdline_processor::get_inst(); clp.get_arg_values("+FILE=", filenames) foreach(filenames[n])begin fd =$fopen(filenames[n],"r"); while(!$feof(fd))begin ret =$fscanf(fd,"%s %d", sequence_name, count); obj = factory.create_object_by_name(sequence_name); if(obj ==null) /* Handle Error */ if(!$cast(seq, obj)) /* Handle Error */ if(!seq.randomize()with{seq.how_many == count;}) /* Handle Error */ seq.start(m_sequencer); end// while end// foreach endtask endclass sequences.txt: fibonacci_sequence 10 triangle_sequence 20 <SIM> +FILE=sequences.txt +FILE=sequences2.txt

  15. classseq; virtualmy_interface vif; taskclass_calling_back(outputintx); #10x = id; endtask task body(); intx; for(int i =0; i <5; i++) vif.c_calc(x); endtask endclass DPI-C (bound) • Use C code to • Get stimulus input • Get expected output • Scoreboard (checker) 1 interfacemy_interface(); import"DPI-C"contexttaskc_calc(outputintx); export"DPI-C"taskintf_calling_back; seq my_class_handle; functionvoid init(seq s); s.vif =interface::self(); my_class_handle = s; endfunction taskintf_calling_back(outputintx); my_class_handle.class_calling_back(x); endtask endinterface C Code int c_calc(int *val) { intid; intf_calling_back(&id); printf("c_calc() Scope = %s\n", svGetNameFromScope(svGetScope())); *val = id++; return0; } 2 3 4

  16. Out-of-Order – sequence/driver DRIVER Run forever begin get_next_item(t); work_list.push(t); item_done(); end Execute SEQUENCE forever begin work_list.pop(t); t.item_really_started(); lookup[tag] = t; send t to BUS end trans t; t = new(“t”); start_item(t); finish_item(t); DUT ISR t forever begin @(interrupt); t = lookup[tag]; t.resp = BUS.resp; resp_list.push(t); end forever begin resp_list.pop(t); t.item_really_done(); end RSP

  17. Out-of-Order – item_really_done DRIVER SEQ Run trans t; t = new(“t”); start_item(t); finish_item(t); forever begin get_next_item(t); work_list.push(t); item_done(); end class my_sequence_base ... function finish_item(trans t); super.finish_item(t); wait(t.item_really_done_e == 1); endfunction t class trans ... bit item_really_done_e; function item_really_done(); item_really_done_e = 1; endfunction ... endclass forever begin resp_list.pop(t); t.item_really_done(); end RSP

  18. Summary • Sequences are the way to write tests. • Just code that ... • Starts other sequences • Sends transactions • Sequences have an API • Randomized tests – constraints, layering • Directed tests, C code, files, command line • Building collections of sequences is a good idea • Glad to share source code. Some of it is in the paper. Questions? rich_edelman@mentor.com

  19. BACKUP SLIDES

  20. Fun with Words • Encryption hardware – one word at a time • Job of the Stimulus • Generating words • Generating four-letter-words • Sentences, Paragraphs, Chapters, … • Use Constraints • Unique combinations • Distribution of letters • Really  Fun with Constraints • SV LRM Chapter 18 – only(!) 50 pages out of 1315 DUT word mode encrypted word Hold the Presses! News Flash Just released

  21. Transaction/Sequence Design class transaction extends uvm_sequence_item; ... rand mode_t mode; // CLR or ROT13 randbyte data[]; string secret_data; endclass • Transaction: a word (data), an encryption mode and the result (secret_data) • Sequence: create a word and send it. virtualclass my_sequence extends uvm_sequence#(transaction); `uvm_object_utils(my_sequence) randbyte data[]; task body(); transaction t; t = transaction::type_id::create("t"); start_item(t); if (!t.randomize()) `uvm_fatal("MSG", "Randomization failed") t.data = data; finish_item(t); `uvm_info("MSG", $sformatf("secret=%s", t.secret_data), UVM_MEDIUM) endtask endclass

  22. Four Letter Words - constraints • Inheritance • Sequence: Extends ‘my_sequence’. “IS-A” • Randc data from the gadget ‘r’. • pre_randomize() • post_randomize() • What is ‘r’? class four_letter_words extends my_sequence; `uvm_object_utils(four_letter_words) four_letter_words_randc r; function new(string name = “..."); super.new(name); r = new(); endfunction functionvoid pre_randomize(); if (!(r.randomize())) `uvm_fatal(...) endfunction functionvoid post_randomize(); data = r.sdata; endfunction endclass

  23. The Gadget ‘r’ class four_letter_words_randc; stringsdata; randcint value; constraint val { value >= 0; value < 456976; } functionvoid post_randomize(); int v; sdata= " "; v = value; for(int i = 0; i < 4; i++) begin sdata[i] = (v%26) + "a"; v = v/26; end endfunction • Just a container which allows for randc to be used. • How to generate all the possible four letter words with no repeats? • Randomize ‘value’ • Convert ‘value’ to string sdata • Modulo 26 operations Note to math people 26**4 = 456976

  24. class short_word_seq extends my_sequence; `uvm_object_utils(short_word_seq) randint length; constraint val_length { length >= 3; length <= 8; } constraint val_data_length { data.size() == length; } constraint val_data { foreach (data[i]) { data[i] inside {["a":"z"]}; // 'a' to 'z' if( i == 0) // First letter of the word data[i] dist{"a" := 116, ... "z" := 01}; else data[i] dist{"a" := 81, ... "z" := 01}; } } endclass Short Word • More… • Inheritance • Constraints classmy_sequence extends ... `uvm_object_utils(my_sequence) randbyte data[]; task body(); transaction t; t = transaction::type_id::create("t"); start_item(t); if (!t.randomize()) `uvm_fatal(...) t.data = data; finish_item(t); endtask endclass

  25. Sentence Seq • Sentence “HAS-A” seq • it generates sequences and starts them. • 4 letter • Short word • Paragraph • Chapter • Book classsentence_seq extends uvm_sequence#(transaction); `uvm_object_utils(sentence_seq) randint how_many; randbit use_four_letter_word = 0; constraint val_how_many {how_many > 0; how_many < 200;} taskbody(); uvm_sequence_base seq; for(inti = 0; i < how_many; i++) begin if(use_four_letter_word) seq = four_letter_words::type_id::create(“..."); else seq = short_word_seq::type_id::create(“..."); if (!seq.randomize()) `uvm_fatal("SEQ", "Randomize failed") seq.start(m_sequencer); end endtask

  26. Factory - Overrides • Type based override • Instance based override class test extends uvm_test; `uvm_component_utils(test) taskrun_phase(uvm_phase phase); n_packets seq1, seq2; phase.raise_objection(this); packet::type_id::set_type_override( packet_with_randc_addr::get_type); packet::type_id::set_inst_override( big_packet::get_type(), "uvm_test_top.e1.sequencer.seq1.packet"); seq1=n_packets::type_id::create("seq1",,get_full_name()); seq2=n_packets::type_id::create("seq2",,get_full_name()); factory.print(); ...

More Related