Forum: FPGA, VHDL & Co. Post Analysis


von ope (Gast)


Lesenswert?

Meine VHDL Modelle (ein Großteil zumindest) sind geschrieben und mit
einem TB bzgl des Verhaltens getestet. In XST kann ich mir nun Post
Synthese VHDL Files kreieren lassen. Nun liegen die Files im Xst Dir
und nicht im Source Dir, na gut.

Die Frage ist, wie kann ich meinen bisherigen TB zur Post Synthese
Simulation benutzen? Mittels configurationen? Kann man den post
synthesis architecture default Namen ändern?, er ist "Structure" und
kann leicht zur Namenskollisionen führen. Sinnvoll wäre auch eine
Änderung des Ausgabeverzeichnisses.

Da ich die "do" scripte verwende, habe ich aber auch keine grosse
Lust jedesmal die neuen post synth. vhdl Files hinzu zuschreiben.

Wie macht ihre die Post Synthese? Mal von den kommenden Problemen bei
der Auswertung abgesehen, von denen ich bereits gelesen habe.

Viele Grüße
Olaf


PS: Happy XMas

von Sven Johannes (Gast)


Lesenswert?

Moin...

Womit simulierst du denn?
Wenn der Modelsim eingebunden ist, kannst du die entsprechenden Modelle
(Source, post Synthesis, post Routing) direkt anwählen. Das Tcl/Tk
Skript zum Aufruf wird automatisch generiert und um die
Namensverwaltung braucht man sich händisch nicht kümmern.

--
 Sven Johannes

von ope (Gast)


Lesenswert?

Vielen Dank! Nutze Xilinx Webpack, also Modelsim. Da gibt's im ISE
(nach Einfügen des TB im Navigator) wirklich die Möglichkeit diese
Modell zu testen.

Allerdings gehen jetzt die (unerwarteten) Fehler auf. Modelsim meldet
plötzlich "Unknown identifier" bzgl der Generics im TB. Beim
Anschauen des Post Synthesis Modells fehlen auch wirklich die Generics,
auch hat xst aus meinem unsigned Vector einen std_logic_vector gemacht -
damit habe ich nun nicht gerechnet (eher Timing/Verhaltensfehler).

Habe ich hier irgendeinen prinzipiellen Fehler?

Viele Grüße
Olaf

von Sven Johannes (Gast)


Lesenswert?

Moin...

Generics in Testbenches sind ein besonderer Fall. Verdreht unser
Mentor-Mensch auch immer die Augen, habe ich mir bereits abgewöhnt, ein
Kollege hier besteht aber drauf.

Die Generics müssen in der Synthese natürlich aufgelöst werden und
durch konkrete Werte ersetzt werden. Warum der ModelSim das nicht
frisst ist natürlich beliebig dusselig zu erraten. Ist dein "Problem"
klein genug um es zu veröffentlichen?

--
 Sven Johannes

von ope (Gast)


Lesenswert?

leider nein (das LA Projekt). Vom Prinzip her:
1
entity foo is
2
  generic (
3
     BIT_WIDTH : natural := 8;
4
  ...

und im TB
1
   constant BIT_WIDTH : natural := 8; 
2
3
   DUT: entity work.foo
4
      generic map (
5
         BIT_WIDTH        => BIT_WIDTH,
6
   ...

In dem Post Translate (entspricht das dem Post Synthese Modell?) sind
die generics alle bereits aufgelöst und das design platt getreten, bei
den records wurde ein name mangeling durchgeführt. Klar, dass dann mein
TB aus der Functional Simulation nicht mehr passt (zumindest bzgl. der
Generics). Ich habe aber auch keinen Schalter dafür gefunden (7.1.04
Web Editition).

Bis jetzt habe ich mir immer meine do scripte zusammengebastelt mit
ihren Depencies. Im ISE ist es mir noch nicht gelungen, diese
einzuführen. Nur Modelsim (MS) hat eine Compile Order. Da aber direkt
MS aus ISE aufgerufen wird, nutzt mir mein Script nichts, auch kein MS
Projekt. Die tolle Hierarchy mit den packages im ISE ist wohl nur
Makulatur, ich musste nach dem Aufruf aus dem ISE die packages in MS
selbst compilieren.

Viele Grüße
Olaf

von ope (Gast)


Lesenswert?

ok, mal ausführlicher:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
-- pragma synthesis_off
6
use std.textio.all;
7
use work.image_pkg.all;
8
-- pragma synthesis_on
9
10
use work.pkg_config.all;
11
use work.pkg_trigger.all;
12
13
14
package pkg_la_register is
15
16
   -- Base/Offset Address and Bit Index Types:
17
   subtype addr_t is unsigned(7 downto 0);
18
   subtype addr_base_t is unsigned(addr_t'range);
19
   subtype addr_offset_t is natural range 0 to 15;
20
   subtype bit_offset_t is natural range 0 to 15;
21
22
   -- Base/Offset Addresses:
23
   -- |7.6.5.4.3.2.1.0|
24
   -- |T.T.S.C.-.O.O.O|
25
   -- T = Trigger Base Register
26
   -- S = Status Base Register
27
   -- C = Control Base Register 
28
   -- O = Offsets
29
   constant TRIGGER0_BASE    : addr_base_t := (7   => '1', others =>
30
'0');
31
   constant TRIGGER1_BASE    : addr_base_t := (6   => '1', others =>
32
'0');
33
   constant EXT_TRIGGER_BASE : addr_base_t := (7|6 => '1', others =>
34
'0');
35
   constant CONTROL_BASE     : addr_base_t := (5   => '1', others =>
36
'0');
37
   constant STATUS_BASE      : addr_base_t := (4   => '1', others =>
38
'0');
39
40
  
41
----------------------------------------------------------------------------
42
   -- WRITE MODE
43
  
44
----------------------------------------------------------------------------
45
46
   -- address offsets of internal trigger register
47
   constant TRIGGER_PATTERN_VALUE   : addr_offset_t := 0;
48
   constant TRIGGER_PATTERN_MASK    : addr_offset_t := 1;
49
   constant TRIGGER_EDGE_RISING     : addr_offset_t := 2;
50
   constant TRIGGER_EDGE_FALLING    : addr_offset_t := 3;
51
   constant TRIGGER_EDGE_MASK       : addr_offset_t := 4;
52
   constant TRIGGER_COMBINE         : addr_offset_t := 5;
53
   constant TRIGGER_LENGTH_VALUE    : addr_offset_t := 6;
54
   -- internal trigger pattern/edge combine bits
55
   constant TRIGGER_PECOMB0_BIT     : bit_offset_t  := 0;
56
   constant TRIGGER_PECOMB1_BIT     : bit_offset_t  := 1;
57
   constant TRIGGER_PECOMB2_BIT     : bit_offset_t  := 2;
58
   constant TRIGGER_INVERT_BIT      : bit_offset_t  := 3;
59
   -- external trigger settings
60
   constant EXT_TRIGGER_ACT_LVL_BIT : bit_offset_t  := 0;
61
   constant EXT_TRIGGER_INVERT_BIT  : bit_offset_t  := 1;  -- unused
62
   -- control address offsets
63
   constant CONTROL_CMD             : addr_offset_t := 0;
64
   constant CONTROL_CLK_DIVIDER     : addr_offset_t := 1;
65
   constant CONTROL_POSTTRIGGER_MEM : addr_offset_t := 2;
66
   constant CONTROL_TRIGGER_SELECT  : addr_offset_t := 3;  -- int/ext
67
   -- control trigger select bits
68
   constant CONTROL_TRIGGER_INT_BIT : bit_offset_t  := 0;
69
   constant CONTROL_TRIGGER_EXT_BIT : bit_offset_t  := 1;
70
71
   -- control register commands
72
   type command_t is (
73
      idle,
74
      run,
75
      stop,
76
      reset,
77
      ld_clkdiv);
78
79
  
80
----------------------------------------------------------------------------
81
   -- READ MODE
82
  
83
----------------------------------------------------------------------------
84
85
   -- trigger matching address offsets
86
   constant TRIGGER_COND_MATCH : addr_offset_t := 0;
87
88
   -- status trigger match bits
89
   constant TRIGGER_COND_MATCH_PATTERN_BIT : bit_offset_t := 0;
90
   constant TRIGGER_COND_MATCH_EDGE_BIT    : bit_offset_t := 1;
91
   constant TRIGGER_COND_MATCH_LENGTH_BIT  : bit_offset_t := 2;
92
93
   -- status offsets
94
   constant STATUS_TRIGGER   : addr_offset_t := 0;
95
   constant STATUS_ERRORCODE : addr_offset_t := 1;
96
97
   -- status bits
98
   constant STATUS_INT_TRIGGER_MATCH_BIT : bit_offset_t := 0;
99
   constant STATUS_EXT_TRIGGER_MATCH_BIT : bit_offset_t := 1;
100
   constant STATUS_TRIGGER_MATCH_BIT     : bit_offset_t := 2;
101
102
  
103
----------------------------------------------------------------------------
104
   -- convenience types
105
  
106
----------------------------------------------------------------------------
107
   type control_register_t is record
108
      command : command_t;
109
   end record control_register_t;
110
111
   type config_register_t is record
112
      clk_divider        : unsigned(LA_CLKDIV_LENGTH-1 downto 0);
113
      posttrigger_mem    : unsigned(3 downto 0);  -- 0 to 8 (9 values)
114
      trigger0_cond      : trigger_cond_t;
115
      ext_trigger_cond   : ext_trigger_cond_t;
116
      enable_trigger_int : std_logic;
117
      enable_trigger_ext : std_logic;
118
   end record config_register_t;
119
120
   type status_register_t is record
121
      trigger0_match    : trigger_match_t;
122
      int_trigger_match : std_logic;
123
      ext_trigger_match : std_logic;
124
      trigger_match     : std_logic;
125
      error_code        : unsigned(7 downto 0);
126
   end record status_register_t;
127
128
  
129
----------------------------------------------------------------------------
130
   -- OTHERS
131
  
132
----------------------------------------------------------------------------
133
   procedure check_pkg_sanity;
134
   procedure c_header (constant fname : in string);
135
136
   function slv2pec (signal slv : std_logic_vector) return
137
pattern_edge_comb_t;
138
   function slv2cmd (signal slv : std_logic_vector) return command_t;
139
140
end package pkg_la_register;
141
142
-------------------------------------------------------------------------------
143
144
library ieee;
145
use ieee.std_logic_1164.all;
146
use ieee.numeric_std.all;
147
148
-- pragma synthesis_off
149
use std.textio.all;
150
use work.image_pkg.all;
151
-- pragma synthesis_on
152
153
use work.pkg_config.all;
154
use work.pkg_trigger.all;
155
use work.pkg_la_register.all;
156
157
158
entity la_register is
159
   
160
   generic (
161
      BIT_WIDTH      : natural   := 16;
162
      RESET_ACTIVE   : std_logic := '1';
163
      WRITE_C_HEADER : boolean   := false;
164
      C_HEADER_FILE  : string    := "la.h");
165
166
   port (
167
      clk              : in  std_logic;
168
      reset            : in  std_logic;
169
      rd               : in  std_logic;
170
      wr               : in  std_logic;
171
      address          : in  addr_t;
172
      rd_data          : out std_logic_vector(BIT_WIDTH-1 downto 0);
173
      wr_data          : in  std_logic_vector(BIT_WIDTH-1 downto 0);
174
      config_register  : out config_register_t;
175
      control_register : out control_register_t;
176
      status_register  : in  status_register_t);
177
178
end entity la_register;

wird breitgestampft zu:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
library SIMPRIM;
4
use SIMPRIM.VCOMPONENTS.ALL;
5
use SIMPRIM.VPACKAGE.ALL;
6
7
entity la_register is
8
  port (
9
    clk : in STD_LOGIC := 'X'; 
10
    status_register_trigger0_match_pattern : in STD_LOGIC := 'X'; 
11
    status_register_trigger0_match_length : in STD_LOGIC := 'X'; 
12
    reset : in STD_LOGIC := 'X'; 
13
    rd : in STD_LOGIC := 'X'; 
14
    status_register_int_trigger_match : in STD_LOGIC := 'X'; 
15
    status_register_trigger0_match_edge : in STD_LOGIC := 'X'; 
16
    wr : in STD_LOGIC := 'X'; 
17
    status_register_ext_trigger_match : in STD_LOGIC := 'X'; 
18
    status_register_trigger_match : in STD_LOGIC := 'X'; 
19
    config_register_ext_trigger_cond_active_level : out STD_LOGIC; 
20
    config_register_enable_trigger_ext : out STD_LOGIC; 
21
    config_register_trigger0_cond_invert : out STD_LOGIC; 
22
    config_register_enable_trigger_int : out STD_LOGIC; 
23
    address : in STD_LOGIC_VECTOR ( 7 downto 0 ); 
24
    status_register_error_code : in STD_LOGIC_VECTOR ( 7 downto 0 ); 
25
    wr_data : in STD_LOGIC_VECTOR ( 15 downto 0 ); 
26
    config_register_clk_divider : out STD_LOGIC_VECTOR ( 7 downto 0 );
27
28
    config_register_trigger0_cond_pattern_mask : out STD_LOGIC_VECTOR (
29
15 downto 0 ); 
30
    config_register_trigger0_cond_edge_mask : out STD_LOGIC_VECTOR ( 15
31
downto 0 ); 
32
    config_register_trigger0_cond_length_value : out STD_LOGIC_VECTOR (
33
7 downto 0 ); 
34
    control_register_command : out STD_LOGIC_VECTOR ( 2 downto 0 ); 
35
    rd_data : out STD_LOGIC_VECTOR ( 15 downto 0 ); 
36
    config_register_posttrigger_mem : out STD_LOGIC_VECTOR ( 3 downto 0
37
); 
38
    config_register_trigger0_cond_edge_falling : out STD_LOGIC_VECTOR (
39
15 downto 0 ); 
40
    config_register_trigger0_cond_edge_rising : out STD_LOGIC_VECTOR (
41
15 downto 0 ); 
42
    config_register_trigger0_cond_pattern_value : out STD_LOGIC_VECTOR
43
( 15 downto 0 ); 
44
    config_register_trigger0_cond_pattern_edge_comb : out
45
STD_LOGIC_VECTOR ( 1 downto 0 ) 
46
  );
47
end la_register;

Klar, dass dann der TB nicht mehr passt. Irgendwelche Hinweise? Möchte
nur ungern alles umschreiben auf RTL. Hat Quartus das gleiche Problem?

Viele Grüße
Olaf

von ope (Gast)


Lesenswert?

keine 'ne Idee was ich bzw. xst da falsch macht?

Viele Grüße
Olaf

von ope (Gast)


Lesenswert?

Kann es sein, dass für die Postsynthesis Simulation (schätze mal auch
für die Post Mapping etc.) die generics des TB einfach weggelassen
werden müssen, d.h. der TB mit den Generic Defaults läuft? In diesem
Fall müsste ich dann für die Functional/Post Synthesis Simulation den
map generic part mit pragma synthesis_off/on "klammern" (mal
probieren); was aber wohl nicht gehen wird - hier fehlt dann wirklich
ein ifdef Konstrukt in der Sprache VHDL.

Das nach der Postsynthese der unsigned nicht mehr existiert ist zwar
ärgerlich, aber umgehbar. Annti schrieb 'mal, immer nur
std_logic_vector zu benutzen, trifft dieses generell zu oder nur auf
die Ports? Intern in der architectutr würde ich wieder mit unsigned
arbeiten.

Wie macht ihr die Postsynthese: keine Generics, nur std_logic?

Viele Grüße
Olaf

von ope (Gast)


Lesenswert?

na ja, meine records erleiden ja auch einem namemangeling, so einfach
geht's wohl doch nicht. Wäre ein "TB-Port-Wrapper" eine
Möglichkeit?

Werde demnächst mal Web/ISE 8.1 probieren.

Viele Grüße
Olaf

von Xenu (Gast)


Lesenswert?

Es gibt da eine tolle Erfindung, die nennst sich Suchmaschine, die
solltest Du mal ausprobieren.

Wenn ich bei Google die Suchbegriffe "testbench generic xilinx"
eingebe,
kommt an zweiter(!) Stelle ein Link auf die Xilinx-Antwortdatenbank mit

der Antwort auf Deine Frage.

Lustig, oder?

Du könntest natürlich auf gleich in der Xilinx-Datenbank suchen.
Wenn ich da "testbench generic" eingebe, kommt die Antwort an erster
Stelle...

von Klaus F. (kfalser)


Lesenswert?

Du brauchst nur eine neue Top-Level Entity ohne Generics schreiben,
welche eine Instanz Deiner konfigurierbaren Komponente enthält. Diese
Instanz wird mit den gewünschten Generics aufgerufen.
Schließlich ist es ja meisten so, daß man zwar die Komponenten
generisch hält, damit man sie wiederverwenden kann, aber bei der
Synthese für ein bestimmtes Projekt ergeben sich die Werte der Generics
(fast) immer aus den Spezifikationen (z.B. Busbreite).

Wenn Du dies machst, dann stimmt die Interface Beschreibung für deine
selbstgeschriebene Architecture und die vom Compiler überein und Du
hast keine Probleme über Configurationen die gewünschte architecture
auszuwählen.
Den Namen der generierten Post-Synthese Architecture kann man wählen,
ebenso wie den Filenamen. Außerdem ist es günstig, im generierten
VHDL-File die Interface-Beschreibung zu unterdrücken.
Du kannst dann das generierte File einfach in Deine Work-Library
kompilieren und voilà!, Du hast Deine Top-Level Entity mit 2
architectures.
Schreibe ein 2 Konfigurationen für Deine Testbench, eine für einen
Aufruf mit Deiner Architecture und eine für einen Aufruf mit der vom
Compiler generierten.
Oder ändere deine Testbench indem Du beide Architectures aufrufst und
die Ausgangssignale vergleichst.
Grüße
Klaus

von Karl (Gast)


Lesenswert?

was bezweckt eine post simulation überhaupt?
ein design muss man doch sowieso auf der hardware verifizieren. deshalb
bringe ich mein design nach einer verhaltenssimulation auf das board und
teste dann die gewünschten funktionen.

von Xenu (Gast)


Lesenswert?

>ein design muss man doch sowieso auf der hardware verifizieren.

Stimmt. Aber mit der Begründung kannst Du Dir jede Simulation sparen.
Wenn Du grundsätzlich fehlerfreie Designs erstellst, Respekt!

>deshalb bringe ich mein design nach einer verhaltenssimulation auf
>das board und teste dann die gewünschten funktionen.

Und was passiert wenn Dein Design sehr zeitkritisch ist und es durch
Laufzeiten z.B. zu gleichzeitigen Buszugriffen kommt? Wie willst Du das
denn mit 'nem Oszi rausfinden? Im Simulator sieht man das sofort.
Evtl. machst Du Dir sogar Deine Hardware kaputt.

von Karl (Gast)


Lesenswert?

@ xenu:
dein sarkasmus in allen ehren...(denn schliesslich bist du immer recht
hilfreich bei fragen hier im forum)

bin bisher immer ohne post simulation ausgekommen.
laufzeitverzögerungen sind sicherlich ein störendes problem, aber auch
mit messungen feststellbar, denn schliesslich kann man das erwartete
Ergebnis nachmessen.
wenn die post simulation so wichtig ist, warum hilfst du nicht bei opes
problem, sondern einen herablassenen kommentar? keiner ist
vollkommen....

von Xenu (Gast)


Lesenswert?

>wenn die post simulation so wichtig ist, warum hilfst du nicht bei
>opes problem, sondern einen herablassenen kommentar?

Habe ich das nicht?
Vielleicht solltest Du Dir meinen Beitrag nochmal genau durchlesen...

Gib auf der Xilinx-Seite in der Suchmaske "testbench" und "generic"
ein und das erste Suchergebniss ist die Antwort.

Wie ich oben bereits geschrieben habe.

von ope (Gast)


Lesenswert?

Xenu meint dies hier:
http://www.xilinx.com/xlnx/xil_ans_display.jsp?iLanguageID=1&iCountryID=1&getPagePath=17952.

Ich wollte es zuvor mit Configurationen versuchen, bin aber nicht zum
testen bisher gekommen (kann also u.U. auch nicht funtionieren):
1
architecture behaviorial of TB_la_register is
2
...
3
configuration behaviorial_cfg of TB_la_register is
4
   for behaviorial
5
      for DUT : la_register
6
         use entity work.la_register(behaviorial);
7
      end for;
8
   end for;
9
end behaviorial_cfg;
10
11
configuration postsynthesis_cfg of TB_la_register is
12
   for behaviorial
13
      for DUT : la_register
14
         use entity work.la_register(postsynthesis)
15
            generic map (
16
               BIT_WIDTH      => 16,
17
               RESET_ACTIVE   => '1',
18
               WRITE_C_HEADER => false,
19
               C_HEADER_FILE  => "la.h");
20
      end for;
21
   end for;
22
end postsynthesis_cfg;

Das Problem (ist kein wirkliches) das ich mit der "netgen -a" Lösung
habe ist, dass ich mal eben in der Console die architecture erzeugen
muss; d.h. ich kann es wohl weder mit den do-Scripten (wäre sicher mit
tcl machbar - kann ich aber (noch) nicht) noch im ISE durchführen.
Wenn man ständig hin- und herspringt, vergisst man leicht einen
Zwischenschritt und klickt, klickt und klickt und simuliert noch mit
den alten Daten...

Schwieriger ist das platt treten der records, was imo aus Hardwaresicht
verständlich ist, aus Sicht der Simu jedoch nicht unbedingt einleuchtend
ist.

Klaus sein Ansatz werde ich ebenfalls (hoffentlich) dieses Wochenende
probieren können, auch wenn ich noch keine konkrete Vorstellung von der
Umsetzung habe.

Bei google u.a. ist das Problem die richtigen Suchbegriffe zu finden,
ich hatte gleich zu Begin der Suche zu stark eingeschränkt; man lernt
eben nicht aus.

Vielen Dank für die Hilfe und viele Grüße
Olaf

von Klaus F. (kfalser)


Lesenswert?

Wenn
- das Design funktional verifiziert ist,
- das Timing der I/O Signale überlegt und mittels Timing Constraints
erzwungen wurde,
dann hat der Designer seinen Teil getan.
Die Post Simulation (Post Synthese und Post Place&Route) dienen dann
nur dazu zu sehen, ob die Tools Fehler gemacht haben.
Wer die Post Simulation braucht, um zu sehen ob das Timing korrekt ist,
ist wirklich ein bischen spät dran (gut, besser zu spät als nie).
Wenn man FPGA's entwirft, dann wird man meisten auf die Post
Simulation verzichten, aber jemand der ASIC's entwickelt wird sie
garantiert verwenden.

Klaus

von Karl (Gast)


Lesenswert?

@ xenu:
habe schon in deinem o.g. beitrag feststellen können, dass du auf
ope's problem ein gegangen bist, nur gefiel mir dein ton dabei nicht,
denn schliesslich ist es ein problem gewesen, dass nicht in neuen
threads hier alltäglich besprochen wird.
dass man nicht vollkommen ist, und das man eben nicht stundenlang
sucht, gibt doch den sinn dieses forums wieder, in dem man fragen
stellen kann, in der hoffnung auf lösungsansätze und hilfreiche tipps.
es kam mir so vor, als wenn es aus deiner sicht nichts einfacheres
gibt, als lösungsansätze selber zu erarbeiten. manchmal sieht man den
wald vor lauter bäumen nicht, deshalb habe ich auf den ton deines o.g.
beitrags nicht für sehr hilfreich empfunden. du bist doch recht
erfahren in vhdl plus designumgebung, ergo musst du nicht so erfahrende
leute me so über den mund fahren. nix für ungut.

by the way, danke klaus für die aussagen der post simulation. ich habe
nach einer funktionalen verhaltenssimualtion und nach festlegen der
time constraints und der festen zuweisung der i/o pins für mein design
in einer oder direkt benachtbarten i/o banks eigentlich kaum probleme
mit meinem design bezüglich des timings gehabt. sicherlich kommt es zu
laufzeitverzögerungen, die man aber mit area constraints auch wieder
minimieren kann.

von Xenu (Gast)


Lesenswert?

>kann ich aber (noch) nicht) noch im ISE durchführen.

Bei "Generate Post-Place & Route Simulation Model" rechte Maustaste
->
Properties. Im Properties-Fenster "Property Display Level" auf
"Advanced" stellen.
Unter "Other NETGEN Command Line Options" kannst Du jetzt "-a" mit
einfügen.

von ope (Gast)


Lesenswert?

cool, Danke!

von ope (Gast)


Lesenswert?

Ich habe es wie Klaus vorgeschlagen das ganze Wochenende versucht, bin
aber immer irgendwie wieder gescheitert. Dazu habe ich ein kleines
Counter Projekt zum testen initiiert (ist übersichtlicher als das LA
Projekt):
1
entity reciprocal_counter_g is
2
   generic (
3
      RESET_ACTIVE        : std_logic;
4
      BITWIDTH_TIME_CNTR  : natural;
5
      BITWIDTH_EVENT_CNTR : natural);
6
   port (
7
      clk         : in  std_logic;
8
      reset       : in  std_logic;
9
      start       : in  std_logic;
10
      stop        : in  std_logic;
11
      events      : in  std_logic;
12
      time_count  : out std_logic_vector(BITWIDTH_TIME_CNTR-1 downto
13
0);
14
      event_count : out std_logic_vector(BITWIDTH_EVENT_CNTR-1 downto
15
0));
16
end entity reciprocal_counter_g;
17
18
architecture behavioral of reciprocal_counter_g is
19
  ...

mit dem TB:
1
entity TB_counter is
2
end entity TB_counter;
3
4
architecture behavioral of TB_counter is
5
   constant RESET_ACTIVE        : std_logic := '1';
6
   constant BITWIDTH_TIME_CNTR  : natural   := 32;
7
   constant BITWIDTH_EVENT_CNTR : natural   := 32;
8
   ...
9
   component reciprocal_counter_g is
10
      port (
11
         clk         : in  std_logic;
12
         reset       : in  std_logic;
13
         start       : in  std_logic;
14
         stop        : in  std_logic;
15
         events      : in  std_logic;
16
         time_count  : out std_logic_vector(BITWIDTH_TIME_CNTR-1 downto
17
0);
18
         event_count : out std_logic_vector(BITWIDTH_EVENT_CNTR-1
19
downto 0));
20
   end component reciprocal_counter_g;
21
begin
22
   DUT : reciprocal_counter_g
23
      port map (
24
         clk         => clk,
25
         reset       => reset,
26
         start       => start,
27
         stop        => stop,
28
         events      => events,
29
         time_count  => time_count,
30
         event_count => event_count);

Die Postsynthese erzeugt nur die architecture "Structural" (keine
entity, switch -a bzw. in 8.1 gab es an anderer Stelle direkt die
Möglichkeit des Abschaltens).

Die neue non-generic Top-Level entity für diese synthetisierte
architecture sieht wie folgt aus:
1
entity reciprocal_counter_32 is
2
   port (
3
      clk         : in  std_logic;
4
      reset       : in  std_logic;
5
      start       : in  std_logic;
6
      stop        : in  std_logic;
7
      events      : in  std_logic;
8
      time_count  : out std_logic_vector(31 downto 0);
9
      event_count : out std_logic_vector(31 downto 0));
10
end entity reciprocal_counter_32;
11
12
architecture behavioral of reciprocal_counter_32 is
13
   component reciprocal_counter_g is
14
      generic (
15
         RESET_ACTIVE        : std_logic;
16
         BITWIDTH_TIME_CNTR  : positive;
17
         BITWIDTH_EVENT_CNTR : positive); 
18
      port (
19
         clk         : in  std_logic;
20
         reset       : in  std_logic;
21
         start       : in  std_logic;
22
         stop        : in  std_logic;
23
         events      : in  std_logic;
24
         time_count  : out std_logic_vector(BITWIDTH_TIME_CNTR-1 downto
25
0);
26
         event_count : out std_logic_vector(BITWIDTH_EVENT_CNTR-1
27
downto 0)); 
28
   end component reciprocal_counter_g;
29
begin
30
   counter32 : reciprocal_counter_g
31
      generic map (
32
         RESET_ACTIVE        => '1',
33
         BITWIDTH_TIME_CNTR  => 32,
34
         BITWIDTH_EVENT_CNTR => 32)
35
      port map (
36
         clk         => clk,
37
         reset       => reset,
38
         start       => start,
39
         stop        => stop,
40
         events      => events,
41
         time_count  => time_count,
42
         event_count => event_count);
43
end architecture behavioral;

Mit den Konfigurationen:
1
configuration behavioral_cfg of TB_counter is
2
   for behavioral
3
      for DUT : reciprocal_counter_g
4
         use entity work.reciprocal_counter_g(behavioral)
5
            generic map (
6
               RESET_ACTIVE        => '1',
7
               BITWIDTH_TIME_CNTR  => 16,
8
               BITWIDTH_EVENT_CNTR => 16);
9
      end for;
10
   end for;
11
end behavioral_cfg;
12
13
configuration synthesis_cfg of TB_counter is
14
   for behavioral
15
      for DUT : reciprocal_counter_g
16
         use entity work.reciprocal_counter_32(behavioral)
17
            for counter_32 : reciprocal_counter_g
18
               use entity work.reciprocal_counter_g(structural);
19
            end for;
20
      end for;
21
   end for;
22
end synthesis_cfg;

Bis zur Synthese bin ich gar nicht mal gekommen. Modelsim 6.0d
compiliert das behavioral architecture fehlerfrei durch, aber vsim
meldet nun:

Generic 'reset_active' has not been given a value.

Ich dachte durch die Konf. werden die Generics gleich gemapped. Das
Prinzip habe ich hoffentlich verstanden, nur in der Realisierung hapert
es noch ...

Viele Grüße
Olaf

von Klaus F. (kfalser)


Lesenswert?

Du muß mit deiner Testbench "TB_counter" die Entity
"reciprocal_counter_32" testen, nicht die generische.
Wenn Modelsim die Konfiguration synthesis_cfg compiliert, erwartet sie
für DUT eine Einheit mit dem selben Interface wie
"reciprocal_counter_g", also inclusive generics. Du setzt aber
"reciprocal_counter_32" ein, welche gar keine generics hat und mit
Interface Beschreibung nicht übereinstimmt.

Grüße
Klaus

von ope (Gast)


Angehängte Dateien:

Lesenswert?

irgenwie bringe ich das nicht :/

Ich habe mal das besagte Testprojekt angehängt. Das Problem liegt in
diesen Configurations, die ich nicht leider hinbekomme. Die behavioral
Simu selbst klappt.

Wäre schon, wenn hier ein Muster Bsp. für die Postsynthese mit generics
entstehen würde. Das Web ist da nicht hilfreich (zumindest mit meinen
Suchbegriffen), da nur non-generics examples exisitieren - und selbst
die Tests fallen nach der Synthese mit Web/ISE 8.1 oftmals durch.

Vielen Dank und Grüße
Olaf

von ope (Gast)


Angehängte Dateien:

Lesenswert?

so, inzwischen komme ich zur Postsynthese (abgesehen von config
Problemen aus dem Nachbar Thread), allerdings klappt der TB nicht bei
der Simu mit dem synthetisierten Modell.

Die folgende Meldung bekomme ich vom Fitter:
WARNING:Xst:737 - Found 1-bit latch for signal <arm>.

Der entsprechende Source schaut wie folgt aus:
1
entity synchronized_gate is
2
   port (
3
      start    : in  std_logic;         -- start synchronizing
4
      stop     : in  std_logic;         -- stop synchronizing
5
      en       : out std_logic);        -- status of synchronized gate
6
end entity synchronized_gate;
7
8
architecture behavioral of synchronized_gate is
9
   signal arm  : std_logic;
10
begin
11
   -- arming FF (asynchronous)
12
   arming_ff : process (arm, start, stop) is
13
   begin
14
      if (start = '1') and (stop = '0') then
15
         arm <= '1';
16
      elsif (start = '1') and (stop = '1') then
17
         arm <= '0';
18
      elsif (start = '0') and (stop = '0') then
19
         -- reset arming
20
         arm <= '0';
21
      else
22
         -- infer latch
23
         arm <= arm; 
24
      end if;
25
   end process arming_ff;
26
27
   en <= arm;
28
end architecture behavioral;

Soll das heissen, das er das Signal arm gleich durch das signal en
ersetzt hat? Dann wäre ISE/XST sehr geschwätzig ... Die einzige
verbleibende Meldung ist noch:

WARNING:Xst:737 - Found 1-bit latch for signal <arm>.

Ich denke, er meldet hier ein impliziet generiertes latch, welches ich
imo jedoch expliziet hingeschrieben habe.

Wie dem auch sei, die entity, welche das synchronized_gate benutzt
fängt nicht an zu zählen, ich vermute mal, da das enable signal nicht
aktiv wird:
1
entity reciprocal_counter_g is  
2
   generic (
3
      RESET_ACTIVE        : std_logic;
4
      BITWIDTH_TIME_CNTR  : natural;
5
      BITWIDTH_EVENT_CNTR : natural);
6
   port (
7
      clk         : in  std_logic;
8
      reset       : in  std_logic;
9
      start       : in  std_logic;
10
      stop        : in  std_logic;
11
      events      : in  std_logic;
12
      time_count  : out std_logic_vector(BITWIDTH_TIME_CNTR-1 downto
13
0);
14
      event_count : out std_logic_vector(BITWIDTH_EVENT_CNTR-1 downto
15
0));
16
end entity reciprocal_counter_g;
17
18
architecture behavioral of reciprocal_counter_g is
19
   signal ce_cntr : std_logic;
20
begin
21
   -- asynchronous time/event counter gate control
22
   sync_time_gate : entity work.synchronized_gate
23
      port map (
24
         start => start,
25
         stop  => stop,
26
         en    => ce_cntr);
27
28
   time_counter : entity work.counter_g
29
      generic map (...)
30
      port map (en    => ce_cntr, ...);
31
32
   event_counter : entity work.counter_g
33
      generic map (...)
34
      port map (en    => ce_cntr, ...);
35
end architecture behavioral;

An sich habe Einstellungen wie keep/retain hierarchy eingestellt, aber
im Post Synthese Modell fehlen mir die inneren Signale, so dass es ein
Black-Box (BB) Verhalten ist, was ich in MXE zu sehen bekomme.

Habe ich trozdem noch falsche Einstellungen, dass ich zur BB komme? Wie
kommt man solchen Problemen auf die Spur?

Viele Grüße
Olaf

von ope (Gast)


Lesenswert?

Mist, die erste Fehlermedlung ist Mist, da habe ich das Falsche
gepasted. Die Meldung lautete sinngemäß:

Warning: Signal /path/to/arm minimized.

Kann heute Abend nochmals die genaue Meldung angeben.

Viele Grüße
Olaf

von ope (Gast)


Lesenswert?

Hier die korrekte Warnung:

WARNING:Cpld:828 - Signal 'reciprocal_counter_i/ce_cntr.SETF' has
been minimized

Viele Grüße
Olaf

von ope (Gast)


Lesenswert?

Evtl. wäre noch wichtig, dass ich einen XC95144XL-5-TQ100 eingestellt
habe zum testen.

von Karl (Gast)


Lesenswert?

ich habe jetzt auch mal eine post place&route simulation gestartet, aber
nach 10 minuten wieder abgebrochen, da sich nichts tut.
dauert diese simulation wirklich so lange mit ise7.1 und modelsim?
gut, lange ist relativ und richtig sich sicherlich auch nach dem
design. ich habe eine simualtionslaufzeit von 1 ms eingestellt.

von T.M. (Gast)


Lesenswert?

Ich habe mal mein Design (Mikroprozessor, BlocKRAM, Uart, LCD-Treiber
und Kleinkram) auch einer Post Synthese Simulation unterzogen. Das
dauert wirklich so lange ;-) Nach 45 Min. waren noch nicht mal 30ms
durch gewesen. Das kostenlose Modelsim ist aber auch ausgebremst, sonst
würde ja niemand mehr die Vollversion kaufen.

Hängt aber auch sehr von der Komplexität des Designs ab...

von ope (Gast)


Angehängte Dateien:

Lesenswert?

hier ist die aktuelle Fassung des synchronized gates. In ISE 8.1 macht
der Fitter für CPLD XC95000 Mist, habe also einen Bug erwischt (siehe
NG comp.arch.fpga).

Die Behavior Simu dauert kaum 1s bei mir (P4/2.6GHz). Die
Post-Fit/Synthese bricht zuvor ab (Selftest).

Ich nehme an, Du hast den counter selber synthetisiert und anschl.
simuliert - yep, das dauert. Aber auch, weil versch. Freq. und je Freq.
3 versch. duty cycles (90,50,10%) durchgetestet werden. Also unten im TB
nur einen Test scharf machen.

Viele Grüße
Olaf

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.