Wie weist man dem bidirektionalen Port in Verilog einen Wert zu?

Ich versuche, einen bidirektionalen Port in Verilog zu verwenden, damit ich Daten darüber senden und empfangen kann. Mein Problem ist, dass ich beim Versuch, dem Port innerhalb einer Aufgabe einen Wert zuzuweisen, immer wieder eine Fehlermeldung erhalte.

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

Mein Code ist 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 bekomme, ist:

Fehler: C:/[...]: (vlog-2110) Illegale Referenz auf einen Netto-"Wert".

Danke.

Antworten (3)

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

  1. Sie können den Inout-Port nicht gleichzeitig lesen und schreiben, daher zum Lesen auf HighZ gehalten.
  2. inout port kann NIEMALS 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, und sollten gelesen werden können, wenn Write = 0).

Zum Beispiel schreibe ich Ihren Code auf folgende Weise.

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

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

  always @(<event>)
    var = value;

endmodule

BTW Wenn var vom Typ wire ist, können Sie es auf folgende Weise lesen:

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

Daher gibt es, wie Sie sehen können, keine Einschränkung, wie es zu lesen ist, aber inout port MUSS wie oben gezeigt geschrieben werden.

Ich hoffe das erklärt es dir.

Ü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 seine Ausgabe Z sein muss, wenn er stattdessen eine Eingabe zulassen soll.

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