2024年3月24日日曜日

回路カルト XILINX ISEの論理合成でFSMが合成されちゃって死亡回避

初の「回路カルト」シリーズです.こんなの書いても誰得です.

前回の投稿で、I2S→SPI変換ロジックを作ると書きました.

XC9536というフリップフロップ(FF)がたったの36個しか入ってないCPLDで足りるように設計しました.必要なFF個数は10個ぐらいです.

ところが、バグ修正とかしてたら突然、、、METしなくなってしまいました.
理由は容量オーバーです.必要なFFが40個だとか突然増えてしまってXC9536には入りません.さっきまでFF10個ほどでMETしてたんですよ.いったいなんだこりゃー?

結論を先に書くと、Finite State Macineで論理合成するように(自動的に)切り替わってしまったからでした.ぐぇぇ.... 余計なことを.

XILINX ISE 13.3を使っています.

verilog codeにはこんな感じの、32 state sequenserがあります.
reg [4:0] s;
always @(posedge bck or negedge xrst)
case(s)
 0:  begin s<=s+1; mosi_<= data_r; end
 1:  begin s<=s+1; mosi_<= data_r; end
 8:  begin s<=s+1; mosi_<= 0; ss_<=1; end
 10: begin s<=s+1; sel<=~sel; end
 11: begin s<=s+1; end
 31: begin s<=0; end
 default: s<=0;
endcase

このsequencerを論理合成したら、消費するFFは5個だけのはずですよね.ところが此処で32FFを消費するようになってしまったのがFSMのせいだったのです.

synthesis reportを読みますと、こんな表示があり、32stateを32bitのFFで表現している臭いがプンプン漂います.くそぉこのせいでFFが40個超えたんだろ.
Found finite state machine <FSM_0> for signal <s>.
 State | Encoding
 00000 | 00000000000000000000000000000001
 00001 | 00000000000000000000000000000010
  中略
 11110 | 01000000000000000000000000000000
 11111 | 10000000000000000000000000000000

32FFでFSMを論理合成するのは動作速度の面で有利とのコンパイラの判断なのでしょうが、clk制約は2MHzと遅いので、組み合わせ回路の複雑さにコンパイラが反応したと見るべきかと思います

ともあれこうゆうのは、コンパイラオプションで抑制できるはずです.

そのコンパイラオプションを探すのにてこずりましたが見つかりました.

合成に関わる事なのでsynthesize....で右クリックしProcess Propertiesへ
HDL options→FSM encoding Alghorithm→None

これでMETして動きましたとさ.やれやれ.

かしこ

10 件のコメント:

  1. >バグ修正とかしてたら突然
    これ、ソフトのコンパイラでもよくありますね・・・ 例えば、変数の宣言とか、
    ホントは「定義順」にメモリに配置して欲しいのに、イロイロ修正しているうちに、
    ・勝手に、メモリ配置が変わる(変数のタイプ(int とか float とか)で、勝手に並び替える)
    とか
    ※これは、外部と変数のやりとりをしてる時に、問題になる。勿論本来は「定義順に変数を配置」とかの directive はありますが、テストや手抜きで書いて無いとハマる。
    最近は、「コンパイラが、進化しすぎて」細かい制御がやりにくくなった感があります。「最適化禁止」とか言っても、勝手に最適化してるときあるし(笑)変に最適化されると「動かないロジック」とかあるし。
    AIとかもそうだけど、もはや「コンピュータに使われてる」感じだなー。

    返信削除
    返信
    1. >外部と変数のやりとり

      うはうはうー

      容量が大きければどんなlogicを合成しようと気にしないのですが、今回のはそうもいきませんで.

      わたしはやりませんけど、論理合成したgateを確認する人もいるようで、マシン語を確認するよなもんですね.

      削除
    2. >マシン語を確認
      「C言語(C++では無い)」辺りの時は、コンパイルオプションに、
      ・アセンブラ出力あり
      とかのオプションを付けて、確認してる人は居ました。が、C++ だと、もはやこの手は使えず
      (アセンブラ出力自体は出来るが、内部の変数割り付けが、 例えば、int a とかが、
      ・「_#@1234」 みたいな変数
      に展開される(あと、勝手に「コンパイラが生成した、内部作業用の変数も展開される」)ので、もう、
      「人間では追いきれない」状況になってしまう。デバッガとかを通せば、辛うじて追いかけられるが、ソレもちょっと厳しい。)
      「お手上げ状態」
      に、なってしまいます。
      ※最近の高級言語は、み~んなそう。
      もうホント、「コンピュータに使われてる」感じ。

      削除
    3. もうこうなると、「デバッグ」自体も、
      ・コンピュータの助け
      を、借りないと出来ない。
      ※そういう意味では、もう、ホントに、
      ・人間がちまちまコーディングする時代
      は、とっくに終わってて、AIに「プロンプト経由」で指示して
      ・プログラムをジェネレートしてもらう
      時代なのかも知れません・・・
      ※実際、「簡単なプログラム」ならば、ChatGPT で作れちゃうし。

      削除
    4. code書くAIと、debugするAIに戦わせる.
      人間はそれをみてるだけ~
      神だ...

      削除
  2. それをみているのもAIにすると簡単かも
    たまったアニメもAIにみてもらうと楽かな? 暇で困るからアニメみるしかない になってみたい

    返信削除
    返信
    1. >たまったアニメもAIにみてもらう
      ヤフコメ?でしたっけ、要約してくれるAIがあるのは。
      同じように、
      ・今週のアニメを要約してくれるAI
      とかあれば、ウけるかもしれない。

      削除
  3. AI教団あらわる

    返信削除