Forum: FPGA, VHDL & Co. VHDL: Nutzung eines Verilog Moduls dessen Ports keine validen VHDL identifier sind.


von M. Н. (Gast)


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.

von Gustl B. (gustl_b)


Lesenswert?

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);

: Bearbeitet durch User
von M. Н. (Gast)


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!

von Gustl B. (gustl_b)


Lesenswert?

M. Н. schrieb:
> ob man Verilog Module in VHDL ohne component instanziieren kann.

Ja, so wie VHDL Komponenten.

Instanzname : entity library.Komponentenname
   port map ...

von M. Н. (Gast)


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.

von Vancouver (vancouver)


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.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Mal mit “extended identifiers” versucht? Die sind doch genau dafür da.
1
\counter__out\

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.