質問

ここでの擬似コードを使用します。これらのスタイルにあっ長所と短所があります:

と言うあなたがまたはとXOR、追加を行うことができますALUを持っている、と。それは(この場合は1ホット)オペコードに基づいて回答を選択し、その後可能な答えのすべての時間を計算し、コードを持っている方が良いです。

alu_add = a + b;
alu_and = a & b;
alu_or  = a | b;
alu_xor = a ^ b;

...

if(opcode[0])      alu_out = alu_add;
else if(opcode[1]) alu_out = alu_and;
else if(opcode[2]) alu_out = alu_or;
else if(opcode[3]) alu_out = alu_xor;

の代替は、このようにそれをコーディングすることです。

if(opcode[0])      alu_out = a + b;
else if(opcode[1]) alu_out = a & b;
else if(opcode[2]) alu_out = a | b;
else if(opcode[3]) alu_out = a ^ b;

私としても、それを見てきました

alu_add = a + b;
alu_and = a & b;
alu_or  = a | b;
alu_xor = a ^ b;

...

alu_out = 
  ( 8{opcode[0]} & alu_add ) |
  ( 8{opcode[1]} & alu_and ) | 
  ( 8{opcode[2]} & alu_or ) |
  ( 8{opcode[3]} & alu_xor );

彼らは最終的にはほぼ同じ出てくるそこに長所と短所は、どちらかの方法になっているかいますか?

役に立ちましたか?

解決

ロジックと読みやすさのレベルという点でこのことについて考えてみよう。最初の2つの形式は、読みやすさの点では細かいですが、両方の具現化の優先順位は、不必要とロジックのより多くのレベルになります。三番目の形式は、これらのメトリックのいずれかによって、とても素晴らしいではありません。最後に、こっちバイナリコーディングをコーディングワンホットを使用するための明白な理由はありません。ここで私はこれをコーディングしたい方法は次のとおりです。

parameter ALU_ADD = 2'b00;
parameter ALU_AND = 2'b01;
parameter ALU_OR  = 2'b10;
parameter ALU_XOR = 2'b11;

reg [1:0]  opcode;  // 2 bits for binary coding vs. 4 for one-hot

//以降、あなたは常にブロックでます:

case (opcode)  // synopsys parallel_case
    ALU_ADD: alu_out = a + b;
    ALU_AND: alu_out = a & b;
    ALU_OR:  alu_out = a | b;
    ALU_XOR: alu_out = a ^ b;
endcase

ここで私は明示的に「マジックナンバー」を回避し、それが簡単に他の人が何が起こっているか理解するために作る、ALUオペコードに値を割り当てました。私はまた、case文を使用し、1個以下の式を一致させることができるので、何のプライオリティエンコーダが推測されないことを私の合成ツールを伝えるディレクティブを適用しました。 (例えば波形ビューアでシミュレーションした後、それらの値を見て)、これらは些細な操作ですので、私は中間信号(alu_addなど)を指定していなかったが、私はそれらの信号に簡単にアクセスしたいとき、私は頻繁に行ってください。

あなたはに効果から、この記事をcase文の使用方法についての詳細を学ぶことができます優れたサンバーストデザインのサイト(なし所属、ちょうど元学生)。

Verilogのハードウェア記述言語であることを覚えておいてください - 最後に、あなたの質問については、「それは、オペコードに基づいて回答を選択することが可能答えを計算し、コードのすべての時間を持っている方が良いです」。このページのすべての実装は、とにかくすべての時間を、すべてを計算しています。彼らは異なる場合ロジックと読みやすさのレベルです。私の実装が持っていることを示しているこのページ、見てみましょうif-else実装はロジックの3つの追加のレベルを有する操作自体を超えて論理1つのレベル

他のヒント

最初の二つは同じロジックを与えるだろうが、あなたのalu_outブロック(あなたのプライオリティエンコーダは)何の最終if elseを持っていないので、あなたはelseのラッチを取得します。 (これは、Verilogとにかくについても同様です)。あなたのタイミングがタイトである場合は、優先順位エンコーダが意味することを長いパスで問題が発生する可能性があります。

第三版では、タイミングのために良いかもしれより「並列」構造を得るでしょう。それラッチません。

すべての3つのバージョンでは、4つの操作のそれぞれが離れnomatter何オペコードコトコトされます。これは、電力意味合いを持つことになります。

これは最初のバージョンはわかりやすくするために勝利というのが私の意見だし、デバッグするとき、あなたはあなたの波形ビューア内の別々の各操作で取得することができます。タイミング、面積や消費電力の制約が傷つけている場合を除き、読みやすいようではない何かをコーディングにはポイントがありません。

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