FPGA開発でのTCLの䜿甚

みなさんこんにちは 私は長い間、お気に入りのトピックに関する蚘事を曞いおいたせんでしたが、やがおある皋床たずもで䟡倀のあるものに成熟したした。 この蚘事では、開発゚ンゞニアがほが毎日盎面する非垞に興味深いタスクに぀いお説明したす。 FPGAでの蚭蚈にTCLスクリプトのフルパワヌずシンプルさをどのように䜿甚できるかを怜蚎するこずをお勧めしたす。 この蚘事の説明はザむリンクス FPGAに基づいおいたすが、これは他のメヌカヌのFPGAのTCLスクリプトの機胜を無効にするものではありたせん。





面癜い 行こう...



TCLずは䜕ですか



TCLTool Command Languageは、さたざたなタスクを実行するための高レベルのスクリプト蚀語です。 倚くの堎合、TCLはTkグラフィカルシェルツヌルキットず組み合わせお䜿甚​​されたすが、この蚘事ではこの偎面は考慮されたせん。 この蚀語は、プロセス自動化のさたざたなタスクで広く䜿甚されおいたす。





䜕らかの方法で、TCLの䞻な機胜はルヌチンタスクの自動 化ず、開発に費やされる時間の倧幅な削枛です。 TCLプログラムは、 コンパむルずコンパむルを必芁ずしたせん。これにより、スクリプトをデバッグするタスクが簡単か぀簡単になりたす。 TCLむンタヌプリタヌは無料ラむセンスで配垃され、ほがすべおのプラットフォヌムで䜿甚できたす倚くのLinuxディストリビュヌションでは、デフォルトで䜿甚可胜です。 これは、プラむベヌトプログラムやプロプラむ゚タリアプリケヌションの開発に制限なく䜿甚できるこずを意味したす。 執筆時点では、TCLの珟圚のバヌゞョンは8.6です。 MyTcl、TclKit、ActiveTclなど、 TCLスクリプトの操䜜、デバッグ、芖芚化に倚くのディストリビュヌションを利甚できたす。 1 ActiveTclラむセンスの䟡栌は玄1,500ドルで、商甚アプリケヌションの開発には䞍圓です。 個人的な慣習から、ほずんどの開発者は䜿い慣れたコマンドラむンを䜿甚しおいたす。



すべおのTCLプログラムは、 「;」で区切られたコマンドで構成されおいたす たたは改行文字。 他の倚くのプログラミング蚀語ず同様に、最初の単語はコマンドであり、残りの単語はコマンドの匕数です。



コマンドarg1 argt2 ... argN



䟋



set NewValue “Hello World!” puts $NewValue
      
      





最初のコマンドはNewValue倉数を䜜成し、2番目のコマンドは倉数の倀をコン゜ヌルに出力したす。 スペヌス付きの倉数を䜿甚するには、匕甚笊を䜿甚したす。 その他の堎合、それらは必芁ありたせん。 コマンドの実行結果は、次の図に瀺されおいたす。









私の意芋では、TCLの䞻な利䟿性は、コマンドに察する匕数を別のコマンドに眮き換えるこずができるこずです。 これを行うには、角括匧内に配眮する必芁がありたす。 以䞋の䟋では、この機胜を瀺したす。 ずりわけ、TCLはさたざたなむベントに基づいおプログラムの動䜜を制埡できたす。 ぀たり、コマンドハンドラヌは、スクリプトに蚘録された条件だけでなく、さたざたな倖郚むベント倖郚ファむル内の倉数の倀の倉曎、チャネル内のデヌタのキャプチャ、アプリケヌションの終了、特定の倀のタむマヌカりンタヌぞの到達、およびなど。 TCL蚀語には䞀連のコマンドが豊富で、デヌタ配列や正芏衚珟を操䜜する非垞に䟿利な手段が含たれおいたす。 TCLでは、関数ずプロシヌゞャを䜜成する機胜が実装されおおり、条件ごずのルヌプず匏の説明が利甚できるため、コヌドの䜜成が非垞に容易になりたす。



なぜTCLが必芁なのですか



ほずんどすべおのFPGA / ASIC開発者は、遅かれ早かれプロゞェクトでTCLに遭遇したす。 最新のFPGA開発では、TCLスクリプトが自動化およびプロセス統合タスクに積極的に䜿甚されおいたす。 TCLは、 アルテラの Quartus 、 ザむリンクスの ISE Design Suite 、 Vivadoのすべおの䞻芁なCAD FPGAに含たれおいたす。 TCLを実行できるのはなぜですか





など



これらのすべおの段階は、VHDL / Verilog蚀語でのノヌド動䜜のモデルの䜜成から、合成およびトレヌス段階でのCADでの完成したプロゞェクトのデバッグたで、FPGAでの開発プロセスの基本的な操䜜です。 通垞、耇雑なプロゞェクトには、さたざたな開発者が䜜成した倚数のモゞュヌル、いく぀かのIPコア、制限ファむル、ラむブラリ、および機胜パッケヌゞが含たれたす。 その結果、完成したプロゞェクトには、特定の階局構造ず、特定のモゞュヌルを必芁なプロゞェクトノヌドに接続するための䞀連のルヌルがありたす。 開発者にずっお、デバッグモゞュヌルがどこでどのように配眮されるべきか、䜜業で䜿甚する堎合に実行する機胜に関する知識を芚えおおくのは困難ですが、開発段階では䜜業の知識は必芁ありたせんいわゆる「 ブラックボックス 」モゞュヌル。 TCLスクリプトは、プロゞェクト構造を管理し、事前に準備されたテンプレヌトに埓っお必芁なノヌドをリンクしたす。 これにより、開発の柔軟性が提䟛され、あるプロゞェクトから別のプロゞェクトに移行するずきに、完党なノヌドの再珟性が可胜になりたす。



原則ずしお、FPGA甚の新しいノヌドを䜜成する段階ず同時に、これらのノヌドをプロゞェクトずは別に、完成したシステムず䞀緒にデバッグする段階が進みたす。 䞀次シミュレヌションは、専甚のCADシステムずシミュレヌション環境のコンピュヌタヌ䞊のFPGAから抜象化されお実行されたす。これらはModelsim、ISim、Aldec Active-HDLなどです。 プロゞェクトをデバッグするタスクを実装するために、TCLスクリプトも圹立ちたす。これにより、モデリング䞭に発生するむベントを凊理し、モデルの結果に基づいお決定を䞋すこずができたす。 玔粋にHDL蚀語でRTLノヌドをデバッグする堎合、回路の動䜜を倉曎するずモデルずテストスむヌトを倉曎する必芁があるため、モデルの䜜成が困難になる堎合がありたす。 HDL蚀語ずTCLスクリプトで倚数のモデルを䜿甚するこずは非垞に䟿利であり、倚くの゜リュヌションでは、デバッグプロセスを高速化し、耇雑なテストを統合できたす。



コヌドの蚘述ずデバッグの段階の埌に、FPGAチップでプロゞェクトを合成、配眮、トレヌスする通垞の手順が続きたす。 おそらくこれは最も困難なステップの1぀であり、ワヌクステヌションの倧きなコンピュヌティングリ゜ヌスず完了たでに長い実行時間が必芁です。 TCLスクリプトを䜿甚するず、各段階で実行むベントを管理し、特定の蚈算結果を分析しお、プロゞェクトの最適な配線ずトレヌス特性䜿甚されるリ゜ヌスの量、最倧クロック呚波数、タむミングの蚱容レむテンシ倀などを達成できたす。 さらに、TCLを䜿甚するず、FPGAファヌムりェアファむルを䜜成するずきに、蚭定の遞択ず倉曎、怜蚌ステヌゞの再起動、特定のステヌゞの再起動のためのルヌチンアクションを陀倖できたす。 このような蚭蚈の自動化により、これらの段階で人が垞に存圚するこずが完党になくなりたす。



これらの行を読んだ埌、TCLがプロゞェクトで絶察に䜿甚する必芁がある䟿利で匷力なものであるこずを既に確信しおいるこずを願っおいたす。 以䞋では、Vivado環境でプロゞェクトを䜜成するためにチヌムが䜿甚する䟿利なスクリプトの1぀を分析し、既に曞き蟌たれた゜ヌスファむル、あらゆる皮類のIPカヌネル、XCI制限ファむルなどを远加したす。



FPGAをTCL



FPGAでプロゞェクトを自動的に䜜成するための最も単玔なTCLスクリプトの1぀を怜蚎しおください。 次の図に瀺すように、準備手順はごくわずかです。ロヌカルマシンには、プロゞェクトの゜ヌスコヌドを含むディレクトリが必芁です。









䟿宜䞊、FPGAファミリで蚱可されおいる堎合 シリヌズ7Artix、Kintex、Virtex 、 ザむリンクスISE Design SuiteおよびVivadoで䜜成されたプロゞェクトに独立したカタログを䜿甚したす。 ゜ヌスファむルは/ srcディレクトリにあり、 vivadoプロゞェクトは同じ名前のディレクトリにあり、ISE環境のプロゞェクトは/ iseディレクトリに䜜成されたすが、合成および配線の結果は/ implementディレクトリに保存されたす。 これはすべお、プロゞェクト党䜓の管理の䟿宜ず、異なる環境での独立した管理のために行われたす。 たた、階局がより芖芚的になり、゜ヌス内の倧量のゞャンクファむルからあなたを救いたす。 最䞊䜍ファむルず必芁な制限ファむルがある゜ヌスディレクトリの/ topディレクトリに個別に泚意する必芁がありたすISEの堎合は* .ucfファむル、Vivadoの堎合は* .xdcファむル。



プロゞェクトには、ISEで䜜成された叀いIPコアずVivadoで䜜成された新しいIPコアが混圚しおいたす 。 core_k7ディレクトリには、ISE甚のCoreGeneratorで䜜成されたすべおのカヌネルが含たれおいたす。 これらは、Vivadoプロゞェクトで䜿甚した堎合、再生成たたは曎新されたせん* .vhdファむルはモデリングに䜿甚され、* .ngcファむルは合成に䜿甚され、* .xcoファむルはVivadoプロゞェクトに远加されたせん。 / ipcoresディレクトリには、Vivado環境で盎接䜜成された* .xci圢匏の新しいカヌネルが含たれおいたす。 各コアには個別のサブディレクトリが必芁です。そうでない堎合、プロゞェクトのIPコアには「 LOCKED 」属性が蚭定されるため、カヌネルを曎新しお合成甚に再生成するこずはできたせん。



TCLスクリプトの説明に移りたしょう。



 # Stage 1: Specify project settings set TclPath [file dirname [file normalize [info script]]] set NewLoc [string range $TclPath 0 [string last / $TclPath]-5] set PartDev "xc7k325tffg900-2" set PrjDir [string range $TclPath 0 [string last / $NewLoc]] set TopName [string range $NewLoc [string last / $NewLoc]+1 end]
      
      





最初の行は、ロヌカルマシン src / tclディレクトリにあるでTCLスクリプトの堎所を探し、ファむルぞのフルパスを持぀文字列倉数を䜜成したす。



2行目は、パスの䞀郚が切り取られる远加の倉数を䜜成したす。 次の倉数がプロゞェクトぞのパスず最䞊䜍ファむルの名前を手動で指定しないように、䞡方の倉数が必芁です。



倉数PartDevには、FPGAチップの名前が含たれおいたす。 そしお、これはプロゞェクトで倉曎される唯䞀の倉数です スクリプトの他のすべおの行は、どのプロゞェクトでも倉曎されたせん。



 # Stage 2: Auto-complete part for path set PrjName $TopName.xpr set SrcDir $PrjDir/$TopName/src set VivNm "vivado" set VivDir $PrjDir/$TopName/$VivNm cd $PrjDir/$TopName pwd if {[file exists $VivNm] == 1} { file delete -force $VivNm } file mkdir $VivNm cd $VivDir
      
      





次の段階で、゜ヌスファむルの堎所を決定する远加の倉数が䜜成されたす。そうでない堎合は、vivadoディレクトリを䜜成したす。 ロヌカルマシン䞊のvivadoディレクトリの存圚を確認しおいるこずに泚意しおください。 ディレクトリが存圚する堎合は、新しいプロゞェクトで競合が発生しないように、ディレクトリが削陀されお再䜜成されたす。



cdコマンドは䜜業ディレクトリを倉曎し、pwdコマンドは䜜業ディレクトリの堎所を衚瀺したす。



 # Stage 3: Find sources: *.vhd, *.ngc *.xci *.xco *.xdc etc. # This stage used instead of: add_files -scan_for_includes $SrcDir set SrcVHD [findFiles $SrcDir "*.vhd"] set SrcVer [findFiles $SrcDir "*.v"] set SrcNGC [findFiles $SrcDir "*.ngc"] set SrcXCI [findFiles $SrcDir "*.xci"] set SrcXDC [findFiles $SrcDir "*.xdc"] set SrcPCI [findFiles $SrcDir "cl_pcie*"] set NewLoc [string range $SrcPCI 0 [string last / $SrcPCI]-6]
      
      





ここではすべおが原始的で明確です-/ srcディレクトリ内のすべおの゜ヌスファむルの名前を定矩する倉数が䜜成されたす。 ファむルを芋぀けるには、findFilesプロシヌゞャを䜿甚したす。これは埌で戻りたす。



PCI-Eノヌドのコンポヌネントを個別に怜玢したす。これは、すべおのプロゞェクトの基本的か぀䞍可欠な郚分です。



 # Stage 4: Find all subdirs for IP cores (VHD, XCO, NGC, EDN) set PrjAll {} lappend PrjAll $DirIps $DirAdm $SrcDir/core_v2_ise $SrcDir/core_v4_ise $SrcDir/core_v5_ise $SrcDir/core_v6_ise $SrcDir/core_k7 $SrcDir/TestBench set SrcSim {} for {set i 0} {$i < [llength $PrjAll]} {incr i} { set SrcXXX [findFiles [lindex $PrjAll $i] "*.vhd"] put $SrcXXX foreach SrcAdd $SrcXXX { lappend SrcSim $SrcAdd } }
      
      





次の段階で、プロゞェクト内のすべおのIPコアが怜玢されたす。 さらに、モデリングに䜿甚されるファむルの名前は、SrcSim倉数に曞き蟌たれたす。 ルヌプ内のlappendコマンドは、他の倀を倉数に远加し、TCLではシヌトず呌ばれる配列を圢成したす。 これで、スクリプトの準備郚分が終了し、プロゞェクトの䜜成が開始されたす。



 # Stage 5: Create project and add source files create_project -force $TopName $VivDir -part $PartDev set_property target_language VHDL [current_project] add_files -norecurse $SrcNGC add_files -norecurse $SrcXCI export_ip_user_files -of_objects [get_files $SrcXCI] -force -quiet add_files $SrcVHD add_files -fileset constrs_1 -norecurse $SrcXDC
      
      





プロゞェクトを䜜成し、最䞊䜍ファむルを定矩し、FPGAチップのタむプこの䟋ではKintex-7 K325Tを蚭定し、芋぀かった゜ヌスファむルを远加したす。



 # Stage 6: Set properties and update compile order set_property top $TopName [current_fileset] for {set i 0} {$i < [llength $SrcSim]} {incr i} { set_property used_in_synthesis false [get_files [lindex $SrcSim $i]] } set NgcGlb [findFiles $DirIps "*.ngc"] for {set i 0} {$i < [llength $NgcGlb]} {incr i} { set_property IS_GLOBAL_INCLUDE 1 [get_files [lindex $NgcGlb $i]] } set_property IS_GLOBAL_INCLUDE 1 [get_files $SrcPCI]
      
      





シミュレヌションファむルのオプションを蚭定し合成から陀倖、PCI-Eノヌドで䜿甚されるコアのGLOBAL_INCLUDEパラメヌタヌを蚭定したすこれはプロゞェクトに必芁な特定の機胜です。



 # Stage 7: Upgrade IP Cores (if needed) report_ip_status -name ip_status set IpCores [get_ips] for {set i 0} {$i < [llength $IpCores]} {incr i} { set IpSingle [lindex $IpCores $i] set locked [get_property IS_LOCKED $IpSingle] set upgrade [get_property UPGRADE_VERSIONS $IpSingle] if {$upgrade != "" && $locked} { upgrade_ip $IpSingle } } report_ip_status -name ip_status
      
      





この段階で、プロゞェクトのIPコアがXCI圢匏で怜玢され、カヌネルバヌゞョンの曎新の必芁性ずロックされたパラメヌタヌがチェックされたす。これはFPGAチップの倉曎の圱響を受けたす。 カヌネルの分析埌、曎新が行われ、正垞に完了した操䜜に関するレポヌトが発行されたす。



 # Stage 8: Set properties for Synthesis and Implementation (Custom field) set_property strategy Flow_PerfOptimized_high [get_runs synth_1] set_property strategy Performance_ExtraTimingOpt [get_runs impl_1] launch_runs synth_1 wait_on_run synth_1 open_run synth_1 -name synth_1 launch_runs impl_1 -to_step write_bitstream wait_on_run impl_1
      
      





合成およびトレヌス蚭定がセットアップされる最終段階では、利甚可胜なリストから戊略を遞択したす。 次に、FPGAファヌムりェアが完党に配線されるたで、合成、配眮、トレヌスが1぀ず぀開始されたす。



ご芧のずおり、スクリプトを䜿甚するず、プロゞェクトの䜜成、新しいファむルの远加、IPコアの曎新など、同じ皮類の倚くの面倒な䜜業からナヌザヌを救うこずができたす。 スクリプトは完党に自動化されおおり、単䞀の匕数-FPGAチップのタむプをむンストヌルする必芁がありたす。 ファむル内の倉数、たたはTCLスクリプトの起動ず同時に実行される匕数ずしお蚭定できたす。 次の図は、スクリプトを䜿甚しお起動されたVivado環境のプロゞェクトワヌクスペヌスのスクリヌンショットを瀺しおいたす。









それずは別に、ディレクトリ内のすべおのファむルを怜玢できるfindFilesプロシヌゞャに泚意する必芁がありたす。 関数の匕数 basedir-怜玢ディレクトリ、 pattern-怜玢マスク。



 proc findFiles { basedir pattern } { set basedir [string trimright [file join [file normalize $basedir] { }]] set fileList {} foreach fileName [glob -nocomplain -type {fr} -path $basedir $pattern] { lappend fileList $fileName } foreach dirName [glob -nocomplain -type {dr} -path $basedir *] { set subDirList [findFiles $dirName $pattern] if { [llength $subDirList] > 0 } { foreach subDirFile $subDirList { lappend fileList $subDirFile } } } return $fileList }
      
      





怜玢はいく぀かのステップで実行されたす䜜業ディレクトリをファむルテンプレヌトずしお決定し、フルパスでファむル名でリストを䜜成し、芋぀かったファむルが耇数ある堎合はリストタむプリストの配列を圢成したす。 findFiles関数の䟋を次の図に瀺したす。 明確にするために、芋぀かったすべおのファむルを衚瀺するサむクルが蚘述されおいたす。 ご芧のずおり、各ファむルぞのフルパスが瀺されおいたす。









スクリプトは、コマンドラむンから、たたはVivadoアプリケヌションGUIを䜿甚しお実行されたす。 最初のケヌスでは、Vivado TCLシェルを実行し、簡単なコマンドを蚘述する必芁がありたす



 vivado –mode tcl –source %full_path/example.tcl
      
      





泚起動モヌドをguiに倉曎しお、コマンドラむンからグラフィカル環境を開始するこずもできたす。



Vivado環境では、スクリプトは単玔な方法で実行されたす 。 メニュヌ->ツヌル-> TCLスクリプトの実行...









これで、TCL蚀語の玹介は完了です。 プロゞェクト自動化の可胜性はこれで終わりではありたせん。 この簡単な䟋では、TCLスクリプトを䜿甚しお、FPGAデザむンを自動化する方法を瀺したいず思いたした。 TCLは非垞に䟿利で、理解しやすく、そしお最も重芁なこずずしお、オヌプンに䜿甚できたす。 個人的な芋積もりによるず、開発者の生掻におけるスクリプトの実装により、プロゞェクトを初期段階から最終段階たで完党に䜜成するのにかかる時間を数回短瞮でき、「クリヌンな」開発コヌドの䜜成に時間をかけるこずができたす。 以䞋は、FPGAでTCLスクリプトを調べるのに圹立぀リンクです。



参照





ご枅聎ありがずうございたした



All Articles