SystemVerilog入門: 設計・仕様・検証のためのハードウェア記述言語
- 作者:篠塚 一也
- 発売日: 2020/10/09
- メディア: 単行本
共立出版様から「System Verilog入門:設計・仕様・検証のためのハードウェア記述言語」を献本頂きました。共立出版様、ありがとうございます。
Amazonでの発売日は2020/10/09ですが、共立出版のウェブサイトでは発売日が2020/10/12となっています。どっちが正しいのか分からないので、遅い方ということで本日このブログを公開することにしました。
私はデジタル設計が専門のハードウェア設計エンジニアで、現在も主たる業務はデジタル回路設計です。VerilogもしくはSystemVerilogを使いますし、たまにSystemVerilog以外の言語を使って設計することもあります。
しかし私のSystemVerilogの知識はあまり多くはありません。最低限必要な設計のための構文、always_ff
だのalways_comb
だの、あとはインタフェースとかstruct
とか、そういうのが使える程度です。検証用の様々な機能とかもあまり使ったことがない。プログラミング言語もそうですが、あまり言語自体に興味がないのです。
という、「SystemVerilog普段使っているけどあまり詳細は知らない」という私にとって、この本はある意味で衝撃です。
まず、やたらめったら細かい。まあLRM(SystemVerilogの仕様書?)をベースにして書かれているわけですから、文法的なところまで非常に細かく書かれています。目次を見ただけでも、「なにこれそんな機能あったの」みたいな項目が多い。
とにかく、仕様書の文法に則っての解説がすごい。章立てを見ると分かりますが、「第7章:代入文」とか「第8章:オペレータと式」とか、文法に従って章分けが行われています。つまり1章から順番に読んでいけばいいという訳では無く、必要なところをピックアップしながら読み進めていく必要がありそうです。
各所の説明も淡々としており、辞書としての要素が強いです。私としては、よくよく読んでいると、「え!SystemVerilogのinteger
とint
って違うの!!!?(integer
は4値、int
は2値らしい)」という驚きの発見があったりしますが、そこは特に強調されていません(あくまで淡々と)。
逆に困ってしまいました。この本を読破すればSystemVerilogの広範囲な機能をカバーできることは間違いありません。しかし、あまりにも詳しすぎてどこから手を付けていいのか分からないのです。
私はあまり頭が良くないので、こういう本を読んでも、実際に手を動かさないと見につかない場合が多いです。この本の場合は仕様の詳細にツッコんでいく場合が多く、あまり手を動かせる場所がありません。さてどうしようか。
私としてはこの本は辞書として使うのが良いかなと思っています。と言っても辞書というほどにはインデックス化されていないので、まずは全体の内容を読み込んで、そのうえで「これってどこに書いてあったかな?」みたいな「思い出しサーチ」をする必要があるでしょう1。
本書は「入門」といいつつ初学者向けではない
私が最初にハードウェア記述言語(その時はVHDLだった)を学んだ時は入門書を片手にシミュレータを使ってあーだこーだと設計していましたが、その当時の私が本書を手に取ってSystemVerilogを勉強しようとしたら、間違いなく挫折しているでしょう。本書は「入門書」ではなく「最強のSystemVerilog辞書」だと思います2。
SystemVerilogを初めて勉強する人が本書を手に取ることは素晴らしいことだと思います。しかしぜひもう一冊「手を動かしながらステップバイステップで学べるSystemVerilog入門書」みたいなやつをご購入ください。この本は基本を学んだ人がもう一歩(いや二~三歩)ステップアップするのを助けるのには素晴らしい本だと思います。
私のビックリポイント
これだけだとレビューとしてあまりにショボいので、各章をざっと読みながら私のビックリポイントを挙げていきますね。
2.3節:プログラム。
program
とかいう構文があるの... これまではinitial begin
でひたすらシーケンスを書いていたけど、それをサブルーチン化できるということかな。すげえ。3.6節, 3.7節:
integer
とint
って違うの!integer
は4値、int
は2値。どっちもハードウェアとして使えるのかな?- 3.13節:イベントデータタイプ
event
というのがあるのか。これは異なるプロセス間での同期待ちを行える。これは検証環境とかで、キューへの入力、キューからの取り出しのタイミング合わせとかで使えそうかな? - 4.2.2節:タグ付きユニオン。なにそれと思ったら、
union
で代入に使ったデータタイプと読み出しに使ったデータタイプが異なる場合にエラーにしてくれるらしい。これ誰がうれしいの...?- と思ったけど、CPUのデコーダとか複数の命令種に合わせて
packed union
で作るので、デコードタイプと異なるデータ型で読みだすと変なデコード結果になっちゃうもんな。そういった場合にtagged
を付けておけば間違える事は無いかも。
- と思ったけど、CPUのデコーダとか複数の命令種に合わせて
- 5.23節:インタフェースクラス。これ自体は知っていたけど、中に関数とかを埋め込んでいろいろできるんだな。バスの定義とかにうまく活用できるかもしれない。
- 8.1.12
inside
オペレータ、ナニコレこんなのあったの...? - 8.1.13 ビットストリームオペレータ。ナニコレ複雑すぎて理解できない...
- 11章 クロッキングブロック。
clocking
とか使ったことない...これはしっかり勉強しないとダメそうだ...
ここまで来て疲れてきた... もう少し時間を取って勉強しないとダメそうです...