考虑下面的代码。
module TriState
(
// Outputs
O,
// Inouts
IO,
// Inputs
OE, I
);
parameter width = 1;
input OE;
input [width-1:0] I;
output [width-1:0] O;
inout [width-1:0] IO;
assign IO = (OE) ? I : { width { 1'b1 } };
assign O = IO;
endmodule // TriState
module m1(.a(inout line_P1$IO));
reg val_P1 ;
wire line_P1$IO,line_P1$O;
TriState #(.width(32'd1)) line_SCL(.I(val_P1),
.OE(1),
.O(line_P1$O),
.IO(line_P1$IO));
always @(*) begin
val_P1 <= 1;
end
endmodule //m1
module m2(.a(inout line_P1$IO));
reg val_P1 ;
wire line_P1$IO,line_P1$O;
TriState #(.width(32'd1)) line_SCL(.I(val_P1),
.OE(1),
.O(line_P1$O),
.IO(line_P1$IO));
always @(*) begin
val_P1 <= 0;
end
endmodule //m2
module top();
wand P1;
assign P1 = 1;
m1 ins1(.a(P1));
m2 ins2(.a(P1));
endmodule //top
对不起,我知道这是很多代码,但要构建一个测试场景,我想不出比这更小的。现在的问题是在模拟上面的代码时,
变量的值如下 在m1中,
三态,I = 1,正如预期的那样。
. , IO = 0, 意外为 IO = I ?
. , O = 0 ;//= IO 符合预期
. , OE = 1 // 显然
平方米,
三态,I = 0,正如预期的那样。
. , IO = 0, 预期为 IO = I
. , O = 0 ;//= IO 符合预期
. , OE = 1 // 显然
现在我不明白 m1 中 IO 的值是 0 吗?是不是因为我将 wand 作为参数传递给 inout,这是否会使 inout 成为 wand 类型,如果是这样,它会引发以下问题,
我先问了(链接中的问题),但有一些需要添加的澄清,所以我根据一个新问题添加了澄清部分。基本上我想知道 inout 如何表现得像 wand,如果是这样,我如何使 inout 表现得像 wand 而不使用不同的顶级模块来实例化 .