【发布时间】:2017-12-04 12:36:28
【问题描述】:
我知道 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
被解释为:
请注意,当 OE 为 0 时,C=SALIDA1 和 SALIDA2。 在 opt pass 期间,opt_merge pass 移除 $2 mux 并生成:
这会断开电路(当 OE 为 0 时 C=SALIDA1)。我意识到这是因为 yosys/ABC 并不真正理解“1'z”输入的后果。 是否可以保留满足以下条件的多路复用器?:
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 的驱动是一样的!合并它们似乎是一个完全有效的转换。使用例如两个不同的使能信号 OE1 和 OE2 将阻止 opt_merge 合并两个驱动程序。另外:如果您希望任何人能够重现您正在做的事情,您还必须发布您的 Yosys 脚本。最后:我认为您误解了节目输出中的“BUF”是什么。在您的第一个示例中,只需运行“opt_clean”即可消除 SALIDA1 和 SALIDA2 的 BUF。
-
感谢 Clifford,但这是无效的。当 OE 为 0 时,两个多路复用器($1 和 $2)的输出均为 1'Z。在这种情况下,外界控制 SALIDA1 和 SALIDA2 是什么,输出 C 是 AND(SALIDA1 AND SALIDA2)。在优化电路中C==SALIDA1。我知道这是“有限支持”的一部分,但无效。我将编辑原始帖子以删除 BUF 内容并提出解决方案。
-
正如我之前所说,您似乎误解了 BUF 在“show”输出中的含义。优化后的输出世界依然控制着 SALIDA1 和 SALIDA2。
-
请阅读我所有的评论。我也将它添加到问题中。电路错了。当 OE=0 时,原始电路是 SALIDA1 和 SALIDA2 之间的 AND。在优化版本中是 SALIDA1 的副本。 SALIDA1 和 SALIDA2 都与外界相连。如果设计表明这些引脚在外部,则综合工具必须格外小心,因为外部世界也会驱动这些引脚。
-
我明白了。感谢您发布脚本。运行“proc”后调用“tribuf”并更新为 git commit 18c030a。
标签: yosys tri-state-logic