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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.