Wie kann ich dem bidirektionalen Port in Verilog einen Wert zuweisen?

7

Ich versuche, in Verilog einen bidirektionalen Port zu verwenden, damit ich Empfangsdaten über diesen senden kann. Mein Problem ist, dass beim Versuch, dem Port innerhalb einer Aufgabe einen Wert zuzuweisen, immer wieder eine Fehlermeldung angezeigt wird.

Was ist der richtige Weg, um diesen Variablentypen einen Wert zuzuweisen?

Mein Code lautet wie folgt:

    module test(value,var);

    inout value;
    output var;
    reg var,value;

    task sendValue;
      begin
        var = 1;
        value = 1;
      end
    endtask

   endmodule

und der Fehler, den ich erhalte, ist: ** Fehler: C: / [...]: (vlog-2110) Unzulässiger Verweis auf einen Nettowert.

Vielen Dank.

HzJavier
quelle

Antworten:

14

Wenn Sie einen Port als Inout verwenden müssen, sollten Sie Folgendes beachten:

  1. Sie können den Inout-Port nicht gleichzeitig lesen und schreiben, daher wird HighZ zum Lesen beibehalten.
  2. inout Port kann NIE vom Typ reg sein.
  3. Es sollte eine Bedingung geben, unter der es geschrieben werden sollte. (Daten in mem sollten geschrieben werden, wenn Write = 1 ist, und sollten lesen können, wenn Write = 0 ist).

Zum Beispiel schreibe ich Ihren Code folgendermaßen.

module test (value, var);
  inout value;
  output reg var;

  assign value = (condition) ? <some value / expression> : 'bz;

  always @(<event>)
    var = value;

endmodule

Übrigens: Wenn var vom Typ Draht ist, können Sie es folgendermaßen lesen:

assign var = (different condition than writing) ? value : [something else];

Wie Sie sehen, gibt es daher keine Einschränkung beim Lesen, aber der Inout-Port MUSS wie oben gezeigt geschrieben werden.

Ich hoffe das erklärt es dir.

wisemonkey
quelle
0

Überprüfen Sie, ob die von Ihnen verwendete Bibliothek Tristate-Treiber enthält - diese habe ich in dieser Situation immer verwendet.

Wenn Sie gezwungen sind, Ihren eigenen Tristate-Treiber zu entwerfen, denken Sie daran, dass die Ausgabe Z sein muss, wenn stattdessen eine Eingabe zulässig sein soll.

user6030
quelle
0

Hier meine 2 Cent,

wire [32-1:0] DATA;//bidireccional port in VERILOG/VHDL
logic put_input_in_bidi;

assign m_sram_if.SRAM_DATA_READ = DATA;//read from inout port
assign DATA = (put_input_in_bidi==1'b1)? m_sram_if.SRAM_DATA_WRITE : 32'hZZZZ_ZZZZ;//write in bidi iout port
assign put_input_in_bidi =     (blabla == 0)  &&  (bobbob == 1);//control write in bidi using master information
Joniale
quelle