Aa  `P0@p @0P0  0@ `0`pP @*Author AccelleraTitleSystemVerilog 3.1/draft 1Subject9PRELIMINARY draft of SystemVerilog 3.1, SUBJECT TO CHANGEH $ d HHZZ̀̀̀ff@  'd Footnote TableFootnote**/ - :;,.!? g  g`TOCHeading1Heading24APIsLimitedInteractiveMaxTime SystemVerilogVCsVerilogargs*assert(vpi_data_read_isinloadlist(loadlist"assert(vpi_get(vpiDataReadLoadListassert(vpi_get(vpiTypebig_loadCollection big_scope big_scope;boolcbcbEndofCompile cbValueChange colFilterHdlcolHdlcollection_handlecollectionloadCollectiondata_busdata_write_objdatafile debuggers delieanatedesignCollection designObjdumpvarsenumextension_nameextension_version filterTypefnameftgoto implementorsinlineinstanceHandleintinteroperabilityiteratoritrloadCollection loadedObj loadedVarloadlistmin my_data_fileobj objCollection obj_handle obj_trvs_hdl object_handleobjsp_toolZ_extensionp_vpi_extension p_vpi_time p_vpi_valueprevreader_extension_ptrreader_p reader_pX reader_pYref_hs_toolZ_extensions_vpi_extension scaleunit scopetypesignal_iteratorsize_tsizeof(s_vpi_extensionsome_net some_portsome_regstrstrcmp(hstruct struct_sizestruct_version sub)scope subscopestime_ptime_p;timelinetoolXtoolYtoolZ toolZfunctoolZfunc)(inttrvstrvsCollectiontrvsHndltrvsObjtypedef user_datavalue_p value_pointervar(s varCollection var_handle vc_trvs_hdlvctrvsCollectionversion:Versionvpi vpiAccessvpiAccessInteractivevpiAccessLimitedInteractivevpiAccessPostProcess vpiCollection vpiDataLoadedvpiDataReadAccessvpiDataReadAccessInteractivevpiDataReadAccessPostProcessvpiDataReadGotoNextVCvpiDataReadIsLoadedvpiDataReadLoadListvpiDataReadMinTimevpiDataReadTrvsGotoNextVCvpiDataReadTrvsGotoPrevVCvpiDataReadTrvsHasVCvpiDataReadTrvsHndlvpiDataReadTrvsMaxTimevpiDataReadTrvsMinTimevpiDataReadTrvsTimevpiDataWriteFileTypevpiDataWriteType vpiFullName vpiHandle vpiHasNoValuevpiHasVCvpiInExtensionvpiIsExtension vpiIsLoaded vpiMaxTime vpiMember vpiMinTimevpiNamevpiNet vpiNextVCvpiObjCollection vpiParentvpiPort vpiPrevVCvpiRegvpiTimevpiTrvsCollection vpiTrvsHasVCvpiTrvsMaxTimevpiTrvsMinTime vpiTrvsNextVC vpiTrvsObj vpiTrvsPrevVC vpiTrvsTimevpiTypevpiTypes vpi_chk_errorvpi_chk_error)(error_info_p vpi_control!vpi_control(vpiDataReadGotoNextVCvpi_control(vpiDataReadMinTimevpi_control(vpiMinTimevpi_control(vpiNextVCvpi_control(vpiTimevpi_control(vpiTrvsMinTimevpi_control(vpiTrvsNextVCvpi_control(vpiTrvsTimevpi_control(vpiType vpi_createvpi_create(vpiCollectionvpi_create(vpiObjCollectionvpi_create(vpiTrvsCollectionvpi_create(vpiTypevpi_data_addtoloadlistvpi_data_createloadlistvpi_data_isinloadlist vpi_data_read_addtolist(loadlistvpi_data_read_addtoloadlist%vpi_data_read_addtoloadlist(vpiHandlevpi_data_read_createloadlistvpi_data_read_get_timevpi_data_read_get_time(vpiTypevpi_data_read_get_versionvpi_data_read_getversionvpi_data_read_init$vpi_data_read_init(vpiDataReadAccess/vpi_data_read_init(vpiDataReadAccessPostProcessvpi_data_read_init(vpiTypevpi_data_read_isinloadlist$vpi_data_read_isinloadlist(vpiHandlevpi_data_read_jump&vpi_data_read_jump(vpiDataReadTrvsTimevpi_data_read_jump(vpiTypevpi_data_read_loadvpi_data_read_load(loadlistvpi_data_read_load(var_handlevpi_data_read_load(vpiHandlevpi_data_read_readloadlistvpi_data_read_resetloadlistvpi_data_read_unloadvpi_data_read_unload(vpiHandlevpi_data_resetloadlistvpi_data_write_begintree"vpi_data_write_begintree(vpiHandlevpi_data_write_closevpi_data_write_close(vpiHandlevpi_data_write_createscope$vpi_data_write_createscope(vpiHandlevpi_data_write_createtime#vpi_data_write_createtime(vpiHandlevpi_data_write_createupscope&vpi_data_write_createupscope(vpiHandlevpi_data_write_createvalue$vpi_data_write_createvalue(vpiHandlevpi_data_write_createvar"vpi_data_write_createvar(vpiHandlevpi_data_write_endtree vpi_data_write_endtree(vpiHandlevpi_data_write_get_versionvpi_data_write_openvpi_data_write_open(charvpi_data_write_openfilevpi_data_write_setscaleunit%vpi_data_write_setscaleunit(vpiHandle vpi_filtervpi_filter((vpiHandlevpi_filter(vpiHandlevpi_free_objectvpi_getvpi_get(vpiDataLoadedvpi_get(vpiDataReadIsLoadedvpi_get(vpiDataReadTrvsHasVCvpi_get(vpiHasNoValuevpi_get(vpiHasVCvpi_get(vpiInExtensionvpi_get(vpiIsLoadedvpi_get(vpiTrvsHasVC vpi_get_timevpi_get_time(trvsCollectionvpi_get_time(vc_trvs_hdlvpi_get_trvs_time vpi_get_valuevpi_get_value(R`'Yl<c@ cB IIII I I IFJFLFMFOF_yFt Fv Fw Fy F F F F kKYh<Z<Z=[&[([)[d6d8kL_[\m] ]]s]u]v]]]h= `)`*g ggi0kRkS  31675: H2,1.1: 29.6 Reading data( *34910: H3,1.1.1: 29.6.3 Reading an object ) H90003: TableTitle: Table291: Usage extensions to existing VPI routines, +35454: H4,1.1.1.1: 29.6.3.2 Jump Behavior / $25024: H3,1.1.1: 29.1.1 Requirements7 .46458: H3,1.1.1: 29.6.6 Time-ordered traversal: &34758: H2,1.1: 29.7 Unloading the data '44643: H3,1.1.1: 29.3.1 Traverse object@ 890473: H2,1.1: 29.9 Reading data from multiple databases          ?㯺 $*34910: H3,1.1.1: 29.6.3 Reading an object ?㯺 H90003: TableTitle: Table291: Usage extensions to existing VPI routines?㯺$+35454: H4,1.1.1.1: 29.6.3.2 Jump Behavior ?㯺$+35454: H4,1.1.1.1: 29.6.3.2 Jump Behavior ?㯺$*34910: H3,1.1.1: 29.6.3 Reading an object ?㯺$.46458: H3,1.1.1: 29.6.6 Time-ordered traversal?㯺$&34758: H2,1.1: 29.7 Unloading the data?㯺$'44643: H3,1.1.1: 29.3.1 Traverse object?㯺$890473: H2,1.1: 29.9 Reading data from multiple databases?㯺$890473: H2,1.1: 29.9 Reading data from multiple databases?㯺$890473: H2,1.1: 29.9 Reading data from multiple databases$ <$curpagenum><$monthname> <$daynum>, <$year>"<$monthnum>/<$daynum>/<$shortyear>;<$monthname> <$daynum>, <$year> <$hour>:<$minute00> <$ampm>"<$monthnum>/<$daynum>/<$shortyear><$monthname> <$daynum>, <$year>"<$monthnum>/<$daynum>/<$shortyear> <$fullfilename> <$filename> <$paratext[ChapterTitle]> <$paratext[SectionTitle]> <$curpagenum> <$paranumonly[Chapter]><$paranum[Chapter]> (continued)+ (Sheet <$tblsheetnum> of <$tblsheetcount>)Heading & Page <$paratext> on page<$pagenum>Pagepage<$pagenum>See Heading & Page%See <$paratext> on page<$pagenum>. Table All7Table<$paranumonly>, <$paratext>, on page<$pagenum>Table Number & Page'Table<$paranumonly> on page<$pagenum> Draft Number (Draft 1) Draft_title7SystemVerilog 3.1, Accellera Extensions to Verilog-2001VerilogXL version #VerilogXL 1.5c <$volnum>copy2003std#SystemVerilog 3.1 <$chapnum>AnnexAnnex<$paranumonly> $paranumonly<$paranumonly>SectionSection<$paranumonly>TableTable<$paranumonly> $paratext <$paratext>FigureFigure<$paranumonly>ExampleExample<$paranumonly>$paranum <$paranum> (HTML Headings++A..A00hh33557IAaacceeAkkmmooArrAuuAww||~~A   AATOCPFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGGGGGG G GGGGGGGGGGG G"G$G&G(G*G,G.G0G2G4G5G6G8G:G<G>G@GAGBGDGFGHGJGLGNGPGRGTGVGXGZG\G^G`GbGdGfGhGjGlGnGpGrGtGvGxGzG|G~GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGHHHHHH H HHHHHHHHHH H"H%H'H)H+H-H/H1H3H5H7H9H;H=H?HAHCHEHGHJHLHNHPHRHTHVHXHZH\H^H`HcHeHgHiHkHmHoHqHsHuHwHyH{H}HHHHHHHHHHHHHHHHHHHHHH%HHH*HHH*HHH*HHLHHHLF$LF7LF8F?F%F&I$ Section 29HFIFPFQ;LZ729.7.6 M29.2.2 JD29.2.1 Jr29.7.1 KpLL<=La1LL)>3>>>I>T>_>jL`OLZ8LLlg5d!!ZZLLZ`29.8 ]G!!ZdLLli.ZrLLZtLLZx!!Z!LZ!!Z!!Z!!Z!!Z!!Z!!Z!!Z!!Z!!Z!!lk5lm.lo5X29.3.1 `LLlq.ls5R)L Table292: XL1)X 2)X 3)U29.1.1 X&lu.X 29.3.2.1 fwLLXLXLYYLY!L]H!!ULRs 29.7.2 Ru a)XLUR R R UUUXLLes 2)Z!!Y$!!Y%!!]I!!Y'!!Y(!!Y)L!]jLLY+!!Y0!!Y1LLY2!!Y4!!Z!!ULLVLZ!LZ!!Z!!Z!!YLLV LV 29.7.3.2 YY5!!lw5lx55_t29.5 hg.Y@LLlz.`L!V 29.7.3.1 cLLX229.7.4 gLLVVd5LZ!!Vhh..lLLZ!!b!e!!X!LX"LLX&XULhj.hl5hn.X>LXgLZ!!l|5Z!`!!Z!Z!!Z LLZLLZ!`!!ZLL_v29.4 [ LFigure 291 _wLL_x"_yl~._ Figure 292 ]29.7.7 _L _LL_ Figure 293 \LL]LL] LL]kL]oLl<] 29.9 ]LL]LL^L^ 29.10.1 ho Table291: `LLiL`L`!!`!!l5eLLl.eLLa:aSLLaw!!a[!a!!a!!a!!a!!a!!a!!a!k!!a!!bKiLc!!c!!c!NLLl4 29.7.4.3 c!c!!c!!HFFFLF-FRLFWF^LFbFcFdFeFfFrFsFzF{F|LFFFFFLFLH!H"H#H$H%H&H'H(HLI729.2 I29.1 ILI29.1.2 c!!d<Lc!!c!!ILc!!IIc!!IdLIJLJ 29.7.4.1 JJJJJJJJJLMLM 29.2.2.1 J29.2.3 Jd!!K  29.2.2.2 K- 29.2.2.2.1 MKuL29.3 j..k!k!!j!!j!!k!!d!!d!!k!!m9k"!!k+!!k&!k-!!k5&c)kF&b)kX!!kd!!nRke!!kk!!l.l.l(Le!!eLLl5e!!l!kl!!M! a)M"M'&b)M(e!!e!e!!l.l5kq!!f!!f!!f!!nSlLLg| 29.10 hLLg!!g!g!!g!g!!h !!g!!g!!g!!g!!g!!g!!g!!g!!g!!h!!!h,!!g!!g!!g!!g!!g!!h-!!h!h!!m3LLh!!l29.7.5 h!!h!!iLiLiLLi$LlLLiL#lLkLLk$Lk$lLLl-LLlLLmsLLl$$lLk$mLLk$mcLLm!Lm!!m!!m!!m!!m!!m!!m!!m!!mL!m!Lm!!m!!m!!m!!m!!m!!m!!m!!m!!vdF*5}seZl[W8seZX DW;3 `To dFdH HN`@H HN`@HRHRAFootnote Hq<@`@H Hq<@`@HzHzA Single LineH'H  Footnote$H$% HH W, dH* }6F=?6 W- dN }2-F>@2- W. dN }_?F?A_? W/ d }$F@B$ W0 d P:Heading2 }HFACH W1 dH* }6GBD6 W2 dN }2-GCE2- W3 dN }_?GDF_? W4 d }$GEG$ W5 dP:HeadingRunIn }HG FHH W6 dH* }6G GI6 W7 dN }2-G HJ2- W8 dN }_?GIK_? W9 d }$ ,GJL$ , W: d P:Indented } H,GKM H,, ; dP <d Parent = UL Q=d Depth = 0 } 6,GLN 6, W> dN }2 -,GMO2 -, W? dN }_ ?,GNP_ ?, W@ d }$9GOQ$9 WA dP:Mapping Table Cell }9HGPR9H WB dP }96G!QS96 WC dN }29-G#RT29- WD dN }_9?G%SU_9? WE d }$IG'TV$IWF dP:Mapping Table Title }IHG)UWIHWG dP }I6G+VXI6WH dN }2I-G-WY2I-WI dN }_I?G/XZ_I?WJ d }$Y,G1Y[$Y,WK d P:Numbered }YH,G3Z\YH,,L dLI Md Parent = OL QNd Depth = 0 }Y6,G7[]Y6,WO dN }2Y-,G9\^2Y-,WP dN }_Y?,G;]_Y?,WQ d }$b,G= `$b,#WR e P:Numbered1 }bH,G? _abH,,#S eLI Te Parent = OL QUe Depth = 0 }b6,GC `bb6,#WV eN }2b-,GE ac2b-,#WW eN }_b?,GG bd_b?,#WX e }$GI ce$#WY eP:TableFootnote }HGK dfH#WZ eP }6GM eg6#W[ eN }2-GO fh2-#W\ eN }_?GQ gi_?#W] e }$GS hj$#W^ e P:TableTitle }HGU ikH#W_ eH* }6GW jl6#W` eN }2-GY km2-#Wa eN }_?G[ ln_?#Wb e }$G] mo$#Wc eP:Title }HG_ npH#Wd eH* }6Ga oq6#We eN }2-Gc pr2-#Wf eN }_?Ge qs_?#Wg e }$Gg rt$#Wh e C:Emphasis }HGi suH#Wi eEM }6Gk tv6#Wj eN }2-Gm uw2-#Wk eN }_?Go vx_?#Wl e }$Gq wy$#Wm eC:EquationVariables }HGs xzH#Wn eEM }6Gu y{6#Wo eN }2-Gw z|2-#Wp eN }_?Gy {}_?#Wq e }$G{ |~$#Wr eX:Heading & Page }HG} }H#Ws eHeading }6G ~6#Wt eN }2-G 2-#Wu eN }_?G _?#Wv e }$G $#Ww eX:Page }HG H#Wx eHeading }6G 6#Wy eN }2-G 2-#Wz eN }_?G _?#W{ e }$G $#W| eX:See Heading & Page }HG  H#W} e See Also }6G  6#W~ eN }2-G 2-#W eN }_?G _?#W e }$G $#W e X:Table All }HG H#W e Table All }6G 6#W eN }2-G 2-#W eN }_?G _?#W e }$G $#W eX:Table Number & Page }HG H# %Table PENumber }6G 6#W eN }2-G 2-#W  eN }_?G _?#W  e }$B G $B #W eHTML Options Table }B G B #W e }hB G hB #W e }$RG $R#W eControl }RG R#W eValue }hRHG hRH#W e Comments }$bG $b#W e Image Format }bG b#W e0001IMAGGIF GIF }hbHG hbH#W e }$rG  $r#W e!Copy Files Imported by Reference }rG !r#W eN }hrHG "hrH#W e }$G !#$#W eExport Encoding }G "$#W e ISO-8859-1 }hHG #%hH#W e }$G $&$# W eCSS Export Encoding }G %'# W e ISO-8859-1 }hHG &hH# W e }$$ G$,$$ &!WeSystem Macros }$ G$$ &!We }$ G$$ &!We }\$ G$\$ &!W e }$4hG$(-$4h&"W! e Macro Name }4hG$,.4h&"W" e Replace With }4hG$-/4h&"W# eHead }\4BG$.0\4B&"W$ e Comments }$Dh,G$/1$Dh,&#W% e StartOfDoc }Dh,G$02Dh,&#W& e }Dh,G$13Dh,,&#' % ���<$defaulttitle></P���ETITLE> }\��DB,��G�$24���\��DB,&�#W( ���e }$ph��G�$35���$ph&�$�W) ���e EndOfDoc }��ph��G�$46�����ph&�$W* ���e }��ph��G�$57�����ph&�$W+ ���e }\��pB��G�$68���\��pB&�$W, ���e }$��h,��G�$79���$��h,&�%�W- ���eStartOfSubDoc }����h,��G�$8:�������h,&�%W. ���e }����h,��G�$9;�������h,,&�%/ ���%<TITLE> ���<$defaulttitle></P���ETITLE> }\����B,��G�$:<���\����B,&�%W0 ���e }$��h��G�$;=���$��h&�&�W1 ���e EndOfSubDoc }����h��G�$<>�������h&�&W2 ���e }����h��G�$=?�������h&�&W3 ���e }\����B��H�$>@���\����B&�&W4 ���e }$��h,��H�$?A���$��h,&�'�W5 ���eStartOfFirstSubDoc }����h,��H�$@B�������h,&�'W6 ���e }����h,��H�$AC�������h,,&�'7 ���%<TITLE> ���<$defaulttitle></P���ETITLE> }\����B,��H �$BD���\����B,&�'W8 ���e }$��h��H �$CE���$��h&�(�W9 ���eEndOfFirstSubDoc }����h��H �$DF�������h&�(W: ���e }����h��H�$EG�������h&�(W; ���e }\����B��H�$FH���\����B&�(W< ���e }$��h,��H�$GI���$��h,&�)�W= ���eStartOfLastSubDoc }����h,��H�$HJ�������h,&�)W> ���e }����h,��H�$IK�������h,,&�)? ���%<TITLE> ���<$defaulttitle></P���ETITLE> }\����B,��H�$JL���\����B,&�)W@ ���e }$$��h��H�$KM���$$��h&�*�WA ���eEndOfLastSubDoc }��$��h��H�$LN�����$��h&�*WB ���e }��$��h��H�$MO�����$��h&�*WC ���e }\��$��B��H!�$NP���\��$��B&�*WD ���e }$:���� ��H$�$OS���$:���� &�+�WE���eCross-Reference Macros }��:���� ��H&�$�������:���� &�+WF���e }D��:���� ��H(�$�����D��:���� &�+WG���e }$J������H*�$PT���$J����&�,�WH ���e Macro Name }��J������H,�$SU�����J����&�,WI ���e Replace With }D��J��?��H.�$TV���D��J��?&�,WJ ���e Comments }$Z������H0�$UW���$Z����&�-�WK ���eHeading }��Z������H2�$VX�����Z����&�-WL ���e <$paratext> }D��Z��?��H4�$WY���D��Z��?&�-WM ���e }$j������H6�$XZ���$j����&�.�WN ���e See Also }��j������H8�$Y[�����j����&�.WO ���eSee <$paratext>. }D��j��?��H:�$Z\���D��j��?&�.WP ���e }$z������H<�$[]���$z����&�/�WQ ���e Table All }��z������H>�$\^�����z����&�/R ���%Table <$paranumonly>, P���E <$paratext> }D��z��?��H@�$]_���D��z��?&�/WS ���e }$������HB�$^`���$����&�0�WT ���e Table Number }��������HD�$_a���������&�0WU ���eTable <$paranumonly> }D����?��HF�$`����D����?&�0WV ���e }$$�� ��HI�'�f���$$�� )�1�WW���eGeneral Macros }v$�� ��HK�'�����v$�� )�1WX���e }$�� ��HM�'�����$�� )�1WY���e }2��$�� ��HO�'�����2��$�� )�1WZ���e }$4ev��HQ�'bg���$4ev)�2�W[ ���e Macro Name }v4ev��HS�'fh���v4ev)�2W\ ���e Replace With }4C��HU�'gi���4C)�2W] ���eHead }2��4Q��HW�'hj���2��4Q)�2W^ ���e Comments }$Dev��HY�'ik���$Dev)�3�W_ ���e }vDev��H[�'jl���vDev)�3W` ���e }DC��H]�'km���DC)�3Wa ���e }2��DQ��H_�'ln���2��DQ)�3Wb ���e }$Z�� ��Hb�'mq���$Z�� )�4�Wc���eCharacter Macros }lZ�� ��Hd�'�����lZ�� )�4Wd���e }��Z�� ��Hf�'�������Z�� )�4We���e }$jH��Hh�'nr���$jH)�5�Wf ���e Character }lj����Hj�'qs���lj��)�5Wg ���e Replace With }��j?��Hl�'rt�����j?)�5Wh ���e Comments }$zH��Hn�'su���$zH)�6�Wi ���e }lz����Hp�'tv���lz��)�6Wj ���e¢ }��z?��Hr�'uw�����z?)�6Wk ���e }$��H��Ht�'vx���$��H)�7�Wl ���e }l������Hv�'wy���l����)�7Wm ���e© }����?��Hx�'xz�������?)�7Wn ���e }$��H��Hz�'y{���$��H)�8�Wo ���e }l������H|�'z|���l����)�8Wp ���e® }����?��H~�'{}�������?)�8Wq ���e }$��H��H�'|~���$��H)�9�Wr ���e }l������H�'}���l����)�9Ws ���e° }����?��H�'~��������?)�9Wt ���e }$��H��H�'���$��H)�:�Wu ���e }l������H�'����l����)�:Wv ���e-- }����?��H�'�������?)�:Ww ���e }$��H��H�'���$��H)�;�Wx ���e }l������H�'���l����)�;Wy ���e- }����?��H�'�������?)�;Wz ���e }$��H��H�'���$��H)�C�W{ ���e }l������H�'���l����)�CW ���e... }����?��H�'��������?)�CW ���e ��d������H���������""����������d������H��������� ��������$$h������H� �����$$h������ �����l��� $$h������H� �����$$h���������� ! ����W��@l }$h�� ��H� ����$h��  �<�W|���dHeadings Table }��h�� ��H� �������h��  �<W}���e }��h�� ��H� �������h��  �<W~���e }$Cl��H� ���$Cl �=�W ���dHeading Level }��Cu��H� �����Cu �=W� ���dParagraph Format }��CH��H� �����CH �=W ���d Comments }$Sl��H� ���$Sl �>�W ���d1 }��Su��H� �����Su �>W ���dTitle }��SH��H� �����SH �>W ���d }$il��H� ���$il �?�W ���d2 }��iu��H� �����iu �?W UTUT���d Heading1 }��iH��H� �����iH �?W ���d }${l��H� ���${l �@�W ���d3 }��{u��H� �����{u �@W  ���d Heading2 }��{H��H� �����{H �@W  ���d }$l��H� ���$l �A�W  ���d4 }��u��H� �����u �AW  ���d HeadingRunIn }��H��H� �����H �AW  ���d }$l��H�  ���$l �B�W ���d4 }��u��H� !�����u �BW  ���d TableTitle }��H��H� ������H �BW ���d $$������H� �����$$����%##����l��� $$������H� �����$$�����������_'"�_dinsx} "%(,048<@DHLPSVY\_bfjnqtwz}�����d������H���������%%��������$$������H�$�����$$����"(&&�����l��� $$������H�$�����$$�������� ���(a%�(,048<@DHLPSVY\_ bfjnqtwz}�����d������H���������(( ��������$$������H�'�����$$����%�))����l��� $$������H�'�����$$�������� ����b(� bfjnqtwz}���� ���~��F� �+������~���������>�UH��ˆ����F� *3���UH��ˆ�����22 ����l�����d������F/���������-h�������� ���~��F0� ,�.������~���������>�Zl��d����F1� ,-0���Zl��d�����//����l��� Zl��d����F2�,�����Zl��d����������.����W���e U$����F3� ,.h���U$�����11����l��� U$����F4�,�����U$����������0����W���d UH��ˆ����F������UH��ˆ����������+����W���d U$����F � +5���U$�����44 ����l��� U$����F!������U$����������3�������` Accellera Q��`-Extensions to Verilog-2001SystemVerilog 3.1 U�w��R��F"� 3����U�w��R���gg ����l��� UH��ˆ����;������UH��ˆ��„� ��� mm��7����UTUT���  UR���@SystemVerilog Data Read API  ��� oThis chapter extends the SystemVerilog VPI with read facilities so that the Verilog Procedural Interface (VPI) 0����hacts as an Application Programming Interface (API) for data access and tool interaction irrespective of ����qwhether the data is in memory or a persistent form such as a file, and also irrespective of the tool the user is ���@interacting with. 9UTqUL���` Motivation :��� mSystemVerilog is both a design and verification language consequently its VPI has a wealth of design and ver0����oification data access mechanisms. This makes the VPI an ideal vehicle for tool integration in order to replace ����oarcane, inefficient, and error-prone file-based data exchanges with a new mechanism for tool to tool, and user ����nto tool interface. Moreover, a single access API eases the interoperability investments for vendors and users ����nalike. Reducing interoperability barriers allows vendors to focus on tool implementation. Users, on the other ����nhand, will be able to create integrated design flows from a multitude of best-in-class offerings spanning the ��@jrealms of design and verification such as simulators, debuggers, formal, coverage or test bench tools.  9⪙���h/Requirements ���`ISystemVerilog adds several design and verification constructs including:  ���`[C data types such as � int� , � struct� , � union� , and � enum� . ���`7Advanced built-in data types such as � string� . ���`User defined data types. ���`&Test bench data types and facilities. U��� mThe access API shall be implemented by all tools as a minimal set for a standard means for user-tool or tool-0`����rtool interaction that involves SystemVerilog object data querying (reading). In other words, there is no need for ����ua simulator to be running for this API to be in effect; it is a set of API routines that can be used for any interac����wtion for example between a user and a waveform tool to � read�  the data stored in its file database. This usage ���@#flow is shown in the figure below. k�� h4 a9=��`Data read VPI usage model U��� oOur focus in the API is the user view of access. While the API does provide varied facilities to give the user p`����tthe ability to effectively architect his or her application, it does not address the tool level efficiency concerns ����qsuch as time-based incremental load of the data, and/or predicting or learning the user access. It is left up to ����limplementors to make this as easy and seamless as possible on the user. To make this easy on tools, the API ����qprovides an initialization routine where the user specifies access type and design scope. The user should be priUH��ˆ����;� �����UH��ˆ����D66 ����l���}6pey��l]�W>���6peyX �DW<3 ���`Use ��d������Q���������== �������� UH��ˆ����Q�9�����UH��ˆ��y�0���0����= ��������zcomplementary or in an exclusive fashion to � access collection� . � NULL�  is to be passed to the collection ���@=when � access scope�  is used in an exclusive fashion. )��� gAccess collection: The specified collection stores the traverse object handles to be loaded. It can be 0����{used either in a complementary or in an exclusive fashion to � access scope� . � NULL�  is to be passed to the ���@Hscope when � access collection � is used in an exclusive fashion. tR��� ovpi_load_init() � can be called multiple times. The load access specification of a call remains valid until 2]����rthe next call is executed. This routine serves to initialize the tool load access and provides an entry point for ���@/the tool to perform data access optimizations. }}��� ivpi_load_init_create()�  can be called anywhere � vpi_load_init()�  is called. The two have the 2����rsame function. In addition to initialization, � vpi_load_init_create()�  creates a load collection list con����qsisting of all the (valued) objects in the specified access scope if any (and its sub-scopes as governed by nest����oing mode) and the objects in the access collection if any. The return of � vpi_load_init_create()�  is a ���@;collection handle, with � NULL�  indicating failure. 9���`Object selection for loading ֪��� qIn order to select an object for loading, we must first obtain the object handle. This can be done using the VPI 0᪛����nroutines (that are supported in the tool being used) for traversing the HDL hierarchy and obtaining an object ���@Ihandle based on the type of object relationship to the starting handle. 7��� kAny tool that implements this read API (e.g. waveform tool) shall implement at least a basic subset of the  ����mdesign navigation VPI routines that shall include � vpi_handle_by_name()�  to permit the user to get a ����qvpiHandle�  from an object name. It is left up to tool implementation to support additional design navigation "����prelationships. Therefore, if the application wishes to access similar elements from one database to another, it ����|shall use the � name�  of the object, and then call � vpi_handle_by_name()� , to get the object handle from the ����qrelevant database. This level of indirection is always safe to do when switching the database query context, and ���@shall be guaranteed to work. uX��� `It should be noted that an objects � vpiHandle�  depends on the access mode specified in c����kvpi_load_extension()�  and the database accessed (identified by the returned extension pointer, see Sec"���stion E29.9D). A handle obtained through a post process access mode (� vpiAccessPostProcess� ) from a ����xwaveform tool for example is not interchangeable � in general�  with a handle obtained through interactive access ����jmode (� vpiAccessLimitedInteractive�  or � vpiAccessInteractive� ) from a simulator. Also han����ldles obtained through post process access mode of different file databases are not interchangeable. This is ����tbecause objects, their data, and relationships in a stored file database could be quite different from those in the ���@6simulation model, and those in other file databases. D9���`Loading objects CҪ��� pOnce the object handle is obtained then we can use the VPI data load routine � vpi_read_load()�  with the 0ݪ����xobjects � vpiHandle�  to load the data for the specific object onto memory. Alternatively, for efficiency consid����perations, � vpi_read_load()�  can be called with a design object collection handle of type � vpiObjCol"����glection� . The collection must have already been created by either using � vpi_create()�  (or ����gvpi_load_init_create()� ) and the (additional) selected object handles added to the load collection "����wusing � vpi_create()�  with the created collection list passed as argument. The object(s) data is not accessible ���H~as of yet to the users read queries; a traverse handle must still be created. This is presented in Section 29.7.4. ')��� rNote that loading the object means loading the object from a file into memory, or marking it for active use if it p4����mis already in the memory hierarchy. Object loading is the portion that tool implementors need to look at for ����nefficiency considerations. Reading the data of an object, if loaded in memory, is a simple consequence of the ����nload. The API does not specify here any memory hierarchy or caching strategy that governs the access (load or ����pread) speed. It is left up to tool implementation to choose the appropriate scheme. It is recommended that this ����phappens in a fashion invisible to the user. The API does provide the tool with the chance to prepare itself for ����sdata load and access with the � vpi_load_init() (� or � vpi_load_init_create()� ). With this call, the ���@mtool can examine what objects the user wishes to access before the actual load and then read access is made. }UeT��h>�T�(���UeTU=�O�W/3 ���`To ~U³;��X��l�X�����U³;��XŚXi���p(��� k The word trace can be replaced by simulation; we use trace here for generality since a dump file can be \終(0���@generated by several tools. UH��ˆ����Q� 9�����UH��ˆ���\L:: ����l���}szZ)��l_�W8?���szZ))X �E�E3 ��� Create a new handle: used to ���@5- create an object (traverse) collection for loading AW���`4- Add a (traverse) object to an existing collection }6pzy)��lb�W>@���6pzy)X �EWX ���` vpi_create() }sZ��ld�W?]���sZX �F�WZ3 ���`Get read interface version ~l�@��lB�0|���~l�@��d������E���������DD �������� UH��ˆ����E�B�����UH��ˆ��l�%���%����D�������@fmarily concerned with the API specified here, and efficiency issues are dealt with behind the scenes. ;9���`Naming conventions @���`\All elements added by this interface shall conform to the VPI interface naming conventions. BC���`+ All names are prefixed by � vpi� . CT��� } All � type names � shall start with � vpi� , followed by initially capitalized words with no separators, e.g., `���@ vpiName. Eq�� w All callback names shall start with � cb� , followed by initially capitalized words with no separators, e.g., }���@cbValueChange� . G���  All � routine names � shall start with � vpi� _, followed by all lowercase words separated by underscores (� _� ), ���@e.g., � vpi_handle()� . 8UTUJ���`Extensions to VPI enumerations HѪ��� qThese extensions shall be appended to the contents of the � vpi_user.h � file, described in IEEE Std. 1364-ܪ���@v2001, Annex G. The numbers in the range�  800 - 899�  are reserved for the read data access portion of the VPI. #9���` Object types - ��� wAll objects in VPI have a � vpiType� . This API adds a new object type for data traversal, and two other objects ���@<types for object collection and traverse object collection. F$��� 2/* vpiHandle type for the data traverse object */ 00���D#define vpiTrvsObj 800 /* use in vpi_handle()*/ ���L#define vpiCollection801 /* Collection of VPI handles*/ ���D#define vpiObjCollection802 /* Collection of traversable ���"design objs*/ ��@Q#define vpiTrvsCollection803 /* Collection of vpiTrvsObjs*/ ,v��� rThe other object types that this API references, for example to get a value at a specific time, are all the valid ����utypes in the VPI that can be used as arguments in the � VPI routines for logic and strength value processing such ���@Xas � vpi_get_value(<object_handle>, <value_pointer>)� . � These types include: J���` Constants P���`Nets and net arrays K���`Regs and reg arrays L���` Variables M���`Memory N���` Parameters O���` Primitives Q���` Assertions R1��� |In other words, any limitation in � vpiType�  of � vpi_get_value()�  will also be reflected in this data access <���@API. "9S���`Object properties SSi���`2This section lists the object property VPI calls. UH��ˆ����E� B�����UH��ˆ���7GCC  ����l�����d������E���������GG �������� UH��ˆ����E�E�����UH��ˆ��~�,���,����G����T9���` Static info Z��� /* Check */ 0 ���;#define vpiIsLoaded 804 /* use in vpi_get() */ ���7#define vpiHasVC805 /* use in vpi_get() */ ���<#define vpiHasNoValue806 /* use in vpi_get() */ ���=#define vpiInExtension807 /* use in vpi_get() */ ���� ���� /* Access */ ���L#define vpiAccessLimitedInteractive808 /* interactive */ ���G#define vpiAccessInteractive809 /* interactive: history */ ��@B#define vpiAccessPostProcess810 /* data file*/  ��� /* Member of a collection */ 0���<#define vpiMember811 /* use in vpi_iterate() */ ����(/* Iteration on instances for loaded */ ��@@#define vpiDataLoaded812 /* use in vpi_iterate() */ X9Ϫ���` Dynamic info Y���`Control constants V��� 9/* Control Traverse: use in vpi_control() or vpi_goto() 0���for a vpiTrvsObj type */ ���6#define vpiMinTime813/* min time*/ ���6#define vpiMaxTime814/* max time*/ ���##define vpiPrevVC  815 ���"#define vpiNextVC 816 ��@5#define vpiTime 817/* time jump*/ =U��� qThese properties can also be used in � vpi_trvs_get_time()�  to enhance the access efficiency. The routine `����qvpi_trvs_get_time()�  is similar to � vpi_get_time()�  with the additional ability to get the min, max, "����pcurrent, previous VC, and next VC times of the traverse handle; not just the current place it points (as is the ����ycase for � vpi_get_time()� ). These same � vpiType� s can then be used for access or for moving the traverse ���@Dhandle where the context (get or go to) can distinguish the intent. U9���`System callbacks %��� kThe access API adds no new system callbacks. The reader routines (methods) can be called whenever the user ���@3application has control and wishes to access data. [UTU4���`VPI object type additions ~9愈���hTraverse object w��� iTo access the value changes of an object over time, the notion of a Value Change (VC) traverse handle is 0����ladded. A value change traverse object is used to traverse and access value changes not just for the current ����xvalue (as calling � vpi_get_time()�  or � vpi_get_value()�  on the object would) but for any point in time: ����wpast, present, or future. To create a value change traverse handle the routine � vpi_handle()�  is called with a ���@vpiTrvsObj vpiType� : yA���  2M����-vpiHandle object_handle; /* design object */ ����8vpiHandle trvsHndl = vpi_handle(/*vpiType*/vpiTrvsObj, ��@(/*vpiHandle*/ object_handle); S8{~��� wA traverse object exists from the time it is created until its handle is released. It is the applications responsibilUH��ˆ����E� E�����UH��ˆ���DJFF ����l�����d������E���������JJ �������� UH��ˆ����E�H�����UH��ˆ��}�.���.����J����8���@dity to keep a handle to the created traverse object, and to release it when it is no longer needed. ,9���`VPI Collection  ��� nIn order to read data efficiently, we may need to specify a group of objects for example when loading (or tra0����tversing) data we may wish to specify a list of objects that we want to mark as targets of data load (or traversal). ����{To do this grouping we need the notion of a � collection� . A collection represents a user-defined collection of VPI ����yhandles. The collection is an ordered list of VPI handles. The � vpiType�  of a collection handle can be � vpiC���@Lollection� , � vpiObjCollection� , or � vpiTrvsCollection� : xp���`lA collection of type � vpiCollection�  is a general collection of VPI handles of objects of any type. ��� vThe collection object of type � vpiObjCollection�  represents a collection of VPI � traversable�  objects ���@in the design.  ���``A � vpiTrvsCollection�  is a collection of traverse objects of type � vpiTrvsObj� . \���`-Our usage here in the read API is of either:  Ǫ��� jCollections of traversable design objects: Used for example in � vpi_read_load()�  to load data for 0Ӫ����kall the objects. A collection of traversable design objects is of type � vpiObjCollection�  (the ele���@bments can be any object type in the design except traverse objects of type � vpiTrvsObj� ).  ��� oCollections of data traverse objects: Used for example in � vpi_control()�  (or � vpi_goto()� ) to 0����pmove the traverse handles of all the objects in the collection (all are of type � vpiTrvsObj� ). A collec���@;tion of traverse objects is a � vpiTrvsCollection� . *��� mThe collection contains a set of member VPI objects and can take on an arbitrary size. The collection may be 0*����lcreated at any time and existing objects can be added to it. The purpose of a collection is to group design ����lobjects and permit operating on each element with a single operation applied to the whole collection group. "����Vvpi_iterate(vpiMember, <collection_handle>)�  is used to create a member iterator. ���@Zvpi_scan()�  can then be used to scan the iterator for the elements of the collection. `��� A collection object is created with � vpi_create()� . The first call gives � NULL�  handles to the collection object 0k����oand the object to be added. Following calls, which can be performed at any time, provide the collection handle ���@cand a handle to the object for addition. The return argument is a handle to the collection object. (���` For example: ���`vpiHandle designCollection; ���`vpiHandle designObj; '���`vpiHandle trvsCollection; "���`vpiHandle trvsObj;  ��`9/* Create a collection of design objects*/ &���`=designCollection = vpi_create(vpiObjCollection, NULL, NULL); j��`7/* Add design object designObj into it*/ ���`NdesignCollection = vpi_create(vpiObjCollection, designCollection, designObj); !���` #��`5/* Create a collection of traverse objects*/ *���`<trvsCollection = vpi_create(vpiTrvsCollection, NULL, NULL); 6��`8/* Add traverse object trvsObj into it */ )���`ItrvsCollection = vpi_create(vpiTrvsCollection, trvsCollection, trvsObj); $/��� pSometimes it is necessary to filter a collection and extract a set of handles which meet, or do not meet, a spe0:����ucific criterion for a given collection. The function � vpi_filter()�  can be used for this purpose in the form ���@of: ,Z��� HvpiHandle colFilterHdl = vpi_filter((vpiHandle) colHdl, (PLI_INT32) file���@terType, (PLI_INT32) flag); S.z��� The first argument of � vpi_filter()� , � colHdl� , shall be the collection on which to apply the filter operation. UH��ˆ����E� H�����UH��ˆ���GMII  ����l�����d������E���������MM�������� UH��ˆ����E�K�����UH��ˆ����������M����.����The second argument, � filterType�  can be any � vpiType�  or VPI Boolean property. This argument is the criterion ����}used for filtering the collection members. The third argument, � flag� , is a Boolean value. If set to � TRUE� , "����~vpi_filter()�  shall return a collection of handles which match the criterion indicated by � filterType� , if set to ����vFALSE� , � vpi_filter()�  shall return a collection of handles which do not match the criterion indicated by ���@WfilterType� . The original collection passed as a first argument remains unchanged. +G��� vA collection object exists from the time it is created until its handle is released. It is the applications responsiR���@bbility to keep a handle to the created collection, and to release it when it is no longer needed.  9e���`Operations on collections ;{��� tWe define a method for loading data of objects in a collection: � vpi_read_load()� . This operation loads all 0����tthe objects in the collection. It is equivalent to performing a � vpi_read_load()�  on every single handle of ���@'the object elements in the collection. %��� uA traverse collection can be obtained (i.e. created) from a design collection using � vpi_handle()� . The call ���@would take on the form of: n��� vpiHandle loadCollection; 0ͪ����</* Obtain a traverse collection from the load collection */ ���@/vpi_handle(vpiTrvsCollection, loadCollection); o漢���hGThe usage of this capability is discussed in Section 929.7.78. A��� pWe also define methods on collections of traverse handles i.e. collections of type � vpiTrvsCollection� . ����mThese methods are � vpi_control()�  and � vpi_goto()� . Their function is equivalent to applying ����nvpi_control()�  with the same time control arguments to move the traverse handle of every single object in ���@the collection. `UTCU?���`Object model diagrams b[��� zA traverse object of type � vpiTrvsObj�  is related to its parent object; it is a means to access the value data of 0f����osaid object. An object can have several traverse objects each pointing and moving in a different way along the ����xvalue data horizon. This is shown graphically in the model diagram below. The � traversable�  class is a represen���@1tational grouping consisting of any object that: c���` Has a name d��� jCan take on a value accessible with � vpi_get_value()� , the value must be variable over time (i.e. ���@Knecessitates creation of a traverse object to access the value over time). Q)��� rThe class includes nets, net arrays, regs, reg arrays, variables, memory, primitive, primitive arrays, concurrent UH��ˆ����E� K�����UH��ˆ���JPLL ����l�����d������E���������PP�������� UH��ˆ����E�N�����UH��ˆ��=����00��P����)�� Hassertions, and parameters. It also includes part selects of all the design object types that can have part selects.� C f9 ���`!Model diagram of traverse object h$��� tA collection object of type � vpiObjCollection�  groups together a set of design objects Obj (of any type). A p/����ttraverse collection object of type � vpiTrvsCollection�  groups together a set of traverse objects trvsObj of ���@type � vpiTrvsObj� . UH��ˆ����E� N�����UH��ˆ���MSOO  ����l�����d������E���������SS�������� UH��ˆ����E�Q�����UH��ˆ������[[��S����i�� h3 j9W���`Model diagram of collection 9UTvUS���`!Usage extensions to VPI routines -��� jSeveral VPI routines have been extended in usage with the addition of new object types and/or properties. 0����nWhile the extensions are fairly obvious, they are emphasized here again to turn the readers attention to the ���@extended usage. W. ���` UH��ˆ����E� Q�����UH��ˆ���PVRR ����l�����d������E���������VV�������� UH��ˆ����E�T�����UH��ˆ��������;AV����v/��@h4)Usage extensions to existing VPI routines= *UTUS���`New additions to VPI routines ժ���`6This section lists all the new VPI routine additions. Q+ꪦ���` UH��ˆ����E� T�����UH��ˆ���SYUU  ����l�����d������E���������YY�������� UH��ˆ����E�W�����UH��ˆ��q� ��� ��Y ����/��@h New Reader VPI routines YUTUS���hReading data 9���`&Reading data is performed in 3 steps: ����`mA design object must be � selected�  for loading from a database (or from memory) into active memory. ��� vOnce an object is selected, it can then be � loaded�  into memory. This step creates the traverse object handle  ���@1used to traverse the design objects stored data. 4��� nAt this point the object is available for reading. A traverse object must be created to permit the data value @���@traversal and access. $9X���`7VPI read initialization and load access initialization S&n���`(Selecting an object is done in 3 steps: UH��ˆ����E� W�����UH��ˆ���V\XX ����l�����d������E���������\\�������� UH��ˆ����E�Z�����UH��ˆ���.���.����\ ����(��� r The first step is to initialize the read access with a call to � vpi_load_extension()�  to load the reader ���@extension and set: ��� cName of the reader library to be used specified as a character string. A NULL entry means that the 0����kdefault library (i.e. tool (e.g. simulator) the application is running under) is used. More details are in ���HSection 229.9'. kR���`kDatabase file with stored data in case of � vpiAccessPostProcess�  mode (see � access mode� ). j���`AAccess mode: The following VPI properties set the mode of access ��� `vpiAccessLimitedInteractive� : Means that the access will be done for the data stored in the 2����ktool memory (e.g. simulator), the history (or future) that the tool stores is implementation dependent. If ����ithe tool does not store the requested info then the querying routines shall return a fail. The file argu���@bment to � vpi_load_extension()�  in this mode will be ignored (even if not � NULL� ). ��� dvpiAccessInteractive� : Means that the access will be done interactively. The tool will then use 2����rthe data file specified as a flush file for its data. This mode is very similar to the � vpiAccess� Limit����gedInteractive with the additional requirement that all the past history (before current time) shall be ����estored (for the specified scope/collection, see the � access scope/collection�  description of ���@@vpi_load_init()�  (� vpi_load_init_create()� ) later). ��� cvpiAccessPostProcess� : Means that the access will be done through the specified file. All data 2����jqueries shall return the data stored in the specified file. Data history depends on what is stored in the ���@)file, and can be nothing (i.e. no data). / ��� hvpi_load_extension() � can be called multiple times for different reader interface libraries (coming 2+����nfrom different tools), database specification, and/or read access. A call with � vpiAccessInteractive�  ����lmeans that the user is querying the data stored inside the simulator database and uses the VPI routines sup����nported by the simulator. A call with � vpiAccessPostProcess�  means that the user is accessing the data ����pstored in the database file and uses the VPI services provided by the waveform tool. The application, if access����ling several databases and/or using multiple read API libraries, can use the routine � vpi_get(vpiInExten����esion, <vpiHandle>)�  to check whether a handle belongs to that database. The call is performed as ���@ follows: s���`<reader_extension_ptr->vpi_get(vpiInExtension, <vpiHandle>); 3��� ^where � reader_extension_ptr�  is the reader library pointer returned after the call to ����zvpi_load_extension()� . � TRUE�  is returned if the passed handle belongs to that extension, and � FALSE�  "����votherwise. If the application uses the default library (i.e. the one provided by the tool it is running under), there ����ris no need to use indirection to call the VPI routines; they can be called directly. An initial call must however ���@ube made to set the access mode, specify the database file, and check for error indicated by a � NULL�  return. -ت��� nIn case of � vpiAccessPostProcess�  mode � vpi_read_close()�  shall be called to close the opened 㪈���@tdatabase file. Handles obtained from the particular database that gets closed are no longer valid after this call. ��� lMultiple databases, possibly in different access modes (for example a simulator database opened in � vpi����kAccessInteractive�  and a file database opened in � vpiAccessPostProcess� , or two different file "���vdatabases opened in � vpiAccessPostProcess� ) can be accessed at the same time. Section B29.9A shows an ���@Zexample of how to access multiple databases from multiple read interfaces simultaneously. ,��� \Next step is to specify the elements that will be accessed. This is accomplished by calling 8����avpi_load_init()�  (or � vpi_load_init_create()� ) and specifying a scope and/or an item "����kcollection. At least one of the two needs to be specified. If both are specified then the union of all the ���@Eobject elements forms the entire set of objects the user may access. d��� fAccess scope: The specified scope handle, and nesting mode govern the scope that access returns. Data pp~����kqueries outside this scope (and its sub-scopes as governed by the nesting mode) shall return a fail in the ����uaccess routines unless the object belongs to � access collection � described below. It can be used either in a UH��ˆ����E� Z�����UH��ˆ���Y=[[  ����l���}6py��lf�W@^���6pyX �FWf ���`vpi_read_get_version() }sZ=��lh�W]_���sZ==X �G�l3 ��� 5Initialize read interface by loading the appropriate p����2reader extension library (simulator, waveform, or ����6other tool). All following VPI routines are called by ����4indirection through the returned pointer (except in ���@:the case of calling the routines in the default library). }6py=��lj�W^���6py=X �GW{ ���`vpi_load_extension() ��d������F ���������ae��������U$����F � `�c���U$�����bb ����l��� U$����F �`�����U$����������a������` Accellera Q��`-SystemVerilog 3.1Extensions to Verilog-2001 Uw��R��F� `ae���Uw��R���dd ����l��� Uw��R��F�`�����Uw��R��������c����W��lH25Copyright 2003 Accellera. All rights reserved. UH��ˆ����F� `c����UH��ˆ�����ff ����l��� UH��ˆ����F�`�����UH��ˆ����������e����W���d�  U�w��R��F#������U�w��R��������5����W��lHCopyright 2003 Accellera. All rights reserved.26 Zw��R��F5� ,0����Zw��R���ii����l��� Zw��R��F6�,�����Zw��R��������h����W��lU Running H/F 4 Copyright 2003 Accellera. All rights reserved.. #  ��d������FA���������ko��������U$����FB� j�m���U$�����ll ����l��� U$����FC�j�����U$����������k������d Accellera Q��dSystemVerilog 3.1 Uw��R��FD� jko���Uw��R���nn ����l��� Uw��R��FE�j�����Uw��R��������m������lU#Copyright 2003 Accellera. All rights reserved..Running H/F 4 Q���d UH��ˆ����FF� jm����UH��ˆ�����pp ����l��� UH��ˆ����FG�j�����UH��ˆ����������o����W���d ��d������FT���������rr��������UH��ˆ����FU� q�����UH��ˆ�����ss����l��� UH��ˆ����FV�q�����UH��ˆ����������r����W?UTUT���e ��d������FY���������uw��������UH��ˆ����FZ� t�w���UH��ˆ�����vv����l��� UH��ˆ����F[� t�����UH��ˆ����������u����W���d U8I��6y��F\� tu����U8I��6y���xx����l��� U8I��6y��F]� t�����U8I��6yOJ����yy��w����@�� l  i���d !h���d "UR���d #���$cAll rights reserved. No part of this document may be reproduced or distributed in any medium whatPKe���DHsoever to any third parties without prior written consent of Accellera. UBI��J��F`�t�������zz�x�����h ���Fa� y������h ���h…��d������Fh���������|��������U$����Fi� {�~���U$�����}}����l��� U$����Fj�{�����U$����������|����$��d Accellera Q%��d-SystemVerilog 3.1Extensions to Verilog-2001 Uw��R��Fk� {|����Uw��R�������l��� Uw��R��Fl�{�����Uw��R��������~����&��lT# Copyright 2003 Accellera. All rights reserved.!Running H/F 4" Q'���d D�;Hˆ����Fm� {~���D�;Hˆ��������l��� D�;Hˆ����Fn�{�����D�;Hˆ�������������������UHˆ����Fo� {�����UHˆ���������l��� UHˆ����Fp�{�����UHˆ��������������W(���d UH�ˆ����Fq�{����UH�ˆ�����d������F~����������������� ��_���F� ������_����������>�D�;Hˆ����F�  � ��D�;Hˆ��� � ����l��� D�;Hˆ����F������D�;Hˆ������������������U$����F�  ���U$�����  ����l��� U$����F������U$���������� ����)���d Accellera Q*��d-Extensions to Verilog-2001SystemVerilog 3.1 U�w��R��F�  ���U�w��R���  ����l��� U�w��R��F������U�w��R�������� ����+��lU#Running H/F 4$Copyright 2003 Accellera. All rights reserved..%#& Q,���d UHˆ����F�  ���UHˆ���� ����l��� UHˆ����F������UHˆ���������� ����W-���d UH�ˆ����F� ����UH�ˆ�� ��d������F�����������������UH��ˆ����F� �����UH��ˆ���������l��� UH��ˆ����F������UH��ˆ��������������W.���d ��d������H�����������������HH��ˆ����H� �����HH��ˆ����������l��� HH��ˆ����H� �����HH��ˆ��� ��� ��������/��d"<$paranum><$paratext><$pagenum> 0��d#<$paranum><$paratext><$pagenum> 1��d#<$paranum><$paratext><$pagenum> 2��d#<$paranum><$paratext><$pagenum> 3Z��d$<$paranum><$paratext><$pagenum> 4b��d#<$paranum><$paratext><$pagenum> 5~��d"<$paranum><$paratext><$pagenum> 6��d"<$paranum><$paratext><$pagenum> C7���d ��d������j���������(�������� UH��ˆ����j������UH��ˆ��ƒ�5���5��������n���+� PLI_BYTE8* filename� : Data file. ���@Related routines� : None. ���  ����vpi_load_init() "P����VSynopsis� : � Initialize the load access to scope and/or collection of objects. ����KSyntax� : � vpi_load_init(vpiHandle loadCollection, vpiHandle scope, ����PLI_INT32 level) I����9Returns: � PLI_INT32� , 1 for success, 0 for fail. ����Arguments� : "���f� vpiHandle loadCollection: � Load collection of type � vpiObjCollection� , a collection ���of design objects. ���/� vpiHandle scope� : Scope of the load. ���k� PLI_INT32 level� : If 0 then enables load access to scope and all its subscopes, 1 means just the ���scope. ���@Related routines� : None. �Ī��� vpi_load_init_create() PЪ����wSynopsis� : � Initialize the load access scope and/or collection of objects. It returns a load collection of all ����Fthe (valued) design objects in access scope and/or access collection. P����RSyntax� : � vpi_load_init_create(vpiHandle loadCollection, vpiHandle scope, ����PLI_INT32 level) I����kReturns: � vpiHandle�  � of type � vpiObjCollection � for success, � NULL�  for fail. ����Arguments� : "���f� vpiHandle loadCollection: � Load collection of type � vpiObjCollection� , a collection ���of design objects. ���/� vpiHandle scope� : Scope of the load. ���k� PLI_INT32 level� : If 0 then enables load access to scope and all its subscopes, 1 means just the ���scope. ����2Related routines� : � vpi_load_init()� . ���� ����vpi_trvs_get_time() "P����YSynopsis: � Retrieve the time of the object or collection of objects traverse handle. ����GSyntax: � vpi_trvs_get_time(vpiType prop, vpiHandle obj, p_vpi_time ����time_p) I����9Returns: � PLI_INT32� , 1 for success, 0 for fail. "���� Arguments: ���$� vpiType�  � prop� : "���b� vpiMinTime� : Gets the minimum time of traverse object or traverse collection. Returns ���ffailure if traverse object or collection has no value changes and � time_p�  is not modified. ���b� vpiMaxTime� : Gets the maximum time of traverse object or traverse collection. Returns ���ffailure if traverse object or collection has no value changes and � time_p�  is not modified. ���d� vpiTime� : Gets the time where traverse handle points. Returns failure if traverse object ���lor collection has no value changes and � time_p�  is not modified. In the case of a collection, it ���nreturns success (and � time_p�  is updated) only when all the traverse objects in the collection are ���]pointing to the same time, otherwise returns failure and � time_p�  is not modified. ���d� vpiNextVC� : Gets the time where traverse handle points next. Returns failure if traverse ���mobject or collection has no next VC and � time_p�  is not modified. In the case of a collection, it ���ireturns success when any traverse object in the collection has a next VC, � time_p�  is updated ���"with the smallest next VC time. ���b� vpiPrevVC� : Gets the time where traverse handle previously points. Returns failure if ���ktraverse object or collection has no previous VC and � time_p�  is not modified. In the case of a ���ecollection, it returns success when any traverse object in the collection has a previous VC, �  ���<time_p�  is updated with the largest previous VC time. B���p� vpiHandle obj� : Handle to a traverse object of type � vpiTrvsObj�  or a traverse collection of UH��ˆ����j� �����UH��ˆ���RF  ����l��� �ɻpx}O��lC�0AA����ɻpx}O� `� `�F parameter}sZ��ll�W_���sZX �H�|3 ��� 1Close data file (if opened in � vpiAccessPostR���@Process�  mode) ��d������Ze���������&&��������~l�@��lD�0����~l�@A}6py��ln�W���6pyX �HW} ���`vpi_read_close() }sZ��lp�W���sZX �I�W�3 ���`Initialize load access }6py��lr�W ���6pyX �IW ���`vpi_load_init() }s)Z)��lt�W!���s)Z))X �J�3 ��� 4Initialize load access and create a complete collecp����4tion of all the objects in the specified scope (and ���@,sub-scopes if required) and load collection }6p)y)��lv�W "���6p)y)X �J7 ���` Q8���`vpi_load_init_create() }sRZ��ly�W!$���sRZX �K�<3 ��� 7Load data (for a single design object or a collection) P���@ onto memory UH��ˆ����Zf������UH��ˆ���7���7����& ����M����ling the object data. We add that step here because we extend VPI with a temporal access component: The user 0 ����scan ask about all the values in time (regardless of whether that value is available to a particular tool, or found ����min memory or a file, the mechanism is provided). Since accessing this value horizon involves a larger memory ����nexpense, and possibly a considerable access time, we have added also in this Chapter the notion of loading an ����dobjectss data for read. Lets see now how to access and traverse this value timeline of an object. ���� ����mTo access the value changes of an object over time we use a traverse object as introduced earlier in Section ���u?29.3.1>. Several VPI routines are also added to traverse the value changes (using this new handle) back and ����tforth. This mechanism is very different from the iteration notion of VPI that returns objects related to a given ����pobject, the traversal here can walk or jump back and forth on the value change timeline of an object. To create ����ja value change traverse handle the routine � vpi_handle()�  must be called in the following manner: ���� ����<vpiHandle trvsHndl = vpi_handle(vpiTrvsObj, object_handle); "���� ����lNote that the user (or tool) application can create more than one value change traverse handle for the same ����lobject, thus providing different views of the value changes. Each value change traverse handle shall have a ����omeans to have an internal index, which is used to point to its current time and value change of the place it ����spoints. In fact, the value change traversal can be done by increasing or decreasing this internal index. What this ����qindex is, and how its function is performed is left up to tools implementation; we only use it as a concept for ���@explanation here. 2쪖��� nOnce created the traverse handle can point anywhere along the timeline; its initial location is left for tool 0����kimplementation, however, if the traverse object has no value changes the handle shall point to the minimum ����|time (of the trace), so that calls to � vpi_get_time()�  can return a valid time. It is up to the user to call an ini���@Gtial � vpi_control()�  to the desired initial pointing location. I9 ���`$Traversing value changes of objects h6��� uAfter getting a traverse � vpiHandle� , the application can do a forward or backward walk or jump traversal by A���@gusing � vpi_control()�  on a � vpiTrvsObj�  object type with the new traverse properties. [V���`\Here is a sample code segment for the complete process from handle creation to traversal. :`��``p_vpi_extension reader_p;/* Pointer to VPI reader extension structure*/ 1^k�� SvpiHandle instanceHandle; /* Some scope object is inside*/ ���BvpiHandle var_handle; /* Object handle*/ ���EvpiHandle vc_trvs_hdl; /* Traverse handle */ ����vpiHandle itr; ���@p_vpi_value value_p; /* Value storage*/ ��@=p_vpi_time time_p; /* Time storage*/ ?���`... @��`U/* Initialize the read interface: Access data from memory */ ]���`I/* NOTE: Use default VPI (e.g. that of simulator application is running ! �� under*/ ����Hreader_p = vpi_load_extension(NULL, NULL, vpiAccessLimitedInteractive); ���@ o���`1if (reader_p == NULL) ... ; /* Not successful */ m���` !w��� F/* Initialize the load: Access data from simulator) memory, for scope ����$instanceHandle and its subscopes */ ����?/* NOTE: Call marks access for all the objects in the scope */ ���@(vpi_load_init(NULL, instanceHandle, 0); !t���  ����1itr = vpi_iterate(vpiVariables, instanceHandle); ����%while (var_handle = vpi_scan(itr)) { ���?if (vpi_get(vpiIsLoaded, var_handle) == 0) { /* not loaded*/ ���1/* Load data: object-based load, one by one */ ���Lif (!vpi_read_load(var_handle)); /* Data not found !*/ ��@ break; AP��`} }6pRy��l{�W"%���6pRyX �KWV ���`vpi_read_load() }sqZ��l}�W$'���sqZX �L�e3 ��� 4Unload data (for a single design object or a collecP���@tion) from memory UH��ˆ����Zh� �����UH��ˆ���LD## ����l���}6pqy��l�W%1���6pqyX �LW| ���`vpi_read_unload() }SeT��h@�T;)���SeTU=�OW03 ���`Use }qeT��hB�T(*���qeTU=�OW13 ���` New Usage }UzT[��hD�T)+���UzT[[U=�P�23 ��� "Create an iterator for the loaded ����objects (using "����vpi_iterate(vpiData���@Loaded, <instance>� )). #\3��� Create an iterator for (load or ����traverse) collections using b����vpi_iterate(vpiMember, ���@<collection>� ). }SzT[��hF�T*,���SzT[U=�PW3 ���`vpi_iterate() }qzT[��hH�T+-���qzT[3U=�P43 ��� !Add iteration types � vpiData����.Loaded�  and � vpiMember� . Extended b3����'with collection handle to create a col���@!lection member element iterator. }UTG��hJ�T,.���UTGU=�Q�53 ��� &Obtain a traverse (collection) handle P���@#from an object (collection) handle }STG��hL�T-/���STGU=�QW6 ���` vpi_handle() }qTG��hN�T.3���qTGGU=�Q>3 ��� 'Add new types � vpiTrvsObj�  and ����vpiTrvsCollection. b3����$Extended with collection handle (of ����!traversable objects) to create a ����'traverse collection from an object col���@lection.�  W�Q����i�N������?ۂE�OC����}sZ��l�W'`���sZX �M�~3 ��� 4Get the traverse handle min, max, current, previous P���@VC, or next VC time. ��d������c���������BB#��������}UT3��hP�T/4���UT3U=�S�WF3 ���`Obtain a property }ST3��hR�T35���ST3U=�SWG ���` vpi_get() }qT3��hT�T46���qT33U=�SH3 ��� #Extended with the new check proper����2ties: � vpiIsLoaded�  , � vpiHasVC� , b����%vpiHasNoValue� , and � vpiIsEx���@tension }UOT��hV�T57���UOTU=�T�WI3 ���` Get a value }SOT��hX�T68���SOTU=�TWL ���`vpi_get_value() }qOT��hZ�T79���qOTU=�TM3 ��� #Use traverse handle as argument to P���@get value where handle points }UnT��h\�T8:���UnTU=�U�WN3 ���`#Get time traverse handle points at }SnT��h^�T9;���SnTU=�UWO ���`vpi_get_time() }qnT��h`�T:<���qnTU=�UQ3 ��� #Use traverse handle as argument to P���@get time where handle points }UT)��hb�T;=���UT)U=�V�S3 ��� Free traverse handle P���@"Free (traverse) collection handle }ST)��hd�T<>���ST)U=�VWT ���`vpi_free_object() }qT)��hf�T=?���qT))U=�V:3 ���` Use traverse handle as argument qG��� $Use (traverse) collection handle as ���@ argument }UT3��hi�T>@���UT3U=�W�P3 ��� %Move traverse (collection) handle to P���@min, max, or specific time }ST3��hk�T?A���ST3U=�WWQ ���`vpi_control() }qT3��hm�T@����qT33U=�WR3 ��� "Use traverse (collection) handles/p����&types and properties. Extended with a ����%time argument in case of jump to spe���@ cific time. ��d������[���������DD�������� UH��ˆ����[�B�����UH��ˆ��~�1���1����D����Y��`1/* Create a traverse handle for read queries */ 1R �� 3vc_trvs_hdl = vpi_handle(vpiTrvsObj, var_handle); ���/* Go to minimum time */ ���'vpi_control(vpiMinTime, vc_trvs_hdl); ��� /* Get info at the min time */ ���7vpi_get_time(vc_trvs_hdl, time_p); /* Minimum time */ ���vpi_printf(...); ���2vpi_get_value(vc_trvs_hdl, value_p); /* Value */ ���vpi_printf(...); ���8if (vpi_get(vpiHasVC, vc_trvs_hdl)) { /* Have VCs ? */ ��@,for (;;) { /* All the elements in time */ !B�� 3if (vpi_control(vpiNextVC, vc_trvs_hdl) == 0) { ���;/* failure (e.g. already at MaxTime or no more VCs) */ ���#break; /* cannot go further */ ���} ���/* Get Max */ ���=/* vpi_trvs_get_time(vpiMaxTime, vc_trvs_hdl, time_p); */ ���Gvpi_get_time(vc_trvs_hdl, time_p);/* Time of VC*/ ��@Fvpi_get_value(vc_trvs_hdl, value_p);/* VC data*/ !A�� } ���} ����} ����/* free handles */ ���@vpi_free_object(...); J��� lThe code segment above declares an interactive access scheme, where only a limited history of values is pro0#����kvided by the tool (e.g. simulator). It then creates a Value Change (VC) traverse handle associated with an ����uobject whose handle is represented by � var_handle�  but only after the object is loaded into memory first. It ����|then creates a traverse handle, � vc_trvs_hdl� . With this traverse handle, it first calls � vpi_control()�  to ����igo to the minimum time where the value has changed and moves the handle (internal index) to that time by ����calling � vpi_control� () with a � vpiMinTime�  argument. It then repeatedly calls � vpi_control()�  with a�  "����bvpiNextVC�  to move the internal index forward repeatedly until there is no value change left. ���@nvpi_get_time()�  gets the actual time where this VC is, and data is obtained by � vpi_get_value()� . Kz��� VThe traverse and collection handles can be freed when they are no longer needed using ���@vpi_free_object()� . U9���h,Jump Behavior V��� ~Jump behavior refers to the behavior of � vpi_control()�  with a � vpiTime�  property, � vpiTrvsObj�  type, 0����oand a jump time argument. The user specifies a time to which he or she would like the traverse handle to jump, ����rbut the specified time may or not have value changes. In that case, the traverse handle shall point to the latest ���@.VC equal to or less than the time requested. _䪛��� �In the example below, the whole simulation run is from tim� e 10�  to time � 65� , and a variable has value changes 0漢���� at time � 10� , � 15�  and � 50� . If we create a value change traverse handle associated with this variable and try to ���@Fjump to a different time, the result will be determined as follows: \ ���`DJump to � 12� ; traverse handle return time is � 10� . ]���`EJump to � 15� ; traverse handle return time is � 15� . ^���`EJump to � 65� ; traverse handle return time is � 50� . _���`EJump to � 30� ; traverse handle return time is � 15� . `���`:Jump to 0; traverse handle return time is � 10� . a���`EJump to � 50� ; traverse handle return time is � 50� . Qb{��� mIf the jump time has a value change, then the internal index of the traverse handle will point to that time. UH��ˆ����[ � B�����UH��ˆ���&xCC  ����l���?l�@��i�0�F!�F��?l�@ }O��i�0EG!E���}O�?�?�F net array2Zl�@��i�0FHI�H��2Zl�@ H?]>}O��i�0GIIG���H?]>}OH?i3H?i3�Gtrvs obj2Zl�@��i�0HM���2Zl�@GH��d������RO���������LL�������� UH��ˆ����RP�J�����UH��ˆ��}�,���,����L ����>9���`,Iterating the design for the loaded objects 3��� dThe user shall be allowed to iterate for the loaded objects in a specific instantiation scope using ����qvpi_iterate()� . This shall be accomplished by calling � vpi_iterate()�  with the appropriate reference ���@Mhandle, and using the property � vpiDataLoaded� . This is shown below. zE��� oIterate all data read loaded objects in the design: use a � NULL � reference handle (� ref_h� ) to Q���@vpi_iterate()� , e.g., {e��� 4itr = vpi_iterate(vpiDataLoaded, /* ref_h */ NULL); 0q����$while (loadedObj = vpi_scan(itr)) { ����/* process loadedObj */ ���@} |��� iIterate all data read loaded objects in an instance: pass the appropriate instance handle as a reference ���@)handle to � vpi_iterate()� , e.g., }��� >itr = vpi_iterate(vpiDataLoaded, /* ref_h */ instanceHandle); 0ɪ����$while (loadedObj = vpi_scan(itr)) { ����/* process loadedObj */ ���@} 49���`<Iterating the load collection for its member loaded objects S ��� uThe user shall be allowed to iterate for the loaded objects in the load collection using � vpi_iterate()�  and ����ovpi_scan()� . This shall be accomplished by creating an iterator for the members of the collection and then ���@5use � vpi_scan()�  on the iterator handle e.g. O1���  2= ���6vpiHandle var_handle;/* some object*/ ���?vpiHandle varCollection;/* object collection*/ ���>vpiHandle loadedVar;/* Loaded object handle*/ ���3vpiHandle itr;/* iterator handle*/ ���3/* Create load object collection*/ ����DvarCollection = vpi_create(� vpiObjCollection, NULL, NULL� ); ���;/* Add elements to the object collection*/ ����<varCollection = vpi_create(vpiObjCollection, varCollection, ���@ var_handle); 5���  R����./* Iterating a collection for its elements */ "���Uitr = vpi_iterate(vpiMember, varCollection);/* create iterator*/ ���Jwhile (loadedVar = vpi_scan(itr)) {/* scan iterator*/ ����/* process loadedVar */ ���@} @9���h(Reading an object 8���`So far we have outlined: )���`aHow to select an object for loading, in other words, marking this object as a target for access. N;��� eHow to load an object into memory by obtaining a handle and then either loading objects individually G���@)or as a group using the load collection. LY���`^How to iterate the design scope and the load collection to find the loaded objects if needed. Mo��� oReading an object means obtaining its value changes. VPI, before this extension, had allowed a user to query a Pz����svalue at a specific point in time--namely the current time, and its access does not require the extra step of loadUH��ˆ����RR� J�����UH��ˆ���=&KK  ����l���{4g5�.���i�0IN���{4g5�.��2bg5{4g5 I4ѧF��i �0MO���I4ѧF֜I4MwI4Mw� -> name MIF��i!�0NP���MIFMM�  str: vpiName 2vPFF��i"�0OQ���2vPFF2@62@6� ->time: trvs time 50TF��i#�0PRv�R��50TF50o50o�  � vpi_get_time� () 509.F��i$�0QSvQS��509.F5050� -> value 50ǀZC,F��i%�0RTvRU��50ǀZC,F50/50/�  � vpi_get_value� () /OH}O��i&�0SU���/OH}O/[//[/�F vpiParent 50ء_F��i'�0TVvSV��50ء_F50Qz50Qz� -> has value change 50Y{xF��i(�0UWvUW��50Y{xF50P50P�* bool: vpiHasVC 50�F��i)�0VYvVY��50�F50v{50v{� ���d������\���������xx�������� 50�F��i*�0WZvWZ��50�F50v{50v{� � 50�F��i+�0YvY��50�F5050� �UQ��:���_�Q�������\�R3���� ZG�]��_�[�]���ZG�]ZZ��~t���_�[\^���~t���Z���_�[]_�����Z��������Q���_�[^a�����Q������}6py��l�W1b���6pyX �MWq ���`vpi_trvs_get_time() ��~l��_�[_e�����~l}sZ)��l�W`c���sZ))X �N�r3 ��� 4Move traverse collection handle to min, max, or spep����7cific time. Return a new collection containing all the ���@%objects that have a VC at that time. }6py)��l�Wbo���6py)X �NWv ���` vpi_goto() ��x�)��b�[gl��� ��x�) �� ���9� z��E�]��_�[af���z��E�]z��z���� ?_��_�[eh���?_YSڙ1?1" collection��~���b�[?d�����~������ 6r$�F��_�[fj���6r$�F6|~6|~� � UH��ˆ����\�X�����UH��ˆ��uX�0���0��<<x����b���@BTherefore, the return time is exactly the same as the jump time. H��� mIf the jump time does not have a value change, and if the jump time is not less than the minimum time of the 0��pwhole trace run, then the return time is aligned backward. If the jump time is less than the minimum time, ����vthen the return time will be the minimum time. In case the object has � hold value semantics�  between the VCs ����vsuch as static variables, then the return code of � vpi_control()�  (with a specified time argument to jump to) ����tshould indicate � success� . In case the time is greater than the trace maximum time, or we have an automatic ����mobject or an assertion or any other object that does not hold its value between the VCs then the return code ����yshould indicate � failure�  (and the backward time alignment is still performed). In other words the time returned ����mby the traverse object shall never exceed the trace maximum; the maximum point in the trace is not marked as ���@ga VC unless there is truly a value change at that point in time (see the example in this sub-section). 9���`Dump off regions 5��� sWhen accessing a database file, it is likely that there are gaps along the value time-line where possibly the data 0����rrecording (e.g. dumping from simulator) was turned off. In this case the starting point of that interval shall be ����smarked as a VC if the object had a stored value before that time. � vpi_control()�  or � vpi_goto()� , ����iwhether used to jump to that time or using next VC or previous VC traversal from a point before or after ����rrespectively, shall stop at that VC. Calling � vpi_get_value()�  on the traverse object pointing to that VC ����nshall have no effect on the value argument passed; the time argument will be filled with the time at that VC. "����hvpi_get()�  can be called in the form: � vpi_get(vpiHasNoValue, <traverse handle>)�  to return ���@TRUE�  if the traverse handle has no value (i.e. pointing to the start of a dump off region) and � FALSE�  otherwise. :��� pThere is, of course, another VC (from no recorded value to an actual recorded value) at the end of the dump off 0 ����tinterval, if the end exits i.e. there is additional dumping performed and data for this object exits before the end ����oof the trace. There are no VCs in between the two marking the beginning and end (if they exist); a move to the ���@5next VC from the start point leads to the end point. &96���`9Sample code using (load and traverse) object collections xI��`Np_vpi_extension reader;/* Pointer to reader VPI library*/ 1T�� GvpiHandle scope; /* Some scope we are looking at*/ ���?vpiHandle var_handle; /* Object handle*/ ���?vpiHandle some_net;/* Handle of some net*/ ���?vpiHandle some_reg;/* Handle of some reg*/ ���AvpiHandle vc_trvs_hdl1; /* Traverse handle*/ ���AvpiHandle vc_trvs_hdl2; /* Traverse handle*/ ���2vpiHandle itr; /* Iterator */ ��@BvpiHandle loadCollection;/* Load collection*/ !o�� FvpiHandle trvsCollection;/* Traverse collection*/ ���� ���HPLI_BYTE8 *datafile = my_data_file;/* data file*/ ��@1p_vpi_time time_p; /* time*/ !J���  ��@P/* Initialize the read interface: Post process mode, read from a file  */ !_�� 8/* NOTE: Uses toolX library*/ ���@Hreader_p = vpi_load_extension(toolX, vpiAccessPostProcess, datafile); c���` y���`1if (reader_p == NULL) ... ; /* Not successful */ p���` g���`#/* Get the scope using its name */ aW��� 9scope = reader_p->vpi_handle_by_name(top.m1.s1, NULL); ����/* Create load collection */ ����EloadCollection = reader_p->vpi_create(vpiObjCollection, NULL, NULL); 6k�F��_�[h{���6k�F6T6T� � ���}��b�[}T������}��������l��b�[dq�����lU������\��������n�64����~ -6��\�m�p���~ -6�}sZ)��l�Wc���sZ))X �R� ��� 1Filter a collection and extract a set of handles p����1which meet, or do not meet, a specific criterion ���@for a given collection�  �� ZQ��\�mns����� ZQ� 2 n΋)��b�[lr���2 n΋)K2$ traversable��Ql��b�[qz�����Ql��6��\�mpt�����6�;��?6��\�msu���;��?6�Z$$��\�mtv���Z$$�~$Z?-?6��\�muw���-?6 ���_��\�mvy������_��E1��E1�"�UH��ˆ����\� X�����UH��ˆ���Dii ����l��� ��n�_��\�mw�����n�_�����"� ;wX )��b�[r}���;wX )Ka;watrvsObj z��L�]��_�[j|���z��L�]z��Uz��U�� ��B�]��_�[{~�����B�]��K��K�� ph}��b�[zk���ph}pp� vpiMember�����_�[|������������}6py)��l�Wo����6py)X �RW ���` vpi_filter() V��Iw�)��_�[~:���V��Iw�)V��RV��R�� ��֐DX)p��\�my�����֐DX)p�����? SystemVerilog CD֐)p��\�m���CD֐)pV��NCN?Foreign��H-���\�m�����H-��;��H��H��cZ$��\�m�����cZ$ ˰bk N<��\�m���˰bk N<��s˰bs6Waveform Database;��l6��\�m���;��l6 Gp��\�m���GpV��y�Gy�6Foreign��u$���\�m �����u$��;��u��u��-���\�m �����-����-��-��u���\�m �����u����u��u��u ��\�m �����u  $\N_��\�m ���$\N_4"VPI ��i`)p��\�m �����i`)p4��?Read )6ޠ]��\�m ~���)6ޠ]׾絲)User��d������l���������FF)����������d������]��������� �������� UH��ˆ����]������UH��ˆ��…�9���9��������W���� ���@4/* Add data to collection: All the nets in scope */ !b��� A/* ASSUMPTION: (waveform) tool toolX supports this navigation ���relationship */ ����,itr = reader_p->vpi_iterate(vpiNet, scope); ����/while (var_handle = reader_p->vpi_scan(itr)) { ���IloadCollection = reader_p->vpi_create(vpiObjCollection, loadCollection, ���� var_handle); ����} ����4/* Add data to collection: All the regs in scope */ ����H/* ASSUMPTION: (waveform) tool supports this navigation relationship */ ����,itr = reader_p->vpi_iterate(vpiReg, scope); ����/while (var_handle = reader_p->vpi_scan(itr)) { ���IloadCollection = reader_p->vpi_create(vpiObjCollection, loadCollection, ���� var_handle); ����} ���@ !K��� J/* Initialize the load: focus only on the signals in the load collection: ����loadCollection */ ����2reader_p->vpi_load_init(loadCollection, NULL, 0); ���� ����(/* Demo scanning the load collection */ ����8itr = reader_p->vpi_iterate(vpiMember, loadCollection); ����/while (var_handle = reader_p->vpi_scan(itr)) { ���... ����} ���� ����6/* Load the data in one shot using load collection */ ����)reader_p->vpi_read_load(loadCollection); ���� ����/* Application code here */ ����some_net = ...; ����time_p = ...; ����some_reg = ...; ����.... ����;vc_trvs_hdl1 = reader_p->vpi_handle(vpiTrvsObj, some_net); ����;vc_trvs_hdl2 = reader_p->vpi_handle(vpiTrvsObj, some_reg); ����6reader_p->vpi_control(vpiTime, vc_trvs_hdl1, time_p); ����6reader_p->vpi_control(vpiTime, vc_trvs_hdl1, time_p); ����(/* Data querying and processing here */ ����.... ���� ���/* free handles*/ ���@ reader_p->vpi_free_object(...); ���` ���`/* close data file */ ���`$reader_p->vpi_read_close(datafile); T��� yThe code segment above initializes the read interface for post process read access from file � datafile� . It then  ����creates an object load collection�  loadCollection�  then adds to it all the objects in � scope�  of type � vpi����Net�  and � vpiReg�  (assuming this type of navigation is allowed in the tool). Load access is initialized and set to "����~the objects listed in � loadCollection� . � loadCollection�  can be iterated using � vpi_iterate(� ) to cre����sate the iterator and then using � vpi_scan()�  to scan it assuming here that the waveform tool provides this ����onavigation. The selected objects are then loaded in one shot using � vpi_read_load() � with � loadCol����slection�  as argument. The application code is then free to obtain traverse handles for the loaded objects, and ���@8perform its querying and data processing as it desires. w��� sIf the user application wishes to access all (or a large number of) the objects in a specific scope (and maybe its P‚����usubscopes) it is easier to call � vpi_load_init_create()�  to create a load collection of all the objects in a UH��ˆ����]� �����UH��ˆ���x  ����l�����d������e���������EE$����������d������a?���������!�������� UH��ˆ����a@������UH��ˆ��‡�8���8������������hsingle shot. The code segment below shows a simple code segment that mimics the function of a $dumpvars 0����`call to access data of all the regs in a specific scope and its subscopes and process the data. ���@ ��`Ip_vpi_extension reader_p;/* Reader library pointer*/ 1`�� KvpiHandle big_scope; /* Some scope we are looking at*/ ���?vpiHandle obj_handle; /* Object handle*/ ���AvpiHandle obj_trvs_hdl; /* Traverse handle*/ ���FvpiHandle big_loadCollection;/* Load collection*/ ���HvpiHandle signal_iterator;/* Iterator for signals*/ ��@1p_vpi_time time_p; /* time*/ !���  ���W/* Initialize the read interface: Access data from simulator*/ ���@I/* NOTE: Use default VPI (e.g. that of simulator application is running !l�� under*/ ���@Hreader_p = vpi_load_extension(NULL, NULL, vpiAccessLimitedInteractive); !����  ����1if (reader_p == NULL) ... ; /* Not successful */ ���@ !~��� G/* Initialize the load access: data from (simulator) memory, for scope ��� big_scope and its subscopes */ ����N/* NOTE: Call marks load access AND creates collection for all the objects in ���the scope */ ����?big_loadCollection = vpi_load_init_create(NULL, big_scope, 0); ���� ���@"if (big_loadCollection == NULL) { ��`#/* unable to create collection */ !��� } ���� ����6/* Load the data in one shot using load collection */ ����#vpi_read_load(big_loadCollection); ���� ����/* Application code here */ ���@./* Obtain handle for all the regs in scope */ ���`3signal_iterator = vpi_iterate(vpiReg, big_scope); !���  ����(/* Data querying and processing here */ ���@=while ( (obj_handle = vpi_scan(signal_iterator)) != NULL ) { ��`1assert(vpi_get(vpiType, obj_handle) == vpiReg);  ��`1/* Create a traverse handle for read queries */ ! �� 4obj_trvs_hdl = vpi_handle(vpiTrvsObj, obj_handle); ���time_p = ...; /* some time */ ���-vpi_control(vpiTime, obj_trvs_hdl, time_p); ���/* Get info at time */ ��@3vpi_get_value(obj_trvs_hdl, value_p); /* Value */  ��`vpi_printf(....); !��� } ���/* free handles*/ ���@vpi_free_object(...); !9"���`Object-based traversal l8��� mObject based traversal can be performed by creating a traverse handle for the object and then moving it back 0C����mand forth to the next or previous Value Change (VC) or by performing jumps in time. A traverse object handle ����xfor any object in the design can be obtained by calling � vpi_handle()�  with a � vpiTrvsObj�  type, and an ���Hobject � vpiHandle� . This is the method described in Section 629.7.45, and used in all the code examples thus far. mn��� nUsing this method, the traversal would be object-based because the individual object traverse handles are crepy����nated, and then the application can query the (value, time) pairs for each VC. This method works well when the ���@edesign is being navigated and there is a need to access the (stored) data of any individual object. UH��ˆ����aB� �����UH��ˆ��� ����l�����d������a���������"�������� UH��ˆ����a������UH��ˆ��„�8���8��������g9���h7Time-ordered traversal k��� mAlternatively, we may wish to do a time-ordered traversal i.e. a time-based examination of values of several ����zobjects. We can do this by using a collection. We first create a � traverse collection�  of type � vpiTrvsCollec"����rtion�  of the objects we are interested in traversing from the design object collection of type � vpiObjCol����ulection�  using � vpi_handle()�  with a � vpiTrvsCollection�  type and collection handle argument. We "����{can then call � vpi_control()�  or � vpi_goto()�  on the traverse collection to move to next or previous or do ����kjump in time for the collection as a whole. A move to next (previous) VC means move to the next (previous) ����rearliest�  VC among the objects in the collection; any traverse handle that does not have any VC is ignored. A "����rjump to a specific time aligns the handles of all the objects in the collection (as if we had done this object by ���@;object, but here it is done in one-shot for all elements). m��� kWe can choose to loop in time by incrementing the time, and doing a jump to those time increments. This is 0����%shown in the following code snippet. ���@ p���` vpiHandle loadCollection = ...; y���`vpiHandle trvsCollection; w���`p_vpi_time time_p; r���` z���`?/* Obtain (create) traverse collection from load collection */ q���`@trvsCollection = vpi_handle(vpiTrvsCollection, loadCollection); s���`,/* Loop in time: increments of 100 units */ t���`%for (i = 0; i < 1000; i = i + 100) { u��`time_p = ...; x��`/* Go to point in time */ ��`/vpi_control(vpiTime, trvsCollection, time_p); v���`} n8��� sAlternatively we may wish to go to the next VC of the traverse collection defined to be the � VC with the smallC����vest time�  among the VCs in the traverse object in the collection; again traverse objects with no VCs are ignored. "����-This is shown in the following code snippet. ���@ .c���` vpiHandle loadCollection = ...; 1/n��� vpiHandle trvsCollection; ���@&vpiHandle vc_trvs1_hdl, vc_trvs2_hdl; 0���`%p_vpi_time time_p, time1_p, time2_p; 1���` E���`!/* Create traverse collection */ I���`@trvsCollection = vpi_handle(vpiTrvsCollection, loadCollection); !Z�� Nvc_trvs1_hdl = ... ; /* some element of trvsCollection*/ ���Pvc_trvs2_hdl = ... ;/* another element of trvsCollection*/ ���@ U���`//* Go to earliest next VC in the collection */ W���`0for (;;) { /* for all collection VCs in time */ !]�� 4if (vpi_control(vpiNextVC, trvsCollection) == 0) { ���9/* failure (e.g. already at MaxTime or no more VCs) */ ���!break; /* cannot go further */ ���} ���Dvpi_get_time(trvsCollection, time_p);/* Time of VC */ ���9/* Test to see which elements have a VC at this time */ ���&vpi_get_time(vc_trvs1_hdl, time1_p); ��@&if (time1_p->real == time_p->real) { !X�� /* Element has a VC */ ��@Bvpi_get_value(vc_trvs1_hdl, value_p);/* VC data */ ^��`&/* Do something at this VC point */ z��`... !{�� } ��@... A+���`} UH��ˆ����a� �����UH��ˆ���B  ����l��� 50'_LF��i,�0ZvZ��50'_LF50l50l�*-> control: trvs time 50qЍF��i-�0v��50qЍF5050�* max time, min time, 50JhT#F��i.�0v��50JhT#F50y50y�* next VC, prev VC 50 PF��i/�0vo��50 PF50+AO50+AO�* �  vpi_control()L:l�R?��i0�0���L:l�R??ol�@��i1�0 ���?ol�@ r )}O��i2�0!��� r )}O ~5 ~5�K � nets?l�@ ��i3�0 "���?l�@ EFg�@l����i4�0!#���g�@l���g�@y4g�@ @S-'}O��i5�0"$���@S-'}O@`7ĥ@`7�K traversable?D l�@��i6�0#%&�%��?D l�@ GSO}O��i7�0$&&$���GSO}OSkSk�Fprimitive array?D l�@��i8�0%'���?D l�@$%?&l�@��i9�0&()�(��?&l�@ )@}O��i:�0'))'���)@}O6�b6�b�L primitive?&l�@��i;�0(*���?&l�@'(l�@��i<�0)+,�+��l�@ E}O��i=�0*,,*���E}OـHـH�F reg arrayl�@��i>�0+-���l�@*+?_l�@��i?�0,.���?_l�@ @!;}O��i@�0-/���@!;}O@!D@!D�K � regs I+}T F��iA�0.0���I+}T F֩I#I#� * str: vpiFullName_k@@��iB�0/1���_k@@ � 눽R}O��iC�002���� 눽R}O� �T� �T�L variables_l�@��iD�0134�3��_l�@ @ HƲ"k}O��iE�02442���@ HƲ"k}O@]@]�F memory_l�@��iF�035���_l�@23c` l�@��iG�046���c` l�@ gPh F��iH�057���gPh F֓r�rr�r� concurrent assertions I4rSB&F��iI�068���I4rSB&F֜I4!I4!� -> trvs loaded I4ٹ)fF��iJ�079���I4ٹ)fF֜I4hϜI4h�  bool: vpiIsLoadedݩYDZ��iK�08;���ݩYDZ$l��b�[�<���$l }98Z!��iL�09in�i��}98Z!f}9M instances~���b�[:=���~���� Qw�)��b�[<>���Qw�)QQ�9�  N")��b�[=@��� N")Xᓹ9 objCollection cX B)��b�[@g���cX B)Xaᓷca9trvsCollection$Ql��b�[>?���$Ql UH��ˆ����c�2�����UH��ˆ���1���1����B����=��� mBy testing the traverse handle time of any element against the collection VC time we can find out if the ele���@_ment has a VC at that time or not. This is shown in the last segment of the code sample above. ?��� oAlternatively, we may wish to get a new collection returned of all the objects that have a value change at the ����pgiven time we moved the traverse collection to. In this case � vpi_control()�  is replaced with a call to ����pvpi_goto()� . The latter returns a new collection with all the traverse objects that have a VC at that time. "����0This is shown in the code snippet that follows. ���@ \���`... ?g��`LvpiHandle vctrvsCollection;/* collection for the objects with VC */ ��`DvpiHandle itr;/* collection member iterator*/ A���`... ���`//* Go to earliest next VC in the collection */ ���`0for (;;) { /* for all collection VCs in time */ D��`9vctrvsCollection = vpi_goto(vpiNextVC, trvsCollection); ! �� !if (vctrvsCollection == NULL) { ���9/* failure (e.g. already at MaxTime or no more VCs) */ ���!break; /* cannot go further */ ���} ���3/* create iterator then scan the VC collection */ ���1itr = vpi_iterate(vpiMember, vctrvsCollection); ���(while (vc_trvs1_hdl = vpi_scan(itr)) { ���/* Element has a VC */ ��@Bvpi_get_value(vc_trvs1_hdl, value_p);/* VC data */ <��`&/* Do something at this VC point */ !�� ... ���} ��@... >���`} iUTWUM���h:Unloading the data ro��� sOnce the user application is done with accessing the data it had loaded, it shall call � vpi_read_unload()�  0z����oto unload the data from (active) memory. Failure to call this unload may affect the tool performance and capac����mity and its consequences are not addressed here since managing the data caching and memory hierarchy is left ���@to tool implementation. s��� sCalling � vpi_read_unload()�  before releasing (freeing) traverse (collection) handles that are manipulating ����qthe data using � vpi_free_object()�  is not recommended practice by users; the behavior of traversal using ����yexisting�  handles is not defined here. It is left up to tool implementation to decide how best to handle this. Tools "����oshall, however, prevent creation of new traverse handles by returning the appropriate fail codes in the respec����qtive creation routines; this situation is similar to attempting to create traverse handles before doing any data ���@Qloads with � vpi_read_load()� , and shall be treated in a similar fashion. qUTUA���hR@Reading data from multiple databases and/or different read library providers  ��� nThe VPI routine � vpi_load_extension()�  is used to load VPI extensions. Such extensions include reader 0����olibraries from such tools as waveform viewers. � vpi_load_extension()�  shall return a pointer to a func���@6tion pointer structure with the following definition. 2=��� typedef struct { H��@S void *user_data;     /* Attach user data here if needed         */ 7]�� E /* Below this point user application MUST NOT modify any values */ ph���| size_t struct_size;  /* Must be set to sizeof(s_vpi_extension)  */ ���q long struct_version; /* Set to 1 for SystemVerilog 3.1a         */ ���$ PLI_BYTE8 *extension_version; UH��ˆ����c� 2�����UH��ˆ���EAA ����l��� UH��ˆ����l������UH��ˆ��|�4���4����F��������type � vpiTrvsCollection. ���_� p_vpi_time time_p� : Pointer to a structure containing the returned time information. ����rRelated routines� : � vpi_get_time()� . Difference is that � vpi_trvs_get_time()�  is more general ����pin that it allows an additional � vpiType�  argument to get the min/max/prev/next current time of handle. ����Fvpi_get_time()�  can only get the current time of traverse handle. &���� ����vpi_read_load() P����kSynopsis: � Load the data of the given object into memory for data access and traversal if object is an ����mobject handle; load the whole collection (i.e. set of objects) if passed handle is a load collection of type ����vpiObjCollection� . P����(Syntax: � vpi_read_load(vpiHandle h) I����Returns: � PLI_INT32� , 1 for success of loading (all) object(s) (in collection), 0 for fail of loading (any) object (in J���� collection). ���� Arguments: "���_� vpiHandle h� : Handle to a design object (of any valid type) or object collection of ���type � vpiObjCollection. ���@Related routines� : None Bת��� vpi_read_unload() P㪘����kSynopsis: � Unload the given object data from (active) memory if object is an object handle, unload the "���wwhole collection if passed object is a collection of type � vpiObjCollection� . See Section <29.8; for a ����description of data unloading. P����*Syntax: � vpi_read_unload(vpiHandle h) I����9Returns: � PLI_INT32� , 1 for success, 0 for fail. ���� Arguments: ���`� vpiHandle h� : Handle to an object or collection (of type � vpiObjCollection� ). ���@Related routines� : None. CH��� vpi_create() 2PT����?Synopsis: � Create or add to a load or traverse collection. ����BSyntax: � vpi_create(vpiType prop, vpiHandle h, vpiHandle obj) I���gReturns: � vpiHandle�  of type � vpiObjCollection�  for success, � NULL�  for fail. "���� Arguments: ���$� vpiType�  � prop� : "���W� vpiObjCollection� : Create (or add to) load (� vpiObjCollection� ) or ���5traverse (� vpiTrvsCollection� ) collection. ���f� vpiHandle h� : Handle to a (object) traverse collection of type (� vpiObjCollection� ) ���8vpiTrvsCollection� , NULL for first call (creation) ���b� vpiHandle obj� : Handle of object to add, NULL if for first time creation of collection. ���@Related routines� : None. Dݪ��� vpi_goto() P骃����iSynopsis: � Try to move value change traverse index of members of collection to min, max or specified "����vtime. If the request is for a next or previous VC and there is no VC for any object in collection a � NULL�  is ����jreturned signifying fail, otherwise a new collection with all objects that have a VC at the time we moved ����kto is returned signifying success. If there is no value change at specified time in a jump, then the value ����gchange traverse index for each object is aligned based on the jump behavior defined earlier in Section ���029.7.4.21, and its time will be updated based on the aligned traverse point. A fail (i.e. � NULL�  collection) is ����Zonly returned when none of the objects in its group can return an individual success. See ����kvpi_control()�  for a more detailed description of the semantics of individual traverse object handles. P����FSyntax: � vpi_goto(vpiType prop, vpiHandle obj, p_vpi_time time_p) I���rReturns:�  � vpiHandle�  of type � vpiObjCollection�  for success, � NULL�  for fail.� . "���� Arguments: ���$� vpiType�  � prop� : B���M� vpiMinTime� : Goto the minimum time of traverse collection handle. UH��ˆ����e������UH��ˆ���3���3����E����7��@ PLI_BYTE8 *extension_name; 9�� ?/* One function pointer for each of the defined VPI routines: ��@V - Each function pointer has to have the correct prototype */ ;��  ... 0F���, PLI_INT32 (*vpi_chk_error)(error_info_p); ��� ... ���4 PLI_INT32 (*vpi_vprintf)(PLI_BYTE8 *format, ...); ��@ ... 1|���`%} s_vpi_extension, *p_vpi_extension; 0��� Subsequent versions of the � s_vpi_extension�  structure shall only � extend�  it by adding members at the � end� ; 0����jpreviously existing entries must not be changed, removed, or re-ordered in order to preserve backward com����tpatability. The � struct_size�  entry allows users to perform basic sanity checks (e.g. before type casting), ����qand the � struct_version�  permits keeping track and checking the version of the � s_vpi_extension�  ����ystructure. The structure also has a � user_data�  field to give users a way to attach data to a particular load of ���@$an extension if they wish to do so. <ݪ��� yThe structure shall have an entry for � every�  VPI routine. If a particular extension does not support a specific 0誚����pVPI routine, then it shall still have an entry (with the correct prototype), and a dummy body that shall always ����have a return (consistent with the VPI prototype) to signify failure (i.e. � NULL�  or � FALSE�  as the case may be). ����oThe routine call must also raise the appropriate VPI error, which can be checked by � vpi_chk_error()� , ���@eand/or automatically generate an error message in a manner consistent with the specific VPI routine. 6��� nIf tool providers want to add their own implementation extensions, those extensions must only have the effect 0)����of making the � s_vpi_extension�  structure � larger�  and any non-standard content must occur � after�  all the ����gstandard fields. This permits applications to use the pointer to the extended structure as if it was a ����mp_vpi_extension�  pointer, yet still allow the applications to go beyond and access or call tool-specific "����ofields or routines in the extended structure. For example, a tool extended � s_vpi_extension�  could be: ���@ =_���`typedef struct { >j��`9/* inline a copy of s_vpi_extension */ @��`/* begin*/ A��`void *user_data; B��`... C��`/* end*/ D��`F/* toolZ extension with one additional routine */ E��`int (*toolZfunc)(int); ?���`)} s_toolZ_extension, *p_toolZ_extension; Fͪ���`AAn example of use of the above extended structure is as follows: G���  ���@p_vpi_extension h; H���`p_toolZ_extension hZ; I���` J���`)h = vpi_load_extension(toolZ, <args>); K���`1if ( h && !(strcmp(h->extension_version, ...) L��`. && !strcmp(h->extension_name, toolZ) ) { M��`hZ = (p_toolZ_extension) h; !O�� E/* Can now use hZ to access all the VPI routines, including toolZs ��@toolZfunc */ P��`... N���`} $f��� nThe SystemVerilog tool the user application is running under is responsible for loading the appropriate extenpq����psion, i.e. the reader API library in the case of the read API. The extension name is used for this purpose, fol����mlowing a specific policy, for example, this extension name can be the name of the library to be loaded. Once UH��ˆ����e� �����UH��ˆ���BLDD  ����l���UH��ˆ����l� �����UH��ˆ���ICC ����l�����d������m���������II*�������� UH��ˆ����m�G�����UH��ˆ����������I����D���M� vpiMaxTime� : Goto the maximum time of traverse collection handle. ���@� vpiTime� : Jump to the time specified in � time_p. "���V� vpiHandle obj� : Handle to a traverse object of type � vpiTrvsCollection. ���q� p_vpi_time time_p� : Pointer to a structure containing time information. Used only if � prop�  is ���5of type � vpiTime� , otherwise it is ignored. ����yRelated routines� : � vpi_control()� . Difference is that � vpi_goto()�  can operate only on traverse col"����klection handles, and returns a new traverse collection for the objects that have a VC at the time it moves ���@to. Fk��� vpi_filter() Pw����sSynopsis: � Filter a general collection, a traversable object collection, or traverse collection according to a "����kspecific criterion. Return a collection of the handles that meet the criterion. Original collection is not ���� changed. P����CSyntax: � vpi_filter(vpiHandle h, PLI_INT32 ft, PLI_INT32 flag) I���gReturns: � vpiHandle�  of type � vpiObjCollection�  for success, � NULL�  for fail. ���� Arguments: ���n� vpiHandle h� : Handle to a collection of type � vpiCollection� , � vpiObjCollection�  or "���vpiTrvsCollection ���MPLI_INT32 ft� : Filter criterion, any vpiType or a VPI Boolean property. ���{� PLI_INT32 flag� : Flag to indicate whether to match criterion (if set to � TRUE� ), or not (if set to �  ���FALSE� ). B���@Related routines� : None. UH��ˆ����m� G�����UH��ˆ���F�HH  ����l�����d������g���������LL%�������� UH��ˆ����g�J�����UH��ˆ��…�:���:����L����$����tthe reader API library is loaded all VPI function calls that wish to use the implementation in the library shall be 0����tperformed using the returned � p_vpi_extension�  pointer as an indirection to call the function pointers spec����pified in s_vpi_extension or the extended vendor specific structure as described above. Note that, as stated ear����rlier, in the case the application is using the default routine implementation (i.e. the ones provided by the tool ���@b(e.g. simulator) it is running under) then the de-reference through the pointer is not necessary. 4G��� _Multiple databases can be opened for read � simultaneously�  by the application. After a R����ovpi_load_extension()�  call, a top scope handle can be created for that database to be used later to derive "����nany other handles for objects in that database. An example of multiple database access is shown below. In the ����mexample, scope1 and scope2 are the top scope handles used to point into database1 and database2 respectively ����Nand perform the processing (comparing data in the two databases for example). ���@  ��``p_vpi_extension reader_pX;/* Pointer to reader libraryfunction struct*/ h��``p_vpi_extension reader_pY;/* Pointer to reader libraryfunction struct*/ !f�� TvpiHandle scope1, scope2; /* Some scope we are looking at*/ ���CvpiHandle var_handle; /* Object handle*/ ���CvpiHandle some_net;/* Handle of some net*/ ���CvpiHandle some_reg;/* Handle of some reg*/ ���EvpiHandle vc_trvs_hdl1; /* Traverse handle*/ ���EvpiHandle vc_trvs_hdl2; /* Traverse handle*/ ���6vpiHandle itr; /* Iterator */ ��@VvpiHandle loadCollection1, loadCollection2;/* Load collection*/ ! �� ZvpiHandle trvsCollection1, trvsCollection2;/* Traverse collection*/ ��@1p_vpi_time time_p; /* time*/ !���  ��@HPLI_BYTE8 *datafile1 = database1;/* data file 1*/ ��`HPLI_BYTE8 *datafile2 = database2;/* data file 2*/ !���  ���@I/* Initialize the read interface: Post process mode, read from a file */ !a�� ;/* NOTE: Use library from toolX*/ ���@Jreader_pX = vpi_load_extension(toolX, datafile1, vpiAccessPostProcess); ���`#/* Get the scope using its name */ ��`S/* NOTE: scope handle comes from file database: datafile1*/ ���`;scope1 = reader_pX->vpi_handle_by_name(top.m1.s1, NULL); ���` "���`I/* Initialize the read interface: Post process mode, read from a file */ !d�� ;/* NOTE: Use library from toolY*/ ���@Jreader_pY = vpi_load_extension(toolY, datafile2, vpiAccessPostProcess); #���`#/* Get the scope using its name */ ��`S/* NOTE: scope handle comes from file database: datafile2*/ !��� ;scope2 = reader_pY->vpi_handle_by_name(top.m1.s1, NULL); ���� ����/* Create load collections */ ���@GloadCollection1 = reader_pX->vpi_create(vpiObjCollection, NULL, NULL); ! ��� GloadCollection2 = reader_pY->vpi_create(vpiObjCollection, NULL, NULL); ���� ���@5/* Add data to collection1: All the nets in scope1, '��`data comes from database1 */ !��� H/* ASSUMPTION: (waveform) tool supports this navigation relationship */ ����.itr = reader_pX->vpi_iterate(vpiNet, scope1); ����0while (var_handle = reader_pX->vpi_scan(itr)) { ���LloadCollection1 = reader_pX->vpi_create(vpiObjCollection, loadCollection1, ���� var_handle); ����} ���� ���@4/* Add data to collection2: All the nets in scope2, (��`data comes from database2 */ a��� H/* ASSUMPTION: (waveform) tool supports this navigation relationship */ ����.itr = reader_pY->vpi_iterate(vpiNet, scope2); UH��ˆ����g� J�����UH��ˆ���EOKK ����l�����d������g���������OO&�������� UH��ˆ����g�M�����UH��ˆ��|�5���5����O��������0while (var_handle = reader_pY->vpi_scan(itr)) { 0���LloadCollection2 = reader_pY->vpi_create(vpiObjCollection, loadCollection2, ���� var_handle); ���@} ���` !��� J/* Initialize the load: focus only on the signals in the load collection: ����loadCollection */ ���@4reader_pX->vpi_load_init(loadCollection1, NULL, 0); ! ��� 4reader_pY->vpi_load_init(loadCollection2, NULL, 0); ���� ����%/* Demo: Scan the load collection */ ����:itr = reader_pX->vpi_iterate(vpiMember, loadCollection1); ����0while (var_handle = reader_pX->vpi_scan(itr)) { ���... ����} ����:itr = reader_pY->vpi_iterate(vpiMember, loadCollection2); ����0while (var_handle = reader_pY->vpi_scan(itr)) { ���... ���@} !���  ����6/* Load the data in one shot using load collection */ ���@+reader_pX->vpi_read_load(loadCollection1); !! ��� +reader_pY->vpi_read_load(loadCollection2); ���� ����H/* Application code here: Access Objects from database1 or database2 */ ����some_net = ...; ����time_p = ...; ����some_reg = ...; ����.... ����(/* Data querying and processing here */ ����.... ���� ���/* free handles*/ ���@!reader_pX->vpi_free_object(...); i���`!reader_pY->vpi_free_object(...); ���` g���` ���`/* close data files */  ���`&reader_pX->vpi_read_close(datafile1); ���`&reader_pY->vpi_read_close(datafile2); %���`  UTUT���`Reader VPI routines u9���` Extensions to existing routines e ���(tThis section describes the extensions to existing VPI routines. Most are obvious and shown in +Table291*. ���@8vpi_control()�  is described here again for clarity. =%��� vpi_control() P1����nSynopsis: � Try to move value change traverse index to min, max or specified time. If the request is for a b����knext or previous VC and there is none (for collection this means no VC for any object) a fail is returned, ����iotherwise a success is returned. If there is no value change at specified time in a jump, then the value ���schange traverse index is aligned based on the jump behavior defined earlier in Section .29.7.4.2-, and the ����ftime will be updated based on the aligned traverse point. If there is a value change occurring at the ����lrequested time, then the value change traverse index is moved to that tag with success return, otherwise if ����qthe object does not have hold semantics a fail is returned. In the case of a collection, a fail is only returned UH��ˆ����g� M�����UH��ˆ���LRNN  ����l�����d������h���������RR'�������� UH��ˆ����h�P�����UH��ˆ��…�3���3����R����=����9when none of the objects in its group can return a true. P����ISyntax: � vpi_control(vpiType prop, vpiHandle obj, p_vpi_time time_p) I����>Returns:�  � PLI_INT32� , 1 for success, 0 for fail. "���� Arguments: ���$� vpiType�  � prop� : "���O� vpiMinTime� : Goto the minimum time of traverse (collection) handle. ���O� vpiMaxTime� : Goto the maximum time of traverse (collection) handle. ���@� vpiTime� : Jump to the time specified in � time_p. "���a� vpiHandle obj� : Handle to a traverse object (collection) of type � vpitrvsObj�  ���(� vpitrvsCollection� ) ���q� p_vpi_time time_p� : Pointer to a structure containing time information. Used only if � prop�  is ���5of type � vpiTime� , otherwise it is ignored. ����yRelated routines� : � vpi_goto()� . Difference is that � vpi_goto()�  can operate only on traverse collec���@ltion handles, and returns a new traverse collection for the objects that have a VC at the time it moves to. [9���`Additional routines dЪ���`>This section describes the additional VPI routines in detail. cચ��� vpi_read_getversion() 2P쪙����,Synopsis� : � Get the reader version. ����(Syntax� : � vpi_read_getversion() I����6Returns: � PLI_BYTE8*� , for the version string "����Arguments� : None ���@Related routines� : None e-��� vpi_load_extension() P9����sSynopsis� : Load specified VPI extension. For the reader, � initialize the reader with access mode, and spec����ify the database file if used. P���eSyntax� : � vpi_load_extension(PLI_BYTE8 *extension_name, ...) � in its general form "���7vpi_load_extension(PLI_BYTE8 *extension_name, ���PLI_BYTE8 *filename, ���9vpiType mode, ...)�  for the reader extension I����9Returns: � PLI_INT32� , 1 for success, 0 for fail. ����Arguments� : "���]PLI_BYTE8�  *extension_name� : Extension name of the extension library to be loaded. ���aIn the case of the reader, this is the reader VPI library (with the supported navigation ���VPI routines). ���[� ...� : Contains all the additional arguments. For the reader extension these are: ���,� PLI_BYTE8 *filename� : Data file. ���vpiType�  � mode� : "���T� vpiAccessLimitedInteractive� : Access data in tool memory, with limited ���[history. The tool shall at least have the current time value, no history is required. ���`� vpiAccessInteractive� : Access data interactively. Tool shall keep value history up ���to the current time. ���N� vpiAccessPostProcess� : Access data stored in specified data file. ���Q� ...� : Additional arguments if required by specific reader extensions. ���@Related routines� : None. n:~��� vpi_read_close() 2PF}����0Synopsis� : � Close the datafile if open. ����DSyntax� : � vpi_read_close(vpiType prop, PLI_BYTE8* filename) I����9Returns: � PLI_INT32� , 1 for success, 0 for fail. ����Arguments� : b���#� vpiType�  � prop� : ���M� vpiAccessPostProcess� : Access data stored in specified data file. UH��ˆ����h� P�����UH��ˆ���OQQ ����l��� G *HfF��i�[cd���G *HfF֣GhУGh�*-> load, unload 05�F��h�[kUc�U��05�F֧0ۧ0� � 0^ �F��h�[TVcTZ��0^ �F֧0 0 � � 0_LF��h�[UWb�W��0_LF֧0єN0єN�*-> control: trvs time 0+~qЍF��h�[VXbVX��0+~qЍF֧0$0$�* max time, min time, 0rThT#F��h�[WYbWY��0rThT#F֧0!0!�* next VC, prev VC 0*P3F��h�[XZbX���0*P3F֧0hЧ0h�* �  vpi_control() 0?b%ˍF��h�[Y[cU[��0?b%ˍF֧00�,-> � creation, addition 0�F��h�[Z\cZ\��0�F֧06^06^�,� 0KqF��h�[[]c[]��0KqF֧0~0~�* �  vpi_create() 0;�F��h�[\^c\^��0;�F֧0F0F� � 0�F��h�[]_c]_��0�F֧0M0M� � 0?@F��h�[^`c^`��0?@F֧00�,-> � filtering 0�F��h�[_ac_a��0�F֧06d06d�,� 0EUF��h�[`bc`���0EUF֧0~0~�* �  vpi_filter()0qеX��h�[ac���0qеXVY0?b%˾��h�[bS���0?b%˾Ta 0 FւF��i�[Se���0 FւF֧0|0|�* 0 F�F��i�[df���0 F�F֧0|0|�*� 0 FւF��i �[eg���0 FւF֧0|0|�*  ?PZ�F��i �[fh���?PZ�F?��?���,� ��P8F��i�[g}�����P8Fֶ!!�, vpi_read_load()k3w]o��iM�0;jn;���k3w]oE.@���iN�0ik���E.@��E.@E.LEn\�i��iO�0jl���En\�i�En\EnBźFmv���iP�0km���Fmv��j2Fm H IR؊ ��iQ�0ln���H IR؊ H lH l�N vpiDataLoadedk2w]p��iR�0mo���k2w]p;i 50��F��iS�0npv���50��F50/50/� � 2f�F��iT�0oq���2f�F2 2 � � 2<�F��iU�0pr���2<�F22� � 2f�F��iV�0qs���2f�F2 2 � � 2f�F��iW�0rt���2f�F2 2 � � 2y.qЍF��iX�0su���2y.qЍF2(2(�* max time, min time, 2hT#F��iY�0tv���2hT#F2o2o�* next VC, prev VC50q؀��iZ�0uz���50q؀Qo 2A�F��il�0v{���2A�F22� � 2A�F��im�0z|���2A�F22� � D��)]F��in�0{A���D��)]FD��hD��h�Hvpi_get_trvs_time() z��F��iu�[h���z��Fֺzz�, vpi_goto() $H1]��i{�m���$H1]P$P Application 6$*\F��iw�[}����6$*\F6/h6/h�, vpi_read_unload()~Q-6��i}�m~���~Q-6�ZZ$ ��i�m���ZZ$ �~cZZ o\N_��i�m���o\N_4{1{1"VPI ��]i`)p��i�m������]i`)p4gj��gj?Read�*�d�������`��Left�d�������Right�d������� Reference�d������� �����d���������HTML�d����� ��HTML�d�����  ��Headings�d����� $��HTML�d�����'��HTML�d���� �9�����d����� B�����d����� E�����d����� H�����d����� K�����d�����N�����d�����Q�����d�����T�����d�����W�����d���� � Z�����d���� � J�����d�����,��First�d�����j�� last left�d�����q�� boilerplate�d�����t�� title page�d�����{�� Index.left�d������� Index.right�d��������Cover�d��������TOC�d���� ������d���� �B�����d����� X�����d�����!�����d����� "�����d�����!#�����d�����"$2�����d�����#%�����d�����$&J�����d�����%'M�����d�����&(P�����d�����')�����d�����(*�����d�����)�G������&�������@��@��������������������� ���������������������������Mapping Table Title������. ������@��@��������������������� ���������������������������Body������. ��� f�@��������H�U��� ������� ���������������� ���������9 $���H���l����������������������� �����D�����h����������H3,1.1.1���H3H:<$chapnum>.<n>.<n+> Body. ���� �@��@��������HQ������������ =������������� ����������SectionHeading����H:Section <$chapnum> SectionTitle. ���� �@��@��������H�Q������������ =������������� ����������SectionHeading����H:Section <$chapnum> SectionTitle. �����f�@��������������������� ������������������������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� �Normal������. ��� f�@��������H�U���������� ���������������� ��������� $���H���l����������������������� �����D�����h����������H2,1.1���H2H:<$chapnum>.<n+> Body. ���f�@��������H�U��� ������� ���������������� ���������9 $���H���l����������������������� �����D�����h���������� H4,1.1.1.1���H4H:<$chapnum>.<n>.<n>.<n+> Body. ��� f�@��������F�E������������ ���������������� ���������9� FigureCaption����F:Figure <$chapnum><n+> FigCaptionCont. ��� f�@���������P�������������������������� ��������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� � heading 1�����Normal. ��f�@��������L������������ ��������������������������. NumberedList2���� L:<n+>)\t�. ��� f�@���������P�������������������������� ��������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� � heading 2�����Normal. ��� f�@���������P���������� ���������������� ��������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� � heading 3�����Normal. �����f�@��������������������� ������������������������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� �Default������. ���f�@���������@����������� ������������������������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� �..�����Default. �����f�@��������������������� ����������������������������.����.�header������. �����f�@��������������������� ����������������������������.����.�footer������. ��� �f�@������������������� ������������������������� �Body������. �����f�@��������������������� ������������������������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� � footnote text������. ���&f33f�@���������@����������� ���������������<���������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� �.. 2�����Default. ���f�@���������@����������� ���������������� ��������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� �caption�����Normal. �f�@��������Z�A����������� ������������������������� �� NumberedLista���� Z:<a=1>)\t NumberedList2. ���33f�@���������@����������� ���������������<���������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� �.. 3�����Default. ��f�@���������������������� �������������������������(�.�<�.�P�.�d�.�x�.����.����.����.����.����.����.����.����.�,���.�@���.�T���.�h���.�|���.����.����.����.����.�Body.Indented.1������. �����f�@���������@����������� ���������������<���������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� � Heading Base�����Default. ��f�@��������D������������� ��������������������������.�DashedList.indented����D:\t�. ������@��@��������������������� ����������������������������Mapping Table Title������. ��f�@��������L�A����������� ��������������������������. NumberedList1���� L:<n=1>)\tL,NumberedListb. ������@��@��������������������� ����������������������������Mapping Table Cell������. ��f�@���������������������� �������������������������(�.�<�.�P�.�d�.�x�.����.����.����.����.����.����.����.����.�,���.�@���.�T���.�h���.�|���.����.����.����.����.�Body.Indented.1������. ������@��@������������������������������������� ����������� �Mapping Table Cell������. 33�f�@��������Z������������ ��������������������������� NumberedListii���� Z:<r+>)\t�. ���f�@����������������������� �������������������������$�.�4�.�D�.�T�.�d�.�t�.����.����.����.����.����.����.����.����.����.����.�$���.�4���.�D���.�T���.�d���.�t���.����.����.����.����.����.����.�ExampleCode.Indented������. ��� �f�@������������������� ���������������� ���������Body������. ���f�@��������������������� ������������������������� �Body���������� �f�@������������������� ��������������������������Body������. ������@��@������������������������������������� ����������� �Mapping Table Cell������. �f�@��������Z������������ ������������������������� �� NumberedListb���� Z:<a+>)\t�. ��� �f�@������������������� ��������������������������Body������. ������@��@��������������������� ���������������� ����������� �Mapping Table Cell������. ���f�@��������H�U��� ������� ���������������� ���������9 $���H���l����������������������� �����D�����h���������� H5,1.1.1.1.1���H5H:<$chapnum>.<n>.<n>.<n>.<n+> Body. �����f�@������������������� �������������������������3� TableText������. �����f�@���������������������� ������������������������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� �Normal������. �����f�@������������������� �������������������������� TableText������. �����f�@���������������������� ������������������������� $� �H� �l� ���� ���� ���� ���� � ��� �D��� �h��� ���� ���� � footnote text������. ��� �f�@������������������� ��������������������������Body������. ������@��@��������TA������������ ���������������}� ���������� TableTitle.1����T:Table<$chapnum><n=1>: Body. �����f�@��������AE������������ ���������������� ����������x.Annex.TableTitle.1����A:Table <A><n=1>T,Text. �����f�@��������AE������������ ���������������� ����������x.Annex.TableTitle����A:Table <A><n+1>T,Text. ���f�@��������D������������ ��������������������������.� DashedList����D:\t�. ��� �@��@��������SA������������ ��������������� �����������SyntaxBoxCaption.1����S:Syntax<$chapnum><n=1>Body. (���f�@�������������������� �������������������������.�.�=�.�BNF_SyntaxItem������. �����f�@�������������������� �������������������������� �� M���� CommitteeList������. ��f�@��������LA����������� ��������������������������. NumberedList1���� L:<n=1>)\tL,NumberedListb. �����f�@���������������������� ����������������������������� PageHeader.right������. ��� �@��@��������SA������������ ��������������� �����������SyntaxBoxCaption����S:Syntax<$chapnum><n+>Body. ������@��@��������TA���� ������� ���������������}� ���������� TableTitle����T:Table<$chapnum><n+>: Body. ��� f�@��������HU��� ������� ���������������� ��������� $���H���l����������������������� �����D�����h����������H3,1.1.1���H3H:<$chapnum>.<n>.<n+> Body. ����f�@��������������������� �������������������������� CellBody.X������. ��� �f�@������������������ ��������������������������Body������. ��� �f�@��������AU����������� ���������������� ����������x.Annex.H1,A.1���� A:<A>.<n+> T,Text. ������f�@���������������������� ����������������������������� PageHeader.left������. ��f�@��������L����������� ��������������������������. NumberedList2���� L:<n+>)\t�. ��f�@��������������������� �������������������������(�.�<�.�P�.�d�.�x�.����.����.����.����.����.����.����.����.�,���.�@���.�T���.�h���.�|���.����.����.����.����.�Body.Indented.1������. ����f�@��������AE����������� ���������������� ��������� $���H���l����������������������� �����D�����h����������x.Annex.H2,A.1.1���AH2A:<A>.<n>.<n+> T,Text. ����f�@������������������� ��������������������������x.Annex.normative������. �����f�@���������������������� ����������������������������� ���� PageFooter.left������. �����@��@��������AQ����������� =������������� ����������x.Annex.Heading���� A:Annex <A+> SectionTitle. ��� f�@���������D����������� ������������������������� $���H���l����������������������� �����D�����h����������Note����� P1,Normal. �����f�@���������������������� ����������������������������� ���� PageFooter.right������. ����f�@��������AE����������� ���������������� ��������� $���H���l����������������������� �����D�����h����������x.Annex.H3,A.1.1.1���AH3A:<A>.<n>.<n>.<n+> T,Text. ��� �f�@��������BE����������� �������������������������� Bibliography���� B:[B<n+>] �. ���f�@���������������������� �������������������������$�.�4�.�D�.�T�.�d�.�t�.����.����.����.����.����.����.����.����.����.����.�$���.�4���.�D���.�T���.�d���.�t���.����.����.����.����.����.����.�ExampleCode.Indented������. �����f�@���������������������� ��������������������������.� �.�0�.�@�.�P�.�`�.�p�.����.����.����.����.����.����.����.����.�����.����.� ���.�0���.�@���.�P���.�`���.�p���.����.����.����.����.����.����.� ExampleCode������. �����f�@�������������������� ��������������������������CellBody������. ���f�@��������HU��� ������� ���������������� ��������� $���H���l����������������������� �����D�����h���������� H4,1.1.1.1���H4H:<$chapnum>.<n>.<n>.<n+> Body. ���f�@��������HU��� ������� ���������������� ��������� $���H���l����������������������� �����D�����h���������� H5,1.1.1.1.1���H5H:<$chapnum>.<n>.<n>.<n>.<n+> Body. 3�����f�@������������������ ���������������� ���������� CellHeading������. ��� f�@���������T��������������������������� ���������� SectionTitle�����Body. �����f�@������������������ �������������������������� TableText������. ��f�@��������D������������ ��������������������������.�DashedList.indented����D:\t�. ��� �f�@��������AE����������� ���������������� ��������� $���H���l����������������������� �����D�����h����������x.Annex.H4,A.1.1.1.1���AH4A:<A>.<n>.<n>.<n>.<n+> T,Text. ��� �f�@��������AE����������� ���������������� ��������� $���H���l����������������������� �����D�����h����������x.Annex.H5,A.1.1.1.1.1���AH5A:<A>.<n>.<n>.<n>.<n>.<n+> T,Text. ��� f�@��������HU���������� ���������������� ��������� $���H���l����������������������� �����D�����h����������H2,1.1���H2H:<$chapnum>.<n+> Body. ��� �f�@��������HE������������ ������������������������� $���H���l����������������������� �����D�����h����������x.BNF.H2��� definition H:<n>.<n+> P1,Normal. ���f�@����������������������������������������������Footnote������. ��� �f�@��������HE������������ ������������������������� $���H���l����������������������� �����D�����h����������x.BNF.H3��� definitionH:<n>.<n>.<n+> P1,Normal. ��� �f�@��������HE������������ ������������������������� $���H���l����������������������� �����D�����h����������x.BNF.H4��� definitionH:<n>.<n>.<n>.<n+> P1,Normal. ��� �f�@��������HE������������ ������������������������� $���H���l����������������������� �����D�����h����������x.BNF.H5��� definitionH:<n>.<n>.<n>.<n>.<n+> P1,Normal. �f�@��������ZA����������� ������������������������� �� NumberedLista���� Z:<a=1>)\t NumberedList2. �f�@��������Z����������� ������������������������� �� NumberedListb���� Z:<a+>)\t�. 33�f�@��������ZA����������� ��������������������������� NumberedListi���� Z:<r=1>)\tNumberedListii. 33�f�@��������Z����������� ��������������������������� NumberedListii���� Z:<r+>)\t�. ��� �f�@��������AE������������ ���������������� ����������x.Annex.FigureTitle����A:Figure <A><n+>T,Text. ��� �f�@��������AE������������ ���������������� ����������x.Annex.FigureTitle.1����A:Figure <A><n=1>T,Text. 33�f�@��������LA����������� �������������������������33�� NumberedNote1���� L:<n=1>)\tL,NumberedListb. ��� �@��@��������EA������������ �� =������������ �����������ExampleCaption����E:Example<$chapnum><n+> Body. ��� �@��@��������EA������������ �� =������������ �����������ExampleCaption.1����E:Example<$chapnum><n=1> Body. ��� f�@��������FE������������ ���������������� ����������FigureCaption.1����F:Figure <$chapnum><n=1> FigCaptionCont. ��� f�@��������FE������������ ���������������� ���������� FigureCaption����F:Figure <$chapnum><n+> FigCaptionCont. 33�f�@��������L����������� �������������������������33�� NumberedNote2���� L:<n+>)\t�. ���� f�@���������T��������������������������� ���������� x.Annex.Title�����T,Text. ������@��@��������T�A���� ������� ���������������}� ���������/� TableTitle����T:Table<$chapnum><n+>: Body. �����@��@��������������������� �������������������������0�� A�� f�� ���� ���� ���� ���� ���� XCourier12������. �����f�@���������������������� �������������������������3 �� 6�� Q�� l�� ���� ���� ���� ���� ���� ���� )���� D���� _���� CellBody������. �����f�@������������������� ���������������� ���������6� CellHeading������. ��9X���f�@����������������������������������������������8xƨ��� Heading2T��� Chapter #��. �����f�@�������������������� ���������������� ���������9� CellHeading������. ��� �f�@������������������� ��������������������������Body������. �����5\\�@������������d��������� ���������������} ����������:�. 33�. H�. TableCell������. ����5\\�@������������d��������� ���������������}� ���������;Q�. c�. TableHead������. �����f�@���������������������� ��������������������������Table���Figure #��. �����\\�@������������d������������������������} ����������<�. 33�. H�. TabularListBody������. ]��̅\\�@��������A�Q�d�� ����������������������} ����������=]�. ���. TableTitle����A:Table <n>< ><n+>< >Body. ����f�@���������������������� ���������������� ���������� Table Heading������. �����33�@���������������������� ���������������� ���������6� LCellHeading������. ����33�@����������������������� �������������������������3� LCellBody������. �����33�@��������������������� ���������������� ���������9� CellHeading������. ����33�@���������������������� ��������������������������CellBody������. ����f�@���������������������� ������������������������� � RCellBody������. $$� �f�@��������J����������� ���������������� ����������TableTitle 1st����J:Table <n>-< >< ><n=1>. �. ������f�@���������������������� ������������������������� � Table body������. ������f�@����������������������� ����������������������������� ���� PageHeader.left������. �����f�@����������������������� ��������������������������� ���� ���� ���� PageFooter.left������. �����f�@����������������������� ����������������������������� PageHeader.right������. �����f�@����������������������� ��������������������������� ���� ���� ���� PageFooter.right������. � ��<f�@��������������������� ���������������� ���������? $�� H�� l�� ���� ���� ���� ���� ���� D���� h���� ���� P1,Normal������. ����f�@��������������������� ���������������} ����������@ $���H���l����������������������� �����D�����h���������� FL,FlushLeft������. ��� �@��@��������������������� �������������������������0�������..SectionHeadingTOC������. ������@��@��������������������� ��������������������������.�*�.�����.. H2,1.1TOC������. ��� �@��@��������������������� �����������������������������������..H1,1stLevelHeadTOC������. ������@��@��������������������� ����������������������������-�������..AT,AnnexTitleTOC������. ������@��@��������������������� �������������������������-���F���Z�������.. AH2,A.1.1TOC������. ���� �@��@��������������������� �������������������������-���F�������.. AH1,A.1TOC������. ��� �@��@��������������������� �������������������������-�������..x.Annex.HeadingTOC������. ���� �@��@��������������������� �������������������������-�������.. AN,AnnexTOC������. �� ���3��������� ������� Hyperlink ���3��������� �������footnote reference �������������� ���������� ��������������� ��������� ������������������������ ������������������������� �������vp������������������3���������� �������Heading 1 Char��������������� ������������������3 8���� ����������� �������3 8���� ����������� ������������������������ �������vp��������������� =������������ ��������� ������������������������ ������������������������ ���3�����������������Bullet1  ������������������������ ��������������>���������� ��������������>���������� ��������������� ��������� ��������������� ��������� ��������������� ��������� ������������������������ ��������������=���������� ��������������� ��������� ��������������� �������� ���������������������������������������"��������1.DELETE������������������������ BNFitalic ��������������� ��������� ������������� �������Keyword �������������� �������������� ����������� ������� BNFkeyword ��������������<��������������������������������3.FIX ����������������������� Superscript ������������������������ ��������������������Code ��������������������������������������� ��������2.DRAFT6 ��������������}� ��������� ������������������������ ������������������������ ��������������� ��������� ����������������������� ��������������� ��������� ��������������} ���������� ��������������}� �����������������������} ������������������������} ���������������������������������� ��������������� ��������� ��������������} ���������� ��������������}� ��������� ��������������������������������������� ��������� ������������������������ ��������������>� ��������� ��������������=������������������������� ����������������������������������������������� ���������� �������������� ���������� ��������������>� ��������� ��������������� ������������������Z���������������Zd������Zd������Zd������Zd�����������������������d�����������d����������������Z�������Z������������������������;������������������������ ��Zd������Zd������Zd������Zd������Zd�����Zd�����Zd�����Zd��������������������Z�������Z�������Thin����Medium����Double����Thick�@���� Very Thin���� Blue Line���� Blue thick����� Blue thin����ThinGray����� .75 Weight�����1.5 pt����Weight Four Double���Weight Three Double����Weight Two Double����Weight One Double���� Weight Four��� Weight Three���� Weight Two���� Weight One��������������������� ���������0�33  �33  �33  �33  �Format A�������������d��� AbRoutine��������������H� Mapping Table����� ��������a �;8 � Lines/Title� �����������H  �H  �H  �H  �H  �Format B�33$��MҁMҁ���� �����������H �v̀ �v̀ �v̀ �v̀ �Wide���MҁMҁ� �����������H �L- � = �ȴ �v3b�3333��MҁMҁ���� �����������H �v̀ �v̀ �v̀ �v̀ �WideFN�33$ff�MҁMҁ������ �����������S �S �S �S �S � TextColumn�3333ff�MҁMҁ������ ����������O33 �O33 �O33 �O33 �O33 � TextColumnFN� �����������������������mPU ��� �Clear�33$ff�MM���������� ����������̀�̀�̀� TabularList�������������H � Mapping Table� $ff�MM����������������mPU �3 � Ruled_formal�$����������H�Z�Z�Z�Table 1�$������������ WideTable�$� ����������H �Z �Z �Z �Z � Default_Table� ���� �������������������P" �$@  ��  �dx@  �z؀  �cmdref� ���������������������YP ��� � Clear/Title� �����������s� �` �Lines��������������d�Q �?�Y�� AbRoutine��������������d��� AbRoutine���z��>����������������H����6����-����?������ @�� ������������������H����z�� ����!*������h����h����h����B����_�� N��+0������������������?����_�� ��13������ev����ev����C����Q������ p��4C������H����������?����)�� W��<B������l����u����H����}w+��q�� DR������Z����y����9p����-=OW������T����T����T�����W�$�� �������������������$Cz�����������������������$Sz���������������� ��!�"�$qz������������#���$��%��&��'��$z��,����������(���)��*��+��,��$z������������-���.��/��0��1��$z������������2���3��4��5��6��$z������ ������7���8��9��:��;��$z������ ������< ���= ��> ��? ��@ ��$z������ ������A ���B ��C ��D ��E ��$z������ ������F ���G ��H ��I ��J ��$ z��,���� ������K ���L ��M ��N ��O ��$9z������ ������P ���Q ��R ��S ��T ��$Iz������ ������U���V��W��X��Y��$Yz��,����������Z���[��\��]��^��$bz��,����#�����_���`��a��b��c��$��z������#������d���e��f��g��h��$��z������#������i���j��k��l��m��$��z������#������n���o��p��q��r��$��z������#������s���t��u��v��w��$��z������#������x���y��z��{��|��$��z������#������}���~���������$��z������#�����������������$��z������#����������� �� �� ��$��z������#������ ��� ��������$��z�������#����������������$B���� �����#������������$R��������#��������������$b��������#�������������$r��������#��������� ��!��$�������� #������"���#��$��$���������#������% ���& ��' ��$$�� �����"&�������(!���)!�*!�+!�$4z������!#&�������,"���-"��."��/"��$Dz��,����"$&������0#���1#��2#��3#��$pz������#%&������4$���5$��6$��7$��$��z��,����$&&������8%���9%��:%��;%��$��z������%'&������<&���=&��>&��?&��$��z��,����&(&������@'���A'��B'��C'��$��z������')&������D(���E(��F(��G(��$��z��,����(*&������H)���I)��J)��K)��$$��z������)�&������L*���M*��N*��O*��$:���� �����,&�������P+���Q+�R+�$J��_������+-&�������S,���T,��U,��$Z��_������,.&������V-���W-��X-��$j��_������-/&������Y.���Z.��[.��$z��_������.0&������\/���]/��^/��$��_������/�&������_0���`0��a0��$$�� �����2)�������b1���c1�d1�e1�$4_������13)�������f2���g2��h2��i2��$D_������2�)������j3���k3��l3��m3��$Z�� �����5)�������n4���o4�p4�$j������46)�������q5���r5��s5��$z������57)������t6���u6��v6��$��������68)������w7���x7��y7��$��������79)������z8���{8��|8��$��������8:)������}9���~9��9��$��������9;)�������:���:��:��$��������:C)������;���;��;��$h�� �����= ������� <���<�<�$C)������<> �������=���=��=��$S)������=? ������>���>��>��$i)������>@ ������?���?��?��${)������?A ������@���@��@��$)������@B ������A���A��A��$)������A� ������B��� B��!B��$��������;�)������C���C��C��se}w�����EX�������D���8D��sz}w)����DFX�������>E���?E��s}w����EGX�������@F���]F��s}w=����FHX�������^G���_G��s}w����GIX�������H���H��s}w����HJX�������I���I��s)}w)����IKX������� J���!J��sR}w����JLX�������"K���$K��sq}w����KMX�������%L���'L��s}w����LNX������1M���`M��s}w)����MRX������bN���cN��Ue9���� �PU�������;O���(O��)O��Uz9[���� OQU�������*P���+P��,P��U9G���� PSU������-Q���.Q��/Q��s}w)����N�X������oR���R��U93���� QTU������3S���4S��5S��UO9���� SUU������6T���7T��8T��Un9���� TVU������9U���:U��;U��U9)���� UWU������<V���=V��>V��U93���� V�U������?W���@W��AW����Comment����� �F:� �F=��I��I��I ��I ��FK��FN� �Fu�!" �Fx�#$ �F�%& �F��cA�+*�Z;�.-�['�01�d7�65�] �98�]t�<;�]�?>�`(�BA �g�2' �kJ�ED �kQ�� ����d� �Black�������T!�White����dd���A�Red���dd�����Green���d�d��� �Blue���d�����Cyan�����d���Magenta����d���� �Yellow���FF������ Dark Green�����������RGB 255,255,255������d����RGB 000,000,000������22����RGB 127,127,127������Header/Footer $1Header/Footer $1Header/Footer $2Header/Footer $2IndexIndexCommentCommentSubjectSubjectAuthorAuthorGlossaryGlossaryEquationEquation Hypertext Hypertext  Cross-Ref Cross-Ref Conditional TextConditional TextPositionFMPrivatePositionFMPrivateRangeEndFMPrivateRangeEndFMPrivate HTML Macro HTML Macro�����W.Times New Roman.R.400�� FrameRoman� W.Arial.R.700�� FrameRoman� W.Arial.I.700�� FrameRoman���� FrameRomanW.Times New Roman.R.700�� FrameRoman�W.Courier.R.400�� FrameRoman�W.Courier New.R.400�� FrameRoman�W.Helvetica.R.700�� FrameRoman� W.Arial.I.400�� FrameRoman�W.Helvetica.R.400�� FrameRoman�W.Helvetica.I.400�� FrameRoman���� FrameRoman� W.Arial.R.400�� FrameRoman�W.Times New Roman.I.700�� FrameRoman���� FrameRoman���� FrameRoman�W.Times New Roman.I.400�� FrameRoman���� FrameRomanW.Courier.R.700�� FrameRoman���� FrameRomanW.Courier New.R.700�� FrameRoman���� FrameRomaniCourierArialTimes New Roman Courier New| Helvetica; Arial,Bold<TimesNewRomanPSMT=TimesNewRomanPS-BoldMT Regular Regular BoldRegularObliqueItalic���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������}<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> <x:xapmeta xmlns:x='adobe:ns:meta/' x:xaptk='XMP toolkit 2.8.1-28, framework 1.5'> <rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'> <rdf:Description about='' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:CreatorTool='FrameMaker 7.0'></rdf:Description> <rdf:Description about='' xmlns:xap='http://ns.adobe.com/xap/1.0/' xap:CreateDate='2003-10-13T19:26:00.0Z' xap:ModifyDate='2003-12-20T02:12:17.0Z' xap:MetadataDate='2003-12-20T02:12:17.0Z'></rdf:Description> <rdf:Description about='' xmlns:dc='http://purl.org/dc/elements/1.1/'><dc:creator><rdf:Seq><rdf:li>Accellera</rdf:li></rdf:Seq></dc:creator><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>SystemVerilog 3.1/draft 1</rdf:li></rdf:Alt></dc:title><dc:description><rdf:Alt><rdf:li xml:lang='x-default'>PRELIMINARY draft of SystemVerilog 3.1, SUBJECT TO CHANGE</rdf:li></rdf:Alt></dc:description></rdf:Description> </rdf:RDF> </x:xapmeta> <?xpacket end='w'?>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~ CSw#I> ruvu2R׍q䯥zRFxi{ Hχ+?&z,>ѬMڳlFz[=Wu�%(TMϣl'z@HǬvlBۓ>J;#\0p PT6wh?hdkUqz `Q"F*nXIlt h.ykFi:DDpP)x5߱YSFׁ>1t^IH2A9ElsR` SyW+}{NVR>ߢeoR*;Ik9&@.;"#ӵB(/ S)kD/4~S<4@4f:j?#5!)SF6+߁g(LeyN= d7l8= f-P%ªWJ}20G}GUm†Qi(q29@,A =dllC# \C}e߹;>5Ŋ=LOfy9B?r8=\mZ8~دLP bMABOzP'P2w)ҙ\*YX sS$-^XM?lO.{!hU掰F1cjN?E]jSuwh)W.������