アルテラ FPGA に配置する QuartusII (14.1) ツールを使用して合成するため、SystemVerilog で FSM を設計しています。コードをより合理的にするために列挙型宣言を使用しています。
typedef enum logic [7:0] { CMD_INIT,
CMD_WAIT,
CMD_DECODE,
CMD_ILLEGAL,
CMD_CMD0,
... } cmd_st;
...
cmd_st cs, ncs;
...
logic [7:0]
Quartus がこのステート マシンを合成するたびに、タイプの一部にもかかわらずワンホット エンコーディングが作成されるようです。状態を SignalTap に追加する必要がある場合と同様に、すべての状態をシグナル 1 ビット変数 ( cs.CMD_INIT
、cs.CMD_WAIT
など) として取得します。これは通常非常に便利ですが、これらの状態の束といくつかのオーバー値を一度に確認する必要があるため、これらの状態をすべて含めるにはオンチップ メモリが不足しています (8 つをはるかに超えています。50 のように)。 +))。したがって、それらすべてを SignalTap に追加すると、このメモリが大量に消費されます。しかし、 の 8 ビット値を書き留めることができればcs
、他のもののために十分なスペースを確保できます。
Quartus が FSM に 1-hot エンコーディングを使用しないようにする方法がわかりません。設定 (設定 -> コンパイラ設定 -> 詳細設定 (合成...) -> ステート マシン処理) を最小ビット、ユーザー エンコーディング、およびシーケンシャルに変更し、いくつかの状態の値を追加しようとしました。
typedef enum logic [7:0] { CMD_INIT = 8'd0,
CMD_WAIT = 8'd1,
CMD_DECODE = 8'd2,
CMD_ILLEGAL = 8'd3,
CMD_CMD0,
(途中でさらに追加する可能性があるため、すべてではないことに注意してください)
SignalTap が状態の 8 ビットのみを認識するようにするには、他に何をすべきかわかりません (これはおそらく、Quartus にこの FSM を 1hot エンコーディングではなくシーケンシャルとして合成させることに戻ります)