Manchmal kommt eine Situation in parametrisierten Code, wo ich gegen eine Array-Slice überprüfen möchte, wenn die Breite dieser Slice nicht Null ist. Ich könnte so etwas schreiben:Verilog Null/ungültige Slice-Bereiche in nicht erreichbaren Auswertungen
parameter SLICE_WIDTH;
parameter SLICE_BASE;
logic [my_array_size : 0] my_array;
//...
always_ff @ (posedge clk) begin
if (SLICE_WIDTH==0 || my_array[SLICE_BASE+:SLICE_WIDTH]==0) begin
//alternately "if (SLICE_WIDTH==0 || my_array[SLICE_WIDTH+SLICE_BASE-1:SLICE_BASE]==0) begin"
//do something
end
else begin
//do something else
end
end
Das war die Art, wie ich diese Situationen behandelt, wenn VHDL zu schreiben; Verlass auf Kurzschluss in den konstanten Auswertungen, um zu verhindern, dass der ungültige Array-Bereich jemals bewertet wird. In System Verilog, wie geschrieben, wirft dies in QuestaSim "Bereich der Teileauswahl ist umgekehrt" Fehler und "Bereich Breite kann nicht Null sein" Fehler.
Gibt es eine Möglichkeit, sauber mit Nullbereichen umzugehen, die die meisten Tools akzeptieren, ohne den Inhalt von //do something
in mehrere if-generate-Konstrukte zu duplizieren?
Ich konnte eine Variante der Maskierung für diese Instanz verwenden, obwohl es schade ist, dass es keinen saubereren allgemeinen Fall gibt. Ich nehme an, ich könnte ein Generat verwenden, um die Bedingung in ein intermediäres Netz zu kombinieren, ohne viele Zeilen sequentieller Logik zu klonen. – QuantumRipple