keep-attribute

#2802420
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?
#2802723
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
Persönliche Seite #2803297
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),
#2806510
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.
Moderator (Firma: Titel) Persönliche Seite #2806699
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
#2806720
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.
#2806758
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 :-/
#2806918
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.
#3201618
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...

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