• Showing Page History #104279

ステートマシンの書き方 Verilog HDL編

ステートマシンの書き方と、それには直接関係ないけれど知っておくと特になることのまとめ。

`default_nettye none

Verilog HDLは、宣言なしで登場した名前を1bit幅のwireとして勝手に解釈しますが、moduleの前に`default_nettype noneを書いておけばそれを禁止できます。 代入の左辺のbit幅が足りず桁あふれするせいでまともに動かない、という厄介なバグを、コンパイルの段階で検出できるありがたいおまじないです。 なお、XilinxのIPコアのソースなどは`default_nettypeがwireであることを前提に作られているものがあるので、endmoduleの後に`default_nettype wireを 書いておくのも忘れないようにしましょう(Verilog HDLのプリプロセッサ制御文は、ほかのソースファイルの記述にまで影響を与えます)。

命名規則

一例として、ここに載せてあるソースの命名規則を以下に示します。

種類命名備考
入力ポート I_~ ポートは全部大文字
出力ポートO_~
入出力ポートIO_~
パラメータG_~VHDLのGenericに由来
localparamC_~VHDLのConstantに由来
FFを推論するものr_~
組み合わせ出力を推論するものw_~wireのみでなく、reg w_~というパターンもあり
負論理~_N
イネーブル信号~_ENA少し長いが、_ENだと負論理と区別しにくいので

ラッチが推論されないようにする

ステートマシンを書くとき、always @(*)節の中に少しでも書き忘れがあるとラッチが推論される回路になってしまいます。 組み合わせ回路になるようにするには、以下のようにする必要があります。

  • beginのすぐあとに「なにも作用しない」ときの値を列挙する
  • 現在の状態を維持する(遷移しない)場合にもw_next_stへの代入をする
  • default文を書く

ラッチが推論されていないことを確かめるには、ソースを眺めるよりもツールで合成をしてWarningを調べるほうが確実です。 以下に、各ツールでラッチが生成されたとき出るWarningをまとめます。

ツール メッセージ
Xilinx XST WARNING:Xst:737 - Found n-bit latch for signal <信号名>
Xilinx Vivado
Altera QuartusII

ソース

  1. PK-シdGレワstatemachine/sim_howto.txtユUIoモ@セ煇呼uXツ"ミr@4R$汎度Db#{レ深ニ?U?メス M*払エ??_猩クI !!.紅??凩雋Nld姜嚶YチX#6オH|鍛Mカユ1「リハリネLハgムケネコHリーアェ?肆骨ER:Eミ痺㍽「嫌ニiモメ`:堺ェ?lck
  2. kェ「pwァケサネンwワ?"?了サ?3KMEケB ヘフレヌムアp慴~ゥネルイWyワ?簧?ワ?ィqウ%ホnqウ?リ睾gャロ莅黏o澈元wホZ
  3. w7/Dホ」 l灯?塘bt(ャ?寞ロマkby<量昞&?ホ鷏?Zソロ3 d忍?妥暈t舊hW|峙イキリ皰 ・キ檐6@;?ンI[・ハA9、「゙zナッ??ッpロk}w ワY?賽ャ、o 颶咏YB?Bィ~R鎚h ZSユシR8{ンラ゙ハウ@ァー N?$5ゥ$b寸ムQbリ>ースIメトクョDチォk捉?%Fハ>V?ェタN?|,ミq,#?・9゚トh権P琺リelチB,ュ嫡家&B?ヤH{fレ?揉W,タフィ軏ヲ;巫ス"w繒ハc嵜?aRJ[/゚タ`ェ.l8ャ「Qワヘstケヘンw] ヘ_eヘヌ-丗ユケOケサ柀_UB?⑯PシサQヘン-②ヌV ヤフ銈。 `ー f縫G?拉?晗yテab?ルzaCT溝Dデチ+ ?)?最cカ~R寵X?L樺&4y?x3?yャ??jノX??ェh?J_コ?ナ:Hフsi ハT*|$ナ7?ル*美゚ク=jノ4リn+⊇Sリ"i3"6ノネ$NCクSコfワ;ワ刧;I5[?o??q#?S」ム?M0コ?j?ヌ<轂ヤロ,{/゚ネS」Pm:q?籐ォラ"妖龍ぼ赤テ廟@?>{??WC?タ|燒 メW檄?k竈ミヘ?リ !ツ?ケ
  4. ?O[7hィ癸l"ケ?[[ks^gt?pノ3@t$?\?@モqKc梺mNQ^HMY%嶌cユwPK=シdGstatemachine/verilog/PK<シdGstatemachine/verilog/isim/PKdG「ロョユ
  5. "statemachine/verilog/isim/Rakefile抃駭モ@?洫X\ I! ?P粘
  6. ・ オQ米?ゥc寛ヘQ.qS@@)gT??・ウク?俤酷:i%??j?゚|3;脂?トト(nFqコ、痰焦zミ`?ネ2TサV-シ+トイMRtlャ GWー餓
  7. F66ォ2T~ミqリ?、е ヒヲ゚;i池ナF嘘mレーqT54ャヲ嚀クレB&カー9册ァ゙W鶲S?%R??セヲ?'?
  8. 讎3Wゥ祥zWィ;M=亮s9ッフ?ラ"跂?? ゙?、=?b?ュヤソ@ス?洟?リgaァ?シ7ョ琉m働
  9. 8屯スチ/ンヲ琪??:K]xッS?ト錂シミ5クr掏 K鮨ァ?,艢dPホッ挙7壼懾b=ヒUソ0?o?ァ?ケ?R鐶イ_゚.7?WBリハ虎Jj<81轢3!ηOマ?gヤソKス?狄¨zヤ?g[チ藪cuミ靭0棗罇?げMカ8Y」?グュ゚`ヌュ=f傔、゙s 埜7 は籃驚ワテ%茱PwサュWッ(ヤ;Oィォウ"鉗&硫疚|yr??睆eGv榘。>$ノrレエ5)6ー?@ァワ"UIリg偰ホセ-oロC!ヲS<ノ?畊.Aオオo実9リ?v]ソ?j3?シ?D゙C4,3?ネ]%薛ヲ?ミチ=飼ナ汽Wマッ?┝ユ ネム-サ?i#z。翫l9ナDZカ葯tu=階テk・x低 ?ユュ~sb$cケ??ホ,,ェ。テ?疲敦#NYキタw?9o
  10. ?nq>?馞qP&zIs徂瘰z碪< ,^ニフc礒3ハ筵ヲ・シ? ゥ糸sX+8zゥ"略MネUォlアa=イ?5?
  11. V 伺」セmhHrャBKヌ秋1x艨チ]サs9yフ‘+ 3ヘ]8?サ?_ハ6ニRャGロヨ氷フt4?賛萵攜OVE@D=ァlル2ウи?皺V)9ヽ)ウ?窯ゥ?」(?譬5%殄f猤チヌュ庶a?チ. /mロ]l[1リ「,^ /僅マメ探&c ゥ?ユQ湯[?0AD邇ュル!*鉸??ェユ髢そ@2「ロjB揉j?関Xテ:ト%ノ?ヨ,シ6 故J梃ウ?Kチ喀ョZヤレ?|崚R ゙ンユ゚チモマチ?ipテ鮻. |G_?Eh9ナケ?ウ 癇X1Wbト&タ-bヤC/xツゥ1TムV ヨ・PモUiXRi飲
  12. ウL0Q拠。狎ユロ」BhZヘT(・cエ螢z?、G%ミト>Q巷「軻2・Tタク|シ9点NG鐺?ヤ8◆lmU3`
  13. ヲ,"e,ゥホム4lt?6?e炙u蒸8ゥf,l#ユ祥_姚PK=シdGstatemachine/verilog/rtl/PKdGF+シェ8#statemachine/verilog/rtl/DELAY_SM.vュWYOQ~歙qM、?。u{ーヨ%h qK\c見オ オアNIムギ;P[ZE,├ィ(A?オBフ咜ハチs吏カエ,丑ス=?薇;ロ貧?鈹炮ch停,ナ?w?8CI塚キ?ラ(Y。?ユuX?エt」茹ナ美、z底ソゥ椶 %?ィ??Rレ;蚣詳?㍍^M最橈ゥH kェ「< C*:s饉゙ォム?チモ迢ェ15うu腆.ァ磧b;ィc#*?v]8ソソ?ハユkヘbェ睡?リr銀p+J(??ィヒロ}貭Yー咜」ホNTaelィ2゙?NQ悸x≫g@Jケ8N s?c搓鮃F?ナ屈?M澁7Owク嘉硤廰hホ?)?sJIヲコ0^-≪郭qV8xCC眤Aァ憑?kX萩?ヲdH骰k?X0ャ15フrw?{繿/Wンハ=5ヤリカ 飾<ョrqo8ぼ8
  14. gHn歔K)福ネ裄'埖N,U?麻還夛ユ"bニ6チシrbォーオ~ゥ>
  15. u
  16. '策g桴Y研Hノ7J?3モ付r& ソ"E?ヘカ鉞!・<済aヒH%Aー験瘢7ル5?ミ銈ヌ忤Pト?G"ェc¦降(鉎Bハナ?BVΩャ7ィ」濠?「♭よ6ホィウ崑|ヘ「Id,#1 jゥ曻チ^g?疚ヲ2?V?&F@ル覡T]オ
  17. 「 ネ
  18. X#1ラ倥m0タ??ィ マy??皞? QZーコ(ロホ?k3ョ」ツワV& Jキ??a匍*b?fjI侔、タ。.匏p\ *[N1虻2[瀘7ハ?氤@ャ/ヤ?Eァレ惲Qオ' ァと9ィヨLチ^ヤヨ(OC9|ト獏!爾゚シ霜ョL袁。?Aィリツ?aホ9エ諾 Eユ潴%i歸"」ア囲\Iー1RX?y/??レコ 幌_ュツ怐禛ヨ气h+V k%?ノ 'YレリノV&?*B秡].$源4?x 上l飽4a80ソ控fヲX釗~0G呈傭y}レXEーノ^C賍eマワT椌!EⅶV 侶?ッС}ヨC僴恟・ョオル`゚wO^x蕃O囮!ー^篆ハF 7IハkS讚?ム?フコV>?Rjウユ#ゥ\%;ユnンYタD1?#/ rセ窒サ煆AルエユW?キュサヲイイJZ\ャサHッ]5>亭オ藾楾ン「1導{w3RュlIワ拵[ヌ琩﨡レテ\ュc3nフ~5FRタ嗄・セ?FチLC06R=痰澵"台6Gメb-」゙2ヨ?ム2オ・筺k、イUソ?儀拭ー%んキUr股クャ軫sB~イfーG「RZ簀1L?シw ?} 竃[ヒイX[:K稙?゚<寡 リyu?ニ托祈Mセ#Oテフ#汞9ナndyq?踪ヒ|ロ9?GIN3稔9・&GアT=`v{(kケKタ聊/餅。「銘mシンハヲ耋ケオ㌻ケzタ蕁'ケ陂,(vX?k?鯣1)PK=シdGstatemachine/verilog/sim/PKdG$氓ッ$statemachine/verilog/sim/tDELAY_SM.vンSOKテ0ス躊<リア僴^?ヤ鯣:nv?-e][コホ。アォ?狠努ナ
  19. ^媒廰??、??%砒?゙{Mモh/ッ靑オj哄/4ク「絨\モ焉?ZDィ}2h?チ2vXjエIG圉fマ;uカl ヤキロC`zアn!モ?Gw?V4・r|Xテllcy+ウ(b??ラナ#裨臺侚C?g齒鵁愈oモノ蕘^ァーォ?uEヘクV彫モ?ゥ\8?鉀u0 3@А.饕<メZf/験゙4ンビ=」ユK?テ%レ 5テ2<C7q鍍 1」5畍セt&輔hヌvノ qca &}ホ!sI#R VチeDソ稾ツ\ンテB6オ壬GpiwI?趾p楢澤ホ
  20. SヘeネH?'ロNコ 詹s7「F「皐。?hキィ)j B雉」GユCホミRQ)xe?G雛・ ;-70{ラPK=シdGstatemachine/vhdl/PK=シdGstatemachine/vhdl/isim/PKdG「ロョユ
  21. statemachine/vhdl/isim/Rakefile抃駭モ@?洫X\ I! ?P粘
  22. ・ オQ米?ゥc寛ヘQ.qS@@)gT??・ウク?俤酷:i%??j?゚|3;脂?トト(nFqコ、痰焦zミ`?ネ2TサV-シ+トイMRtlャ GWー餓
  23. F66ォ2T~ミqリ?、е ヒヲ゚;i池ナF嘘mレーqT54ャヲ嚀クレB&カー9册ァ゙W鶲S?%R??セヲ?'?
  24. 讎3Wゥ祥zWィ;M=亮s9ッフ?ラ"跂?? ゙?、=?b?ュヤソ@ス?洟?リgaァ?シ7ョ琉m働
  25. 8屯スチ/ンヲ琪??:K]xッS?ト錂シミ5クr掏 K鮨ァ?,艢dPホッ挙7壼懾b=ヒUソ0?o?ァ?ケ?R鐶イ_゚.7?WBリハ虎Jj<81轢3!ηOマ?gヤソKス?狄¨zヤ?g[チ藪cuミ靭0棗罇?げMカ8Y」?グュ゚`ヌュ=f傔、゙s 埜7 は籃驚ワテ%茱PwサュWッ(ヤ;Oィォウ"鉗&硫疚|yr??睆eGv榘。>$ノrレエ5)6ー?@ァワ"UIリg偰ホセ-oロC!ヲS<ノ?畊.Aオオo実9リ?v]ソ?j3?シ?D゙C4,3?ネ]%薛ヲ?ミチ=飼ナ汽Wマッ?┝ユ ネム-サ?i#z。翫l9ナDZカ葯tu=階テk・x低 ?ユュ~sb$cケ??ホ,,ェ。テ?疲敦#NYキタw?9o
  26. ?nq>?馞qP&zIs徂瘰z碪< ,^ニフc礒3ハ筵ヲ・シ? ゥ糸sX+8zゥ"略MネUォlアa=イ?5?
  27. V 伺」セmhHrャBKヌ秋1x艨チ]サs9yフ‘+ 3ヘ]8?サ?_ハ6ニRャGロヨ氷フt4?賛萵攜OVE@D=ァlル2ウи?皺V)9ヽ)ウ?窯ゥ?」(?譬5%殄f猤チヌュ庶a?チ. /mロ]l[1リ「,^ /僅マメ探&c ゥ?ユQ湯[?0AD邇ュル!*鉸??ェユ髢そ@2「ロjB揉j?関Xテ:ト%ノ?ヨ,シ6 故J梃ウ?Kチ喀ョZヤレ?|崚R ゙ンユ゚チモマチ?ipテ鮻. |G_?Eh9ナケ?ウ 癇X1Wbト&タ-bヤC/xツゥ1TムV ヨ・PモUiXRi飲
  28. ウL0Q拠。狎ユロ」BhZヘT(・cエ螢z?、G%ミト>Q巷「軻2・Tタク|シ9点NG鐺?ヤ8◆lmU3`
  29. ヲ,"e,ゥホム4lt?6?e炙u蒸8ゥf,l#ユ祥_姚PK=シdGstatemachine/vhdl/rtl/PKdGスチ2"statemachine/vhdl/rtl/DELAY_SM.vhdュWYOQ~?クo・エcヤ+&ニオq!ヤ悟R&?df?ヨ;#Z-  H1.?D$E衂\ヲナ'?ら.ウミ?1r?gセウ}釛iWハ覩g償_飼ァ(。ト・?%o(ゥPノワム 鋺ィ禔z?鄰ツ? J =??~」d勅_ゥw?゚ゥWヺ uソP?-ケ延ョ]アTメ0ニ僖ムニ|オロv俍コYミ?E9ーoキェ?。Qシ?£?ー疉ホ-t??耀スg素'
  30. リ`Jィ#≒綜「κP擇・?`7Rメ欝&1dZ社A償9后I3
  31. ]ネHルセv2mkYO 3起$テ炙?ト?Zヘチyp#ヒム?ー) 取ワツィキ?゚q8Bルcg指「KGイ}'zホ躁dマe{O2W?] ?ケス鴟~J ラW_Rw伴レ@ムネ;喨 .鋕ョ鵙フ#qp[)dapネ$滔ェ・ゥWt懸kCー洪ハ4ゥ馨ヤ戳?ク?〉モ剛]H ?ヲ」テ?4・創咾\ヤネV{ψョク9ィヌ Od、2 %?冫[+タャ|ムイ??ミEュ2qア{r<。8.キユゥ触d喚 h?nゥrUヒ_EM(!5籃NQ_=hidゥ/マヨニ揺ニ櫛﨓OJ?[・6]FM>bバSヨル?:フ4ラニXキ涙タe/ hソ3%UJnS賈.E?ィャッ<、、フ$?uaャ, -~r;f?フsン・3ハaイ?トッリ・、ツ`セテ< 0ョX6「ハ哘#,Mム`ァクソC@ノ x]
  32. ?o脂メャノW[OBイX嫋ae Oy?ウq`{ネ2?醺ゥS 「TC?r@u」、奪ホ Y9yィアア黛゙x號?彑~^岼ヨョW(Yセヤ躔」榧m0テスH粱??」_?gV2S浴軋3。f襲:螽嵓-ミ゙;ワT2挑sf?ー^濺♯イオ??舒章?R=澂? lムQqlソ<Qセ 「lフ?ロX[*締鉾梁y}ャZ+Cモ )ソ?ツDゥ6仔K雇雹牙UCン④AT{装カUリヒマ?pキハゥ洸Мミ
  33. +ィ%`5\?QucシチM?ナツウヒ?」2$PツCユト P芹lG[a厩曚,!V<?オEィヤ@メヲz4トンコ2挑[T&齋Tt泌yァオjャ セ[6 剿ュヒ莟=゚F 團?畩ムf:07堯?ネk?」猫チァ&?Hューv?ワ_ソ?g。>オ ャ?V|綢'33D筮リ銧dッVaセア+P^G?/@~?ッ3^}餒q榜アQpS;
  34. ??ユ ・?ワW,レ
  35. ~IlF|R?オEロル至セタ^ホ9Dxロa^w)ワチQ?トr璞モPK=シdGstatemachine/vhdl/sim/PKdGャ E+S#statemachine/vhdl/sim/tDELAY_SM.vhd侊チnモ@ス?@4?メC Un。U*喪ネ)r扨コ患ュ7T蜆B簑? q蚶6フ鏆qU傷?ヘシvv珥ーア゚鋗?ヲ/ユ艸埓RモⅣMヌ芽ト%PB育慶b條ア?"゙ァaヌuw?Z イ !ネFツ$風 モb@c3b朶IB9b:゙[Oエ正XLめ?:m{タフ
  36. "リォ⊇? ?j泚?Jセクヌラ*忠埔Qノラナロ<鰉~縺゚⑨*髏hニ
  37. ーリモ系ゥヤ<z飽9hエチZ乏ヨ)薩「?テホツh`ヒチiX。TA"ケ :?矜_L<ツnホH?モvテMx$xHb;Z?]TB暑ユ吁){Y?F、?。iFkオ桑?hs?ニ?p' z?「テt?トD?゚鋲3筱=I??゙Z?カ??ムQV}スイ)J?pArィ嶬ヌ?藁(制?タ*z^駢゙┠ナgッj\ョl寃リ「ァ\コt-じ-Wォ央オク\ 企?ム>a妤
  38. 錫ヨ抵矮ヨ鈊?テ 凖w鰀ェナワ]q?n挧キ?3Vンソ始ォ* 悧{bl=s盻丨{ホoPK?-シdGレワ$ statemachine/sim_howto.txt
  39. ._qテム;メユム;メユムPK?=シdG$statemachine/verilog/
  40. DオルユムDオルユムュ壞ユムPK?<シdG$Gstatemachine/verilog/isim/
  41. 2モヤユム2モヤユム゚ヤユムPK?dG「ロョユ
  42. "$ statemachine/verilog/isim/Rakefile
  43. L ?WHム!ャヤユム!ャヤユムPK?=シdG$ア statemachine/verilog/rtl/
  44. \潰ユム\潰ユム閠ヨユムPK?dGF+シェ8#$ statemachine/verilog/rtl/DELAY_SM.v
  45. L ?WHムLkラユムLkラユムPK?=シdG$セstatemachine/verilog/sim/
  46. ィ湃ユムィ湃ユムDオルユムPK?dG$氓ッ$$ statemachine/verilog/sim/tDELAY_SM.v
  47. L ?WHム踊レユム踊レユムPK?=シdG$statemachine/vhdl/
  48. ?゚ユム?゚ユムチ7ンユムPK?=シdG$statemachine/vhdl/isim/
  49. 5I゙ユム5I゙ユムヤンユムPK?dG「ロョユ
  50. $ Kstatemachine/vhdl/isim/Rakefile
  51. L ?WHム5I゙ユム5I゙ユムPK?=シdG$zstatemachine/vhdl/rtl/
  52. コ≡ユムコ≡ユムx袱ユムPK?dGスチ2"$ ョstatemachine/vhdl/rtl/DELAY_SM.vhd
  53. L ?WHムゥZ゚ユムゥZ゚ユムPK?=シdG$statemachine/vhdl/sim/
  54. .内ユム.内ユム?゚ユムPK?dGャ E+S#$ statemachine/vhdl/sim/tDELAY_SM.vhd
  55. L ?WHムl獨ムl獨ムPKk}}}

  1. /*
  2. I_KICK入力があってからG_COUNTクロック後にO_KICKを出すステートマシン。
  3. */
  4. `default_nettype none
  5. module DELAY_SM #(
  6. parameter G_COUNT = 10
  7. ) (
  8. input wire I_CLK,
  9. input wire I_RST,
  10. input wire I_KICK,
  11. output wire O_KICK
  12. );
  13. localparam C_IDLE = 0; // ステート数が増えたときに付け直すのが面倒なので、
  14. localparam C_WAIT = 1; // 4'd0のような幅をつける記述はしない。
  15. // Verilog2005の$clog2の代わり
  16. function integer clog2;
  17. input integer value;
  18. begin
  19. value = value - 1;
  20. for (clog2 = 0; value > 0; clog2 = clog2 + 1)
  21. value = value>>1;
  22. end
  23. endfunction
  24. // ステート数が少ないため幅は4も必要ないが、ビット割付はシンセサイザが勝手に
  25. // やるので幅が大きすぎる分には問題ない。
  26. reg [3:0] r_current_st;
  27. reg [3:0] w_next_st;
  28. reg w_start;
  29. wire w_finish;
  30. reg w_kick;
  31. reg r_kick;
  32. // clog2(value)は、valueの「要素数」を表現できる最小限のビット幅を返す。
  33. // valueまでの「値」を表現したいなら+1した値を与えなければならない。
  34. // たとえば0~16までを表現したいなら、clog2(16+1)ビットが必要になる。
  35. reg [clog2(G_COUNT+1)-1:0] r_count;
  36. // ステートマシンの核はこれだけ。
  37. always @(posedge I_CLK or posedge I_RST) begin
  38. if (I_RST) begin
  39. r_current_st <= C_IDLE; // リセットで初期状態へ遷移
  40. end
  41. else begin
  42. r_current_st <= w_next_st;
  43. end
  44. end
  45. // このalways節の中はすべてブロッキング代入
  46. // ノンブロッキング代入を使ってしまうと、同時刻に同一変数への代入が行われる
  47. // ため結果が処理系依存になってしまう。
  48. always @(*) begin // へたにセンシティビティ・リストを書くより*がよい
  49. w_start = 1'b0; // ここらへんには「なにも作用しない」ときの値を
  50. w_kick = 1'b0; // 列挙する。記述がもれるとラッチが生成される。
  51. case (r_current_st)
  52. C_IDLE : begin
  53. if (I_KICK) begin
  54. w_start = 1'b1; // こうするとミーリ型になる
  55. w_next_st = C_WAIT;
  56. end
  57. else begin
  58. // 遷移しない場合もw_next_stへの代入を書く
  59. // そうしないとラッチ生成
  60. w_next_st = C_IDLE;
  61. end
  62. end
  63. C_WAIT : begin
  64. if (w_finish) begin
  65. w_kick = 1'b1;
  66. w_next_st = C_IDLE;
  67. end
  68. else begin
  69. w_next_st = C_WAIT;
  70. end
  71. end
  72. default : begin // defaultでw_next_stへの代入を忘れるとラッチ生成
  73. w_next_st = C_IDLE;
  74. end
  75. endcase
  76. end
  77. // 組み合わせ出力からフリップフロップ出力に直す
  78. always @(posedge I_CLK or posedge I_RST) begin
  79. if (I_RST) begin
  80. r_kick <= 1'b0;
  81. end
  82. else begin
  83. r_kick <= w_kick;
  84. end
  85. end
  86. assign O_KICK = r_kick;
  87. // 値域は0~G_COUNT
  88. always @(posedge I_CLK or posedge I_RST) begin
  89. if (I_RST) begin
  90. r_count <= 0;
  91. end
  92. else begin
  93. if (w_start) begin
  94. r_count <= 1;
  95. end
  96. else if (r_count == 0) begin
  97. r_count <= r_count;
  98. end
  99. else if (r_count < G_COUNT) begin
  100. r_count <= r_count + 1'b1;
  101. end
  102. else begin
  103. r_count <= r_count;
  104. end
  105. end
  106. end
  107. assign w_finish = (r_count == G_COUNT-1) ? 1'b1 : 1'b0;
  108. endmodule
  109. `default_nettype wire