2008-09-03 14 views
3

Veriogで4対1の関数を実装する必要があります。入力は4ビットで、0〜15の数値です。出力は1ビットの0または1です。各入力は異なる出力を提供し、入力から出力へのマッピングはわかりますが、入力と出力自体は分かりません。私はvcsにコードの最適化を成功させ、できるだけ短く/素直にしたいと思っています。これまでの私の解決策:Verilogで4対1の関数を効率的に合成

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-マップを認識するかどうかはわかりません。これは、ケース・ステートメントまたは結合通常の形式での割り当てと同様に機能しますか?

答えて

5

あなたが持っているものは大丈夫です。ケース・ステートメントも同様に機能します。それはあなたがどのように表現力豊かになりたいかの問題です。

選択エンコーディングが特別な意味を持たない場合(たとえば、メモリアドレスセレクタなど)、ソリューションが適切に機能します。 selectエンコーディングがデザイナーに特別なセマンティックな意味を持っている場合(そしてあまり多くはありません)、caseステートメントとenumsを使います。

合成は賢明ですが、どちらを使用するかは関係ありません。まともな合成ツールであれば、同じ結果が得られます。

2

私の好み - あなたの問題には意味がある - enumsや `definedを使ったcase文です。コードレビュー、メンテナンス、検証を容易にするもの。

3

私はダラスと全く同意します。ケース・ステートメントを使用すると、意思決定が明確になります。合成ツールはルックアップテーブルとして作成し(パラレルの場合)、可能な限り最適化します。

また、RTLコードを短くすることについても心配しません。私は最初に明快に撮影したいと思います。合成ツールは、あなたが思っているよりもきれいです...

2

このような場合、RTLの明瞭さはすべて広いマージンで優先されます。 SystemVerilogには、ブロックがcombinational logic、latch、またはflopに合成されるタイミングを明確にするための特別なalwaysディレクティブがあります(RTLと矛盾するRTLを書いた場合、合成ツールでエラーが発生するはずです。エンベロープ自体がピンに伝播しない限り、ハードウェア効率の最も良いエンコード(あなたのトータルデザインの面積を最小限に抑えるエンコーディング)に置き換えられるでしょう。

このアドバイスは一般的なものでもあります。人間がコードを理解しやすくしてください。合成ツールでもコードを理解しやすくなり、より効果的にコードを読み込むことができます文字通りアルゴリズム研究の人年あなたの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 
1

を。 :-)私はちょうど両方のバージョン(ワイヤ遅延のためのファンアウトに基づくモデルを使用しているモジュールのみ)を合成しました。質問からのインデックス作成バージョンは、ケースステートメントよりもタイミングと面積が優れています。 Synopsys DC Z-2007.03-SPを使用します。

関連する問題