www.mikrocontroller.net

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


Autor: Luke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
$force ("Signal", 0);
$force nResetAsync, 0;
force ("Signal", 0);
force Signal 0;

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

Danke im Vorraus!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Nürnberger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Luke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In VHDL setzt man Signale so:
rst: process begin
  nResetAsync <= '0';
  wait for 100 ns;
  nResetAsync <= '1';
  wait;  -- forever
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:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

ENTITY tb_Komplement_vhd IS
END tb_Komplement_vhd;

ARCHITECTURE behavior OF tb_Komplement_vhd IS 
  -- Component Declaration for the Unit Under Test (UUT)
  COMPONENT Komplement
  PORT(
    nResetAsync : std_logic;
    Eing : IN std_logic_vector(3 downto 0);          
    Ausg : OUT std_logic_vector(3 downto 0)
    );
  END COMPONENT;

  --Inputs
  SIGNAL Eing :  std_logic_vector(3 downto 0) := (others=>'0');
  SIGNAL nResetAsync :  std_logic;

  --Outputs
  SIGNAL Ausg :  std_logic_vector(3 downto 0);

BEGIN
  -- Instantiate the Unit Under Test (UUT)
  uut: Komplement PORT MAP(  
    nResetAsync => nResetAsync;
    Eing => Eing,
    Ausg => Ausg
  );

  rst: process 
  begin
           nResetAsync <= '0';
           wait for 5 ns;
           nResetAsync <= '1';
           wait;  -- forever
  end process;


  tb : PROCESS
  BEGIN
          Eing <= x"0";
          wait for 10 ns;
          Eing <= Eing+1;
          wait for 10 ns;
          Eing <= Eing+1;
          wait for 10 ns;
          Eing <= Eing+1;
          wait for 10 ns;
          Eing <= Eing+1;
          wait; -- will wait forever
  END PROCESS;

END;

Autor: Luke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Skript (Gast)
Datum:

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

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.