Forum: FPGA, VHDL & Co. Toggeln in PSL


von Hardwerker (Gast)


Lesenswert?

Hallo,

um die Property Specification Language zu lernen, habe ich ein 
RS-Flipflop in VHDL beschrieben.
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity FlipFlop is
5
  generic (
6
    formal : boolean := true
7
    );
8
  port (
9
    clk  : in  std_logic;
10
    s  : in  std_logic;
11
    r  : in  std_logic;
12
    y  : out std_logic
13
  );
14
end FlipFlop;
15
16
architecture rtl of FlipFlop is
17
  default clock is rising_edge(clk);
18
begin
19
20
  process
21
  begin
22
    wait until rising_edge(clk);
23
    if s='1' and r='0' then
24
      y <= '1';
25
    elsif s='0' and r='1' then
26
      y <= '0';
27
    elsif s='1' and r='1' then
28
      y <= not y;
29
    end if;
30
  end process;
31
  
32
  formal_gen : if formal generate
33
  begin
34
    assert always {s='1' and r='0'} |=> y='1';
35
    assert always {s='0' and r='1'} |=> y='0';
36
    --assert always (r='1' and s='1' and y='1') |=> y='0';
37
    --assert always (r='1' and s='1' and y='0') |=> y='1';
38
    assert always (r='1' and s='1') |=> ; -- Was muss da hin?
39
  end generate;
40
41
end rtl;
Wie kann ich vorgeben, dass y in jedem Takt umschalten (toggeln) muss, 
wenn r=s=1 ist? Mit den auskommentierten Zeilen funktioniert es, aber
y='1' |=> y='0'
y='0' |=> y='1'
finde ich redundant. Es geht ja nur um y[next]=not y[now].

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


Lesenswert?

Hardwerker schrieb:
> habe ich ein RS-Flipflop in VHDL beschrieben.
Das hat aber normalerweise keinen Takt. Könnte es sein, dass du ein 
JK-Flipflop meinst?

Evtl. helfen dir bei deinem Problem Attribute weiter. Such mal dort ab 
S'delayed:
https://www.csee.umbc.edu/portal/help/VHDL/attribute.html

: Bearbeitet durch Moderator
von Hardwerker (Gast)


Lesenswert?

Lothar M. schrieb:
> Hardwerker schrieb:
>> habe ich ein RS-Flipflop in VHDL beschrieben.
> Das hat aber normalerweise keinen Takt. Könnte es sein, dass du ein
> JK-Flipflop meinst?
Ja, stimmt. Ein JK-Fliflop mit R- und S-Eingängen. :-)
Aber die Beschreibung ist ja einfach genug, um zu erkennen, was gemeint 
ist.

Lothar M. schrieb:
> Evtl. helfen dir bei deinem Problem Attribute weiter.
Es müsste auch mit PSL gehen, aber als Alternative könnte das vielleicht 
funktionieren. Danke, ich probiere es mal aus.

von Hardwerker (Gast)


Lesenswert?

Leider funktioniert das nicht. Es sieht so aus, als ob GHDL 'delayed und 
'event nicht verarbeiten kann. Die anderen Attribute scheinen nicht 
zielführend zu sein.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Ich hab eine Weile schon kein PSL mehr gemacht, aber ich meine dass dir 
da nichts anderes uebrig bleibt als beide Zustaende zu beschreiben:
1
assert always (r='1' and s='1' and j='1') |=> y='0';
2
assert always (r='1' and s='1' and j='0') |=> y='1';

Was auch funktionieren koennte ist etwas in der Form:
1
assert always (r='1' and s='1') |=> y /= prev(y);

Falls das zweite funktioniert, dann hat es allerdings ein paar Probleme 
falls y auch Werte die nicht '1' oder '0' sind annehmen kann.

von Hardwerker (Gast)


Lesenswert?

Tobias B. schrieb:
> Was auch funktionieren koennte ist etwas in der Form:
> assert always (r='1' and s='1') |=> y /= prev(y);
Es funktioniert. Vielen Dank.
Probiert hatte ich es mit next, aber das gab entweder Syntaxfehler oder 
hat nicht funktioniert.
y=not prev(y) funktioniert auch.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Hardwerker schrieb:
> y=not prev(y) funktioniert auch.

Ahh, das ist gut zu wissen und sicher die bessere Loesung! Super. :-)

Kleiner Buchtipp:

"Using PSL/Sugar for Formal and Dynamic Verification (2nd Edition)" von 
Ben Cohen. Ist didaktisch ein bisschen wild, aber an sich finde ich den 
Schinken ganz gut.

: Bearbeitet durch User
von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Setzt das jemand regelmässig ein?

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #6365115:
> Setzt das jemand regelmässig ein?

Definitiv ja, sowohl PSL als auch SVA (aktuell jedoch nicht von mir 
persoenlich). Gerade wenn groessere Systeme getestet werden mit 
komplexen Bussystemen, ist Assertion Based Verification ein enorm 
maechtiges Werkzeug und via PSL lassen sich recht praegnante Assertions 
definieren ohne am Code rumfummeln zu muessen (das Ziel von PSL war auch 
immer einen dokumentativen Charakter zu haben - ob der Syntax dazu 
geeignet ist sei mal dahin gestellt ;-)).

Man stelle sich mal vor man entwickelt ein AXI IP Core. Dann wuerde man 
im ersten Schritt wohl am AXI Bus entsprechende Assertions definieren 
(evtl. sogar als IP Template). Am Ende der Entwicklung kann man den IP 
dann z.B. mit Garbage Daten fuettern und schauen ob er sich auch unter 
extremen Bedingungen AXI konform verhaelt. Das waere ein klassischer 
Fall fuer ABV in dem ich nicht den klassischen Testvektoren rein / 
Testvektoren raus / Vergleich mit Golden Sample Ansatz haben. Wenn man 
sich dann noch die Maechtigkeit von PSL anschaut, liegt es nahe das auch 
zu verwenden.

Kleiner Hinweis: Mit VHDL-2019 wird das Ganze dann nochmal maechtiger, 
siehe:

https://vhdlwhiz.com/vhdl-2019/#new-psl-attributes-and-functions

von Hardwerker (Gast)


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #6365115:
> Setzt das jemand regelmässig ein?
Noch nicht. Ich teste gerade, ob es sinnvoll ist.

Tobias B. schrieb:
> Man stelle sich mal vor man entwickelt ein AXI IP Core. Dann wuerde man
> im ersten Schritt wohl am AXI Bus entsprechende Assertions definieren
> (evtl. sogar als IP Template). Am Ende der Entwicklung kann man den IP
> dann z.B. mit Garbage Daten fuettern und schauen ob er sich auch unter
> extremen Bedingungen AXI konform verhaelt.
Sowas wäre mein Ansatz. Man definiert einmal einen Satz von Annahmen zum 
Beispiel für häufig benutzte Busse und kann damit automatisch jedes 
Modul, das diesen Bus benutzt auf Korrektheit testen.

von Martin S. (strubi)


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #6365115:
> Setzt das jemand regelmässig ein?

In der GHDL-Community gibt es einige Puristen, die da recht aktiv sind, 
es werden auch aktiv Features in GHDL eingepflegt, im gitter.im-Chat zu 
GHDL kriegt man immer mal Antworten.

PSL kann allerdings bei komplexen SoCs und aufwendigeren Regresstests 
die Co-Simulation/Verification nicht ersetzen, bzw. wird so komplex zu 
unterhalten wie bei SV.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Martin S. schrieb:
> PSL kann allerdings bei komplexen SoCs und aufwendigeren Regresstests
> die Co-Simulation/Verification nicht ersetzen, bzw. wird so komplex zu
> unterhalten wie bei SV.

Das ist eigentlich nicht der Anspruch von PSL, bzw. Aepfel mit Birnen 
verglichen. PSL ist einfach ein Werkzeug um moeglichst einfach komplexe 
Assertions zu definieren.

Ob man jetzt Assertions verwendet oder eine andere Methode zur 
Functional Verification ist erstmal unabhaengig von der Teststrategie. 
Aber alles in allem stimme ich dem voll und ganz zu, mit reinem 
Assertion Based Verification kommt man in komplexen Designs nicht weit.

Wo ein Einsatz allerdings noch Sinn macht ist nicht in der 
Verifikationsphase sondern in der Design Phase. So wie Hardwerker PSL 
verwenden moechte ist es eigentlich genau richtig und hilft ihm Fehler 
moeglichst fruehzeitig zu erkennen. Wenn sein Design fertig ist wird er 
allerdings trotzdem noch Testvektoren erstellen muessen die er durch 
sein Design jagd (ob mittels Co-Simulation oder "klassischen" Verfahren 
sei dann mal dahin gestellt).

: Bearbeitet durch User
von Martin S. (strubi)


Lesenswert?

Tobias B. schrieb:
> Wo ein Einsatz allerdings noch Sinn macht ist nicht in der
> Verifikationsphase sondern in der Design Phase

Test Driven Development mit PSL und VHDL zu machen, ist eine ziemlich 
bloede Idee, da gibt es schon laengst nachhaltigere Ansaetze wo man 
nicht gleich zwei unterschiedliche Sprachen, sondern nur noch Python 
koennen muss.
Dann kann man's in der zweiten Verifikationsstufe immer noch durch einen 
PSL-Check kloppen, wenn's ein Purist verlangt.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Martin S. schrieb:
> Test Driven Development mit PSL und VHDL zu machen, ist eine ziemlich
> bloede Idee, da gibt es schon laengst nachhaltigere Ansaetze wo man
> nicht gleich zwei unterschiedliche Sprachen, sondern nur noch Python
> koennen muss.

Naja, das ist jetzt aber etwa viel Polemik.

Assertions sind sehr wohl in der Design Phase ein wertvolles Werkzeug 
und mittels PSL lassen sich halt relativ einfach sehr komplexe 
Assertions definieren, ohne das Design anfassen zu muessen. Das Problem 
ist wahrscheinlich eher, dass man es Assertion Based Verification nennt, 
obwohl man eher Assertion Based Debugging macht. ;-)

Und natuerlich haengt das auch von diversen anderen Randbedingungen ab, 
wie z.B. den Skills des Entwicklers. Man kann nicht von jedem Entwickler 
erwarten, dass er auch gleichzeitig den Job eines Verification Engineers 
vollumfaneglich beherrscht, obenso vice versa. Und dann ist es doch 
vollkommen in Ordnung wenn in der Design Phase mit Assertions gearbeitet 
wird.

Martin S. schrieb:
> Dann kann man's in der zweiten Verifikationsstufe immer noch durch einen
> PSL-Check kloppen, wenn's ein Purist verlangt.

Ich wuerde das wenn schon in der Design Stufe machen. Z.B. man hat ein 
AXI IP Core Template mit eingebauten AXI Assertions. Der Designer sieht 
dann sofort was vom Core verlangt wird, damit sein IP mit der AXI Welt 
kommunizieren kann. In der Regel ist die Testbench die der Designer 
verwendet nicht die entgueltige Verifikation, idealerweise erstellen 
zwei verschiedene Personen Test und Design. Und leider ist auch TDD 
nicht immer moeglich, z.B. wenn keine Ressourcen verfuegbar sind.

: Bearbeitet durch User
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.