Hierarchische Refernzen in SystemVerilog mit Synplify

Gast #4901173
Lesenswert?

Hallo,

in (System)verilog kann man Signale über Hierarchiegrenzen hinweg 
referenzieren, z.B. A.B.C.s, wenn A, B und C hierarchische 
Moduleinstanzen sind und s ein Signal in Modul C. Wenn s ein Vektor ist, 
kann man mit A.B.C.s[i] auf das i-the Element zugreifen.

Ok soweit, aber angenommen, das Modul C wird innerhalb einer generate 
loop mehrmals instanziiert, und es soll nur die Instanz 0 referenziert 
werden. Ich hätte erwartet, dass die Referenz A.B.C[0].s heißt, aber das 
funktioniert nicht. "Could not resolve hierarchical reference" lautet 
der Fehler bei Synplify. Offenbar wird die Instanz C anders indiziert 
als mit [0]. Weiß jemand, wie die korrekte Referenz heißt?
Gast #4901539
Lesenswert?

Nicht das Module wird indiziert sondern der darüber liegende begin..end 
block.
1
  for( ... )
2
    begin
3
      ModuleName C( .. )
4
    end

Hier also A.B.xxxxx[0].C.s
Da kein Block Name definiert ist, denkt sich Synplify einen aus und du 
darfst raten.

Also besser:
1
  for( ... )
2
    begin:BLK
3
      ModuleName C( .. )
4
    end

-> A.B.BLK[0].C.s
Gast #4901619
Lesenswert?

Genau das habe ich mittlerweile auch herausgefunden, aber leider 
funktioniert es trotzdem nicht. Die for-Schleife hat einen Namen wie in 
Deinem Bespiel und ich habe die Referenz nach dem Schema A.B.BLK[0].C.s 
benannt, aber es gibt immernoch den "Could not resolve hierarchical 
reference"-Fehler.

Es gibt wohl eine Synplify-Option, die die Indizierung von den eckigen 
Klammern in etwas anderes ändert. Der Aufruf wäre dann z.B. 
A.B.BLK_0__C.s. In den Scripten kann ich die change_name-Option aber 
irgens finden (die Scripten sind recht lang und nicht von mir), deswegen 
sollten die ecjigen Klammern eigentlich funktionieren.

Ich muss einfach mal weitersuchen. Es ist sowieso ein Wahnsinn, 
hierarchische Referenzen außerhalb der Simulation zu verwenden, aber der 
Code ist nun mal so.
Gast #4901673
Lesenswert?

Vancouver schrieb:

> Es ist sowieso ein Wahnsinn,
> hierarchische Referenzen außerhalb der Simulation zu verwenden, aber der
> Code ist nun mal so.

Hatte ich mir verkniffen anzumerken.
Zu Debugzwecken einzelne Signal auf Pins rauszuschalten ist imo die 
einzige gerade noch sinnvolle Anwendung.


Bei Lattice Diamond muss ich es im Constraintfile d.h ausserhalb von 
Synplify folgendermassen referenzieren:
A/B/BLK[0].C/s

Im Code habe ich bisher nie ausserhalb der Simulation gemacht, wie du 
schreibst das ist fortgeschrittener Wahnsinn.
Gast #4901809
Lesenswert?

Vancouver schrieb:
> A.B.BLK_0__C.s. In den Scripten kann ich die change_name-Option aber

In der Synplify Hilfe finde ich keine change_name option.

Relevante settings könnten sein:

set_hierarchy_separator
bus_naming_style
bus_dimension_separator_style

Das Beispiel in der Hilfe für bus_naming_style ersetzt A[0] durch A_0.
(gehört wenn ich es richtig sehe in den constraint file)
Gast #4902501
Lesenswert?

Danke, das probiere ich mal aus. ich muss auch zugeben, dass ich bei 
Synplify noch etwas "newbie" bin.

Zum Thema Wahnsinn: Die betreffenden Signale sollen auf einen 
Debug-Stecker für den Logicanalyzer gelegt werden. Das kann man mit viel 
gutem Willen noch akzeptieren, wenn es eine temporäre Lösung ist und 
nach erfolgtem Debugging wieder verschwindet. Aber trotzdem verursacht 
das viele Probleme, wenn sich der Code ändert und die herausgezogenen 
Signale plötzlich nicht mehr existieren.  Die Kollegen, die das 
implementiert haben, sind natürlich weg und entziehen sich somit ihrer 
Läuterung.
Gast #4903687
Lesenswert?

Vancouver schrieb:
> Die betreffenden Signale sollen auf einen
> Debug-Stecker für den Logicanalyzer gelegt werden.
Ich hab das unter VHDL eine zeitlang mit einem globalen Package gelöst:
1
library ieee;
2
use ieee.std_logic_1164.all;
3

4
package global_signals is
5

6
    signal global_break    : std_ulogic;
7
    signal global_ready    : std_ulogic;
8
    signal global_timeout  : std_ulogic;
9
    ....
10

11
end package global_signals;

Das Package wurde an den benötigten Stellen eingebunden. Im top-Modul 
wurden die Signale gelesen und auf den debug-Port ausgegeben und im tief 
vergrabenen Submodul wurde die Signale geschrieben.
Mit Xilinx war das synthetisierbar.

Ich könnte mir vorstellen, das sowas in SystemVerilog auch geht.

Duke

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