Guten Tag allerseits,
ich brauche mal Tipps, welche Möglichkeiten ich bei folgender Situation
habe:
seit heute Mittag plagt mich ein akutes Problem:
Ich habe ein für mich unantastbares (zugekauftes) Verilog RTL eines IPs.
Irgendein Held... Und anders kann ich das nicht ausdrücken... hat diesem
Ding in der Toplevel Portliste einen Namen mit zwei Unterstrichen in
Folge verpasst.
Beispiel:
1 | module counter_ip(
|
2 | input clk;
|
3 | output counter__out);
|
4 | ...
|
5 | endmodule
|
In einem VHDL Modul hat dieses Ding eine Component und wird
instantiiert:
1 | ....
|
2 | component counter_ip
|
3 | port (
|
4 | clk : in std_logic;
|
5 | counter__out : out std_logic_vector(31 downto 0)
|
6 | );
|
7 | end component counter_ip;
|
8 | ...
|
Das Ganze hat mittels Cadence Xcelium auch ganz super simuliert und
getan:
Erst jetzt ist in einem anderen Flow aufgepoppt:
counter__out is not a valid identifier.
Da habe ich jetzt erstmal blöd geschaut.
Und siehe da. VHDL Standard aufgemacht und die Bacchus-Naur Form
angeschaut:
1 | A basic identifier consists only of letters, digits, and underlines.
|
2 |
|
3 | basic_identifier ::=
|
4 | letter { [ underline ] letter_or_digit }
|
5 | letter_or_digit ::= letter | digit
|
6 | letter ::= upper_case_letter | lower_case_letter
|
7 |
|
8 | All characters of a basic identifier are significant, including any underline character inserted between a letter
|
9 | or digit and an adjacent letter or digit. Basic identifiers differing only in the use of corresponding uppercase
|
10 | and lowercase letters are considered the same.
|
Verdammt! Zwei Unterstriche sind nicht valide in einem Namen.
Genausowenig wie ein Name, der auf einen Unterstrich aufhört (das fährt
irgnedwo auch noch rum).
Das Problem ist, das ist bis heute Mittag nicht aufgefallen, weil
Xcelium das einwandfrei kompiliert und simuliert, weil ja für die ganzen
Tool-Hersteller der VHDL Standard nicht mehr als so eine grobe
Richtlinie ist. Ich kotze.
Der andere Flow ist jetzt aber Standardkonform und weigert sich
(offenbar zurecht).
Welche Möglichkeiten habe ich, das zu lösen?
* Dem Lieferanten des IPs am Montag ne Mail schreiben, dass sie ihr
Toplevel bitte anpassen. Wird im Zweifelsfall teuer, da alles bereits
abgewickelt und nacharbeiten sind ja immer vergoldet.
Und in Code, der mir nicht gehört kann ich lizenzbedingt nicht drin
rumfummeln.
* Einen eigenen Verilog-Wrapper drumherumstricken, der die Ports
sinnvoll umbenennt.
Da habe ich aber Probleme, dass dann im Instanzpfad eine Hierarchieebene
mehr drin ist, und das an allen Stellen
(Verifikations-Probes, Verifikations-Forces, Synthese Constraints,
Place&Route constraints)
alles kaputtmachen würde.
* Kann VHDL vielleicht irgndwie wie Verilog diesen unangenehmen Weg,
dass man Ports nicht per Namen, sondern nach Position in der Portliste
mappt oder sowas? Sodass man den Namen nicht schreiben muss?
(Verzweiflungstat)
Mein aktueller Ansatz:
Das Modul, wo die Instanz drin ist ebenfalls in Verilog nachzubauen und
abschließend mittels Formality die formale Äquivalenz zum originalen
VHDL nachweisen. Das würde mich aber mindestens 2 eher 3 Tage kosten.
Und bevor ich das jetzt anfange, lieber mal hören, was andere sagen.
Das Ticket, ob man diese "Standard compliance" in meinem anderen Flow
abdrehen kann ist bereits bei Toolhersteller in Klärung... Sieht aber
schlecht aus.
Gesegneten unterstrich-freien Sonntag euch allen.