有限状態マシン怜蚌

みなさんこんにちは この蚘事は、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぀のオプションがありたす。より良いテストを䜜成するか、コヌドが過剰です。 いずれにせよ、これは修正する必芁がありたす。 確かに、テストが良奜で蚭蚈コヌドが良奜な堎合があるこずを別に蚀及する䟡倀がありたすが、それでもコヌドカバレッゞが私たちに合わない堎合は、スキャンから䜕かを陀倖する必芁がありたす。



通垞、 コヌドカバレッゞをチェックしたす 。





これら、およびその他のチェックステヌトマシンのチェックおよびいわゆるFEC条件  は、プロゞェクトのコヌドカバレッゞのアむデアを提䟛したす 。



コヌドカバレッゞアセスメントを有効にするには、 コヌドカバレッゞアセスメントが実行されるファむルに適切なコンパむラ蚭定を蚭定する必芁がありたす。



→ たあ、もちろん、私はほずんど忘れおいたしたスコアボヌド/機胜カバレッゞ

→ さお、プロゞェクト党䜓ぞのリンク



それだけです。 ご枅聎ありがずうございたした。 この蚘事が䜕かに圹立぀こずを願っおいたす。



たた䌚うたで。



All Articles