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.
Wenn Sie einen beliebigen Port als Eingang verwenden müssen, sollten Sie Folgendes beachten:
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