PSoC Creator の Verilog-HDL のリダクション演算の不具合 (2)
PSoC Creator のリダクション演算の問題で、回路自体は変更せずに、ゲートを負論理で表現して OR の部分を単項リダクション演算で記述してみたところ、ひとつの式の中に複数のリダクション演算があっても問題なく変換されることが分かりました。
CLA 回路部分を回路自体は変えずに負論理で表現したものを下に示します。
上記の回路では OR-AND の順の構成になっています。
この回路を Verilog-HDL 言語で、(2 項演算子のみを使って) ひとつの式として素直に書き下すと次のようになります。
assign cla[3] = ( ((~g[2]) | m) & (m | (~p[2]) | (~g[1])) & (m | (~p[2]) | (~p[1]) | (~g[0])) & (m | (~p[2]) | (~p[1]) | (~p[0]) | (~cn)) );
「AND」部分は 2 項演算子の「&」、「OR」部分は 2 項演算子の「|」を使っています。
これを PSoC Creator で論理合成し、「.rpt」ファイルから結果を抜き出すと次のようになります。
MacroCell: Name=cla_3, Mode=(Combinatorial) Total # of inputs : 8 Total # of product terms : 4 Clock Enable: True Main Equation : 4 pterms !( g_2 * !m + !m * p_2 * g_1 + !m * p_2 * p_1 * g_0 + !m * p_2 * p_1 * p_0 * cn ); Output = cla_3 (fanout=1)
PSoC3/4/5LP の UDB (Universal Digital Block) の PLD 部分の AND-OR-(INVERT) 形式にフィットするように、正論理で書いた Verilog ソースの記述と同じ形に合成されています。
「OR」部分を Verilog 機能の単項リダクション演算子 (reduction operator) に書き換えると次のようになります。
assign cla[3] = ( (|{~g[2], m}) & (|{m, ~p[2], ~g[1]}) & (|{m, ~p[2:1], ~g[0]}) & (|{m, ~p[2:0], ~cn}) );
これを PSoC Creator で論理合成すると、2 項演算子を使った場合と同一の、誤りのない期待通りの結果が得られました。