【问题标题】:Using inouts with wand使用魔杖输入
【发布时间】:2017-12-24 04:18:09
【问题描述】:

考虑下面的代码。

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 中,

tristate ,I = 1,正如预期的那样。

。 , IO = 0, 意外为 IO = I ?

。 , O = 0 ;//= IO 符合预期

。 , OE = 1 // 显然

以平方米为单位,

tristate ,I = 0,正如预期的那样。

。 , IO = 0, 预期为 IO = I

。 , O = 0 ;//= IO 符合预期

。 , OE = 1 // 显然

现在我不明白 m1 中 IO 的值是 0 吗? 是不是因为我将 wand 作为参数传递给 inout,这是否会使 inout 成为 wand 类型,如果是这样,它会引发以下问题,

A link to my another question on stackoverflow

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

【问题讨论】:

  • 剪切粘贴错误?此代码无法编译(请参阅定义 m1 的行),并且没有任何内容被声明为 wand。

标签: verilog inout


【解决方案1】:

此语法不正确:

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工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2015-07-07
    • 2017-10-27
    • 2016-02-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多