今回は Verilog ネタです。
本当は本職に近いこんなネタばかり書きたいんですが、本職と言いながらも遠ざかっていたものですから。。。
でも、先月職場異動して、久しぶりに FPGA 設計の職に戻って来ました。
この仕事してると給料は上がらないんだけど、マネージメント系よりは技術に携わっている分やり甲斐と充実度が違う。
とはいっても、ずっと FPGA ってわけでもなく、 FPGA もできる職場ってことですね。
以前の職場でも FPGA 開発はありはしましたが、5年で3,4個とかって少なさ。
作るたびにツールのバージョンがあがってて半日かけてインストールするって感じでしたからね。
ここはもう少しは出来るんじゃないかな?って思ってますが、世の中から開発そのものが減ってきてるので今後どうなることやら。。。。
さて、最初の仕事は、Virtex5からKintex7への移植。
PCIExpressやSDIやらという高速シリアルIO使いまくりというだけじゃなくて、中のモジュールを作った人がすでにいない。というありがちなもの。
新しく作りなおすほうが自分的には良いのだが、経験のあるSDIならともかく、PCIExpressは経験もなく、短期で仕上げられる自信がない。
というわけで、移植です。
が、動いているという実績のあるソースが気持ち悪い。
その一例。
簡単に書くとこんな感じのインクリメンタ。
reg [3:0] count;
always@( ... ) begin
…
…
count <= count + 1;
これをISEに通すと、まぁ思い通り、4bitアダーなりインクリメンタが生成されるんでしょうが、
以下の様なWARNINGが出る。
Result of 5-bit expression is truncated to fit in 4-bit target.
作った本人的には、おそらくオーバーフローしないようにしてるか、しても上のビットを捨てているのかだと思うが、当然ながら加算の結果は5ビットになるので、4ビットに代入するには「良きにはからえ!」というおまかせの部分が入る。
なので、WARNINGが出てくる。
まぁこれはまず問題ないレベルのWARNING。
だけど、山ほど出てくるWARNINGから、これはOK、これはNGなんて区別するのは現実的じゃない。
恐らくそういう人はWARNINGは全てOKとしているんだろう。
しかし、これは意図していないWARNINGが出ていたとしたら見逃してしまい、バグとなる可能性が潜んでいる。
しかも、処理系に依存する結果となることもあり、今はOKだけど、次はNGだったとかもありうる。
ツールの信頼性がイマイチだった論理合成初期から入った自分にはとても怖い書き方だ。
しかも、定数も1と書くより、1’b1と書いてほしい。
昔は、+4’h1と+1’b1との違いが出て、アダーとインクリメンタが作り分けられてたんじゃないかなぁ。
また、違う部分ではこういう書き方もある。
parameter A = 4096;
…
…
reg [7:0] count;
…
always@( … )
…
count <= A-1;
これもWARNINGが出る。
Aは定数で、32bitに展開され、それを8bitに格納するので、下位8bitになってるんだろう。
この場合も、{(A-1’b1)}[7:0];
とでもしてくれるとWARNINGは出なくなる。
WARNINGは出ても合成できてしまうので、ある意味怖い部分でもあります。
GND固定とかWARNINGが消せない部分もあったりするんですが、できるだけWARNINGは少なくしてほしい
って思うんだけど、最近のエンジニアはあんまり深く思わないのかな?
それともツールがとても賢くて、うまくやってくれるんだろうか???
と思ってたら、これはまずいだろうという場所発見。
count <= 12'd40955;
恐らく数字的には4095を入れたかったんだと思いますが、5がダブってます。
こういうのでも同じくWARNINGしか出ません。これを見逃してはいけないんです。
これがちゃんと動いているってことは、この部分は使われてないのか、あるいはうまく12'd4095として代入されているのか?
普通に考えると40955の下位12bitが代入されてもいい気がするが。。。
謎だ。。。
本当にちゃんと動いているのかなぁ。この FPGA 。
というわけで、パワポやエクセルで会議資料ばっかり作ってた以前の職場より、今は楽しくなっているというお仕事の話でした。
コメント