2017-07-19 108 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工作。