2017-06-30 14 views
2

yosysのトライステートサポートは限られていますが、回避策が考えられます。 次回路:opt_mergeによるBUFの削除を避けることはできますか? (Yosysトライステート回避策)

TBUF2 parsed tree

なお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マルチプレクサを除去し、生成:

TBUF2 optimized

(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 
+0

opt_mergeがどのようにしてあなたの意見で回路を破壊するのか分かりません。 SALIDA1とSALIDA2のドライバは同じです!それらをマージすることは完全に有効な変換であるようです。たとえばを使用します。 2つの異なるイネーブル信号OE1およびOE2は、opt_mergeが2つのドライバをマージすることを防止する。また、あなたがしていることを誰かが再現できるようにしたい場合は、あなたのYosysスクリプトも投稿する必要があります。最後に、私は、あなたが "BUF"がショーの出力にあるものを誤解していると思います。単に "opt_clean"を実行すると、最初の例でSALIDA1とSALIDA2のBUFを取り除く必要があります。 – CliffordVienna

+0

クリフォードありがとうございますが、これは無効です。 OEが0の場合、両方のマルチプレクサ($ 1と$ 2)の出力は1'Zです。この状況では、外部からはSALIDA1とSALIDA2が制御され、出力CはAND(SALIDA1とSALIDA2)になります。最適化された回路C == SALIDA1。私はこれが「限られたサポート」の一部であると理解していますが、有効ではありません。元の投稿を編集してBUFのものを削除し、解決策を提案します。 –

+0

私が前に言ったように、あなたはBUFが "ショー"の出力の意味を誤解しているようです。出力された世界では、最適化されたバージョンのSALIDA1とSALIDA2は引き続き制御されます。 – CliffordVienna

答えて

0

proctribufコマンドを実行することにより、あらゆるを実行する前に$tribuf細胞にトライステートバッファに$mux細胞を変換します3210コマンド。

関連する問題