Parameterized Classes, Interfaces & Registers

Parameterized Classes, Interfaces & Registers

Parameterized Classes, Interfaces & Registers Mark Li(erick © Verilab & Accellera 1 Introduc1on to Parameters • In SystemVerilog parameters enable flexibility – compile-me specializaon of code-base – e.g. RTL module with variable FIFO depth, bus width, etc. – e.g. verificaon component with variable channels, etc. • Parameterizaon enables horizontal reuse – e.g. same DUT RTL code in different project derivave – e.g. same verificaon code adap1ng to different projects • Parameterized code trades flexibility with complexity – in RTL parameters are usually easy to deal with and simple – in verificaon code the benefits are less clear... PARAMETERIZED PARAMETERIZED PARAMETERIZED CLASSES INTERFACES REGISTERS © Verilab & Accellera 2 PARAMETERIZED CLASSES © Verilab & Accellera 3 Parameterized Classes • Parameterized classes are a good fit for many cases: – extensive horizontal reuse for a set of derivaves – UVM base classes (e.g. TLM, seQuencer, driver, monitor,...) • But parameterizaon is intrusive... – creates verbose code base (harder to read and maintain) – parameter proliferaon is ubiquitous (all over the code) – all files need parameters just to iden1fy specialized types • When is it worth the effort? – parameterizaon is a lot of effort for the developers – ... but can be very good for the user of the code! © Verilab & Accellera 4 Non-Parameterized Setup DERIVATIVE-SPECIFIC ENV DERIVATIVE-SPECIFIC DERIVATIVE-SPECIFIC MY_ENV REGISTER SEQUENCES seq lib REGISTER MODEL C (CLONE & MODIFY) VS MY REG REG MODEL SHARED ENVIRONMENT SHARED SEQUENCES NOP_ENV HAVE NO ACCESS TO seq lib REGISTER FIELDS UVC_BUS C VS BASE P S C (SINCE FIELDS ONLY ACTIVE CHANNELS MODEL A IN DERIVED CLASS) D M SCOREBOARD HELD IN CONFIG UVC_PRX UVC_STXRX TX RX RX D S C C S D 1 - 4 M M MY VS TX RX TX UVC_PTX S D DUT 1 - 4 D S C M M SERIAL PARALLEL CONFIG-AWARE MAX-FOOTPRINT AGENTS & SEQUENCES INTERFACES © Verilab & Accellera 5 Parameterized Environment REGISTER MODEL OF PARAMETER TYPE SHARED ENVIRONMENT SHARED SEQUENCES P_ENV#(REG,T,R) HAVE ACCESS TO seq lib REGISTER FIELDS UVC_BUS C VS REG P S C REG (PARAMETERIZED) PARAMETERS MODEL A D M SCOREBOARD (REGISTER TYPE, NUM CHANNELS) UVC_PRX#(T) UVC_STXRX#(T,R) TX RX RX D S C C S D 1 - 4 M M MY VS TX RX TX UVC_PTX#(R) S D DUT 1 - 4 D S C M M PARAMETERIZED PARAMETERIZED AGENTS & SEQUENCES INTERFACES © Verilab & Accellera 6 Reuse of Parameterized Env A FEW DERIVATIVE-SPECIFIC DERIVATIVE-SPECIFIC ENVS e.g. B12_ENV SETS: • REG TYPE = REG_B, REGISTER SEQUENCES (SPECIALIZE PARAMETERS) • NUM SERIAL TX = 1 • NUM SERIAL RX = 2 A21_ENV B12_ENV seq lib seq lib P_ENV#(REG_A,2,1) P_ENV#(REG_B,1,2) seq lib seq lib UVC_BUS C UVC_BUS C VS P P REG_A S C VS REG_B S C REG REG MODEL MODEL A D M SCOREBOARD A D M SCOREBOARD UVC_PRX#(2) UVC_PRX#(1) UVC_STXRX#(2,1) UVC_STXRX#(1,2) S C TX RX RX D TX RX RX D S C C S D C S D M M M A21 M B12 VS TX VS TX RX TX UVC_PTX#(1) RX TX UVC_PTX#(2) S D DUT S D DUT D S C D S C M M M M MASSIVE REUSE & SHARED ENVIRONMENTS AUTOMATIC TUNING: (IDENTICAL CODE BASE) WHAT’S NOT TO LIKE? © Verilab & Accellera 7 Generic p_env Environment PARAMETER DECLARATION class p_env #(type REG=uvm_reg_block, int T=1, int R=1) extends uvm_env; PARAMETER PROPAGATION my_regREG reg_model; // register block base p_env_sequencer # ( REG ) sequencer; // virtual sequencer stxrx_env # ( T , R ) stxrx; // serial UVC ... `uvm_component_utils_beginuvm_component_param_utils_begin(p_env)( p_env#(REG,T,R)) ... MUST function USE *_PARAM_UTILS void build_phase (...); MUST USE PARAMETERIZED TYPES IN ... UTILS (OR YOU GET THE WRONG TYPE) reg_model = my_regREG::type_id::type_id::create::create(...);(...); sequencer = p_env_sequencer::#(type_idREG)::type_id::create::(...);create (...); stxrx = stxrx_env::#(type_idT,R)::type_id::create::(...);create (...); ... reg_model.build(); MUST USE PARAMETERIZED TYPES IN ... CREATE (OR YOU GET THE WRONG TYPE) uvm_config_object::set(this, "*", "reg_model", reg_model); ... © Verilab & Accellera 8 uvc_stxrx – Env/Agent/Comps class stxrx_env extends#(int NT uvm_env=1, int; NR=1) extends uvm_env; stx_agent tx_agent#(NT) tx_agent; ; PROPAGATE PARAMETERS srx_agent rx_agent#(NR) rx_agent; ; THROUGHOUT HIERARCHY ... class stx_agent extends#(int N =1)uvm_agent extends; uvm_agent; stx_driver driver#(N) ; driver ; INTRODUCE NEW PARAMETERS s_monitor #monitor(TX,N) ;monitor ; AS REQUIRED (e.g. SHARED virtual s_interface vif#(N;) vif; MONITOR FOR TX AND RX) ... class s_monitor extends#(s_dir_enum uvm_monitor D=RX, ;int N=1) extends uvm_monitor; ... s_transaction m_trans[4N]; USE PARAMETERS AT LOW LEVELS ... (e.g. ARRAY SIZE, MESSAGES, ETC.) if (D==TX) ` uvm_warning (...,”error injected in Tx traffic to DUT”) else `uvm_error(...,”error inobserved DUT traffic”) in Rx traffic from DUT”) ... © Verilab & Accellera 9 p_env – Virtual SeQuencer PARAMETERIZE SEQUENCER TO GIVE SEQUENCES ACCESS TO REG_MODEL OF CORRECT TYPE class p_env_sequencer # (type REG=uvm_reg_block) extends uvm_sequencer; my_regREG reg_model reg_model; //; //handle handle to toregister register model model `uvm_component_utils_beginuvm_component_param_utils_begin(p_env_sequencer(p_env_sequencer) #(REG)) `uvm_field_object(reg_model, UVM_ALL_ON | UVM_NOPRINT) ... function void build_phase(...); super.build_phase(...); DON’T FORGET ☺ if (reg_model == null) `uvm_fatal("NOREG", ”null handle for reg_model") ... © Verilab & Accellera 10 p_env – SeQuences P_SEQUENCER MUST BE CORRECT TYPE OR YOU GET RUN-TIME CAST FAIL ERROR “...SEQ CANNOT RUN ON SEQUENCER TYPE...” class p_env_base_seq # (type REG=uvm_reg_block) extends uvm_sequence; `uvm_declare_p_sequencer(p_env_sequencer) #(REG)) `uvm_object_param_utils(p_env_base_seq) #(REG)) ... SEQUENCES MUST EXTEND CORRECT BASE TYPE => SEQUENCES MUST BE PARAMETERIZED class p_env_init_seq # (type REG=uvm_reg_block) extends p_env_base_seq; #(REG); p_env_reset_seq # ( REG reset_seq) reset_seq; // drive; // reset drive reset p_env_wait_cfg_seq # (cfg_seqREG) ;cfg_seq // wait; //cfg wait ack cfg ack p_env_wait_ready_seq ready_seq#(REG) ready_seq; // wait; //ready wait ready `uvm_object_param_utils_begin(p_env_init_seq) #(REG)) ... DON’T EVER FORGET ☺ © Verilab & Accellera 11 DUT-Specific Environment SPECIALIZE P_ENV ENVIRONMENT BY SETTING ACTUAL PARAMETER VALUES class a21_env extends uvm_env; p_env #env(reg_a,2,1; // specific) env; environment// generic environment `uvm_component_utils_begin(a21_env) ... function void build_phase(...); env = p_env::#(type_idreg_a,2,1::create)::type_id("env::",create this);(" env", this); ... DON’T FORGET THIS EITHER ☺ ... OR REPLACE ALL OF THAT WITH CONVENIENCE TYPE DEFINITION typedef p_env#(reg_a,2,1) a21_env; © Verilab & Accellera 12 DUT-Specific Sequences MUST EXTEND CORRECT TYPE class a21_example_seq extends p_env_base_seq #(reg_a,2,1); `uvm_object_utils(a21_example_seq) ... DEFINE CONVENIENCE TYPE typedef p_env_base_seq #(reg_a,2,1) a21_base_seq; class a21_example_seq extends a21_base_seq; `uvm_object_utils(a21_example_seq) USE CONVENIENCE TYPE ... p_sequencer.reg_model.TX2_FIELD.write(status, 1'b0); ... typedef p_env_init_seq #(reg_a,2,1) a21_init_seq; typedef p_env_config_seq #(reg_a,2,1) a21_config_seq; ... SHARED SEQUENCES MUST ALSO BE SPECIALIZED TO RUN ON SPECIALIZED ENVIRONMENT SEQUENCER => DEFINE AND USE CONVENIENCE TYPES © Verilab & Accellera 13 DUT-Specific Tests class test_example_seq extends a21_base_seq; a21_init_seq init_seq; // init sequence a21_config_seq cfg_seq; // cfg handshake ... task seq_body(); SEQUENCES ARE ALREADY `uvm_do(init_seq) SPECIALIZED BY TYPEDEFS `uvm_do_with(cfg_seq, {...}) p_sequencer.reg_model.TX2_CFG_STAT.read(status, m_val); ... NON-PARAMETERIZED SEQUENCES ALL RUN ON OBJECTS & COMPONENTS ENVIRONMENT SEQUENCER AT THE TOP-LEVEL class test_example extends a21_base_test; test_example_seq example_seq = new(); virtual task run_phase(...); example_seq.start(tb.env.sequencer); tb.env.reg_model.RX1_OFFSET_FIELD.write(status, 0); ... © Verilab & Accellera 14 Parameterizaon Tips • Don’t do it! – avoid parameterizaon if possible – ...but some1me it is an ideal fit for horizontal reuse • It is hard to implement first 1me round but relavely easy to retrofit – errors are all related to types specializaon – bugs are all caused by bad parameter proliferaon – so get the ini1al version working, then parameterize • Pracce makes perfect... – clone a working environment right now... – ...and retrofit parameterizaon just for fun! © Verilab & Accellera 15 PARAMETERIZED INTERFACES © Verilab & Accellera 16 Normal Interfaces class my_comp extends uvm_component; config database virtual my_intf vif; function void build_phase(...); CIF uvm_config_db#(virtual my_intf) config_db::get config_db::set ::get(this,"","cif",vif); BASE-TEST ENV module testbench; C S TESTBENCH MODULE my_intf mif; UVC my_dut dut(.ADDR(mif.addr),...); C SVA initial begin uvm_config_db#(virtual my_intf) S D VIF DUT ::set(null,"*","cif",mif); M VIF AGENT run_test(); INTERFACE (MIF) INTERFACE end Other AGENTs interface my_intf(); Other OVCs logic [31:0] addr; ... © Verilab & Accellera 17 Parameterized Interfaces • RTL Parameters o^en affect module ports – e.g. signal width (e.g. input logic [WIDTH-1:0] ADDR) – (but not the presence or absence of signal ports) • Temp1ng to parameterize the interface to match RTL ... interface my_intf ();#(int WIDTH=1)(); SIMPLE CHANGE TO logic [31WIDTH:0] -1:0]addr; addr; ADD PARAMETER ... TO INTERFACE module testbench; SIMPLE CHANGES TO my_intf #mif(32;) mif; SPECIALIZE INTERFACE my_dut dut(.ADDR(mif.addr),...); AND SEND TO CONFIG_DB initial begin uvm_config_db#(virtual my_intf)#( 32)) NOTE THE INTERFACE

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    38 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us