www.mikrocontroller.net

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


Autor: Stefan Behrendt (Firma: HS Wismar) (gonse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

folgend einen Auszug aus meinem Quelltext:
constant A_ADDR_OFFSET : natural := 2;
signal B_addr_offset: std_logic_vector(15 downto 0); 
signal C_addr_offset: std_logic_vector(15 downto 0); 
  
-- actual dimension of matrices
signal A_act_num_rows, A_act_num_cols: std_logic_vector (0 to 7);
signal B_act_num_rows, B_act_num_cols: std_logic_vector (0 to 7);

...

-- Auslesen der Matrizendimensionen
A_act_num_rows <= BRAM_Din_B(0 to 7);
A_act_num_cols <= BRAM_Din_B(8 to 15);
B_act_num_rows <= BRAM_Din_B(16 to 23);
B_act_num_cols <= BRAM_Din_B(24 to 31);
            
-- Berechnung des Offset auf die Adresse im BRAM bis Matrix B beginnt
B_addr_offset <= A_ADDR_OFFSET + A_act_num_rows * A_act_num_cols;
C_addr_offset <= A_ADDR_OFFSET + A_act_num_rows * A_act_num_cols + 
                                 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde das erst mal auf numeric_std umschreiben.

Autor: Stefan Behrendt (Firma: HS Wismar) (gonse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nennst du mir auch den Grund?

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

Stefan

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

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

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.