SystemVerilogの基礎知識(検証編)【その1:概要】

みなさん、こんにちは。
SystemVerilogは、検証用に使用されている場面が多いですが、筆者はデザイン開発への浸透は、まだまだだなと感じています。
Verilogを使用されていた方は、SystemVerilogは、上位互換なので、入りやすいかと思います。
「記述の簡略化」、「その簡略化によって防げる記述ミス」、「解析にかかる時間削減」など多くのメリットがあるため、使ってみてはどうでしょうか。
本ブログでは前回に引き続きSystemVerilogで便利になった内容を記載していきます。
このブログは「FPGA設計ブログ一覧」の
2. シミュレーションのひとつです。
目次
“アサーション”について
アサーションとは、検証に導入されたSystemVerilogの機能の一つです。
SystemVerilogでは、SVA(System Verilog Assertion)と表現されています。
使用する主な目的は、仕様(記述)の確認漏れ、不具合の解析時間の短縮でしょうか。
設計したデザインが意図した動作になっている?
異常時(想定外)の動作があった場合の検証
等、正しく動作することの確認を開発期間内に行う必要があります。
実際に開発を進めていくと検証に時間をかけていることがわかります。
1つの機能であれば、さほど時間はかからないですが、チップ全体もしくはチップ間を跨ぐ機能であれば、検証に時間を要します。
従来の場合、設計デザインの入力端子に対して、値を与えてシミュレーションを行っていました。
→テストベンチに検証用のパタンデータを作り仕様通りの確認を行う。
すべての条件(タイミング)を確認するのは容易ではないため、通常のパターンでは不具合が発生しないが、ある特定のパターンでないと発生しないなど見逃してしまう場合がありました。
アサーションの記述について
SVAでは、設計者が確認したいポイントに挿入することが可能です。
そのため、不具合検証の見逃しをできるだけ少なくすることが可能だと考えます。
どういった箇所で挿入できるかというと、例えば、条件文だったり、FIFOだったり、いろいろな箇所の動作が確認できます。
ここで、アサーションは、どんな記述すればいいの?どこに挿入すればいいの?となってきます。
SVA構文には、主な構成として、下記の2種があります。
- 即時アサーション(immediate assertion)
- 並列アサーション(concurrent assertion)
があります。
上記2つの違いは、以下の通りです。
即時アサーション(immediate assertion)
記述したある時点でチェック実施と結果を見る。
assert ( <条件文> ) <処理:成立> ;
else <処理:不成立> ;
条件を満たした場合、処理:成立が実行されます。
満たされなかった場合、処理:不成立が実行されます。
注意:処理とelseは省略できますが、記述した方が良いと個人的に思います。
並列アサーション(concurrent assertion)
複数のクロックエッジに跨るロジックのチェック実施と結果を見る。
assert propertyで始まる構文になります。
使用する関数を以下にまとめます。(一部の例となります)
関数 | 意味 |
---|---|
$rose | 立ち上がりの判定 |
$fell | 立ち下がりの判定 |
$statble | 無変化の判定 |
$past | 過去の信号値を参照 |
$onehot | 信号がワンホットか判定 |
$onehot0 | 信号がワンホットもしくはALL0か判定 |
$countones | 2進数表記で‘1’の数を返す |
$isunknown | 信号にX,Zを含むかを判定 |
$sampled | アサーションで使用する値を取得 |
いろいろありますね。
使いこなせれば非常に役に立ちますので、覚えていきましょう。
今回は、ここまでとなります。
おわりに
いかがでしたでしょうか。SystemVerilogの基礎知識についてご理解いただければ幸いです。
次回、記述の詳細について記載をしていこうと思います。
弊社ではFPGA設計や回路図設計、レイアウト設計、ソフトウェア設計、筐体設計などを受託開発しています。
サービス内容をWEBサイトに掲載していますので、ぜひご覧ください。
FPGAの活用に際して設計検討などありましたら、お気軽にお問い合わせください。
最後までお付き合いいただきありがとうございました。
このブログは「FPGA設計ブログ一覧」の
2. シミュレーションのひとつです。