0

考虑下面的代码。

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 类型,如果是这样,它会引发以下问题,

指向我关于 stackoverflow 的另一个问题的链接

我先问了(链接中的问题),但有一些需要添加的澄清,所以我根据一个新问题添加了澄清部分。基本上我想知道 inout 如何表现得像 wand,如果是这样,我如何使 inout 表现得像 wand 而不使用不同的顶级模块来实例化 .

4

1 回答 1

0

此语法不正确:

module m1(.a(inout line_P1$IO));

你应该做

module m1(.a(line_P1$IO));
    inout line_P1$IO;

在 ansi 标准中应该是

module m1(inout .a(line_P1$IO));

虽然我在“vcs”中尝试了 ansi 版本,但没有在那里实现。非ansi工作。

于 2017-07-19T13:55:48.777 回答