Forum: FPGA, VHDL & Co. XST Synthesefehler durch MAC-Instanziierung


von Stefan B. (Firma: HS Wismar) (gonse)


Lesenswert?

Hallo zusammen,

folgend einen Auszug aus meinem Quelltext:
1
constant A_ADDR_OFFSET : natural := 2;
2
signal B_addr_offset: std_logic_vector(15 downto 0); 
3
signal C_addr_offset: std_logic_vector(15 downto 0); 
4
  
5
-- actual dimension of matrices
6
signal A_act_num_rows, A_act_num_cols: std_logic_vector (0 to 7);
7
signal B_act_num_rows, B_act_num_cols: std_logic_vector (0 to 7);
8
9
...
10
11
-- Auslesen der Matrizendimensionen
12
A_act_num_rows <= BRAM_Din_B(0 to 7);
13
A_act_num_cols <= BRAM_Din_B(8 to 15);
14
B_act_num_rows <= BRAM_Din_B(16 to 23);
15
B_act_num_cols <= BRAM_Din_B(24 to 31);
16
            
17
-- Berechnung des Offset auf die Adresse im BRAM bis Matrix B beginnt
18
B_addr_offset <= A_ADDR_OFFSET + A_act_num_rows * A_act_num_cols;
19
C_addr_offset <= A_ADDR_OFFSET + A_act_num_rows * A_act_num_cols + 
20
                                 B_act_num_rows * B_act_num_cols;

Aus dem BRAM lese ich mir die Informationen über die Matrizendimensionen 
ein und berechne den Offset zu den Matrizen.

1. Versuche ich dieses Konstrukt zu synthetisieren erhalte ich folgende 
Fehlermeldung:

ERROR:Xst:1706 - Unit <matrix_multiply_ip>: port <D> of FF/Latch 
<B_addr_offset_15> has no source
ERROR:Xst:1847 - Design checking failed

Kommentiere ich C_addr_offset aus, wird für B_addr_offset eine 
MAC-Einheit synthetisiert.
Kommentiere ich B_addr_offset aus, wird für C_addr_offset keine 
MAC-Einheit synthetisiert.
Lasse ich beide drin, wird wohl versucht zwei MAC-Einheiten zu 
verschalten, was dann wohl zum Fehler führt.

Multiplier <Mmult__n0067> in block <matrix_multiply_ip> and 
adder/subtractor <Madd__n0027> in block <matrix_multiply_ip> are 
combined into a MAC<Mmac_Madd__n0027>.
The following registers are also absorbed by the MAC: <B_act_num_rows> 
in block <matrix_multiply_ip>.

Multiplier <Mmult__n0071> in block <matrix_multiply_ip> and 
adder/subtractor <Madd__n0059> in block <matrix_multiply_ip> are 
combined into a MAC<Maddsub__n0071>.
The following registers are also absorbed by the MAC: <A_act_num_rows> 
in block <matrix_multiply_ip>, <A_act_num_cols> in block 
<matrix_multiply_ip>.


2. In der Berechnung von C_addr_offset werden jeweils zwei 8Bit-Zahlen 
miteinander multipliziert und anschließend addiert. Laut meinem 
Verständnis müsste das REsultat eine Breite von 17Bit haben.
Synthetisiere ich C_addr_offset allerdings mit dieser Breite erhalte 
ich:

Width mismatch. <C_addr_offset> has a width of 17 bits but assigned 
expression is 16-bit wide.

Hat jemand konstruktives zu einem oder beiden Punkten beizutragen?

Gruß,
Stefan

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Ich würde das erst mal auf numeric_std umschreiben.

von Stefan B. (Firma: HS Wismar) (gonse)


Lesenswert?

Nennst du mir auch den Grund?

Übringens arbeite ich mit Xilinx Webpack 8.1.03 und synthetisiere für 
den Virtex4FX12.

Stefan

von Fpgakuechle K. (Gast)


Lesenswert?

Wenig Info, muss man will raten

!) hast du den richtigen BRAM Port? ich hätte einen Namen wie Dout 
erwartet, nicht Din:
A_act_num_rows <= BRAM_Din_B(0 to 7);
                       ^^^
2) Mindestens beim starten3 teilen (shared) sich multiplier und BRAM den 
Datapath,
da gehen die oberen 16 Bit von Din auch an einen Eingang des Multiplier. 
Mehr findet sich hier: http://www.xilinx.com/bvdocs/userguides/ug331.pdf
Allerdings kann ich nicht sagen ob das auch für dsp48.

3) XST erkennt da viel automat an Hardware und wohl auch einen Adder mit 
16 bit Ausgang. bielleicht hat das dsp48 modul nur 16 bit ausgang. 
Testhalber kannsz du ja die Eisganssvektoren um 1 bit breiter machen, 
und oberste bit auf '0' setzten und diese 9 bit zahlen addieren, da baut 
die Automatik wohl einen 18 bit ausgang (wenn vorhanden) und alles ist 
OK.

Besser ist es selbst das dsp48 Macro einzubauen (Port Map) statt zu 
hoffen das XST aus * und + das richtige macht.

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.