Forum: FPGA, VHDL & Co. force in der Testbench


von Luke (Gast)


Lesenswert?

Hallo Forum,

In Modelsim gibt es ja das Forcekommando mit dem man signale auf einen 
Wert setzen kann.

In meiner Testbench habe ich eine RX und TX Module. Nun möchte ich gern 
einen parity fehler simulieren und somit ein Bit in einem Register 
verändern.
Ich habe mir das Manual zu dem Befehl angesehen, aber leider 
funktioniert er in der Testbench einfach nicht.
1
$force ("Signal", 0);
2
$force nResetAsync, 0;
3
force ("Signal", 0);
4
force Signal 0;

keine von diesen Varianten funktioniert und ich weiß leider keinen Rat.

Danke im Vorraus!

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


Lesenswert?

In welcher Sprache ist diese Testbench geschrieben?
Kannst du mal ein wenig mehr vom Sourcecode zeigen?

von Nürnberger (Gast)


Lesenswert?

Wie man das im script macht, weis ich auch nicht, ich mache das immer 
während der Simulation mit dem force vom Bildschirm / GUI aus.

Ich würde an Deiner Stelle das Signal über ein Oder mit einem Störsignal 
verkoppeln, das mit einem anderen Prozess getriggert wird.

Oder Du generierst ein sporadisches Signal "error", welches ab und zu 
"1" wird. Dann kippst Du gezielt die Leitung um:

error = 0 -> Leitung_Sim = Leitung_Soll;
error = 1 -> Leitung_Sim = not Leitung_Soll;

Wenn Du serielle Signale hast, ist das effektiv. Man kann bei 
DS-Signalen auch die Leitungen tauschen, um das Bit zu kippen:

error = 0 -> LVDS_A_Sim = Line_A; LVDS_B_Sim = Line_B;
error = 0 -> LVDS_A_Sim = Line_B; LVDS_B_Sim = Line_A;

Ich simuliere so immer die CRC, FER - Funktionen.

von Luke (Gast)


Lesenswert?

Danke für eure Antworten!

>In welcher Sprache ist diese Testbench geschrieben?
>Kannst du mal ein wenig mehr vom Sourcecode zeigen?
Die Sprache der Testbench ist VHDL, der Befehl selbst aber afaik 
probritär von Modelsim.
Viel gibt es in der Testbench eigentlich noch nicht ;) Gerade mal 
probeweise ein Signal das ich versuche mit "force" zu setzen und 
Modelsim den Befehl nicht "kapiert" und fehler wie "expecting ;" ,.. 
wirft.

@Nürnberger
Ah das is ein sehr guter Ansatz!
Somit bin ich dann auch nicht auf Modelsim und den force Befehl 
angewiesen.
Dann werd ich das gleich so realisieren ;)

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


Lesenswert?

In VHDL setzt man Signale so:
1
rst: process begin
2
  nResetAsync <= '0';
3
  wait for 100 ns;
4
  nResetAsync <= '1';
5
  wait;  -- forever
6
end process;

Probier das mal aus.

Dazu muss allerdings dein Simulationsmodell als Komponente in die 
Testbench eingebunden werden. Hier habe ich eine Komponente Komplement, 
die getestet werden soll. Ich aktiviere fü 5ns den Reset, und dann gebe 
ich alle 10ns ein neues Muster auf die Eingänge:
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.std_logic_unsigned.all;
4
USE ieee.numeric_std.ALL;
5
6
ENTITY tb_Komplement_vhd IS
7
END tb_Komplement_vhd;
8
9
ARCHITECTURE behavior OF tb_Komplement_vhd IS 
10
  -- Component Declaration for the Unit Under Test (UUT)
11
  COMPONENT Komplement
12
  PORT(
13
    nResetAsync : std_logic;
14
    Eing : IN std_logic_vector(3 downto 0);          
15
    Ausg : OUT std_logic_vector(3 downto 0)
16
    );
17
  END COMPONENT;
18
19
  --Inputs
20
  SIGNAL Eing :  std_logic_vector(3 downto 0) := (others=>'0');
21
  SIGNAL nResetAsync :  std_logic;
22
23
  --Outputs
24
  SIGNAL Ausg :  std_logic_vector(3 downto 0);
25
26
BEGIN
27
  -- Instantiate the Unit Under Test (UUT)
28
  uut: Komplement PORT MAP(  
29
    nResetAsync => nResetAsync;
30
    Eing => Eing,
31
    Ausg => Ausg
32
  );
33
34
  rst: process 
35
  begin
36
           nResetAsync <= '0';
37
           wait for 5 ns;
38
           nResetAsync <= '1';
39
           wait;  -- forever
40
  end process;
41
42
43
  tb : PROCESS
44
  BEGIN
45
          Eing <= x"0";
46
          wait for 10 ns;
47
          Eing <= Eing+1;
48
          wait for 10 ns;
49
          Eing <= Eing+1;
50
          wait for 10 ns;
51
          Eing <= Eing+1;
52
          wait for 10 ns;
53
          Eing <= Eing+1;
54
          wait; -- will wait forever
55
  END PROCESS;
56
57
END;

von Luke (Gast)


Lesenswert?

@Lothar

Danke, das ist schon klar ;)
Es geht mir bei meinem "großen" Design darum, dass ich, um einen Fehler 
zu simulieren ,auf Signals in Enities zugreifen muss die von der 
Hierachie weit hinzen sind und von der Testbench auch nicht erreichbar.
Ich müsste sonst ja das Signal, das ich brauche um einen Fehler zu 
injizieren, von der betreffenden Entity auf die Top Level durch alle 
Instanzen ziehen.

Das kann ich zwar tun und den Port dann bei der Synthese offen lassen, 
nur besonders schön ist das meiner Meinung nach nicht.
Deswegen möchte ich einfach von der Testbench mittels force direkt auf 
die internen signale von instanzen schreiben, ohen in den intanzen die 
Signale über Ports nach außen stellen zu müssen.

Ich hoffe ich hab mich halbegs verständlich formuliert, wenn nicht bitte 
einfach nachfragen ;)

von SuperWilly (Gast)


Lesenswert?

Probier es mal folgendermaßen:

Definiere ein globales Signal in einem Package, binde
das Package in deinem Modul ein, weise diesem globalen
Signal das Signal zu, das du in der Testbench abfragen willst.
In der Testbench kannst du das globale Signal dann abfragen (das Package
muss natürlich auch in der Testbench eingebunden werden).
Bei dieser Methode muss man jedoch höllisch darauf aufpassen, dass man
das globale Signal nicht von mehreren verschiedenen Modulen aus
treibt. (z.B. wenn man ein und dasselbe Module mehrfach instanziiert)

Gruß,
SuperWilly

von Skript (Gast)


Lesenswert?

Evtl. schreibst du direkt ein Modelsim skript (.do, .fdo) mit der 
force-Anweisung?

von SuperWilly (Gast)


Lesenswert?

Nachtrag:
Du kannst natürlich über globale Signale auch Signale treiben.
Dafür könntest du die entsprechende Simulationslogik im Modul
mit --synthesis translate_off  --synthesis translate_on
für die Synthese aussparen.

Gruß,
SuperWilly

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.