本業の傍らで最近は副業としてマイコン案件とかFPGA案件とか依頼されることもあって平日夜や休日を使って対応してます。
その程度の時間なので小規模案件です。
その程度の時間なので小規模案件です。
もちろん本業の会社には許可申請済みですし、本業と関係ない業界のみとかでまぁ細かい規約はあります。なのであまり大きな案件を受けることは厳しい状況です。
本業の職場でパソコンやネットのログは皆しっかり取られているので、本業の仕事中には一切副業はできませんっていうか規約でしてはいけないんです。当たり前。
まぁ頭の中で考えるのは自由ですけどねw。
とはいえ、定年が見えてきた歳ですし、今の業務はPMがクソで言うことがコロコロ変わるのでそろそろ足を洗って、転職というよりもフリーランスとして今の副業をメインにして生きていければなぁって密かに思っています。
もうちょっと安定した長期案件が見つかればって思ってますが。。。
さて、そんな副業の一つの案件として先日までやってたFPGA案件があります。
既存製品に搭載されているFPGAなんですが、書いた人がすでにいなくてろくな資料も残ってない。
コンパイルが通らないので調べてできれば直して!っていうもの。
コンパイルが通らないので調べてできれば直して!っていうもの。
Intel(Altera)のCycloneで、Quartusでコンパイルしたら山のように出てくるWarning。中にはCriticalWarningもある。良くこんなので動いてるよなぁっていうレベルのソースでした。
当然ろくな資料もなければ、コメントもいい加減なので中身の把握はしきれないんですが、あくまでも文法チェックだけ行うという業務で、代入のビット幅の違いとか、ブロッキングとノンブロッキングが混在しているのを修正したりとか、
って、ブロッキングとノンブロッキングが混在しててもちゃんと動くのがすごいなぁって気づきましたがw
って、ブロッキングとノンブロッキングが混在しててもちゃんと動くのがすごいなぁって気づきましたがw
と、作業をしていたんですが、Warningは山程でるものの、最初からエラーで止まることはなく、一応コンパイルは通ります。
エラーでないんですがって聞いたら、
どうやら合成ではなくシミュレーション(ModelSim-Altera)の方でエラーが出るらしい。
どうやら合成ではなくシミュレーション(ModelSim-Altera)の方でエラーが出るらしい。
ちなみにそれは今でも量産されている製品で使われているFPGAらしいのですが、テストベンチは簡単なものが一つだけあるだけで、基本は現物確認のみだそうです。
シミュレーションって時間かかるじゃないですか!
仕様書ありました! これ!
えっとこれってレジスタマップって言うんじゃ。。。
色々と常識からぶっ飛んだ開発だったみたいです。
で、その唯一のテストベンチが動かない。エラーが出るらしい。確かにModelSIMかけたらエラーが出ます。
変数定義していませんエラー。なんで量産で動いているのにそんなエラー??
変数定義していませんエラー。なんで量産で動いているのにそんなエラー??
で、プロジェクトの中を見てみると、
Veritakというシミュレータのプロジェクトファイルがありましたので、おそらく以前はシミュレータとしてはVeritakを使ってたんじゃないかと推測できました。
Veritakというシミュレータのプロジェクトファイルがありましたので、おそらく以前はシミュレータとしてはVeritakを使ってたんじゃないかと推測できました。
聞くと、
あーそんなのあったかも。なんかドングルみたいなのが転がってたような。。。っていうレベル。
あーそんなのあったかも。なんかドングルみたいなのが転がってたような。。。っていうレベル。
私はVeritakってのは使ったことは無かったのですが、調べると有償のシミュレータのようです。
無料というかQuartusについてくるModelSim(Questa)を使わずにわざわざ有償のものを使ってるのはなんで?
さぁ。。。わかりません。。。以前はその人(退職済み)任せだったので。。。
で、ドングル借りてVeritakかけたみたらなんとコンパイル通るんです。
なんでーーーー
なんでーーーー
その違いを調べてみました。
エラーの内容はシンプルなもの。
Verilogで使う信号については普通宣言しますよね。
input/outputは当然最初でしますが、そうでない内部信号のwireとかregとかも普通は宣言が必要!
その宣言は使う前にあらかじめしていないといけない。
input/outputは当然最初でしますが、そうでない内部信号のwireとかregとかも普通は宣言が必要!
その宣言は使う前にあらかじめしていないといけない。
当たり前ですよね。C言語とかでもそうでしょう。
ちなみに宣言不要な言語は除いて、公式に宣言場所がフリーダムな言語ってあるんでしょうか?
で、ツールの振る舞いですが
信号を使うより後での宣言でもAlteraのコンパイル(合成)は通るんです。特にWarningなし。
で、Veritakも通るんです。
でも、ModelSimはエラーが出ます。うん。まともな人がいてよかったー
で、Veritakも通るんです。
でも、ModelSimはエラーが出ます。うん。まともな人がいてよかったー
これが違いのようです。
おかしいのがAlteraですよね。
合成が通ってシミュレーションが通らないってなんやねん!!!って感じですね。
まぁModelSimはAlteraじゃなくてメンター開発なので違いはあるんでしょうね。
合成が通ってシミュレーションが通らないってなんやねん!!!って感じですね。
まぁModelSimはAlteraじゃなくてメンター開発なので違いはあるんでしょうね。
その確認をするために簡単に作ったソースを紹介します。
試したバージョンはQuartus18.1とVeritak 3.84Dです。
無宣言だと1bitワイヤになるんだっけ?
そうなったらややこしいのでとりあえず2bitのTEMPって内部のみのreg信号を作りました。
そのTEMPっていう信号の宣言位置を変えて確認です。
そうなったらややこしいのでとりあえず2bitのTEMPって内部のみのreg信号を作りました。
そのTEMPっていう信号の宣言位置を変えて確認です。
ソースはこちら
module testq
( input wire CLK,
input wire RESETx,
output reg [7:0] Dout,
output wire DIVout
);
always@(posedge CLK or negedge RESETx) begin
if( !RESETx ) Dout <= 8'h00;
else Dout <= Dout + 1'b1;
end
reg [1:0] TEMP; // 本来の宣言場所
always@(posedge CLK or negedge RESETx) begin
if( !RESETx ) TEMP <= 2'h0;
else
if( Dout[3] ) TEMP <= TEMP + 1'b1;
else TEMP <= TEMP;
end
assign DIVout = TEMP[1];
reg [1:0] TEMP; // アホな宣言場所
endmodule // test
TEMPの宣言場所は2箇所とも記載してますのでここままだと違うエラーが出ます。
試すときに、上の方と下の方でどちらかをコメントアウトして比較したわけです。
試すときに、上の方と下の方でどちらかをコメントアウトして比較したわけです。
このVerilogの内容としては簡単なもの。
リセット後動作を開始する8bitカウンターを回して
その[3]ビット目が立ったときだけTEMPという2bitカウンターをカウントアップする。
そのTEMPの[1]ビット目を出力
リセット後動作を開始する8bitカウンターを回して
その[3]ビット目が立ったときだけTEMPという2bitカウンターをカウントアップする。
そのTEMPの[1]ビット目を出力
これで
Alteraは合成通ります。
ModelSIMは
# ** Error: D:/●略●/testq.v(16): (vlog-2730) Undefined variable: ‘TEMP’.
ってエラーが出ます。
# ** Error: D:/●略●/testq.v(16): (vlog-2730) Undefined variable: ‘TEMP’.
ってエラーが出ます。
Veritakはエラー出ず。
Veritakさんはなぜ通しちゃうの?WebみたらVerilogチュートリアルとかあるんで厳密に準拠してそうなんですけどねぇ。
http://japanese.sugawara-systems.com/tutorial.htm
ひょっとして通しちゃうのが本来の仕様???まさかぁ。。。
ってことで、こういうどこでもいいでしょ宣言が山ほどあるソースだし、信号名も aaaとかbbbとか意味不明な暫定っぽい名付け方もあったり、まぁ今まで見た中でも抜群に酷いソースでした。
この業務は2週間かけて毎晩ちょこちょこと修正してModelSimで動くようにして昨日納品したところです。
合成のWarningも800個くらいあったのを200個位には減らしました。
合成のWarningも800個くらいあったのを200個位には減らしました。
まぁ動くようになっただけで、中が何をしているのか?ってのは理解しきれなかったんですけどね。
入出力の仕様とか記載ないし。っていうかそのIOのDelay設定もSDCにない。SDCはクロック定義だけ。
このソースを今後どうやって使っていくんだろうか?って疑問はありますが、あまり深入りしたくないので特に聞かずにそっと納品ですw。
入出力の仕様とか記載ないし。っていうかそのIOのDelay設定もSDCにない。SDCはクロック定義だけ。
このソースを今後どうやって使っていくんだろうか?って疑問はありますが、あまり深入りしたくないので特に聞かずにそっと納品ですw。
エラーやWarningが多いので、lintみたいなチェッカーを導入すればって伝えておきましたが、今って主流は何なんでしょうかね?
FPGAのツールのWarningをしっかり見るだけでもそれなりのチェッカーになると思いますけど、昔FPGAじゃなくてASICやってた頃は、VerilintとかRTLqualifyとか使ってて、RTLqualifyを通すことってのがリリース条件(の一つ)ってやってた記憶があるんですが。
FPGAのツールのWarningをしっかり見るだけでもそれなりのチェッカーになると思いますけど、昔FPGAじゃなくてASICやってた頃は、VerilintとかRTLqualifyとか使ってて、RTLqualifyを通すことってのがリリース条件(の一つ)ってやってた記憶があるんですが。
そういえば、スタイルガイドってありましたよね。昔。STARCの。
中の項目すべてをそのまま使っていませんが、その中から職場でまとめてこうしましょう!なんてしてたはず。
そのスタイルガイドって今ってどうなってるんでしょうか?
ググったらAmazonのこれが引っかかりましたが、これって10年以上前のものですよね。
STARCは無くなったはずだし、なくなったのかなぁ。
中の項目すべてをそのまま使っていませんが、その中から職場でまとめてこうしましょう!なんてしてたはず。
そのスタイルガイドって今ってどうなってるんでしょうか?
ググったらAmazonのこれが引っかかりましたが、これって10年以上前のものですよね。
STARCは無くなったはずだし、なくなったのかなぁ。
コメント