Forum: FPGA, VHDL & Co. keep-attribute


von P. K. (pek)


Lesenswert?

Hallo zusammen

ich versuche, mittels keep-attribute, ein (Debug-)Signal vor dem 
Wegsynthetisieren zu bewahren (Quartus), damit ich's im SignalTap 
darstellen kann. Mein Versuch
1
  attribute keep               : boolean;
2
  attribute keep of WdcEventxS : signal is true;
fruchtet aber nicht, das Signal ist nach der Synthese trotzdem weg.

Während der Synthese erhalte ich die (eigentlich erwartete, da noch 
nicht im SignalTap) message/warning:

Warning (10036): Verilog HDL or VHDL warning at procmux.vhd(165): object 
"WdcEventxS" assigned a value but never read

Wie sag' ichs meinem Synthesizer?

von Klaus F. (kfalser)


Lesenswert?

Welcher Compiler?

Für Xilinx jedenfalls gilt :
attribute keep               : string;
attribute keep of WdcEventxS : signal is "true";

Docu ist Xilinx "Constraint Guide" (cgd.pdf)

von P. K. (pek)


Lesenswert?

Nein, das ist's nicht, bei Altera ist's ein Boolean, das müsste stimmen.
Habe aber folgende Bedingung im Manual überlesen:

> You cannot use this synthesis attribute for signals that have no fan-out.

Wie also mache ich das Signal verfübar, ohne künstlich nicht benötigten 
Fanout einzubauen?

von SuperWilly (Gast)


Lesenswert?

"Virtual Pin"

von Cihan K. (lazoboy61)


Lesenswert?

Das Problem mit dem Wegsynthesieren hatte ich auch bei Chipscope. Ich 
wollte Signale betrachten, die vorerst keine Verwendung im weiteren 
Programm hattem, die ich aber zur Verständnis gebraucht habe.

Habe es dann folgendermaßen gelöst:
Ich habe einfach einen Output-Pin deklariert, welches ich mit meinem 
Signal kombinierte, um die Wegoptimierung zu blockieren.

Bsp.:
1
entity Bsp is
2
Port (
3
      ...
4
      Test_Out : std_logic;
5
      ...
6
      );
7
end Bsp;
8
9
architecture Behavioural of Bsp is
10
...
11
signal bsp_signal: std_logic; -- Signal was normalerweise wegoptimiert wird
12
...
13
14
begin
15
...
16
17
process(clk)
18
begin
19
...
20
if bsp_signal = '1' then      -- Wegoptimierte Signal wird abgefragt,
21
   Test_Out <= '1';           -- sodass dadurch eine Verwendung da ist
22
else
23
   Test_Out <= '0';
24
end if;
25
...
26
end process;
27
...
28
end Behavioural;

In diesem Prinzip mache ich es mit allen Signalen, die ich in Chipscope 
betrachten will. So wird auch nichts wegoptimiert. Ist natürlich nicht 
die beste Lösung, aber sie funktioniert. Mit keep-hirarchie hatte ich es 
auch versucht, doch ohne Erfolg.

Benutze selber Xilinx Virtex 5 als FPGA mit ISE Webpack 14.1. Würde auch 
an einer besseren Lösung interressiert sein.

Gruß Cihan

von J. S. (engineer) Benutzerseite


Lesenswert?

In der Regel sollte ein keep Constraint (hart oder soft = "S") reichen. 
Leider scheinen sich die Xilinx Tools nicht untereinander zu verstehen, 
denn ich habe auch aktuell wieder einen Fall, wo ein halber Bus 
verschwindet, obwohl er ausdrücklich erhalten werden sollte und die 
Xilinx Synthese auf "keep hierarchy = Yes/Soft" steht, was bei anderen 
Signalen funktioniert.

Das seltsame ist, dass das eigentliche Trimming erst im MAP-Prozess 
erfolgen soll, bzw. dort wegklickbar ist, obwohl das ChipScope schon 
nach der Synthese ins Spiel kommt und eigentlich kein getrimmtes Design 
vorfinden sollte.

Ich habe mich dann eine Weile so beholfen, wie Cihan es beschreibt.

Wichtig ist, dass man gleiche Signale mit 2 Namen in unterschiedlichen 
Zeitebenen ins ChipScope führt, weil er auch dort sonst wieder ansetzt 
und Busse verschwinden lässt oder den anderen Namen benutzt.

Eine effektive Methode ist es, erst alle benötigten Signale in die 
ChipScope Domain einzutakten - in kritischen Fällen auch über kurze 
aFiFos - und dann die Signale ins CS zu führen. Das löst auch einige 
Timingprobleme, die der Router immer wieder mal hat (obwohl ja TIGs 
gesetzt werden),

von dasdgw (Gast)


Lesenswert?

das Problem kommt mir bekannt vor. :-)

probiers mal mit
1
signal reg1: std_logic;
2
attribute noprune: boolean;
3
attribute noprune of reg1: signal is true;

hat bei mir unter quartus wunderbar funktioniert.

von P. K. (pek)


Lesenswert?

dasdgw schrieb:
> attribute noprune: boolean;

Dummerweise ist es in meinem Fall (WdcEventxS) kein Register, geht also 
wieder nicht ganz ohne Zusatzaufwand. Du siehst, bin ein wenig auf der 
Suche nach einer "schönen" Lösung.

Ich lasse mittlerweile meinen WatchDog-Counter bei WdcEventxS = '1' 
saturieren damit das Signal benutzt wird. Dann kann ich mit "keep" 
arbeiten. Meine Hauptanforderung, keine Änderungen für 
Debug-Instrumentierung in den (übergeordneten) Entities zu haben, ist 
somit erfüllt.

von Daniel M. (daniel__m)


Lesenswert?

für Xilinx hat bei mir bisher immer das Attribute "S" funktioniert 
(steht wohl für SAVE).
1
attribute S        : string;
2
attribute S of xyz : signal is "true";

Dabei ist es egal, ob es ein FF oder ein komb. Signal ist.

von Klaus F. (kfalser)


Lesenswert?

Daniel M. schrieb:
> für Xilinx hat bei mir bisher immer das Attribute "S" funktioniert
> (steht wohl für SAVE).
> attribute S        : string;
> attribute S of xyz : signal is "true";
>
> Dabei ist es egal, ob es ein FF oder ein komb. Signal ist.

Wo hast Du denn diese Information her?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
The KEEP attribute does not block trimming - A common misconception is that 
2
KEEP properties can be used to block signal trimming. The KEEP property can 
3
be used to prevent a signal from being absorbed into a component, but it has 
4
no effect on trimming behavior. The correct attribute to block trimming is 
5
"S" (AKA Save, SAVESIG, NOCLIP).
Aus http://www.xilinx.com/support/answers/23990.htm

von P. K. (pek)


Lesenswert?

keep: A VHDL synthesis attribute that directs Analysis & Synthesis to 
not minimize or remove a particular net when optimizing combinational 
logic.

Aus 
http://quartushelp.altera.com/11.1/mergedProjects/hdl/vhdl/vhdl_file_dir.htm

Allerdings funktioniert es nur, wie bereits erwähnt, wenn das Netz nicht 
"dangling" ist, sprich wieder auf ein Register geht.

von T. M. (xgcfx)


Lesenswert?

Lothar Miller schrieb:
> The KEEP attribute does not block trimming - A common misconception is that
> KEEP properties can be used to block signal trimming. The KEEP property can
> be used to prevent a signal from being absorbed into a component, but it has
> no effect on trimming behavior. The correct attribute to block trimming is
> "S" (AKA Save, SAVESIG, NOCLIP).
> Aus http://www.xilinx.com/support/answers/23990.htm

Danke, gut zu wissen. Ich bin bis jetzt davon ausgegangen, dass KEEP 
(wie der Name mir zumindestens suggeriert), dafür sorgt, dass Logik 
nicht optimiert wird. Schade ist nur, dass es bei Altera scheinbar 
wieder anders aussieht :-/

von Klaus F. (kfalser)


Lesenswert?

Lothar Miller schrieb:
> The KEEP attribute does not block trimming - A common misconception is that
> KEEP properties can be used to block signal trimming. The KEEP property can
> be used to prevent a signal from being absorbed into a component, but it has
> no effect on trimming behavior. The correct attribute to block trimming is
> "S" (AKA Save, SAVESIG, NOCLIP).
> Aus http://www.xilinx.com/support/answers/23990.htm

Toll, wer sucht, der findet.
In der Constraint User Guide steht jedenfalls nix drinnen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Klaus Falser schrieb:
> Toll, wer sucht, der findet.
Da sind sicher noch einige andere solcher Perlen unterwegs...  ;-)

Das mit dem neuen Parser für die "alten" S3 und V5 dürfte sich 
zwischenzeitlich rumgesprochen haben...
http://www.lothar-miller.de/s9y/archives/79-use_new_parser-YES.html

von P. K. (pek)


Lesenswert?

Klaus Falser schrieb:
> Für Xilinx jedenfalls gilt :
> attribute keep               : string;
> attribute keep of WdcEventxS : signal is "true";

Diesmal begegnet mir die Sache auf Xilinx, und ich benutze das genau wie 
oben beschrieben:
1
  attribute keep                : string;
2
  attribute keep of CurRdFpVxSO : signal is "true";  -- Required in .sdc

Ich brauche das Ganze, um einen Multicyclepfad durch dieses Signal zu 
setzen zu setzten. Das Tool ist Vivado 2013.1, und das Keep funktioniert 
zur Zeit nicht. Muss ich noch irgendwo ein Enable setzen?
Im Synthesis-Log habe ich keine Hinweise gefunden, warum das Statement 
ignoriert wird (kein "ignored" oder so), ich finde aber auch nichts 
relevantes, wenn ich nach "keep" oder "Attribute" suche.
Muss allenfalls eine bestimmte Xilinx-Library in den VHDL-Code?

Mein bestehendes Altera-Pendant funktioniert tipp-topp, die Pfade sind 
also vorhanden...

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.