我可以避免 opt_merge 删除 BUF 吗? (Yosys 三态解决方法)
Can I avoid opt_merge from removing a BUF? (Yosys tri-state workaround)
我知道 yosys 对三态支持有限,但我正在寻找可能的解决方法。
以下电路:
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
解释为:
TBUF2 parsed tree
注意当OE为0时C=SALIDA1和SALIDA2。
在 opt pass 期间,opt_merge pass 删除 $2 mux 并生成:
TBUF2 optimized
这会断开电路(当 OE 为 0 时,C=SALIDA1)。我意识到这是因为 yosys/ABC 并不真正理解“1'z”输入的后果。
是否可以保留满足以下条件的多路复用器?:
1) 至少有一个输入是1'Z
2) 它的输出驱动一个输入输出引脚
这是重现它的脚本:
read_verilog tbuf2.v
proc
show -format dot -prefix tbuf2_01
opt
show -format dot -prefix tbuf2_02
在proc
之后运行任何opt
命令。
我知道 yosys 对三态支持有限,但我正在寻找可能的解决方法。 以下电路:
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
解释为:
TBUF2 parsed tree
注意当OE为0时C=SALIDA1和SALIDA2。 在 opt pass 期间,opt_merge pass 删除 $2 mux 并生成:
TBUF2 optimized
这会断开电路(当 OE 为 0 时,C=SALIDA1)。我意识到这是因为 yosys/ABC 并不真正理解“1'z”输入的后果。 是否可以保留满足以下条件的多路复用器?:
1) 至少有一个输入是1'Z
2) 它的输出驱动一个输入输出引脚
这是重现它的脚本:
read_verilog tbuf2.v
proc
show -format dot -prefix tbuf2_01
opt
show -format dot -prefix tbuf2_02
在proc
之后运行任何opt
命令。