
ã¿ãªããããã«ã¡ã¯ïŒ
åã®èšäºã§ãã¢ã«ãã©ã®FPGAã§ç°¡åãªOpenCLã®äŸãå®è¡ããŸããã
// ACL kernel for adding two input vectors __kernel void vector_add( __global const uint *restrict x, __global const uint *restrict y, __global uint *restrict z ) { // get index of the work item int index = get_global_id(0); // add the vector elements z[index] = x[index] + y[index]; }
ç§ã¯æå³çã«è©³çŽ°ã«ç«ã¡å ¥ãããæ°·å±±ã®äžè§ã瀺ããŸãããéçºããã»ã¹ããããžã§ã¯ãã®çµã¿ç«ãŠãã·ã¹ãã ã®èµ·åã§ãã
æåã®èšäºãæºåãããšãããããã®è¡ãäœã«å€ãããã«ã€ããŠéåžžã«èå³ããããŸããïŒFPGAåŽããïŒã ã¢ãŒããã¯ãã£ãç解ããããšã§ãäœããæé©åããŠãã©ã®ãªãœãŒã¹ãè²»ããããŠãããããŸããã®ã·ã¹ãã ã®è¯ãç¹ãšæªãç¹ãç解ããããšãã§ããŸãã
ãã®èšäºã§ã¯ãã³ã¢ãéããŠã次ã®è³ªåã«å¯ŸããçããèŠã€ããããšããŸãã
- 圌ã®ã¢ãŒããã¯ãã£ã¯äœã§ããïŒ
- ã©ã®ããã«æ§æãããŠããŸããïŒ ããŒã¿ã¯ã©ã®ããã«åŠçãããŸããïŒ
- ã©ã®åšæ³¢æ°ã§æ©èœããŸããïŒ ããã¯ã©ã®ããã«æ±ºå®ãããŸããïŒ
- RTLã·ãã¥ã¬ãŒã¿ãŒã§ã³ã¢ã®ã¿ãã·ãã¥ã¬ãŒãããããšã¯å¯èœã§ããïŒ
- ã©ã®ãããã¯ãæããªãœãŒã¹ãæ¶è²»ããŸããïŒ ãããæé©åããæ¹æ³ã¯ãããŸããïŒ
ãã®å éšãèŠãŠã¿ãŸãããïŒ ç«ãžããããïŒ
ã¢ã«ãã©ã®èŠæ¹
FPGAã®ãããžã§ã¯ãã詳ããæ€èšããåã«ããã³ããŒããã®ããŸããŸãªãã¬ãŒã³ããŒã·ã§ã³ã«ç®ãåããŸããé«ã¬ãã«ïŒããŒã±ãã£ã³ã°ïŒèšèªã§ã®å®è£ ã«ã€ããŠè©±ããŠãããã®ã§ãã
ã¢ã«ãã©ã®OpenCLã®å€§ããªãã¬ãŒã³ããŒã·ã§ã³çŽ¹ä»ãã芧ã«ãªãããšããå§ãããŸã
ã¢ã«ãã©ã®OpenCL Compilerã䜿çšããFPGAã®ãã¯ãŒã®æŽ»çš ïŒ æ³šæ ã100æ以äžã®ã¹ã©ã€ããçŽ16 MBïŒã

ãã¡ãŒã ãŠã§ã¢ã®æ§æã¯æ¬¡ã®ãšããã§ãã
- åšèŸºæ©åšïŒPCIeãå€éšã¡ã¢ãªïŒDDRãQDRïŒïŒãžã®ã¢ã¯ã»ã¹ãæäŸããIPã³ã¢ã
- Nucleiã¯ã³ã³ãã¢ããŒã¹ã§å®è£ ãããŠããŸãã OpenCLã«ãŒãã«ã§èª¬æãããŠããèšç®ãå®è¡ããŸãã
- ã€ã³ãã©ã¹ãã©ã¯ãã£ïŒ ã°ããŒãã«ããã³ããŒã«ã«ã¡ã¢ãªã€ã³ã¿ãŒã³ãã¯ã ã
çžäºæ¥ç¶ã¯ããã¹ã¿ãŒãšã¹ã¬ãŒãïŒãã¹ã¿ãŒãšã¹ã¬ãŒãïŒã§ããã¢ãžã¥ãŒã«éã®å ±éãã¹ã®åå²ã§ãã
ç§ãã¡ã®å ŽåããŠã£ã¶ãŒãã¯ãã°ããŒãã«ã¡ã¢ãªïŒãã¹ãã¡ã¢ãªãŸãã¯å€éšã¡ã¢ãªã®ããããïŒãšããã£ãã·ã¥ãšåŒã°ããããŒã«ã«ïŒå éšïŒã¡ã¢ãªã®äž¡æ¹ã«ããŒã¿ãèªã¿æžãããã«ãŒãã«ã§ãã 調åãšããŒã¿å€éåã®ããã»ã¹ã®çµæãã¢ãžã¥ãŒã«ã¯ã以äžã§èª¬æããããã«ãããªãã®éã®ãªãœãŒã¹ãæ¶è²»ããå¯èœæ§ããããŸãã
䟿å®äžãã¢ãžã¥ãŒã«éã®éä¿¡ãããã³ã«ã¯æšæºåãããŠããŸãã ã¢ã«ãã©ã®ãããžã§ã¯ãã§ã¯ã Avalon ïŒ Avalon-MM ïŒMemory MappedïŒãAvalon-ST ïŒStreamingïŒãªã©ã®ã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠããŸãã ããã«ã€ããŠã¯è©³ãã説æããŸãããèªè ã¯ããã§åå¥ã«èªãããšãã§ããŸãã ãã®èšäºã§ã¯ãçžäºæ¥ç¶ã®ã»ãšãã©ãAvalon-MMã€ã³ã¿ãŒãã§ãŒã¹ã«ãªããŸãã
ç¹°ãè¿ããŸããããããã¯ãã¹ãŠOpenCLã®ã«ãŒãã«èšè¿°ããèªåçã«ååŸãããããšã匷調ããŸãã
æŽæ°çµæã®æçš¿
åã®èšäºã§ãQuartusããŒãžã§ã³14.1ã§ã®äœæ¥ã«åºã¥ãããã«ãçµæã«ã€ããŠèª¬æããŸããã
å°ãåãããŒãžã§ã³15.1ããªãªãŒã¹ãããŸãããããã§å€§ããªéãããããã©ããã確èªããããšã«ããŸããã ãããè¡ãããã«ããœãŒã¹ã³ãŒããåçæããæ°ããããŒãžã§ã³ã§åæ§ç¯ããŸããã
æ®å¿µãªãããOpenCLã®ããžã¥ã¢ã©ã€ã¶ãŒãšãããã¡ã€ã©ãŒã§ã¯ãïŒå€èŠ³ã®ïŒå€æŽã¯çºçããŠããŸããããããã®å€èŠ³ã«ã¯ããŸã å€ãã®èŠæããããŸãã
--profileã䜿çšããã¢ã»ã³ããªã¬ããŒã ïŒãããã¡ã€ãªã³ã°ã«ãŠã³ã¿ãŒã䜿çšïŒïŒ
+-----------------------------------------------------------------------------------+ ; Fitter Summary ; +---------------------------------+-------------------------------------------------+ ; Fitter Status ; Successful - Sun Nov 22 13:18:14 2015 ; ; Quartus Prime Version ; 15.1.0 Build 185 10/21/2015 SJ Standard Edition ; ; Family ; Cyclone V ; ; Device ; 5CSEMA5F31C6 ; ; Timing Models ; Final ; ; Logic utilization (in ALMs) ; 5,472 / 32,070 ( 17 % ) ; ; Total registers ; 10409 ; ; Total pins ; 103 / 457 ( 23 % ) ; ; Total block memory bits ; 127,344 / 4,065,280 ( 3 % ) ; ; Total RAM Blocks ; 44 / 397 ( 11 % ) ; ; Total PLLs ; 2 / 6 ( 33 % ) ; ; Total DLLs ; 1 / 4 ( 25 % ) ; +---------------------------------+-------------------------------------------------+
以åã®ããŒãžã§ã³ã®ã³ã³ãã€ã©ãšæ¯èŒããŠããããžã§ã¯ãã¯çŽ100 ALMã倱ããŸããã
ãããã¡ã€ãªã³ã°ã«ãŠã³ã¿ãŒã䜿çšããªããã«ãã¬ããŒãã¯æ¬¡ã®ãšããã§ãã
+-----------------------------------------------------------------------------------+ ; Fitter Summary ; +---------------------------------+-------------------------------------------------+ ; Fitter Status ; Successful - Sun Nov 22 13:51:21 2015 ; ; Quartus Prime Version ; 15.1.0 Build 185 10/21/2015 SJ Standard Edition ; ; Family ; Cyclone V ; ; Device ; 5CSEMA5F31C6 ; ; Timing Models ; Final ; ; Logic utilization (in ALMs) ; 4,552 / 32,070 ( 14 % ) ; ; Total registers ; 7991 ; ; Total pins ; 103 / 457 ( 23 % ) ; ; Total block memory bits ; 127,344 / 4,065,280 ( 3 % ) ; ; Total RAM Blocks ; 44 / 397 ( 11 % ) ; ; Total PLLs ; 2 / 6 ( 33 % ) ; ; Total DLLs ; 1 / 4 ( 25 % ) ; +---------------------------------+-------------------------------------------------+
ã芧ã®ãšãããçŽ1000åã®ALMããããã¡ã€ãªã³ã°ã«ãŠã³ã¿ãŒãšããžãã¯ã§å ããããŠããããããããèªã¿åãããŸãã
å°æ¥çã«ã¯ããã®ç¹å®ã®ã¬ããŒãã䜿çšããŠãæèŠéãåæããŸãã
ãããžã§ã¯ããæåã«èŠã
ãããžã§ã¯ããgithubã«æçš¿ãããŠããããšãæãåºãããŠãã ããã
ãããžã§ã¯ããã¡ã€ã«ã¯åçŽã§ããtop.qpf ïŒQPF-Quartus Project FileïŒãæãéèŠãªã¢ãžã¥ãŒã«top.vã§ãå®éã«ã¯ã·ã¹ãã ã¢ãžã¥ãŒã«ã®ã€ã³ã¹ã¿ã³ã¹ãšLEDã«è¡šç€ºãããåçŽãªã«ãŠã³ã¿ãŒãå«ãŸããŠããŸãã
ã·ã¹ãã ïŒ4535 ALMïŒ

systemã¯Qsysã䜿çšããŠèªåçæãããã¢ãžã¥ãŒã«ã§ã ã Qsysã¯ãããŸããŸãªIPãããã¯ãæ¥ç¶ããçžäºæ¥ç¶ã1ã€ã®åšæ³¢æ°ããå¥ã®åšæ³¢æ°ãžã®åãæ¿ããªã©ã«å¿ èŠãªã¢ãžã¥ãŒã«ã®ã³ãŒããèªåçã«çæã§ããGUIããŒã¹ã®ããŒã«ã§ãã
ã¢ãžã¥ãŒã«ïŒ
- vector_add_systemïŒ2141 ALMïŒã¯ã vector_addã«ãŒãã«ã§èšè¿°ããå 容ãå®è£ ããã¢ãžã¥ãŒã«ã§ãã
- acl_ifaceïŒ2343 ALMïŒ -ãã䟿å©ãªã¢ã¯ã»ã¹ãšã«ãŒãã«ãšã®å¯Ÿè©±ãæäŸããã€ã³ãã©ã¹ãã©ã¯ãã£ã
ã€ã³ã¿ãŒãã§ãŒã¹ïŒ
- avs_vector_add_cra-ã«ãŒãã«ç®¡ççšã®Avalon-MMã
- avm_memgmem0_port_0_0_rw -DDRã¡ã¢ãªã«ã¢ã¯ã»ã¹ããããã®Avalon-MMã ããŒã¿å¹ ã¯256ãããã§ãã
acl_ifaceïŒ2343 ALMïŒ

ã¢ãžã¥ãŒã«ïŒ
- pllïŒ0 ALMïŒ ïŒ config_clk ïŒ50 MHzãå€éšãžã§ãã¬ãŒã¿ãŒããã®ïŒããpll_outclk0 ïŒ100 MHzïŒã¯ããã¯ãåä¿¡ããPLL ã
- acl_kernel_clkïŒ1057 ALMïŒ ïŒå¥ã®PLLïŒã¯ããã¯ãçæãããããã«ãŒãã«ã«äŸçµŠãããŸãã èå³æ·±ããã¥ã¢ã³ã¹ããããŸããåŸã§è©³ãã説æããŸãã
- acl_kernel_interfaceïŒ439 ALMïŒ ïŒã«ãŒãã«ãšããã»ããµãŒéã®ãçžäºäœçšããæäŸããŸãïŒå¶åŸ¡ã€ã³ã¿ãŒãã§ãŒã¹ãšå²ã蟌ã¿ãä»ããŠïŒã
- clock_cross_kernel_mem1ïŒ82 ALMïŒ ïŒç°ãªãåšæ³¢æ°ïŒ CDC ïŒã§åäœããã€ã³ã¿ãŒãã§ãŒã¹ã®ã調æŽãã«åŸäºããŠããŸãã
- hpsïŒ0 ALMïŒ ïŒããã¯HPSïŒããŒãããã»ããµã·ã¹ãã ïŒã€ã³ã¹ã¿ã³ã¹ã§ãã FPGA tkã®ããžãã¯ã¯å¿ èŠãããŸããã ãããããŒããŠã§ã¢ã³ã¢ã§ãã
ã€ã³ã¿ãŒãã§ãŒã¹ïŒ
- f2h_sdram0 -DDRã¡ã¢ãªã«ã¢ã¯ã»ã¹ããããã®Avalon-MMã€ã³ã¿ãŒãã§ã€ã¹ã ããŒã¿å¹ ã¯256ãããã§ãåäœåšæ³¢æ°ã¯pll_outclk0 ïŒ100 MHzïŒã§ãã
- h2f_lw -AXIã€ã³ã¿ãŒãã§ã€ã¹ã ããã«ãããCPUïŒARMïŒã¯ãã«ãŒãã«ãªã©ã®å¶åŸ¡/ã¹ããŒã¿ã¹ã¬ãžã¹ã¿ã䜿çšããŠã·ã¹ãã ãå¶åŸ¡ããã³æ§æã§ããŸãã
ãããã®ã¢ãžã¥ãŒã«ã®åèšå®¹éãåèšãããšãåèšã¯åæããŸããã äºå®ãQsysã¯ããã©ã«ãã§ã¯çžäºæ¥ç¶ã¿ã€ãã®ã¢ãžã¥ãŒã«ã衚瀺ããŸããã ãããã衚瀺ããã«ã¯ã[ ã·ã¹ãã ]ã¡ãã¥ãŒã®[ ã·ã¹ãã ãQsysã€ã³ã¿ãŒã³ãã¯ãã§è¡šç€º ]ãã¯ãªãã¯ããŸãã ãã®åŸã mm_interconnect_ *ãšãã圢åŒã®ã¢ãžã¥ãŒã«ãããã568åãš195åã®ALMãå æããŠããããšãããããŸãã
vector_add_systemïŒ2141 ALMïŒ
ãã®ã¢ãžã¥ãŒã«ã®ã¢ãŒããã¯ãã£ã¯GUIã§è¡šç€ºã§ããŸãããã©ã®ããã«æ©èœããããç解ããããã«ãVerilogã«é£ã³èŸŒã¿ãŸãã
ãã€ã¢ã°ã©ã ã®äŸã¯æ¬¡ã®ããã«ãªããŸãã

- vector_add_system_interconnect_ *ïŒ443 ALMïŒ -avm_memgmem0_port_0_0_rwã€ã³ã¿ãŒãã§ã€ã¹ã®èª¿åãšå€éåãå®è¡ããçžäºæ¥ç¶ã¢ãžã¥ãŒã«
- LSU_XïŒ235ïŒ ã LSU_YïŒ239ïŒ -ãã¯ãã«ã®ã«ãŒãã«ã¡ã¢ãªããããŒã¿ãæžç®ããŸãïŒããããã«ãŒãã«åŒæ°xããã³y ïŒã
- LSU_ZïŒ424 ALMïŒ -èšç®çµæãã°ããŒãã«ã¡ã¢ãªã«æžã蟌ã¿ãŸãïŒåŒæ°z ïŒã
- acl_id_iteratorïŒ228 ALMïŒ ã acl_work_group_dispatcherïŒ149 ALMïŒ -ã«ãŒãã«ã«ãã£ãŠå®è¡ãããã¿ã¹ã¯ãçºè¡ããŸãïŒã©ã®èŠçŽ ãåŠçããå¿ èŠããããã瀺ããŸãïŒã
- acl_kernel_finish_detectorïŒ144 ALMïŒ -ã«ãŒãã«ããã€åäœãçµäºãããã決å®ããŸãã
泚ïŒ
LSUã¢ãžã¥ãŒã«ã¯1ã€ã®ã¢ãžã¥ãŒã«ïŒ lsu_top ïŒã®ã€ã³ã¹ã¿ã³ã¹ã§ããã lsu_local_bb0_ld_ ã lsu_local_bb0_ld__u0ããã³lsu_local_bb0_st_addãšããååã§ã ã 䟿å®äžãããã人éçãªãååãä»ããŸããã LSUã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãã
ã«ãŒãã«ã®ä»çµã¿ïŒ
- èšå®ã¯CRAãéããŠè¡ãããåŠçãéå§ãããŸãã
- LSU_Xããã³LSU_Y㯠ãããŒã¿ãèªã¿åããã°ããŒãã«ã¡ã¢ãªã«èŠæ±ãè¡ãããã®ãã³ãã³ãããåãåããŸãã
- èªã¿åãããŒã¿ã¯ãäž¡æ¹ã®LSUããã®ããŒã¿ãæºåã§ãããŸã§ã¡ã¢ãªïŒ FIFO ïŒã«ãããã¡ãªã³ã°ãããŸãã
- ããŒã¿ãäž¡æ¹ã®FIFOã«ãããšããã«ããã€ãã©ã€ã³ã«éä¿¡ãããå ç®ãå®è¡ãããŸãã
- çµæã¯LSU_Zã«åé¡ãããããã§æ©äŒãã°ããŒãã«ã¡ã¢ãªã«æžã蟌ãŸããã®ãåŸ ã¡ãŸãã
- å¿ èŠãªæ°ã®èŠçŽ ãåŠçããããã¹ãŠã®çµæãã¡ã¢ãªã«æžã蟌ãŸãããšïŒä¿çäžã®ãšã³ããªã¯ãããŸããïŒã kernel_finish_detectorãããªã¬ãŒããã kernel_irqå²ã蟌ã¿ãèšå®ãããŸãã
3ã€ã®LSUã¯ãã°ããŒãã«ã¡ã¢ãªã«ã¢ã¯ã»ã¹ããããã®1ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹ãæ±ããŠäºãã«ç«¶åããããšã«æ³šæããããšãéèŠã§ãããããã¯ãAvalon-MMã€ã³ã¿ãŒãã§ãŒã¹ã®ãã¹ã¿ãŒã§ãã
å³ã§add_pipelineãšããŠæå®ãããã€ãã©ã€ã³ã¯ãå®éã«ã¯å¥ã®ã¢ãžã¥ãŒã«ã«ã¯åãŸããŸãããvector_add_basic_block_0ã¢ãžã¥ãŒã«ã®vector_add.vãã¡ã€ã«ã«é 眮ãããŠããã ãã§ãã
2ã€ã®32ãããæ°ã®å ç®ãå®è¡ããè¡èªäœã¯ã次ã®ããã«ãªããŸãã
assign local_bb0_add = (rstag_3to3_bb0_ld__u0 + rstag_3to3_bb0_ld_);
ãã®è¡ããäœæãããè«çèŠçŽ ã¯ããã¹ãŠã®æçšãªäœæ¥ãè¡ããŸãã
ãã以å€ã¯ãã¹ãŠãããŒã¿ããã®ããžãã¯ã«å°ãã€ã³ãã©ã¹ãã©ã¯ãã£ã§ãã
LSUïŒããŒãã¹ãã¢ãŠãããïŒ
ãã®ã«ãŒãã«ã®æãèå³æ·±ãã¢ãžã¥ãŒã«ã¯LSUã§ãã ä»çµã¿ãèŠãŠã¿ãŸãããã
å®éã lsu_topã¯ã READããã³STYLEãã©ã¡ãŒã¿ãŒã«å¿ããŠéžæãããä»ã®lsu_ *ã¢ãžã¥ãŒã«ã®ã©ãããŒã§ãã
ãã¹ãŠã®çš®é¡ã®ãã¡ã2ã€ã®ã¿ããããŸãã
- LSU_READ_STREAMING - LSU_X ã LSU_Y ïŒREAD = 1ãSTYLE = "STREAMING"ïŒ
- LSU_WRITE_STREAMING - LSU_Z ïŒREAD = 0ãSTYLE = "STREAMING"ïŒ
LSU_READ_STREAMING

ã¢ãžã¥ãŒã«ã®ãã©ã¡ãŒã¿ãŒã«æ³šæããŠãã ããã
BURSTCOUNT_WIDTH = 5; MEMORY_SIDE_MEM_LATENCY = 89;
BURSTCOUNT_WIDTHã¯ãä¿¡å·å¹ avm_burstcountã瀺ããŸããAvalon -MMã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠèŠæ±ãããå Žåã ããŒã¹ããã©ã³ã¶ã¯ã·ã§ã³äžã«èªã¿åãå¿ èŠãããã¯ãŒãæ°ããããŸãã
ä¿¡å·å¹ ã5ã®å Žåãæ倧ããŒã¹ãå€ã¯16ã§ããããã¯ã ä»æ§ããæããã§ãã
The value of the maximum burstcount parameter must be a power of 2. A burstcount interface of width n can encode a max burst of size 2^(n-1). For example, a 4-bit burstcount signal can support a maximum burst count of 8. The minimum burstcount is 1.
ããã¯ãæ倧ã§1ã€ã®èŠæ±ã16åã®256ãããã¯ãŒãã§èªã¿åãããããšãæå³ããŸããã€ãŸãã4096 KããããŸãã¯128åã®32ãããæ°ã§ãïŒæ£ç¢ºã«32ãããæŽæ°ãè¿œå ããŸãïŒã
MEMORY_SIDE_MEM_LATENCYã¯ã lsu_burst_read_masterã®FIFOã¯ãŒãã®æ°ã«åœ±é¿ããŸã ã ãã®FIFOã¯ãã°ããŒãã«ã¡ã¢ãªããã®èªã¿åãããŒã¿ããããã¡ãªã³ã°ããããã«äœ¿çšãããŸãã
圌女ã®åèªæ°ã¯ã©ã®ããã«æ±ºå®ãããŸããïŒ
localparam MAXBURSTCOUNT=2**(BURSTCOUNT_WIDTH-1); // Parameterize the FIFO depth based on the "drain" rate of the return FIFO // In the worst case you need memory latency + burstcount, but if the kernel // is slow to pull data out we can overlap the next burst with that. Also // since you can't backpressure responses, you need at least a full burst // of space. // Note the burst_read_master requires a fifo depth >= MAXBURSTCOUNT + 5. This // hardcoded 5 latency could result in half the bandwidth when burst and // latency is small, hence double it so we can double buffer. localparam _FIFO_DEPTH = MAXBURSTCOUNT + 10 + ((MEMORY_SIDE_MEM_LATENCY * WIDTH_BYTES + MWIDTH_BYTES - 1) / MWIDTH_BYTES); // This fifo doesn't affect the pipeline, round to power of 2 localparam FIFO_DEPTH = 2**$clog2(_FIFO_DEPTH);
_FIFO_DEPTH = 16 + 10 + ((89 * 4 + 32 - 1)/32) = 39 , : FIFO_DEPTH = 64
çµè« ïŒ
256ãããã®64ã¯ãŒãã®ãããã¡ïŒãã£ãã·ã¥ïŒãå²ãåœãŠãããŸãã
å®éããã®äºå®ãä¿®æ£ããããã«ããœãŒã¹ãéžæããå¿ èŠã¯ãããŸããã§ãããã¢ã»ã³ããªã®ã¬ããŒãã®RAM Summaryã»ã¯ã·ã§ã³ãèŠãã ãã§ãã èšç®ã¯æ£ããããšãå€æããã¬ããŒãã«ã¯7ã€ã®M10Kãããã¯ã䜿çšãããããšã瀺ãããŠããŸãã 7ã€ã®ãããã¯ã¯ãäºæ³ããã256ããã* 64 = 16 Kbpsã§ã¯ãªãã10,240ããã* 7 = 70 Kbpsã§ãã
ãªããããèµ·ãã£ãã®ã§ããïŒ
FPGAã§ã¯ãå éšã¡ã¢ãªã¯ããŸããŸãªæ§æãå¯èœãªå€æ°ã®å°ããªãããã¯ã§ãã
ããã§ãM10KãŠããããæ§æããæ¹æ³ã確èªã§ããŸãïŒã€ãŸããCyclone Vãã¡ããªã®ãããã®åºç€ã圢æããŸãïŒã
ã¡ã¢ãªãããã¯ã®æ倧ã¯ãŒãé·ã¯40ãããã§ãã256ãããã§ã¯ãŒããäœæããå¿ èŠãããå Žåã¯ã256/40 = 6.4-> 7ãããã¯ãå¿ èŠã§ãã ã¡ã¢ãªå ã®ã¯ãŒãæ°ã¯64ã§ãããããåãããã¯ã¯64x40ãšããŠæ§æãããæ®ãã®75ïŒ ã®ã¡ã¢ãªã¯åçŽã«äœ¿çšãããŸããã
ããŒã¹ããµã€ãºãšãã£ãã·ã¥ãµã€ãºã®åœ±é¿ã¯äœã§ããïŒ
- ããŒã¹ããå€ãã»ã©ã1åã®ãªã¯ãšã¹ãã§èªã¿åãããšãã§ããŸãããæ®ãã®ã¡ã¢ãªãªã¯ãšã¹ãã¯ãããã¯ãããŸãïŒå€éšã¡ã¢ãªãšéä¿¡ããããã¹ã¿ãŒã3人ããŸãïŒã
- ãã£ãã·ã¥ã倧ããã»ã©ãæ°ããããŒã¿ãã£ã³ã¯ã®èªã¿åãäžã«åŠççšã®ãäºçŽãã«ããããŒã¿ãå€ããªããŸãã 倧ããªãã£ãã·ã¥ã®ãã€ãã¹ã¯ããªãœãŒã¹ã®æ¶è²»ãé€ããŠããããŸããã ãã®å Žåãã¯ãŒãæ°ã256ã®ãã£ãã·ã¥ãäœæã§ããåãæ°ã®M10Kãããã¯ã䜿çšãããŸãã
LSU_WRITE_STREAMING

çä¿¡32ãããããŒã¿ïŒå ç®ã®çµæïŒã¯ãé çªã«FIFOã«å ¥ããããŸãã ããããã«MAXBURSTCOUNTããã€ã€ã«ããããšïŒãã®ã¢ãžã¥ãŒã«ã§ã¯ãã®ãã©ã¡ãŒã¿ãŒã16ïŒãã¡ã¢ãªãžã®æžã蟌ã¿ãã©ã³ã¶ã¯ã·ã§ã³ãçºçããŸãã ãããã®åFIFOã®ããŒã¿å¹ ã¯32ã§ãããã®ãããªFIFOã¯8åïŒ256/32ïŒãããŸãã
ãããã®fifoã¯ã©ã®ãããã®ããŒã¿åãã«èšèšãããŠããŸãã
ã³ãŒãlsu_streaming_writeããèšç®ãè¡ããŸãã ãã®ã¢ãžã¥ãŒã«ãã©ã¡ãŒã¿çšã MEMORY_SIDE_MEM_LATENCYã¯32ã§ãã
localparam MAXBURSTCOUNT=2**(BURSTCOUNT_WIDTH-1); localparam __FIFO_DEPTH=2*MAXBURSTCOUNT + (MEMORY_SIDE_MEM_LATENCY * WIDTH + MWIDTH - 1) / MWIDTH; localparam _FIFO_DEPTH= ( __FIFO_DEPTH > MAXBURSTCOUNT+4 ) ? __FIFO_DEPTH : MAXBURSTCOUNT+5; // This fifo doesn't affect the pipeline, round to power of 2 localparam FIFO_DEPTH= 2**($clog2(_FIFO_DEPTH));
MAXBURSTCOUNT = 2^4 = 16 __FIFO_DEPTH = 2 * 16 + ( 32 * 32 + 256 - 1)/256 = 36 + 5 = 41 _FIFO_DEPTH = 41 : FIFO_DEPTH = 64
ã¬ããŒãã§ç¢ºèªããŸãïŒ64 * 32 = 2048ãããïŒ1 M10KïŒã
FIFOã¯å®å šã«ç¬ç«ããŠãããããåFIFOã«1ã€ã®M10Kãããã¯ãå²ãåœãŠããã lsu_read_streamingã® 7ã€ã®M10Kãããã¯ã«å¯ŸããŠ8ã€ã®M10Kãããã¯ã«ãªããŸãã
ãªã8åã®FIFOãäœæããã®ã§ããïŒ ã»ãšãã©ã®å Žåãããã¯ç°¡åã§ãïŒæå¹ãªåèªã®æ°ãåå¥ã«ä¿åããå¿ èŠã¯ãããŸããïŒã
LSUãã©ã¡ãŒã¿ã¯ã©ã®ããã«èšç®ãããŸããïŒ
ãã®ãããªæ°åãã©ãããæ¥ãã®ããç解ããŠã¿ãŸãããïŒ
ãããã®èšå®ã¯ãããŒãã説æãããã¡ã€ã«ïŒaltera / 15.1 / hld / board / de1soc / de1soc_sharedonly / board_spec.xmlïŒããååŸãããçãããããŸãã
ã°ããŒãã«ã¡ã¢ãªã«é¢é£ä»ããããŠããè¡ãèŠã€ããŸãã
<!-- One DDR3-800 DIMM, 256-bit data --> <global_mem max_bandwidth="6400"> <interface name="acl_iface" port="kernel_mem0" type="slave" width="256" maxburst="16" latency="240" address="0x00000000" size="0x40000000"/> </global_mem>
ãããã®ãã©ã¡ãŒã¿ãŒã®èª¬æã«ã€ããŠã¯ã Altera SDK for OpenCLïŒã«ã¹ã¿ã ãã©ãããã©ãŒã ããŒã«ããããŠãŒã¶ãŒã¬ã€ãã®ç« board_spec.xmlãã¡ã€ã«ã®XMLèŠçŽ ãå±æ§ãããã³ãã©ã¡ãŒã¿ãŒãåç §ããŠãã ãã ã
max_bandwidth- çŸåšã®æ§æã§çµåããããã¹ãŠã®ã°ããŒãã«ã¡ã¢ãªã€ã³ã¿ãŒãã§ã€ã¹ã®æ倧垯åå¹ ã ã¢ã«ãã©ã®ãªãã©ã€ã³ã»ã³ã³ãã€ã©ã¯ãmax_bandwidthã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ãšããŒãã«é©ããã¢ãŒããã¯ãã£ãéžæããŸãã æãåºã®ããŒã¿ã·ãŒããããã®åž¯åå¹ ã®å€ãèšç®ããŸãã
翻蚳
max_bandwidth- ã°ããŒãã«ã¡ã¢ãªã®ãã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ã®æ倧垯åå¹
ã ã¢ã«ãã©ãªãã©ã€ã³ã³ã³ãã€ã©ã¯ãmax_bandwidthã䜿çšããŠãç¹å®ã®ããŒãããã³ã¢ããªã±ãŒã·ã§ã³ã«æé©ãªã¢ãŒããã¯ãã£ãéžæããŸãã 䜿çšãããã¡ã¢ãªã®ãã©ã¡ãŒã¿ãŒã«åºã¥ããŠãããã®å€ãèšç®ããŸãã
æ®å¿µãªãããã©ã®ãŠããããšã©ã®ããã«èããããŠãããã«ã€ããŠã®èª¬æã¯ãããŸãããäžæ¹ã§ããããã¡ã€ã©ãŒã§6400 MB / s ãæžã蟌ãŸãã6400 MB / sã®èšç®ã«ãããšããŸã£ããæ©èœããŸããïŒ400ïŒMHzãDDRã¯ããã¯åšæ³¢æ°ïŒ* 32ïŒããããå¹ DDRã€ã³ã¿ãŒãã§ã€ã¹ã®ããŒã¿ä¿¡å·ïŒ* 2ïŒ2ã€ã®åé¢ã§åäœïŒ= 25600 Mb / s = 3200 MB / s ãŸãã¯ãäž¡æ¹åã§æ€èšããå¿ èŠããããŸããïŒ
max_burst- ã¹ã¬ãŒãã€ã³ã¿ãŒãã§ã€ã¹ã®æ倧ããŒã¹ããµã€ãºã
翻蚳
max_burst- ã¹ã¬ãŒãã€ã³ã¿ãŒãã§ã€ã¹ã®æ倧ããŒã¹ããµã€ãºã
ãã®äŸã§ã¯-16ã§ãBURSTCOUNT_WIDTH = 5ã«ãªããŸãã fpga2hps_sdramã€ã³ã¿ãŒãã§ãŒã¹ã¯max_burstcount = 128ããµããŒãããŸãã16-ããã¯ããçš®ã®ããžãã¯ãã³ããŒã§ã誰ã«ã§ãé©ããŠããŸããïŒ :)
ã¬ã€ãã³ã· - ã¡ã¢ãªã€ã³ã¿ãŒãã§ã€ã¹ããªã¯ãšã¹ãã«å¿çãããŸã§ã®æéãããç§ïŒnsïŒã§æå®ããæŽæ°ã ã¬ã€ãã³ã·ã¯ãã«ãŒãã«ãããŒãã·ã¹ãã ã«ã¡ã¢ãªèªã¿åãèŠæ±ãçºè¡ããŠãããã«ãŒãã«ã«æ»ãã¡ã¢ãªããŒã¿ãžã®ã©ãŠã³ãããªããæéã§ãã ããšãã°ãã¯ããã¯ã¯ããã·ã³ã°ããªããžãåãã200 MHzã§åäœããã¢ã«ãã©DDR3ã¡ã¢ãªã³ã³ãããŒã©ã®ã¬ã€ãã³ã·ã¯çŽ240 nsã§ãã
翻蚳
ã¬ã€ãã³ã·ãŒ - å¿
èŠãªæéãããç§åäœã§ç€ºãæŽæ°
å¿çããã¡ã¢ãªã€ã³ã¿ãŒãã§ã€ã¹ã åŸ æ©æéã¯ãèªã¿åãèŠæ±ããã«ãŒãã«ã§ããŒã¿ãåä¿¡ãããŸã§ã®æéã§ãã ããšãã°ã200 MHzã®åšæ³¢æ°ã§åäœããå¥ã®åšæ³¢æ°ã«åãæ¿ããã¢ãžã¥ãŒã«ãšé£åããã¢ã«ãã©ã®DDR3ã³ã³ãããŒã©ã«ã¯ãçŽ240 nsã®é 延ããããŸãã
å¿çããã¡ã¢ãªã€ã³ã¿ãŒãã§ã€ã¹ã åŸ æ©æéã¯ãèªã¿åãèŠæ±ããã«ãŒãã«ã§ããŒã¿ãåä¿¡ãããŸã§ã®æéã§ãã ããšãã°ã200 MHzã®åšæ³¢æ°ã§åäœããå¥ã®åšæ³¢æ°ã«åãæ¿ããã¢ãžã¥ãŒã«ãšé£åããã¢ã«ãã©ã®DDR3ã³ã³ãããŒã©ã«ã¯ãçŽ240 nsã®é 延ããããŸãã
ãã®å Žåããé 延ã240 nsã§ãããšããŸãã æããã«ããã£ã¡ã³ã·ã§ã³MEMORY_SIDE_MEM_LATENCYã¯ãã£ãã¯ã®æ°ã§ãïŒãã®ã³ã¡ã³ãã瀺åããã®ã¯ãLSUãšã¡ã¢ãªéã®ãµã€ã¯ã«ã®ã¬ã€ãã³ã·ã§ãïŒã
board_spec.xmlã®å€ïŒ maxburst ã latency ïŒããã³ã«ãŒãã«ã®æ§é ïŒè¿œå ãããåŒæ°ã®æ°ïŒ readers ïŒïŒãå€æŽããŠãããã€ãã®å®éšãè¡ã£ãŠã¿ãŸããã ã äž¡æ¹ã®ã¢ãžã¥ãŒã«ïŒ LSU_X ïŒlsu_read_streamingïŒããã³LSU_Z ïŒlsu_write_streamingïŒïŒã®MEMORY_SIDE_MEM_LATENCYãã©ã¡ãŒã¿ãŒã®å€ãç£èŠããŸãã
|--------------------------------------------------------| | maxburst | latency | readers | MEMORY_SIDE_MEM_LATENCY | | | | |-------------------------| | | | | LSU_X | LSU_Z | |--------------------------------------------------------| | 16 | 0 | 1 | 25 | 16 | | 16 | 100 | 1 | 45 | 16 | | 16 | 240 | 1 | 73 | 16 | |--------------------------------------------------------| | 16 | 0 | 2 | 41 | 32 | | 16 | 100 | 2 | 61 | 32 | | 16 | 240 | 2 | 89 | 32 | |--------------------------------------------------------| | 16 | 0 | 3 | 57 | 48 | | 16 | 100 | 3 | 77 | 48 | | 16 | 240 | 3 | 105 | 48 | |--------------------------------------------------------| | 32 | 0 | 1 | 41 | 32 | | 32 | 100 | 1 | 61 | 32 | | 32 | 240 | 1 | 89 | 32 | |--------------------------------------------------------| | 32 | 0 | 2 | 73 | 64 | | 32 | 100 | 2 | 93 | 64 | | 32 | 240 | 2 | 121 | 64 | |--------------------------------------------------------| | 32 | 0 | 3 | 105 | 96 | | 32 | 100 | 3 | 125 | 96 | | 32 | 240 | 3 | 153 | 96 | |--------------------------------------------------------|
äŸåé¢ä¿ã¯äœã§ããïŒ
- ã¬ã€ãã³ã·ãå¢å ãã maxburstããã³ãªãŒããŒã ä¿®æ£ããããšã LSU_X_MEMORY_SIDE_MEM_LATENCYã¯ã¬ã€ãã³ã·/ 5ã«çããå€ã ãå¢å ããŸãã ã»ãšãã©ã®å Žåã5ã¯5 nsã§ãïŒ200 MHzã®ããžãã¯åšæ³¢æ°ã«éä¿¡ãããŠããŸããïŒïŒã
- ãªãŒããŒã®æ°ãå¢ãããšã LSU_X_MEMORY_SIDE_MEM_LATENCYã¯ããŒã¹ãã®å€ã ãå¢å ããŸãã
- LSU_Z_MEMORY_SIDE_MEM_LATENCYã¯ãã°ããŒãã«ã¡ã¢ãªã«ã¢ã¯ã»ã¹ããèŠçŽ ã®æ°ãšæ倧ããŒã¹ãå€ã«ç·åœ¢ã«äŸåããŸãã
æ°åŒãèŠãããšãã§ããŸãïŒ
- LSU_X_MEMORY_SIDE_MEM_LATENCY = 9 + ãªãŒã㌠* maxburst + latency / 5ã ïŒ9ã¯äœããã®ããžãã¯ãã³ããŒããç§ãæåŸãŸã§å°éããŠããªãã«ãŒãã«ã®å¥ã®ç¹æ§ã§ããããããããã¯ã«ãŒãã«ã®äžè¬çãªé 延ã§ãïŒã
- LSU_Z_MEMORY_SIDE_MEM_LATENCY = maxburst * readers ã
泚 ïŒ
ãããã®åŒã¯ç¹å®ã®ã«ãŒãã«ïŒå®è£ ïŒå°çšã§ãããå¥ã®åŒã§ã¯ãã¹ãŠãç°ãªãå ŽåããããŸãã
ã³ã¢ã¯ã©ã®åšæ³¢æ°ã§æ©èœããŸãã
ã³ã¢ã¯ããã¯ã¯acl_kernel_clkã¢ãžã¥ãŒã«ã«ãã£ãŠçæãããŸãã
ããã¯ãåçã«åæ§æïŒåºååšæ³¢æ°ãå€æŽïŒã§ããPLLã«åºã¥ããŠããŸãã
QsysãŸãã¯system_acl_iface_acl_kernel_clk_kernel_pll.vã§ãã®ã¢ãžã¥ãŒã«ãéããšããã®PLLã140 MHzïŒ kernel_clk ïŒãš280 MHzïŒ kernel_clk2x ïŒã®2ã€ã®ä¿¡å·ãçæããããšãããããŸã ã kernel_clk2xã¯ã©ãã§ã䜿çšãããŠããªããšèšããªããã°ãªããŸããã
ã³ã¢ã¯åžžã«ïŒããã³ä»»æã®ïŒ140 MHzã§ã®ã¿åäœãããªãŒããŒã¯ããã¯ã§ããªãããšãæå³ããŸããïŒ ãã¡ããéããŸãã
140 MHzã¯ããã®ç¹å®ã®ããŒãã®èšå®ã§ãã
䜿çšãããè«çèŠçŽ ãšãããã®æ¥ç¶æ¹æ³ã«å¿ããŠãåè·¯ãé害ãªãåäœããããšãä¿èšŒãããã¯ããã¯åšæ³¢æ°ã®å€ã¯ç°ãªãå ŽåããããŸãã ãã®åé¡ã«ã€ããŠã¯ããã€ãã©ã€ã³åŠçã«é¢ããèšäºã§è§ŠããŸããã
ã³ã³ãã€ã©ã®ã¿ã¹ã¯ã¯ãç¹å®ã®åšæ³¢æ°èŠä»¶ãæºããããã«ããªããã£ãïŒè«çèŠçŽ ãã¡ã¢ãªãããã¯ãªã©ïŒãé 眮ããããšã§ãã ããã¯æ¬¡ã®ããšãæå³ããŸãã
- 圌ã¯æ倧ã¯ããã¯é床ãäžããå ŽæãèŠã€ããããšããŸããã
- ãã°ããã®éã圌ããããå ã®èŠçŽ ã®é 眮ãæŽçããç¹æ®ã§ããªãããšãç解ããå Žåã圌ã¯æè¯ã®éžæè¢ã®1ã€ãæ®ããŸãïŒæ€çŽ¢äžïŒã
140 MHzã®ä»£ããã«ã Quartusã¯135 MHzã®æ倧ã¯ããã¯é床ã瀺ããŠãããšããŸãã ããã¯æ¬¡ã®ããšãæå³ããŸãã
- ã³ã³ãã€ã©ã¯ã135 MHzãé©çšããããšãèšç®ãæ£ããè¡ãããäœããã³ã°ããªããªã©ãä¿èšŒããŸãïŒãã¡ãããã³ãŒãèªäœã«ã¢ã«ãŽãªãºã ãšã©ãŒããªãå ŽåïŒã
- 140 MHzãé©çšãããšããã¹ãŠãæ£åžžã«ãªãå ŽåããããŸãã ãŸãã¯ããã§ãªããããããŸããã ããã¯ãããã«äŸåããŸã-åãã©ãã«ä»ãã®ãããã¯ãããã«ç°ãªãå Žåããããããã³ã³ãã€ã©ã¯åä¿éºãããææªã®å Žåã«èšç®ãããŸãã
ã»ãšãã©ã®å ŽåãFPGAãããžã§ã¯ããåæ§ç¯ããåŸãéçºè ã¯ã¢ã»ã³ããªã¬ããŒããèŠãŠãåšæ³¢æ°ãã¹ããŒã ã«é©åãããã©ããçåã«æã£ãŠããŸããååã®èšäºã§ã¯ããã€ããªãååŸããŠã¹ãããããŸãããã³ã³ãã€ã©ããããã®140 MHzã«é©åããªãå Žåã¯ã©ããªããŸããïŒèšç®ã¯ééã£ãŠããŸããïŒ
ãã®åé¡ãéçºè ããé ãããã«ãã¢ã«ãã©ã¯éåžžã«èå³æ·±ãããªãã¯ãäœæããŸããïŒãããããã¢ã«ãã©ã®OpenCL SDKã§éãã§ãããšãã«æãäžãããã®ã®äžã§æãèå³æ·±ããã®ã§ãïŒã
- ãã«ããå®äºãããšãadjust_plls.tclã¹ã¯ãªãããåŒã³åºãããŸããæ倧蚱容ã³ã¢åšæ³¢æ°ïŒFmaxïŒãåãåããpll_romã¢ãžã¥ãŒã«ã®ROMãåæåããããã«äœ¿çšããããã¡ã€ã«ïŒpll_rom.mifããã³pll_rom.hexïŒãçæããŸãã
- FPGAãããŒãããããšãèšå®ãããåšæ³¢æ°ïŒ140 MHzïŒãããžãã¯ã«é©çšãããŸããã«ãŒãã«ãèµ·åããåã«ãROMããããŒã¿ãèªã¿åããããããã®ä¿æ°ã䜿çšããŠãPLLãåæ§ç¯ãããŸãïŒåæ§æã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠïŒãåæ§æãçµäºãããšããã«ãç®çã®åšæ³¢æ°ããã§ã«ã«ãŒãã«ã«äŸçµŠãããŸãã
é衚瀺ã®ããã¹ã
åèšïŒ
- ã³ã¢ã§ã¯ãåšæ³¢æ°ãé©çšã§ãããã®ãæäŸãããŸããããžãã¯ã®å®¹éã倧ããããããšãå€æããæå®ãããæ°å€ãæºãããªãã£ãå Žåãèšç®ã¯äžæããããé ããªããŸãã
- 蚱容åšæ³¢æ°ãé«ãå ŽåãPLLã¯ãã®å€ã«èª¿æŽãããŸãïŒèšç®ãå éããŸãïŒãæå€§é »åºŠãäžããå Žæã®æ€çŽ¢ã¯ãããŸãããããã§ããåæ£ãã§ãããšããæèŠãããå Žåã¯ãPLLåšæ³¢æ°ã§æåã§ããŒãäžããæ¹ãè¯ãã§ãããã
ã¢ã»ã³ããªãå°ãç°¡çŽ åãã
ã«ãŒãã«ãã©ã®ããã«é 眮ããã³æ§æãããŠããããåŠç¿ããåã«ãïŒã«ãŒãã«ã«ïŒå€æŽãå ããããããŒããŠã§ã¢ã§ãããã°ããå Žåã«åœ¹ç«ã€å°ããªäœè«ãè¡ããŸããéçºããã»ã¹ã
æãåºãããŠãã ãããFPGAãã¡ãŒã ãŠã§ã¢ãå«ãvector_add.aocxãã¡ã€ã«ã¯vector_add.clããååŸãããŸããåé¡ã¯ãQuartusãããžã§ã¯ãã«å€æŽãå ããŠãã* .aocxã«è©²åœããªãããšã§ããaocãŠãŒãã£ãªãã£ãåèµ·åãããšããããã©ã«ããããžã§ã¯ãããã³ããŒãããVerilog IPãåçæãããŸãããããã£ãŠãå€æŽã¯å€±ãããŸããAocãŠãŒãã£ãªãã£
ã¯ãã€ããªã§ãããåŒã³åºããããšãã«ãã¬ãŒã¹ã§ããŸãïŒ
$ aoc device/vector_add.cl -o bin/vector_add.aocx --board de1soc_sharedonly --profile -v
ãã®ã¹ã¯ãªããã¯aoc.pl pearl ã§å®è¡ãããŸãããããã¯ãã§ã«ãã¹ãŠã®æçšãªäœæ¥ãè¡ã£ãŠããŸããaoc
ãŠãŒãã£ãªãã£ã䜿çšããã«ããã®ã¹ã¯ãªãããçŽæ¥åŒã³åºãããšãã§ããŸãã
$ /home/ish/altera/15.1/quartus/linux64/perl/bin/perl /home/ish/altera/15.1/hld/share/lib/perl/acl/aoc.pl device/vector_add.cl --board de1soc_sharedonly --profile -v
ã¹ã¯ãªãããã€ã³ã¿ããªã¿èšèªã§æžãããŠããã®ã¯è¯ãããšã§ããã€ãŸããã¹ã¯ãªããã®æ©èœãç解ããå€æŽãå ããããšãã§ããŸãã
ã¹ã¯ãªããã®æåã«ãããŒïŒãã«ãã§ãŠãŒã¶ãŒã«é衚瀺ã«ãªã£ãŠãããã®ãå«ãïŒãä»ããŠèšå®ãããããŸããŸãªå€æ°ã説æãããŠããŸãã
ãã®ãããããã«--quartusããŒãèŠã€ãããŸããããã«ãããquartusã®ã¢ã»ã³ããªãšã* .aocxãã¡ã€ã«å ã®å¿ èŠãªããŒãã®ããã±ãŒãžåã®ã¿ãè¡ãããŸãããããžã§ã¯ãïŒãœãŒã¹ïŒã®åçæã¯ãããŸããã
ãŸããå©äŸ¿æ§ãé«ããããã«ãã³ã³ãœãŒã«ã«ãã«ããã°ã衚瀺ã§ããŸãããããè¡ãã«ã¯ãmysystem_fullé¢æ°åŒã³åºãã§stdoutãšstderrã空è¡ãšããŠæå®ããŸãã
$return_status = mysystem_full( {'time' => 1, 'time-label' => 'Quartus compilation', 'stdout' => '', 'stderr' => ''}, $synthesize_cmd);
ããã§ããããžã§ã¯ãã«ç°¡åã«å€æŽãå ãïŒæé©åãè¡ããSignalTapãè¿œå ïŒãclangåŒã³åºããšã³ãŒãåçæã䜿çšããŠã«ãŒãã«å šäœã§ã¯ãªããFPGAã®ãããžã§ã¯ãã®ã¿ãåæ§ç¯ããããšãã§ããŸãã
ããã確èªããããã«ãã€ã³ã¿ãŒãã§ã€ã¹ã«SignalTapãè¿œå ããŸããïŒãŸããã«ãŒãã«ãããŒãããŠèšç®ãéå§ããåŸããããã¬ãŒã䜿çšããŠæ¥ç¶ã§ããããã«15ç§ã®ã¹ãªãŒããè¿œå ããŸããïŒã

ã«ãŒãã«ã®å¶åŸ¡æ¹æ³
avs_vector_add_craã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠã«ãŒãã«ãæ§æããŸããããŒã¿ã¯ã¬ãžã¹ã¿ãŒã®ã¢ãã¬ã¹ã«æžã蟌ãŸããŸãã
æ®å¿µãªããããªãŒãã³ã¢ã¯ã»ã¹ã®ã¬ãžã¹ã¿ããããšãã®èšå®æ¹æ³ãèŠã€ãããªãã£ããããå°ã調æ»ããå¿ èŠããããŸãã
ãã¹ãŠã®ã¬ãžã¹ã¿ã¯vector_add.vã§èª¬æãããŠãããé©åãªååãä»ããããŠããŸãã
ãããã¯64ãããã§ãã[31ïŒ0]ã¯äžäœ32ãããã瀺ãã[63:32]-æäžäœã瀺ããŸãã
0x0 - status 0x1 - 0x4 - profile 0x5 - [31:0] - work_dim 0x5 - [63:32] - workgroup_size 0x6 - [31:0] - global_size[0] 0x6 - [63:32] - global_size[1] 0x7 - [31:0] - global_size[2] 0x7 - [63:32] - num_groups[0] 0x8 - [31:0] - num_groups[1] 0x8 - [63:32] - num_groups[2] 0x9 - [31:0] - local_size[0] 0x9 - [63:32] - local_size[1] 0xA - [31:0] - local_size[2] 0xA - [63:32] - global_offset[0] 0xB - [31:0] - global_offset[1] 0xB - [63:32] - global_offset[2] 0xC - [31:0] - kernel_arguments[31:0] - input_x[31:0] 0xC - [63:32] - kernel_arguments[63:32] - input_x[63:32] 0xD - [31:0] - kernel_arguments[95:64] - input_y[31:0] 0xD - [63:32] - kernel_arguments[127:96] - input_y[63:32] 0xE - [31:0] - kernel_arguments[159:128] - input_z[31:0] 0xE - [63:32] - kernel_arguments[191:160] - input_z[63:32]
ååã«åºã¥ããŠãäœããã©ã³ãã ã«æ§æããã³å®è¡ããããšããããšãã§ããŸããããããå±éºã«ãããã®ã§ã¯ãªããããã«äœãã©ã®é åºã§æžãããŠããããèŠã€ããŠãã ããã
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ãã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³ãèšé²ããŸãïŒSignalTapã䜿çšïŒïŒ
---------------------------------------------- | addr | write_data | byte_enable | ---------------------------------------------- | 0x5 | 0x00000000 0x00000001 | 0x0F | | 0x5 | 0x000F4240 0x00000000 | 0xF0 | ---------------------------------------------- | 0x6 | 0x00000000 0x000F4240 | 0x0F | | 0x6 | 0x00000001 0x00000000 | 0xF0 | ---------------------------------------------- | 0x7 | 0x00000000 0x00000001 | 0x0F | | 0x7 | 0x00000001 0x00000000 | 0xF0 | ---------------------------------------------- | 0x8 | 0x00000000 0x00000001 | 0x0F | | 0x8 | 0x00000001 0x00000000 | 0xF0 | ---------------------------------------------- | 0x9 | 0x00000000 0x000F4240 | 0x0F | | 0x9 | 0x00000001 0x00000000 | 0xF0 | ---------------------------------------------- | 0xA | 0x00000000 0x00000001 | 0x0F | | 0xA | 0x00000000 0x00000000 | 0xF0 | ---------------------------------------------- | 0xB | 0x00000000 0x00000000 | 0x0F | | 0xB | 0x00000000 0x00000000 | 0xF0 | ---------------------------------------------- | 0xC | 0x00000000 0x20100000 | 0x0F | | 0xC | 0x00000000 0x00000000 | 0xF0 | ---------------------------------------------- | 0xD | 0x00000000 0x20500000 | 0x0F | | 0xD | 0x00000000 0x00000000 | 0xF0 | ---------------------------------------------- | 0xE | 0x00000000 0x20900000 | 0x0F | | 0xE | 0x00000000 0x00000000 | 0xF0 | ---------------------------------------------- | 0x0 | 0x00000000 0x00000001 | 0x0F | ----------------------------------------------
泚ïŒ
byte_enableã¯ãã¬ãžã¹ã¿ã®ã©ã®ãã€ããæžã蟌ããããéžæãããŸããããšãã°ãæåã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã¯ã0x00000001ã0x5ã¬ãžã¹ã¿ã®äžäœ32ãããã«æžã蟌ã¿ãŸããïŒäžäœ32ãããã¯å€æŽãããŸããã§ããïŒã
SignalTapã§ãã©ã³ã¶ã¯ã·ã§ã³ãç£èŠããããšã¯å¿ ããã䟿å©ã§ã¯ãªãå ŽåããããŸãããã¹ãã§ã¯ãç°å¢å€æ°ã䜿çšããŠè¿œå ã®ãããã°ãæå¹ã«ã§ããŸãããããã¯ãã¢ã«ãã©Stratix Vãããã¯ãŒã¯ãªãã¡ã¬ã³ã¹ãã©ãããã©ãŒã ããŒãã£ã³ã°ã¬ã€ãã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã® ç« ã§ç¢ºèªã§ããŸããACL_HAL_DEBUGå€æ°ãå¿ èŠã§ããæã ã¯2ã«ãã®å€ãå ¬éããŠããã¹ãã¢ããªã±ãŒã·ã§ã³ãå®è¡vector_addïŒ
root@socfpga:~/myvectoradduint# export ACL_HAL_DEBUG=2 root@socfpga:~/myvectoradduint# ./vector_add // < > :: Launching kernel 0 on accelerator 0. :: Writing inv image [ 0] @ 0x28 := 1 :: Writing inv image [ 4] @ 0x2c := f4240 :: Writing inv image [ 8] @ 0x30 := f4240 :: Writing inv image [12] @ 0x34 := 1 :: Writing inv image [16] @ 0x38 := 1 :: Writing inv image [20] @ 0x3c := 1 :: Writing inv image [24] @ 0x40 := 1 :: Writing inv image [28] @ 0x44 := 1 :: Writing inv image [32] @ 0x48 := f4240 :: Writing inv image [36] @ 0x4c := 1 :: Writing inv image [40] @ 0x50 := 1 :: Writing inv image [44] @ 0x54 := 0 :: Writing inv image [48] @ 0x58 := 0 :: Writing inv image [52] @ 0x5c := 0 :: Writing inv image [56] @ 0x60 := 20100000 :: Writing inv image [60] @ 0x64 := 0 :: Writing inv image [64] @ 0x68 := 20500000 :: Writing inv image [68] @ 0x6c := 0 :: Writing inv image [72] @ 0x70 := 20900000 :: Writing inv image [76] @ 0x74 := 0 :: Accelerator 0 reporting status 2. :: Accelerator 0 is done.
0x28ã¯ã5çªç®ã®64ãããã¬ãžã¹ã¿ã®ãã€ããªãã»ããã§ããããšã«æ°ä»ããããããŸããã
ã¢ãã¬ã¹ãšããŒã¿ãäžèŽããããšãããããŸããããã®ãããã°ã§ã¯ããŒãã¬ãžã¹ã¿ã«ãã©ã³ã¶ã¯ã·ã§ã³ã«é¢ããæ å ±ããããŸããïŒACL_HAL_DEBUGã 5ã«èšå®ãããŠããå Žåã§ãïŒã
èšå®çµæïŒ
- work_dim - 0x1-以é 1次å ã®ãã¯ãã«ããããŸãã
- workgroup_size -0xF4240ãŸãã¯1,000,000ã
- global_size-æåã®æ¬¡å ã®å Žåã¯0xF4240ããã®ä»ãã¹ãŠã®æ¬¡å ã®å Žåã¯0x1ã
- num_groups-ãã¹ãŠã®æ¬¡å ã§0x1ã
- local_size-æåã®æ¬¡å ã§ã¯0xF4240ããã®ä»ãã¹ãŠã®æ¬¡å ã§ã¯0x1ã
- global_offset-ãã¹ãŠã®æ¬¡å ã§0x0ã
- input_xãinput_yãinput_z - 0x20100000ã0x20500000ã0x20900000ãããããã
ã«ãŒãã«ã調æŽããåŸããŒãã¬ãžã¹ã¿ã®æäžäœããããåããŠãèšç®ãéå§ããŸãã
é衚瀺ã®ããã¹ã
, .
status ?
?
status ?
?
ã³ã¢ã·ãã¥ã¬ãŒã·ã§ã³
ããã§ãã«ãŒãã«ã®æ§ææ¹æ³ãããããŸãããã·ãã¥ã¬ãŒãããŸãããã
ã«ãŒãã«ã«ã¯ããã¥ãŒãã³ã°çšãšããŒã¿èªã¿åãçšã®2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ãããããŸããïŒå²ã蟌ã¿ãèšå®ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ïŒ1ã€ã®ä¿¡å·ãµã€ãºïŒããããŸãããããŸãèå³ããããŸããïŒã
ã«ãŒãã«ãã·ãã¥ã¬ãŒãããã«ã¯ãå®éãšåãããã«ãã¹ãŠãè¡ãå¿ èŠããããŸãã
- ãããèšå®ããŸãïŒæžã蟌ã¿ã®é åºãããããã€ã³ã¿ãŒãã§ãŒã¹ã¯æ¯èŒçåçŽã§ãïŒã
- ãããã¡ãå²ãåœãŠãããããŒã¿ãä¿åãããã°ããŒãã«ã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã
ãã¡ãããLinuxããã¹ãã¢ããªã±ãŒã·ã§ã³ãã·ãã¥ã¬ãŒãããããšã¯æãŸãããªããããæåã®è¿äŒŒãšããŠã次ã®ã¹ããŒã ã«å¶éããããšãã§ããŸãã

- cra_driver-ã«ãŒãã«ãæ§æããããã®ãã©ã€ããŒã
- vector_add_system-ã·ãã¥ã¬ãŒãããã«ãŒãã«ïŒDUTïŒã
- avalon_mm_clock_crossing-ã³ã¢åšæ³¢æ°ïŒ140 MHzïŒããã³ã³ãããŒã©ãŒããã®èªã¿åãåšæ³¢æ°ïŒ100 MHzïŒãžããŸãã¯ãã®éãžã®ããŒã¿è»¢éã
- prepare_data-ã·ãã¥ã¬ãŒã·ã§ã³ãéå§ããåã«Xããã³Yãããã¡ãŒã«ããŒã¿ãæžã蟌ãåçŽãªã¿ã¹ã¯ã
- avalon_mm_interconnect -2ã€ã®Avalon-MMã€ã³ã¿ãŒãã§ã€ã¹ã®å€éåãšèª¿åã
- ddr3_contollerãddr3_model-ã¢ã«ãã©ã®ããŒãã¡ã¢ãªã³ã³ãããŒã©ãšDDR3ã¡ã¢ãªã®ã·ãã¥ã¬ãŒã·ã§ã³ã¢ãã«ãã¢ãã«ãšã³ã³ãããŒã©ãŒã®èšå®ã¯ãhpsã¢ãžã¥ãŒã«ã§äœ¿çšãããèšå®ãšåãã§ãã
ã«ãŒãã«ãæ§æããããã®ãã©ã€ããŒã¯ãSignalTapã®ãããã§æããã«ãªã£ãã«ãŒãã«èšå®ã䜿çšããã次ã®ã¿ã¹ã¯ã®åçŽãªåŒã³åºãã§ãã
task cra_write( input bit [3:0] _addr, bit [63:0] _data, bit [7:0] _byteenable ); $display("%m: _addr = 0x%x, _data = 0x%x, _byteenable = 0x%x", _addr, _data, _byteenable ); @( posedge clk ); cra_addr <= _addr; cra_wr_data <= _data; cra_byteenable <= _byteenable; cra_wr_en <= 1'b0; @( posedge clk ); cra_wr_en <= 1'b1; @( posedge clk ); cra_wr_en <= 1'b0; // dummy waiting repeat (10) @( posedge clk ); endtask
é衚瀺ã®ããã¹ã
initial begin wait( ram_init_done ); wait( test_data_init_done ); cra_write( 4'h5, 64'h000F424000000000, 8'hF0 ); cra_write( 4'h5, 64'h0000000100000000, 8'hF0 ); cra_write( 4'h6, 64'h00000000000F4240, 8'h0F ); cra_write( 4'h6, 64'h0000000100000000, 8'hF0 ); cra_write( 4'h7, 64'h0000000000000001, 8'h0F ); cra_write( 4'h7, 64'h0000000100000000, 8'hF0 ); cra_write( 4'h8, 64'h0000000000000001, 8'h0F ); cra_write( 4'h8, 64'h0000000100000000, 8'hF0 ); cra_write( 4'h9, 64'h00000000000F4240, 8'h0F ); cra_write( 4'h9, 64'h0000000100000000, 8'hF0 ); cra_write( 4'hA, 64'h0000000000000001, 8'h0F ); cra_write( 4'hA, 64'h0000000000000000, 8'hF0 ); cra_write( 4'hB, 64'h0000000000000000, 8'h0F ); cra_write( 4'hB, 64'h0000000000000000, 8'hF0 ); cra_write( 4'hC, 64'h0000000020100000, 8'h0F ); cra_write( 4'hC, 64'h0000000000000000, 8'hF0 ); cra_write( 4'hD, 64'h0000000020500000, 8'h0F ); cra_write( 4'hD, 64'h0000000000000000, 8'hF0 ); cra_write( 4'hE, 64'h0000000020900000, 8'h0F ); cra_write( 4'hE, 64'h0000000000000000, 8'hF0 ); cra_write( 4'h0, 64'h0000000000000001, 8'h0F ); end
èšç®ãè¡ãå¿ èŠãããããŒã¿ãæºåããããã«ãäºåã«ããã¯ãããã¢ãã¬ã¹ã§ã¡ã¢ãªã«æžã蟌ãŸããåæ§ã®ã¿ã¹ã¯ãäœæããŸãã ïŒã¢ãã¬ã¹ã®å²ãåœãŠã誰ãïŒã·ã¹ãã ïŒã«äŸé Œããå¿ èŠã¯ãããŸããïŒããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã§ã¯ãã¿ã¹ã¯ã®æ¡ä»¶ã«å¿ããŠå¿ èŠã«å¿ããŠ2x1000000ã®æ°åãæžãå¿ èŠã¯ãããŸãã-åäœã確èªããã«ã¯æ°ååã§ååã§ããããŒã¿ãæžã蟌ãŸãªãå ŽåãxïŒäžæãªå€ïŒãã¡ã¢ãªããèªã¿åãããŸãããããã®ã»ã«ã«ã¯äœãæžã蟌ãŸããŸããã§ããã
ã·ãã¥ã¬ãŒã·ã§ã³ã®çµæã確èªããŸãïŒ16é²æ°åœ¢åŒã®äžæçãªå»ºç©ã®ãã¹ãŠã®æ°åïŒïŒã¹ã¯ãªãŒã³ã·ã§ããã¯å¥ã®ãŠã£ã³ããŠã§éãããšããå§ãããŸãïŒïŒéå§ä¿¡å·ãæ¥ãŸã

ãããŠãããã€ãã®ã¹ãããŒã¯ã®åŸãäž¡æ¹ã®LSUã¯åæã«berstaã®ãµã€ãºã«ããŒã¿ãèªã¿åºãããã®èŠæ±ãé²åºãã0x10ã«çãã= 16èå³æ·±ãããšã«ã3ã€ã®èŠæ±ã¯ãæåã«ã®ã¿åãå ¥ãããLSU_Xã次ãã§ããLSU_YïŒããã¯ä¿¡å·ã瀺ãavm_waitrequestå Žåã«ã®ã¿åãå ¥ãããããªãŒãèŠæ±ãwaitrequestã¯ãŒãã«çããããæ³åã®ãšããããªã¯ãšã¹ãã亀äºã«è¡ãããªãçç±ã¯ãã·ã§ãã©ãŒãšã°ããŒãã«ã¡ã¢ãªãžã®çžäºæ¥ç¶ã®åé¡ã§ãã
ãªãæ£ç¢ºã«3ã€ã®èŠæ±ããã£ãã®ã§ããïŒ
LSUã®FIFOã®ã¯ãŒãæ°ã¯64ã§ããã4ã€ã®èªã¿åãèŠæ±ãäºæ³ãããŸããããã®ãããªããªãã¯ããããŸããã
parameter READTHRESHOLD = FIFODEPTH - MAXBURSTCOUNT - 4; assign too_many_reads_pending = (reads_pending + fifo_used) >= READTHRESHOLD; // make sure there are fewer reads posted than room in the FIFO
èªã¿åãèŠæ±ã3ã€éä¿¡ããŸããïŒ3 x 16 = 48ã¯ãŒãïŒïŒ16ã¯ãŒãã®ã¹ããŒã¹ã¯ãŸã ãããŸããã4ã¯ãŒããå®äºãããŸã§èªã¿åãã¯åæ¢ããŸãã 12ã®å°ããªããŒã¹ãã¯ãããŸããããã®ã¢ãžã¥ãŒã«ã¯ãã®æ¹æ³ãç¥ããŸããïŒãã®æå³ã¯ãããŸãã-ããžãã¯ã®ç¡é§ã§ãïŒã
ãã°ããåŸã«ãããŒã¿ãèªã¿åºãããã«ãªã£ïŒä¿¡å·ãåç §ãLSU_X_avm_readdatavalidãšããé²åºä¿¡å·ïŒLSU_X_o_validããã®äžã®32ãããããŒã¿ç¥ãããLSU_X_o_readdataã¯ããããªãåŠçã®ããã«æºåãã§ããŠãç§ãã¡ã¯ã³ãŒãã³ã°ïŒLSU_X_i_stallã®ããããã«èšå®ãããŠããŸããå®éãããŒã¿ãè¿œå ããã³ã³ãã€ãŒã«ã¯LSU_Yããã®ããŒã¿ããããŸããããããã£ãŠãLSU_Y_avm_readdatavalidãå°çãããŸã§ããã¹ãŠãã·ã£ããããŠã³ããŸãããããŠãLSU_Y_o_validãèšå®ããŸãã
ããã«ç¶ã次ã®ã¡ãžã£ãŒã¯ãæå¹æ§ã«ã€ããŠLSU_Z_i_writedataã«éç¥ããLSU_Z_i_valid ã§ããè¿œå ãã€ãã©ã€ã³ã¯1ã€ã®ã¡ãžã£ãŒã§æ©èœããŸãããLSU_Zã¯ãå¿ èŠãªéã®ããŒã¿ã®èç©ãåŸ æ©ããŠããŸããããã¯ããã¡ãã16 256ãããã¯ãŒãã§ãããæžã蟌ã¿ãã©ã³ã¶ã¯ã·ã§ã³ãäœæããŸããåæã«ãLSU_XãšLSU_Yã¯ãFIFOã空ã«ãªããšèªã¿åããã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ããŸããLSU_X_i_stallãšLSU_Y_i_stallã¯ã³ãã¯ãããŠããªãããšã«æ³šæããŠãã ãããããã¯ããã€ãã©ã€ã³ãã·ã£ããããŠã³ãããåã¯ããã¯ãæ°ããããŒã¿ãåä¿¡ããããšãæå³ããŸãã


å€ãã®ãã©ã³ã¶ã¯ã·ã§ã³ã調ã¹ãçµæãããå€ãã®ã®ã£ãããçºçããªãããšã¯æããã§ãã
çµè«ïŒ
ãã€ãã©ã€ã³ãåæ¢ããããšã¯ãªãïŒæåã®æ®µéãé€ããŠïŒãããæ倧ã®ããã©ãŒãã³ã¹ã§åäœããããšã¯æããã§ããããã®åçŽãªäŸã§ã¯çããªã³ã¯ã圌ã§ããèªã¿åãã¯256ãããã¯ãŒãã䜿çšããŠè¡ãããããã8ã€ã®32ãããæ°ã®äžŠåå ç®ãæŽçããããšã¯çã«ããªã£ãŠããŸãããã®å Žåãããããã¯ã¯ã¡ã¢ãªã¢ã¯ã»ã¹ã§çºçããå¯èœæ§ãé«ããªããŸãã䜿çšã«å ç®åšã®ããã·ãŒãžã£ã»EEDçªå·ç¹å¥ãªæå³ã¯ãããŸãã
ã·ãã¥ã¬ãŒã·ã§ã³ã®ãããã§ãRTLã³ãŒãã«ããã€ãã®å€æŽïŒããŒã¹ãé·ããã£ãã·ã¥ãµã€ãºãªã©ïŒãå ããŠããããèšç®ã®é床ã«ã©ã®ããã«åœ±é¿ãããã確èªããéåžžã«è¿ éã«çãã確èªã§ããŸããããã10ã15ååŸ ã€å¿ èŠã¯ãããŸããQuartusã§ãããžã§ã¯ãå šäœãåæ§ç¯ããã«ã¯ãã·ãã¥ã¬ãŒã¿ã§ã·ãã¥ã¬ãŒã·ã§ã³ãå®è¡ããŸãã
ãã¡ããã* .clãã¡ã€ã«ãç·šéããŠïŒããšãã°ãç¹å¥ãªãã£ã¬ã¯ãã£ãã䜿çšããŠïŒã¢ãŒããã¯ãã£ãå€æŽããå¿ èŠããããŸããã³ãŒããåçæããã·ãã¥ã¬ãŒã·ã§ã³ãå®è¡ããŠããããžã§ã¯ãå šäœãçµã¿ç«ãŠãã«çµæã®ã²ã€ã³ã確èªããããšãã§ããŸãã
ãããã«
vector_addã«ãŒãã«ãFPGAåŽããäœã«å€ãããããããŠã©ã®ããã«æ§æãããŠããããåŠã³ãŸããã
ã芧ã®ãšãããFPGAéçºè ãæ±ããŠããå€ãã®åé¡ïŒãŒãããäœæããå ŽåïŒã¯è§£æ±ºãããŸããã
- ãã£ãã·ã¥ãµã€ãº
- 建ç¯
- ã€ã³ã¿ãŒãã§ã€ã¹ã®çžäºæ¥ç¶ãšèª¿åãè¡ããŸãã
- çµæã®å€ãžã®ã¯ããã¯åšæ³¢æ°ã®èªå調æŽ
ãã¡ãããèªåçã«è¡ãããããšãæé©ã§ãããšããäºå®ã§ã¯ãããŸããã
é衚瀺ã®ããã¹ã
, Quartus'a ( , ) «».
, :
, : â FPGA.
, , FPGA , Advisor ', GUI , . ( Altera).
, :
, : â FPGA.
, , FPGA , Advisor ', GUI , . ( Altera).
äœã¬ãã«ã®æé©åãšæåãã¥ãŒãã³ã°ãæåŸã®ã¹ãããã§ããgccããã«ãããåŸãã¢ã»ã³ãã©ãŒã«é »ç¹ã«å ¥ããŸããïŒãŸãã* .clã§é«åºŠãªæé©åãå®è¡ããQuartusã®èšå®ã§éã¶å¿ èŠããããŸãã
ã³ã¢ãã·ãã¥ã¬ãŒãããæ©äŒãããã®ã¯è¯ãããšã§ããæå ã«éïŒããŒãïŒããªããŠããã³ã¢ã®ããã©ãŒãã³ã¹ãæšå®ã§ããŸãã
ãæž èŽããããšãããããŸããïŒ ã³ã¡ã³ããŸãã¯å人ã®ã¡ãŒã«ã§è³ªåãã³ã¡ã³ãããåŸ ã¡ããŠãããŸãã