質問

Veriog に 4 対 1 関数を実装する必要があります。入力は 4 ビット、0 ~ 15 の数値です。出力は単一ビット、0 または 1 です。各入力は異なる出力を与え、入力から出力へのマッピングはわかっていますが、入力と出力自体はわかっていません。VC がコードを適切に最適化し、できるだけ短く、整然としたコードになるようにしたいと考えています。これまでの私の解決策:

wire [3:0] a;
wire b;
wire [15:0] c;

assign c = 16'b0100110010111010; //for example but could be any constant
assign b = c[a];

c を宣言しなければならないのは醜いし、vcs がそこにある K マップを認識するかどうかはわかりません。これは、結合正規形の case ステートメントや代入と同様に機能しますか?

役に立ちましたか?

解決

あなたが持っているものは大丈夫です。case ステートメントも同様に機能します。それは、あなたがどれだけ表現力豊かになりたいかということだけです。

選択したエンコーディングに特別な意味がない場合 (メモリ アドレス セレクターなど)、ソリューションであるインデックス付けは正常に機能します。選択エンコーディングが設計者にとって特別な意味を持つ場合 (そして、その数がそれほど多くない場合)、case ステートメントと enum を使用します。

合成に関しては、どちらを使用しても問題ありません。適切な合成ツールであれば、同じ結果が得られます。

他のヒント

私はダラスの意見に完全に同意します。case ステートメントを使用します。意図がより明確になります。合成ツールはそれをルックアップ テーブルとして構築し (並列の場合)、可能な限り最適化します。

また、RTL コードを短くすることについてはあまり心配しません。まず明確にするために撮影します。合成ツールはあなたが思っているより賢いです...

私の好みは、問題にとって意味があるのであれば、enum または `defines を使用する case ステートメントです。コードのレビュー、メンテナンス、検証を容易にするためのあらゆるもの。

このようなものでは、RTL の明瞭さがはるかに優れています。SystemVerilog には、ブロックがいつ組み合わせロジック、ラッチ、またはフロップに合成されるべきかを明確にする特別な always ブロック ディレクティブがあります (また、それと競合する RTL を作成した場合、合成ツールはエラーをスローする必要があります (例:Always ブロックの感度リストにすべての信号が含まれるわけではありません)。また、エンコーディング自体が最上位モジュールのピンに伝播しない限り、このツールはおそらく、使用しているエンコーディングを最もハードウェア効率の高いエンコーディング (デザイン全体の面積を最小化するエンコーディング) に置き換えることにも注意してください。

このアドバイスは一般的にも当てはまります。コードを人間が理解しやすいものにすると、おそらく合成ツールにとっても理解しやすくなり、文字通りの効果をより効果的に発揮できるようになります。 何千もの RTL に影響を与えるアルゴリズム研究の人年数。

必要に応じて三項演算子を使用してコーディングすることもできますが、私は次のようなものを好みます。

always_comb //or "always @*" if you don't have an SV-enabled tool flow
begin 
  case(a)
  begin
    4'b0000: b = 1'b0;
    4'b0001: b = 1'b1;
    ...
    4'b1111: b = 1'b0;
    //If you don't specify a "default" clause, your synthesis tool
    //Should scream at you if you didn't specify all cases,
    //Which is a good thing (tm)
  endcase //a
end //always

どうやら私はひどい合成ツールを使用しているようです。:-) 両方のバージョン(配線遅延のファンアウトに基づくモデルを使用するモジュールのみ)を合成したところ、質問のインデックス付けバージョンの方が、case ステートメントよりも優れたタイミングと面積の結果が得られました。シノプシス DC Z-2007.03-SP を使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top