2017-07-19 3 views
0

Considérons le code ci-dessous.Utilisation d'inouts avec baguette

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 

Je suis désolé, je sais que cela est beaucoup de code, mais de construire un scénario de test, je ne pouvais pas penser à plus petit que cela. Maintenant, le problème est lorsque le code ci-dessus est simulé,

La valeur des variables sont les qui suit dans m1,

tristate, I = 1, comme prévu.

. , IO = 0, inattendu comme IO = I?

. , O = 0; // = IO comme attendu

. , OE = 1 // évidemment

m2,

tristate, I = 0, comme prévu.

. , IO = 0, attendu comme IO = I

. , O = 0; // = IO comme attendu

. , OE = 1 // évidemment

Maintenant, je ne comprends pas comment la valeur de IO dans m1 est 0? Est-ce parce que je suis baguette repassais comme argument INOUT, cela fait inout un type de baguette, si cela il pose la question suivante,

A link to my another question on stackoverflow

Je demande à la (question lien) d'abord, mais il Il y avait quelques éclaircissements à ajouter, alors j'ai ajouté la partie clarification à une nouvelle question. Fondamentalement, je veux savoir comment inout se comporte comme baguette, et si oui, comment je fais comme inout se comporter comme baguette sans utiliser un autre module supérieur à instancier.

+0

Erreur de copier-coller? Ce code ne compile pas (voir la ligne autour de laquelle m1 est défini) et rien n'est déclaré comme une baguette magique. –

Répondre

0

Cette syntaxe est incorrecte:

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

vous devriez faire

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

dans ansi standard, il devrait être

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

si j'ai essayé ansi la version en 'VCS' et a été pas mis en œuvre là-bas. Non-ansi a travaillé.