2017-07-19 105 views
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 //明显

现在我不明白IO中m1的值是如何为0? 是不是因为我传递棒作为参数传递给INOUT,也使INOUT一棒型,如果因此它回避以下问题,

A link to my another question on stackoverflow

我问(链路问题)第一,但有是需要补充的一些澄清,所以我根据一个新问题添加了澄清部分。 基本上我想知道inout的行为如何像魔杖一样,如果是这样的话,我怎样才能使inout的行为像魔杖一样,不需要使用不同的顶层模块来实例化。

+0

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

回答

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