rice is nice.

日々の生活の色々

約一ヶ月の勉強で気づいたこと色々

Verilogを勉強しだして一ヶ月程度です。

最初は何ができないのか、何がわからないのかすらわからないような感じでしたが、ようやくほんの少しだけわかることが増えてきました。

 誰かの役に立つかどうかはちょっとわからないですが、自分の備忘録としては確実に役に立つと思うので、ちょこちょこっと気づいたことを書き残していこうと思います。

あ、特にverilogについては初心者ですし、内容に間違いや勘違いがあることもございますのでご了承ください…(間違いは指摘していただけるとありがたいです!)

 

まず全般的なこととして

・人は忘れる

はい。文法どうのこうのの前に何をするにも覚えておくべき重要なことです。

うわぁ、ようやく解決した!これはもう絶対一生忘れないぞ…!と思ったことでさえ、次の日には忘れてまた同じ問題で悩んでたりします。

とにかくメモは大事。メモ取ることで記憶も少し強固になるし必ずメモ取るべき。

 

ここからはプログラミング全般?

・冗長なくらいバージョン作っとこ

ここがちょっとだけ直ったぞ!とか、少しの改善でまだまだ目標に到達していなかったとしても、とりあえずその状態を残しておきましょう。

他のところを色々いじってうまくいかなくて、とりあえずさっきのところまで戻した、はずなのに、あれ、動かないよ…?とかいう悲劇はよくある。本当によくある。

 

・バージョン管理はちゃんとしとこう

今度はこのver2やらverltuやら、自分の作ったバージョンの意味がわからず、所望のバージョンはどれだ…?という事件が稀によくある。特に前日作ったやつとか自分が何を思って命名したか全く思い出せない。

テキストファイルにまとめてこのバージョンはここをこう変更したやつ、って記録しておく手法を今のところ使ってます。明日の自分は他人だと思って分かりやすい説明書いとくべし。

 

・問題は切り分けて解決する

プログラミングに限ったことではないですが、プログラミングで特に重要だなと感じます。

これとこれをつないで、その出力をこっちに差して、計算した結果をこっちに出す!とか一気にすると自分のような初心者はほぼ確実にミスります。そしてどこでミスってるのかを突き止めるのにまず時間を割くことになり二度手間が発生し、最悪の場合どこが悪いかわからないので最初から作り直すことになります。

面倒だし遠回りに思えるかもしれませんが、初心者は石橋叩きながら一歩ずつ進むのが結局のところ一番近道で早いです。

完成系を紙に図とかできちんと書いて、じゃあこの部分をまず構築、テスト。OKなら次の部分、テスト、OKなら先のパーツと繋いで次の部分…と着実に行きましょう。

 

ここからはverilog

・算術シフト

符号付きの信号において、符号を考慮したシフト(算術シフト)をすることができます。

a >>> シフト幅

これでシフト幅分右にシフトできる。なお算術シフトの左シフトは対応していません。(その場合は上位ビットをシフト幅分拡張してから論理シフトで左シフトを行えばいい気がします)

ex) 101100 >>> 2 とすると、100011となる

符号を考慮しない論理シフトは >>、<<。

 

・ビット幅は超大事

ビット幅宣言しなくても、ビット幅の異なる信号線同士を接続してもコンパイルで怒られません。

でも不具合は出ます…怒られない分どこが悪いのか特定しづらくて大変だったりします。

とにかく全ての信号線にきちんとビット幅宣言しておいた方がいいです。書いて悪いことはないんだし。

 

・$fopen等のオプション指定するときは""が必要

これに気付かず結構悩みました…""つけないと、そんなものは定義されていないというエラーになります。

ex)$fopen("test.txt","w");

 

・符号なしから符号付きへのキャスト

ex)assign result = $signed({1'b0,original});

originalという元の符号なしの信号に{}で上位に1bit拡張してから(符号bit用)$signedで符号付きにキャストします。

 

とりあえず思いつくことはこれくらいかなぁ。また気づいたことがあれば書いていきます。