MUXシンクロナイザの使用上の注意
前項のMUXシンクロナイザには非同期転送FF間に組合せ回路(図の点線部)が入っているが、en_b=0のときに非同期信号dat_aが変化してもハザードが出ないかを調べる。
なお上図の組合せ回路は1出力に対して3入力,4入力であるが、以下の議論は組合せ回路の選択信号(b_clk同期)や非同期信号(a_clk同期)が複数本ある場合にもあてはまる。
◇
まず、組合せ回路が1個のLUTに収まっている場合を考える。LUTは入力信号をアドレスとする1ビット出力のRAMで、RAMの値を真理値表どおりに書き込めば、任意の組合せ回路が実現できるしくみになっている。
MUXシンクロナイザの組合せ回路において、選択信号が非同期信号を選択してない(en_b=0)とき、出力は非同期信号の値に依存しない。ということは、LUT内では次図のように非同期信号の入力a[*]に対してbとcは同じ値になっている。したがってa[*]の変化時にFETは一瞬両方ONまたは両方OFFになるもののdには同じ値が出続ける。
結局、組合せ回路が1個のLUTに収まっている場合、非同期信号が変化してもハザードは出ない。(本物の回路がこの説明のとおりになっているかわからないのだが、もしハザードが出るようならば実用上困るはずなので、困ってないということはやはりハザードが出ないのだろう)
◇◇
次に、1個のLUTに収まらない場合を考える。ハザードは伝搬遅延差によって起きるから、右側の図のように非同期信号が分岐して合流している場合にハザードが出る可能性がある。
それでもロジック的にはen_bでANDしているので、en_b=0であるかぎりen_b & dat_a = 0になりdat_aのハザードは出ないと信じたい所だが、次図のようにロジック的に冗長な回路を考えれば、en_b=0でもdat_aが変化するとハザードは出てしまう。
普通はこんな冗長な回路は合成されないと思うが、絶対に合成されないという保証もないので、安全のため組合せ回路が1個のLUTに収まるように、冒頭の4入力以下の回路に限定して使った方がよい。(CPLDでは補足のようなことがあった) もちろん4入力以下でも、ロジック的にはいくらでも冗長な回路を作れてしまうのだが、合成ツールはそんな不合理なことはしないだろう。また5入力以上でも冗長回路ができなければよいのだが、いちいち合成結果を見て判定をするのは大変なので、一律にMUXシンクロナイザに必要最小限な4入力にしておいた方がよい。
◇◇◇
(補足) CPLDでハザードが出る例
MAXシリーズCPLDは次図のとおりAND-ORプレーンにXORゲートが付いた回路構造なので、アドレスデコードのように多ビットのANDを取るとハザードが出る回路になった。
例えばANDが最大3入力しかないとして、4入力のANDを取らなければならないとき
hit = en & (a[2:0]==3'b100)
→ hit = (a[1:0]==2'b00) ^ (~en & (a[1:0]==2'b00) | ~a[2] & (a[1:0]==2'b00))
(∵a & b = b ^ (~a & b))
と3入力以下のAND 3個に分解される。このときa[1:0]が分岐して合流しているので、イネーブルでない(en=0)ときでもハザードが出てしまう。