組み込み屋の為のVerilog入門 その4
前のブログで、RTL用のOS-APIを含んだ言語(という本物の意味でのシリコンOS)の構想を書いてみたが、その前に既存言語の難しさ(課題)、を整理しておくのはVerilog入門としても有意義そうなので書いておく。
ソフト屋がVerilogをやるとぶつかる異文化の壁に、波形を見てのデバッグがある。
言語記述のほとんどが、@(posedge clk) つまり、クロックが立ち上がる瞬間という刹那の事象についてしか記述しないので、混乱しがちだ。
このとき気をつけるべきことは、レジスタ変数に入っているのは、「クロックが立ち上がる前の値」であって、ノンブロッキング代入で「予約」する値は、「クロックが立ち上がった後の値」ということだけである。
わかってはいても、ごちゃごちゃしてくるとわからなくなってくる。おまけにブロッキング代入を使うと、「クロックが立ち上がる前の値」のはずだったものを容赦なく更新してしまい、他のalways文から参照していたりすると、どちらの値が読まれるかシミュレータ依存となってバグを作りこんでしまう。
assign 文も、狭い意味で同じ混乱を引き起こす。
ひとつは、イベントに対して明確に前後に分離されるべき値のアクセス方法が言語上分離されていないことも課題のひとつといえよう。
また、RTLシミュレータは、そのままであれば上記を本当に刹那として扱うが、実際には組み合わせ回路の結果の確定には時間がかかるということも混乱を助長している。
特にLSIのデータシートなどでは実際の波形をベースに記述されていたりするので、そちらをイメージしながら書くとタイミングがずれてしまったりする。
1) RTL記述は「今」のレジスタ値から「次」のレジスタ値を求める式を記述するもの
2) 「次」の値はシミュレータでは一瞬で確定するが、実際には次のクロックまでに確定する。
の2点を理解できるまで混乱は続くのである。
がんばって理解するしかないが、理解してしまえば回路図を考えなくてもソフト屋的思考のままプログラムとして記述できてしまったりもする。
« 本物のシリコンOS | トップページ | プログラミング言語におけるマクロ »
「FPGA」カテゴリの記事
- LUT-Networkの蒸留とMobileNet風構成とセマンティックセグメンテーション(2020.03.09)
- LUT-Networkの蒸留(Distillation)について(2019.12.29)
- FPGAでのDNN(Deep Neural Network)の整理(LUT-Netまとめ)(2019.12.15)
- LUT-NetのFPGAリソースについて(2019.12.08)
- MNIST認識のリアルタイム動作環境更新(2019.09.02)
この記事へのコメントは終了しました。
コメント