
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
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages38 Page
-
File Size-