2017-07-19 3 views
0

Betrachten Sie den folgenden Code.Verwenden von Inouts mit dem Stift

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 

Es tut mir leid, ich weiß, das ist viel Code ist aber ein Testszenario zu bauen ich von kleineren zu denken, als diese nicht in der Lage war. Das Problem ist jetzt, wenn der obige Code simuliert wird,

Der Wert der Variablen die folgenden In m1,

Tri-State, I = 1, wie erwartet.

. , IO = 0, unerwartet als IO = I?

. , O = 0; // = IO wie erwartet

. , OE = 1 // offensichtlich

In m2,

Tri-State, I = 0, wie erwartet.

. , IO = 0, erwartet als IO = I

. , O = 0; // = IO wie erwartet

. , OE = 1 // offensichtlich

Jetzt verstehe ich nicht, wie der Wert von IO in m1 0 ist? Ist es, weil ich Zauberstab als Argument bin vorbei, zu InOut ist, dass inout einen Stab Typ machen, wenn das so ist es die folgende Frage aufwirft,

A link to my another question on stackoverflow

ich die (Frage in Verbindung) zuerst gefragt, aber es Es gab einige Klarstellungen, die hinzugefügt werden mussten, also fügte ich den Klarstellungsteil in Bezug auf eine neue Frage hinzu. Grundsätzlich möchte ich wissen, wie es ist, dass inout verhält sich wie Zauberstab, und wenn ja, wie mache ich inout wie Zauberstab ohne ein anderes Top-Modul zu instanziieren.

+0

Ausschneiden und Einfügen Fehler? Dieser Code wird nicht kompiliert (siehe die Zeile, in der m1 definiert ist) und nichts wird als Zauberstab deklariert. –

Antwort

0

Diese Syntax ist falsch:

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

Sie

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

in ANSI-Standard tun sollte sollte es

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

sein, obwohl ich ANSI-Version versucht, in 'VCS' und war dort nicht implementiert. Nicht-ansi hat gearbeitet.

Verwandte Themen