VHDL: Nutzung eines Verilog Moduls dessen Ports keine validen VHDL identifier sind.

Gast #7529538
Lesenswert?

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.

Gast #7529579
Lesenswert?

Gustl B. schrieb:

M. H. schrieb:

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)

Ja, kann es.

port map(signal1, signal2, ... , signaln);

Okay. Ich habe die port map umgebaut. Dann hatte ich natürlich noch das Problem, dass ich die Component im VHDL mit dem "falschen Namen" stehen habe. Keine Ahnung, ob das irgendwo definiert ist, ob man Verilog Module in VHDL ohne component instanziieren kann. Ich habe jetzt also mal testweise die Component-Instanziierung durch eine VHDL-Style entity Instanziierung ersetzt, wie hier: https://stackoverflow.com/questions/48172504/can-a-verilog-module-be-instantiated-in-a-vhdl-module-using-entity-instantiation

Xcelium ist immernoch zufrieden, wobei das ja alles frisst.. Der DCNXT scheint es auch zu fressen. Dann bleibt jetzt nur noch aus, zu versuchen, ob es im vollen Flow an allen Stellen klappt.

Vielen Dank!

Gast #7529776
Lesenswert?

Gustl B. schrieb:

Ja, so wie VHDL Komponenten.

Instanzname : entity library.Komponentenname port map ...

1
A component declaration allows an object file with a compatibility layer to be linked (elaborated) into a design model, while a component instantiation with the non-optional reserved word entity would require the module be previously analyzed (compiled) into a VHDL resource library (IEEE Std 1076-2008 11.7 Component instantiation). Verilog modules aren't VHDL library units (13. Design units and their analysis). Design libraries are an implementation defined storage facility for previously analyzed design units (13.2 Design libraries, also see 13.5 Order of analysis).

Eingetlich dürfte das nicht gehen. Glück gehabt.

#7529950
Lesenswert?

Steht in den Lizenzbedingungen explizit drin, dass ihr den Code nichtanfassen dürft? Wir hatten mal einen ähnlichen Fall, wor wir eine kleine Anpassung im Code machen mussten. Das war dem Provider ziemlich egal, solange der RTL-Code nicht weitergegeben wird - weder original noch modifiziert. Und er übernimmt natürlich keine Garantie mehr für die funktionale Korrektheit, aber die Umbenennung eines Portsignals ist ja keine funktionale Änderung.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren