ã¿ãªããããã«ã¡ã¯ïŒ ãã®èšäºã¯ãVerilogïŒèšèšïŒããã³System VerilogïŒæ€èšŒïŒã§èª¬æãããŠããèªå販売æ©ã®èšèšã®æ€èšŒã«å°å¿µããŸãã
äžè¬ã«ããã®åºçç©ã®åºç€ã¯ç§ã®ã³ãŒã¹ãããžã§ã¯ãã§ãããHabréã§åºçç©ãäœæããææ¡ãããŠãããç§ã®å
çã«æè¬ãããŸããã
ç§ã泚ç®ãããäž»ãªããšã¯ãå
žåçãªå€å±€ãã¹ããã³ããããã¯ã®èª¬æãšãSystemVerilogèšèªã®åºæ¬çãªæ§æã®ããã€ããšæ€èšŒã®é©çšã§ãã ç§ã䜿çšããã¢ãããŒãã¯ããããžã§ã¯ãã®éçºãç°¡çŽ åããå人çã«ã¯äŸ¿å©ãªå€æŽãå ããããããã
Open Verification MethodologyïŒOVMïŒã«åºã¥ããŠããŸãã
ãããè¡ããïŒ
ããã€ã¹ã®ä»æ§ãšãã®åäœåç
以äžã®è³æã¯ãããã€ã¹ã®ä»æ§ãšã¯ã»ãšãã©èšããŸããããè©Šã¿ãããŸããã ãããŠãããã¯ããããæ¥ããã®ã§ãã
æ€èšŒæžã¿ã®ããã€ã¹ã¯ã ãŒã¢ã®æéç¶æ
ãã·ã³ã§ããããã®ç®çã¯èªå販売æ©ãæäœããããšã§ãã
ããã€ã¹ã€ã³ã¿ãŒãã§ã€ã¹ïŒ7ã€ã®å
¥åä¿¡å·/ãã¹ãš6ã€ã®åºåä¿¡å·/ãã¹ã ä¿¡å·ã®ç®çããã®å解èœãããã³äŸ¿å®äžã®æ¹åã¯è¡šåœ¢åŒã§ç€ºãããŠããŸãã
ä¿¡å·/ãã¹å | æ¹å | åå®¹äººæ° | äºå® |
---|
i_clk | å
¥å | 1 | åæä¿¡å· |
i_rst_n | å
¥å | 1 | ã¢ã¯ãã£ãããŒãªã»ãã |
i_money | å
¥å | 4 | é貚åäœã®ã³ãŒããéä¿¡ããããã¹ |
i_money_valid | å
¥å | 1 | i_moneyãã¹ã®ã³ãŒãæå¹æ§ä¿¡å· |
i_product_code | å
¥å | 4 | 補åã³ãŒããéä¿¡ããããã¹ |
i_buy | å
¥å | 1 | 賌å
¥ç¢ºèªä¿¡å· |
i_product_ready | å
¥å | 1 | 補åã®åºè·æºåãã§ããããšã瀺ãä¿¡å·ïŒå
¥åãå¥ã®ããã€ã¹ã補åã®æºåã«åŸäºããŠããããšãåãå
¥ããããïŒ |
o_product_code | äŒã¿ | 4 | ãã€ã€ãŒãžã®çºè¡ã®è£œåã³ãŒã |
o_product_valid | äŒã¿ | 1 | o_product_codeãã¹äžã®æ
å ±æå¹æ§ä¿¡å· |
o_busy | äŒã¿ | 1 | ã¹ããŒããã·ã³ãçŸåšã®æ³šæã®åŠçã§ããžãŒã§ããããšã瀺ãã·ã°ãã« |
o_change_denomination_code | äŒã¿ | 4 | é
ä¿¡ããŸãã¯é貚åäœã®éçš®ã®ã³ãŒã |
o_change_valid | äŒã¿ | 1 | o_change_denomination_codeãã¹äžã®æå¹æ§ä¿¡å· |
o_no_change | äŒã¿ | 1 | å€æŽå®äºã®åå³ |
åèšã§ãã¹ããŒããã·ã³ã«ã¯4ã€ã®ç¶æ
ããããŸãïŒCHOOSE_PRODUCTãENTER_MONEYãGIVE_PRODUCTãGIVE_CHANGEã
ååãããååãšããŠãäœãæ確ã§ãããšæããŸãã
ããããæ確ã§ãªãå Žåã¯ãæ確ã«ããå¿
èŠããããŸãCHOOSE_PRODUCTïŒãã®ç¶æ
ã§ã¯ãã¹ããŒããã·ã³ã¯è£œåã³ãŒããåãå
¥ãã賌å
¥ã®ç¢ºèªãåŸ
ã¡ãŸã
ENTER_MONEYïŒããã§ã¯ãé貚åäœã®éçš®ã®ã³ãŒãã®åœ¢ã§æ©æ¢°ã«ãéãäŸçµŠããŸãã 次ã®ç¶æ
ãžã®ç§»è¡ã¯ãæ©æ¢°ã®è²¡åžã®ãéãååã賌å
¥ããã®ã«å¿
èŠãªé¡ä»¥äžã«ãªã£ãçŽåŸã«çºçããŸãã
GIVE_PRODUCTïŒããã§ã¯ãå€æŽãã«ãŠã³ãããæºåãå¿
èŠãªè£œåã³ãŒãããæœè±¡çãªããã€ã¹ããã©ãŒããŒãã«æž¡ããŸãã 次ã®ç¶æ
ãžã®é·ç§»ã¯ããæœè±¡å®è¡è
ããã補åæºåã®å¯Ÿå¿ããä¿¡å·ãåä¿¡ããåŸã«çºçããŸãã
GIVE_CHENGEïŒå€æŽãçºè¡ããã¹ã¿ã³ãã€ã¢ãŒããã€ãŸãCHOOSE_PRODUCTã«ç§»è¡ããŸãã
ãŸãããã®å¥è·¡ã®ããçš®ã®å³ã«æ³šæããããšããå§ãããŸãã
â
Verilogã®èª¬æã¯ãã¡ãã«ãããŸãæ€èšŒèªäœ
ãã®ã»ã¯ã·ã§ã³ã2ã€ã®éšåã«åããããšæããŸãã æåã«ããã¹ããã³ãã®æ§é ã瀺ãããããæ§æããåæ©èœãããã¯ã«ã€ããŠèª¬æããŸãã 2çªç®ã§ã¯ãããããã³ãŒããšæ©èœã®ã«ãã¬ããžãããã³ã¢ãµãŒã·ã§ã³ã«ã€ããŠèª¬æããŸãã
ãã¹ããã³ãæ§é
ãã¹ããã³ãã®æ§é ã瀺ãå³ããå§ããŸãããã

åãããã¯ãåå¥ã«æ€èšããŠãã ããã
DUT ïŒãã¹ã
察象èšèšïŒ-ãã®ãããã¯ã¯ããã¹ããããã¯ãããã¯ã
ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠçžäºã«ããåãã§ããããã«ããçãã©ãããŒã®åœ¢åŒã§ã1ã€ã®å°ããªãªããžã§ã³ãæã€ã¹ããŒããã·ã³ããã€ã¹ã®èª¬æã§ãã
äžè¬ã«ã
ã€ã³ã¿ãŒãã§ã€ã¹ã¯SystemVerilogèšèªã®ãããªæ§é ã§ãããããã·ã°ãã«ãã°ã«ãŒãåããŠéçºè
ã®äœæ¥ãç°¡çŽ åã§ããŸãã ããã«ãããèšèªã®æšæºã§èªãããšãã§ããå€ãã®ã¯ãŒã«ãªããšãè¡ãããšãã§ããŸãããã®èšäºã§ã¯å°ã説æããŸãã
DUTãªãã¡ã¬ã³ã¹ã¢ãµãŒã·ã§ã³ -ããã§ã¯ãèšèšã®åäœãããã€ã¹ã®ä»æ§ãšã©ã®çšåºŠäžèŽããããä¿¡å·ã¬ãã«ã§ç¢ºèªããŸãã
ããã§ã¯ã
assert ã
property ã
sequenceãªã©ã®æ§æäœã圹ç«ã¡
ãŸã ã
ã«ããŒã³ã³ã¹ãã©ã¯ãã䜿çšããŠãæ©èœã«ãã¬ããžã®å®çŸ©ã«ã¢ãã«ã®åäœããã¹ãããçµæãå«ããããšãã§ããŸãã
â
ã¢ãµãŒã·ã§ã³ãžã®ãªã³ã¯ç°å¢ -æ¡ä»¶ä»ãã§ãæ€èšŒãå®è£
ããä»ã®ãã¹ãŠã®ãããã¯ãååšããã³ã³ãããã€ãŸããœãããŠã§ã¢æ€èšŒç°å¢ãšåŒã¶ããšãã§ããŸãã
ãããèšè¿°ãããšãã
ããã°ã©ã æ§æã䜿çšãããŸãã ãªããããªã®ããçããã®ã¯é£ããã§ããç§ã«ãšã£ãŠãããã¯çºèŠã®è³ªåã§ãã ããããããã¯SystemVerilogã·ãã¥ã¬ãŒã¿ãŒã®ã·ãã¥ã¬ãŒã·ã§ã³ã®é åã«èµ·å ããŸãããããã¯ãŸã åœãŠæšéã§ãã
â
ç°å¢ãžã®ãªã³ã¯ç°å¢å
ã«ã¯ãèšèšã®ããã®åºæ¿ãçæããããŸããŸãªæ€èšŒã·ããªãªãå®è£
ããåºåã§åä¿¡ããããŒã¿ã®æ£ç¢ºæ§ãæ€èšŒããã³ãŒããšæ©èœã«ãã¬ããžãè©äŸ¡ããä»ã®å€ãã®ãšã³ãã£ãã£ããããŸãã ããã§ã¯ããããã«ç§»ããŸãããïŒ
ã·ãŒã±ã³ãµãŒ -æ€èšŒãè¡ãããã·ããªãªãèšè¿°ãããããã¯ã ãããã®èšè¿°ã¯éåžžã«é«ã¬ãã«ã§ããã
TransactorãæäŸããã¡ãœããã«äŸåããŠããŸãã ããã§æ³šç®ãã¹ãããšã¯ããã®ãããã¯ã®
äž»åã¯éåžž
randsequenceã³ã³ã¹ãã©ã¯ãã§ããããšã§ãã ãã®äž»ãªã¿ã¹ã¯ã¯ã
Transactorã¡ãœããã®äžé£ã®åŒã³åºãã®åœ¢åŒã§ã¹ã¯ãªãããæŽçãã䟿å©ãªæ¹æ³ãæäŸããããšã§ãã
randsequenceã®äœ¿çšæ¹æ³ã説æãã
ãªã³ã¯ã 次ã«ç€ºããŸãã
â
ããããç§ã«èµ·ãã£ãããšïŒã·ãŒã¯ãšã³ãµãŒïŒTransactorã¯ãå®éã«ã¹ã¯ãªããã®åºç€ãšããŠæ©èœããã¡ãœãããå®è£
ãããããã¯ã§ãã ãã®æ®µéã§ãæ
å ±ã®çæãè¡ããããããèšèšãžã®å
¥åãšããŠéä¿¡ãããŸãã ãããŠãSystemVerilogã®ãã¯ãŒãã·ãŒã³ã«å
¥ããŸãã
SystemVerilogã§ã¯ãã¯ã©ã¹ãã£ãŒã«ãå€ãã©ã³ãã ã«çæã§ããŸãã ããã¯ãæ€èšŒã倧å¹
ã«é«éåã§ãããããéåžžã«äŸ¿å©ã§ãã å®éã«ã¯ããã£ãŒã«ããã©ã³ãã ã«çæããã«ã¯ã
ããŒã¯ãŒã randãŸãã¯
randcã䜿çšããå¿
èŠããããŸãã
ããããããã ãã§ã¯ãããŸããã
intå€æ°ãäœæããããå³å¯ãªç¯å²ã§å®çŸ©ããããã«å¿
èŠãªå€ãå¿
èŠã§ãããšä»®å®ããŸãïŒããšãã°ãç¹å®ã®ã¢ãã¬ã¹ã®ã¿ããã¹ã«è¡šç€ºãããŸãïŒã SystemVerilogã«ã¯ããã®ç¹ã§ããªãã«èŽãç©ããããŸãïŒã©ã³ãã å€æ°ãæã€ããããã£ã«å¶éã課ãããšãå¯èœã«ãã
å¶çŽæ§é ã ãããžã§ã¯ãã®äŸïŒ
rand logic [ 3:0] product_code; constraint c_product_code { product_code inside { [ 1 : 8 ] }; }
ããã§ã
c_product_codeã䜿çšããŠéé[1; 8]ã«å¶éããå€æ°
product_codeãäœæããŸããã
ããããäžã€ã ããããŸããã ã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åããããšãå€æ°
randããã³
randcã¯ã©ã³ãã ãªå€ã§åæåãããŸããã ããã¯ãçµã¿èŸŒã¿ã€ã³ã¹ã¿ã³ã¹ã¡ãœãã
randomizeïŒïŒãåŒã³åºããããšãã«çºçããŸãã
Transactorã«æ»ãã
randãã£ãŒã«ãã
randomizeïŒïŒã¡ãœãããããã³ãã®æ¡åŒµæ©èœ
randomizeïŒïŒã®äœ¿çšã¯ã
Transactor ã§èªç¶ã«çºçããŸãã
randomizeïŒïŒãšã¯ç°ãªãã
randomizeïŒïŒã䜿çšãããšã
randãã£ãŒã«ããåŒã³åºããããšãã«è¿œå ã®å¶éã課ãããšãã§ããŸãã ãã®è©³çŽ°ã«ã€ããŠã¯ãSystemVerilogèšèªæšæºã
åç
§ããŠãã ãã ã
â
ãããŠãã¡ããTransactorããã§æ¬åœã«åãã®ã¯
ãã©ã€ããŒã ãã§ãã 圌ã®ä»äºã¯ã
Transactorããåãåã£ãæ
å ±ãå
¥åèšèšä¿¡å·ã«å€æããããšã§ãã 圌ãšäžç·ã«ããã¹ãŠãã·ã³ãã«ã§æ確ã§ãã ãããã£ãŠã
ã€ã³ã¿ãŒãã§ãŒã¹ã®èšèšã«ã€ããŠå°ãã話ã
ãŸã ã
ãããã¯ãéåžžã®ããã°ã©ãã³ã°èšèªã§èŠãããæ§é ã§ã¯ãããŸããã ããã§ã®
ã€ã³ã¿ãŒãã§ã€ã¹ã¯ããŠãŒã¶ãŒã«ãšã£ãŠäŸ¿å©ãªæ¹æ³ã§ãæ¹åã«é¢ä¿ãªãä¿¡å·ãã°ã«ãŒãåã§ããèšèšã§ãã ãã®ãããžã§ã¯ãã«ã¯ãdut_interfaceãvm_in_interfaceãvm_out_interfaceã®3ã€ã®
ã€ã³ã¿ãŒãã§ãŒã¹æ§é ãããããŸããã 1ã€ç®ã¯åæããã³ãªã»ããä¿¡å·ã2ã€ç®ã¯vending_machineå
¥åã3ã€ç®ã¯ãã®åºåã§ãã
ã ããããã¹ãŠãèŠããŸãã
â
ãããŠãã¡ãã-ãã©ã€ããŒINã¢ãã¿ãŒãšOUTã¢ãã¿ãŒ -ãããã®ãããã¯ã¯ãæ£ç¢ºæ§ãããã«æ€èšŒããããã«ã
DUTã«åºå
¥ãããæ
å ±ãèªã¿åããŸãã çãæ
å ±ã
DUTã«å±ãã®ã¯ãªãã§ããïŒ
ãã©ã€ããŒããããããã³äžèšã®ãã¹ãŠã®ã¹ã¿ã³ãã£ã³ã°ãããã¯ã®ãšã©ãŒãé¿ããããã«ããã¹ãŠãç°¡åã§ãã
â
INããã³OUTã¢ãã¿ãŒãã§ãã«ãŒ-IN ã¢ãã¿ãŒããåä¿¡ããããŒã¿ãš
OUTã¢ãã¿ãŒããåä¿¡ããããŒã¿ã«åºã¥ããŠèšç®ãããåç
§ããŒã¿ã®é©åæ§ããã§ãã¯ãããããã¯ã
ã¹ã³ã¢ããŒã/æ©èœã«ãã¬ããžã¯æåŸã®ãããã¯ã§ãããç°ãªãæ©èœãå®è¡ãã2ã€ã®å¥åã®ãããã¯ã®ãã€ããªããã§ãã
ã¹ã³ã¢ããŒãèªäœã¯ãã·ãã¥ã¬ãŒã·ã§ã³ã®æåŸã«åç
§ããŒã¿ãçæããã¬ããŒããçæããå¿
èŠããããŸããããã®ãããžã§ã¯ãã¯å°ãããããããŸã䟿å©ã§ã¯ãããŸããã
æ©èœã«ãã¬ããžèªäœã¯ãããã€ã¹ä»æ§ã«çµã¿èŸŒãŸããŠãããã¹ãŠã®å¯èœãªæ©èœã®ã«ãã¬ããžãã§ãã¯ãè¡ããŸãã
ãããŠãããã§ã¯ããžã¥ãŒã¹èªäœã
æ©èœçãªã«ãã¬ããžã®å®è¡æ¹æ³ã«ã€ããŠèª¬æããŸãã ãã®ãããSystemVerilogã«ã¯ç¹å¥ãª
ã«ããŒã°ã«ãŒãèšèšããããŸãã å
ã«ããŒã°ã«ãŒãã§ã¯ããããã
ã«ããŒãã€ã³ããå®çŸ©ããŸãããã®
ã«ããŒãã€ã³ãã§ã¯ãç¹å®ã®ä¿¡å·ãŸãã¯ãã¹ãžã®ãã€ã³ããè¡ãããããŒã¿ã®ãã¹ãŠã®å¯èœãªããªãšãŒã·ã§ã³ãèšèšã«ãã£ãŠåä¿¡ããããã©ããããã¹ãŠã®å¯èœãªããŒã¿ãåºåã«è¡šç€ºããããã©ããããã§ãã¯ãããŸãã
äžè¬ã«ã
æ©èœã«ãã¬ããžã®çµæãžã®ã¢ã¯ã»ã¹ã¯
å®è¡æã«çºçãããããåŸã§ãã€ã§ãè©äŸ¡ã§ããç¹å¥ãªæ©èœããããŸãã
ãããã®1ã€ã¯ãçµã¿èŸŒã¿é¢æ°
$ get_coverageã§ããããã¯ããã¹ãŠã®ã«ããŒæ§é ïŒ
cover ã
covergroup ã
coverpoint ïŒã«åºã¥ããŠèšç®ããã0ã100ã®å€ãè¿ããŸãã
ã©ã³ã¿ã€ã ãžã®ã¢ã¯ã»ã¹ã«å ããŠãã°ã©ãã£ã«ã«ã·ãã¥ã¬ãŒã·ã§ã³ç°å¢ã§
æ©èœã«ãã¬ããžã®ã¢ã€ãã¢ãååŸããããšãã§ããŸãïŒModelSimãéåžžã«æ£ç¢ºã«ä¿èšŒã§ããŸãïŒã
ã³ãŒãã«ãã¬ããžã«é²ã¿ãŸãããã ãã®ã€ã³ãžã±ãŒã¿ã¯ãç§ãã¡ãæžããã³ãŒããã©ãã ã䜿çšããããããããŠãã¹ããã©ãã ãå®äºããŠããããç解ãããŠãããŸãã äœããã®çç±ã§
ã³ãŒãã«ãã¬ããžã蚱容ã¬ãã«ã«éããŠããªãå Žåã2ã€ã®ãªãã·ã§ã³ããããŸããããè¯ããã¹ããäœæããããã³ãŒããéå°ã§ãã ãããã«ãããããã¯ä¿®æ£ããå¿
èŠããããŸãã 確ãã«ããã¹ããè¯å¥œã§èšèšã³ãŒããè¯å¥œãªå Žåãããããšãå¥ã«èšåãã䟡å€ããããŸãããããã§ã
ã³ãŒãã«ãã¬ããžãç§ãã¡ã«åããªãå Žåã¯ãã¹ãã£ã³ããäœããé€å€ããå¿
èŠããããŸãã
éåžžã
ã³ãŒãã«ãã¬ããžããã§ãã¯ã
ãŸã ã
- ã¹ããŒãã¡ã³ã -ã·ãã¥ã¬ãŒã·ã§ã³äžã«å®è¡ãããè¡ãšå®è¡ãããªãã£ãè¡
- ãã©ã³ã -ãã®ä»ã®å Žåãã±ãŒã¹ã®æ§é ããã§ãã¯ããŸã
- æ¡ä»¶ -çµæãTrueãŸãã¯Falseã§ãªããã°ãªããªãè«çæ¡ä»¶ããã§ãã¯ããŸã
- ãã°ã« -0ãã1ãžã®è«ççãªé·ç§»ããã§ãã¯ããŸãã
ããããããã³ãã®ä»ã®ãã§ãã¯ïŒã¹ããŒããã·ã³ã®ãã§ãã¯ããã³ãããã
FECæ¡ä»¶ ïŒ
ã¯ããããžã§ã¯ãã®
ã³ãŒãã«ãã¬ããžã®ã¢ã€ãã¢ãæäŸã
ãŸã ã
ã³ãŒãã«ãã¬ããžã¢ã»ã¹ã¡ã³ããæå¹ã«ããã«ã¯ã
ã³ãŒãã«ãã¬ããžã¢ã»ã¹ã¡ã³ããå®è¡ããããã¡ã€ã«ã«é©åãªã³ã³ãã€ã©èšå®ãèšå®ããå¿
èŠããããŸãã
â
ãŸãããã¡ãããç§ã¯ã»ãšãã©å¿ããŠããŸããïŒã¹ã³ã¢ããŒã/æ©èœã«ãã¬ããžïŒâ
ããŠããããžã§ã¯ãå
šäœãžã®ãªã³ã¯ããã ãã§ãã ãæž
èŽããããšãããããŸããã ãã®èšäºãäœãã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
ãŸãäŒããŸã§ã