INFO:Xst:2385 - HDL ADVISOR - You can improve the performance of the multiplier

Gast #1828325
Lesenswert?

Hallo zusammen,

ich hätte gern eine Frage:

Wenn ich so ein multiplier habe, dann kriege ich eine INFO von xilinx 
ise:

INFO:Xst:2385 - HDL ADVISOR - You can improve the performance of the 
multiplier T2_scale by adding 1 register level(s).
1
  
2
T2_scale <= signed(T) * signed( resize( unsigned(peak), 17));
3
  
4
process
5
begin
6
  wait until rising_edge (clk);
7
  if scale_start = '1' then
8
      T2 <= to_integer ( unsigned( T2_scale(29 downto 14))); 
9
   end if;
10
end process;


Was ist hier gemeint, und was man damit umgehen kann?

vielen dank im voraus!

lg tomi
Moderator (Firma: Titel) Persönliche Seite #1828337
Lesenswert?

tomi schrieb:
> Was ist hier gemeint,
Wenn dein Design so läuft und du zufrieden bist ignorierst du den Tip 
einfach... ;-)

> und was man damit umgehen kann?
Du solltest eine Registerebene mehr einführen, dann kannst du den 
Multiplizierer und damit das Gesamtsystem u.U. schneller takten.
1
process
2
begin
3
  wait until rising_edge (clk);
4
  T2_scale <= signed(T) * signed( resize( unsigned(peak), 17));
5
  if scale_start = '1' then
6
      T2 <= to_integer ( unsigned( T2_scale(29 downto 14))); 
7
   end if;
8
end process;
Allerdings bekommst du dadurch logischerweise einen Takt Latency auf 
T2_scale...

Evtl. kannst du probieren, den Multiplizierer einfach andersrum 
aufzuzäumen:
1
process
2
begin
3
  wait until rising_edge (clk);
4
  if scale_start = '1' then
5
     T2_scale <= signed(T) * signed( resize( unsigned(peak), 17));
6
  end if;
7
end process;
8
T2 <= to_integer ( unsigned( T2_scale(29 downto 14)));
Das kommt aber ganz darauf an, wie T2 und/oder T2_scale weiterverwendet 
wird.
Moderator (Firma: Titel) Persönliche Seite #1829377
Lesenswert?

> wieso ist es dann schneller?
Sieh dir mal dieses einfache Beispiel an:
Du hast zwei FFs und dazwischen eine Kobinatorische Funktion aus zwei 
Teilen F1 und F2. Wenn F1 z.B. 10ns braucht und F2 ebenfalss 10ns, dann 
darfst du (unter Vernachlässigung von tco und tsu) diese Schaltung mit 
maximal 1/20ns = 50MHz takten.
1
                        20ns
2
       ______     10ns      10ns      ______
3
A  ---| D  Q |---(F1)------(F2)------| D  Q |--  B
4
    C-|>     |                     C-|>     |
5
      |______|                       |______|
6
        FFa                             FFb

Wenn du jetzt aber zwischen die beiden Funktionen nochmal ein FF setzt, 
dann kannst du den Takt (wieder unter Vernachlässigung von tco und tsu) 
auf 100MHz erhöhen.
1
       ______     10ns      ______     10ns      ______ 
2
A  ---| D  Q |---(F1)------| D  Q |---(F2)------| D  Q |--  B
3
    C-|>     |           C-|>     |           C-|>     |
4
      |______|             |______|             |______|
5
        FFa                  FFx                  FFb

Aber: auch hier wird dein eigentliches Ergebins B erst nach 20ns 
berechnet sein!! Du hast dann zwar einen doppelt so hohen Takt, aber 
dafür einen Takt Latency (Verzögerung).

Warum also der ganze Aufwand?

Was wäre, wenn dein restliches FPGA-Design durchaus die 100MHz könnte, 
und nur durch diese F1+F2 Logik ausgebremst würde? Dann könntest du dir 
hier mit deieser zusätzlichen Registerebene den Hals aus der Schlinge 
ziehen, aber dabei immer im Hinterkopf behalten, dass das Ergebnis B um 
einen Takt zu spät ankommt.

> wieso ist es dann schneller?
Die Multiplikation selber wird nicht schneller, aber du könntest den 
Takt erhöhen und damit evtl. den Rest deines FPGAs (der ja idealerweise 
am selben Takt hängt) schneller machen.
Das ist der Tip, den dir der HDL-Tipgeber hier offenbart.
Gast #1829686
Lesenswert?

Lothar Miller schrieb:
> Die Multiplikation selber wird nicht schneller, aber du könntest den
> Takt erhöhen und damit evtl. den Rest deines FPGAs (der ja idealerweise
> am selben Takt hängt) schneller machen.
> Das ist der Tip, den dir der HDL-Tipgeber hier offenbart.

also in meinem fall sieht es aber so aus:
1
F1 <= A * B;
2
  
3
process
4
begin
5
  wait until rising_edge (clk);
6
  if scale_start = '1' then
7
      T <= F1;
8
   end if;
9
end process;
10

11
       ______  A      F1    ______               
12
   ---| D  Q |---(*)-------| D  Q |---(T)
13
    C-|>     |    |      C-|>     |        
14
      |______|    |        |______|             
15
        FFa       |          FFx                
16
                  |   
17
                  |  
18
                  |
19
       ______  B  |
20
   ---| D  Q |----+            
21
    C-|>     |           
22
      |______|             
23
        FFb



dein code würde so dann aussehen oder?
1
  
2

3
process
4
begin
5
  wait until rising_edge (clk);
6
  F1 <= A * B;
7
  if scale_start = '1' then
8
      T <= F1; 
9
   end if;
10
end process;
11

12

13
       ______  A            ______               ______ 
14
   ---| D  Q |---(*) ------| D  Q |---(F1)------| D  Q |--  T
15
    C-|>     |    |      C-|>     |           C-|>     |
16
      |______|    |        |______|             |______|
17
        FFa       |          FFx                  FFy
18
                  |   
19
                  |  
20
                  |
21
       ______  B  |
22
   ---| D  Q |----+            
23
    C-|>     |           
24
      |______|             
25
        FFb


Dann kann es nicht schneller sein, oder? weil es nur eine 
kombinatorische funktion (mul) gibt!?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren