2
yosysのトライステートサポートは限られていますが、回避策が考えられます。 次回路:opt_mergeによるBUFの削除を避けることはできますか? (Yosysトライステート回避策)
はなおOEが0 C = SALIDA1とSALIDA2:
module TBUF2
(
inout SALIDA1,
inout SALIDA2,
input OE,
output C);
assign SALIDA1=OE ? 1'b0 : 1'bZ;
assign SALIDA2=OE ? 1'b0 : 1'bZ;
wire e;
assign e=SALIDA1 & SALIDA2;
assign C=e;
endmodule
はとして解釈されます。 OPTのパスの間、opt_mergeパスが$ 2マルチプレクサを除去し、生成:
(OE 0、次いでC = SALIDA1ある場合)これは、回路を破壊します。これは、yosys/ABCが「1'z」入力の結果を実際に理解していないためであることがわかります。 は、それが次の基準を満たしてマルチプレクサを維持することができる?:
1)少なくとも1つの入力が1'Z
2である)、その出力がここでINOUTピン
を駆動して再現するスクリプトですそれ:
read_verilog tbuf2.v
proc
show -format dot -prefix tbuf2_01
opt
show -format dot -prefix tbuf2_02
opt_mergeがどのようにしてあなたの意見で回路を破壊するのか分かりません。 SALIDA1とSALIDA2のドライバは同じです!それらをマージすることは完全に有効な変換であるようです。たとえばを使用します。 2つの異なるイネーブル信号OE1およびOE2は、opt_mergeが2つのドライバをマージすることを防止する。また、あなたがしていることを誰かが再現できるようにしたい場合は、あなたのYosysスクリプトも投稿する必要があります。最後に、私は、あなたが "BUF"がショーの出力にあるものを誤解していると思います。単に "opt_clean"を実行すると、最初の例でSALIDA1とSALIDA2のBUFを取り除く必要があります。 – CliffordVienna
クリフォードありがとうございますが、これは無効です。 OEが0の場合、両方のマルチプレクサ($ 1と$ 2)の出力は1'Zです。この状況では、外部からはSALIDA1とSALIDA2が制御され、出力CはAND(SALIDA1とSALIDA2)になります。最適化された回路C == SALIDA1。私はこれが「限られたサポート」の一部であると理解していますが、有効ではありません。元の投稿を編集してBUFのものを削除し、解決策を提案します。 –
私が前に言ったように、あなたはBUFが "ショー"の出力の意味を誤解しているようです。出力された世界では、最適化されたバージョンのSALIDA1とSALIDA2は引き続き制御されます。 – CliffordVienna