Hallo,
bin gerade dabei eine größere Testbench zu schreiben.
Mir ist bekannt, dass man alle Signale, auch von Komponenten
auflisten und im Wave anzeigen lassen kann.
Ist es nun möglich irgendwie darauf mittels assert(...='0')
zuzugreifen?
z.B:
1
ENTITYtb_user_logicIS
2
ENDtb_user_logic;
3
4
ARCHITECTUREbehaviorOFtb_user_logicIS
5
6
-- Component Declaration for the Unit Under Test (UUT)
7
8
COMPONENTuser_logic
9
PORT(
10
...
11
);
12
ENDCOMPONENT;
13
BEGIN
14
15
-- Instantiate the Unit Under Test (UUT)
16
uut:user_logic
17
PORTMAP(
18
...
19
);
20
21
clk_process:process
22
begin
23
Bus2IP_Clk<='0';
24
waitforclk_period/2;
25
Bus2IP_Clk<='1';
26
waitforclk_period/2;
27
endprocess;
28
29
-- Stimulus process
30
stim_proc:process
31
begin
32
Bus2IP_Reset<=transport'1';
33
-- hold reset state for 3ns.
34
waitforclk_period*3;--totaltime: 3ns
35
Bus2IP_Reset<=transport'0';
36
assert(IP2Bus_Ack='1')report"IP2Bus_Ack!=1, by RAM read Test, Addr:2"severityfailure;
---
Wie kann ich nun also auf das Signal "ready" der Componente x_motor der
Componente uut zugreifen???
Folgendes habe ich probiert, geht aber alles NICHT!!!:
Diese Möglichkeit gibt es in VHDL nicht. Mit einem Assert-Statement kann
nur ein Signal innerhalb desselben Moduls überwacht werden. Deshalb
musst Du die assert-Statements in den einzelnen Modulen "verteilen".
aus der ModelSim-Doku (manchmal lohnt es sich eine Doku tatsächlich):
"init_signal_spy()
The init_signal_spy() utility mirrors the value of a VHDL signal or
Verilog register/net onto an
existing VHDL signal or Verilog register. This allows you to reference
signals, registers, or nets
at any level of hierarchy from within a VHDL architecture (such as a
testbench).
See init_signal_spy for complete details."
Gruß
Joko
> Deshalb musst Du die assert-Statements in den einzelnen Modulen> "verteilen".
"verteilen" - wie ist das gemeint?
Klar, ich kann jedes Modul separat testen.
Aber ich kann nicht in den "normalen" VHDL-Code,
also in einer erzeugten Komponente, Asserts einfügen;
wie soll das gehen?
Ist die einzige Möglichkeit benötigte Signale bis auf
die oberste Instanz durchzuschleifen?
Dann müsste ich die ganzen Components,Entity's usw. ergänzen,
was ja doch sehr aufwändig sein wird...
Modelsim kennt ja die internen Signale,
und kann diese präsentieren,
daher kann ich nicht ganz verstehen, weshalb ich aus
der Testbench nicht darauf zugreifen kann...
Vielleicht hilft ein kleines Beispiel...
Danke und Grüße
Matthias Krüßelin
Nachtrag:
>Aber ich kann nicht in den "normalen" VHDL-Code,>also in einer erzeugten Komponente, Asserts einfügen;>wie soll das gehen?
klar kannst Du: mit
-- synthesis translate_off
blablabla
-- synthesis translate_on
kannst Du jede beliebigen Code für die Synthese
unsichtbar machen - der ist dann nur noch für die
Simulation relevant
Gruß
Noch besser:
Du definierst für deine Simulation ein globales Package mit globalen
Signalen:
package global_probes is
signal probe_ls_signal_in_deep_hierarchy : std_logic;
end package;
Das Signal, das du beobachten willst, wird diesem globalen Signal
zugewiesen (in der Komponente)
--synthesis_off
probe_ls_signal_in_deep_hierarchy <= ls_signal_of_interest;
--synthesis_on
In deiner Testbench und in deiner Komponente bindest du nun das globale
Package ein:
library work;
use work.global_probes.all;
Nun kannst du bequem in der Testbench deine Assert-Abfragen vornehmen:
assert probe_ls_signal_in_deep_hierarchy='0' ....
Gruß,
SuperWilly
Hi,
@Joko: vielen Dank, habe Deinen Beitrag erst nach meinem Eintrag
gelesen, sorry...
Vielen Dank für die schnelle Hilfe :-)
Grüße
Matthias Krüßelin
Nun zur Vervollständigung:
SuperWilly wrote:
> Du definierst für deine Simulation ein globales Package mit globalen> Signalen:>> package global_probes is> signal probe_ls_signal_in_deep_hierarchy : std_logic;> end package;>> Das Signal, das du beobachten willst, wird diesem globalen Signal> zugewiesen (in der Komponente)> --synthesis_off> probe_ls_signal_in_deep_hierarchy <= ls_signal_of_interest;> --synthesis_on
Wie funktioniert das mit dem global package dann, wenn von einer
Komponente mehrere Instanzen vorhanden sind?
Gibt es dann nicht einen Namenskonflikt?
>Wie funktioniert das mit dem global package dann, wenn von einer>Komponente mehrere Instanzen vorhanden sind?>Gibt es dann nicht einen Namenskonflikt?
Wenn man die Instanz eindeutig (bspw. über ein Generic) identifizieren
kann, so kann man in der Komponenten-Beschreibung folgendes machen:
--Beispiel: 5 Instanziierungen einer Komponente, nur das Signal in
--Instanziierung 1 soll sichtbar gemacht werden.
p_ProbeMap: process(ls_signal_of_interest)
begin
if gComponentNumber=1 then
probe_ls_signal_in_deep_hierarchy <= ls_signal_of_interest;
else
probe_ls_signal_in_deep_hierarchy <= 'Z';
end if;
end process p_ProbeMap;
Muss man halt entscheiden, in welchem Stadium sich das Design befindet
(bezüglich der Hierarchie), ob eine oder mehrere Instanzen einer
Komponente verwendet werden (hier könnte die "init_signal_spy"-Variante
von Vorteil sein, weil man keine Generics mitführen muss).
Gruß,
SuperWilly