Hallo FPGA-Programmierer, Ich hab da mal ein Problem und kann mit der Fehlermeldung leider nichts mit anfangen... Ich glaube das ist ein recht spezielles Problem, so das ich nichts gefunden habe. Ich hoffe, ich hab mich nicht zu blöd angestellt... FPGA: Virtex 4 xcvlx25-10ff668 Also ich habe ein Design das mittels IP-Coregenerator von Xilinx ein MIG erstellt hat (500MB). Ich soll das jetzt ändern, dass er mit einem 1GB-Speicher läuft. Wenn ich jedoch versuche das Design in mein Design einpflegen möchte, bringt er mir folgende Fehlermeldung: ERROR:Place:872 - Delay element "inst_sl_ddr2/cntrl0/top_00/iobs_00/data_path_iobs_00/gen_dq[10].u_iob_d q/dq_q1" has been placed at ILOGIC_X0Y51 due to the following location constraint on component "cntrl0_DDR2_DQ<10>": COMP "cntrl0_DDR2_DQ<10>" LOCATE = SITE "AB24" LEVEL 1 However, the delay controller that calibrates this delay element has not been used. Please instantiate a delay controller and apply appropriate location constraint, or instantiate one delay controller for the design with out any location constraint. Please refer to the usage document to use the controller efficiently. Für die anderen Pins natürlich auch... Könnt Ihr was mit der Fehlermeldung anfangen? Braucht Ihr noch mehr Informationen? Ich hatte gehofft, das ich das Design nur austauschen und geringfügig anpassen muss..
Hallo Thorsten, hm, die Fehlermeldung windet sich gerade durch mein Gedächtnis... Die Fehlerlösung wird wohl nicht in nem Einzeiler zu erschlagen sein... Interessant wären Infos, zu welcher Zeit, bzw. mit welchem MIG (Pinout des Rams) das V4 Board entwickelt wurde. Der MIG wurde im Laufe der Jahre vielfach umgekrempelt und es war keineswegs sicher das der MIG noch (direkt) lauffähigen Code für ältere Pinouts erzeugen konnte. Dann bräuchten wir noch Infos über die aktuell verwendete Toolchain (ISE und MIG-Version), sowie dem Vorgehen wie Du das MIG Design aufgesetzt hast: - ISE Projekt importiert, Pin Constraint File importiert oder mit den vorgegebenen Pins neu eingegeben. Je nach MIG kommen drei unterschiedliche Designs bei raus, oder auch nur eine Fehlermeldung... Im folgenden ein paar Annahmen zu deinem Design: bis 500K kam der MIG mit einem Adresspin weniger aus, das zusätzliche Adresspin hängt nun auf einer Bank welche nicht über den IDELAY_CTRL Block der restlichen Pins zugänglich war? Der Fehler den ISE rauswirft trifft den folgenden Sachverhalt: Im FPGA gibt es mehrere IDELAY_CTRL Blöcke. wenn der IDEAY_CTRL im Code instantiiert wird ohne dass der Ausgang weiterverendet wird ist alles in Butter, dann instantiiert ISE diese für alle Pins an denen IDELAY Verwendung findet (sprich es gibt mehrere _CTRL Blöcke, jeweils dediziert für bestimmte IOs zuständig). wenn aber der Ausgang verwendung findet (In neueren MIG für V4 meines wissens der Fall), dann muss jede verwendete _CTRL Instanz von Hand instantiert werden und die Stati von Hand verodert (oder verundet?) werden. Aufgrund von unpassendem (nicht getesteten) Pinout im MIG Generator kann es hier zu einem Fehler kommen... Gruss Vanilla
Hallo Vanilla und andere Hilfeleistenden, schön, dass doch noch jemand antwortet... Ich versuche mal mehr Info´s zu geben. Ich schreib einfach mal Stickpunktartig eineige Punkte auf, damit ihr nicht so viel lesen braucht. Xilinx ISE rv13.4 App V.O.87xd Coregenerator: gleiche Version MIG: 3.6.1 Alter Speicher: MT8HTF6464HDZ – 512MB Neuer Speicher: MT8HTF12864HZ - 1024MB FPGA: Virtex4 xc4vlx25-10ff668 Im MIG - auf der Seite „Reserve Pins“- konnte ich leider mein UCF-file nicht angeben, da der MIG dort IMMER abgestürzt ist. Aus dem Grund habe ich alle verfügbar gemacht und auf der nächsten Seite „Bank Selection For Controller 0 – DDR2 SDRAM“ alle Kästchen ausgewählt. Anschließend habe ich das UCF-File manuell – entsprechend dem Board angepasst und nochmal vom MIG prüfen lassen. Hier mal der ausschnitt von meine UCF-File:
1 | ########################################################################
|
2 | # Controller 0 |
3 | # Memory Device: DDR2_SDRAM->SODIMMs->MT8HTF12864HY-667 |
4 | # Data Width: 64 |
5 | # Data Mask: 1 |
6 | ########################################################################
|
7 | |
8 | |
9 | ################################################################################
|
10 | # I/O STANDARDS |
11 | ################################################################################
|
12 | |
13 | NET "cntrl0_ddr2_dq[*]" IOSTANDARD = SSTL18_II_DCI; |
14 | NET "cntrl0_ddr2_a[*]" IOSTANDARD = SSTL18_II; |
15 | NET "cntrl0_ddr2_ba[*]" IOSTANDARD = SSTL18_II; |
16 | NET "cntrl0_ddr2_ras_n" IOSTANDARD = SSTL18_II; |
17 | NET "cntrl0_ddr2_cas_n" IOSTANDARD = SSTL18_II; |
18 | NET "cntrl0_ddr2_we_n" IOSTANDARD = SSTL18_II; |
19 | NET "cntrl0_ddr2_cs_n[*]" IOSTANDARD = SSTL18_II; |
20 | NET "cntrl0_ddr2_odt[*]" IOSTANDARD = SSTL18_II; |
21 | NET "cntrl0_ddr2_cke[*]" IOSTANDARD = SSTL18_II; |
22 | NET "cntrl0_ddr2_dm[*]" IOSTANDARD = SSTL18_II_DCI; |
23 | NET "sys_clk_p" IOSTANDARD = LVPECL_25; |
24 | NET "sys_clk_n" IOSTANDARD = LVPECL_25; |
25 | NET "clk200_p" IOSTANDARD = LVPECL_25; |
26 | NET "clk200_n" IOSTANDARD = LVPECL_25; |
27 | #NET "sys_reset_in_n" IOSTANDARD = LVCMOS18; |
28 | #NET "cntrl0_init_done" IOSTANDARD = LVCMOS18; |
29 | NET "cntrl0_ddr2_dqs[*]" IOSTANDARD = DIFF_SSTL18_II_DCI; |
30 | NET "cntrl0_ddr2_dqs_n[*]" IOSTANDARD = DIFF_SSTL18_II_DCI; |
31 | NET "cntrl0_ddr2_ck[*]" IOSTANDARD = DIFF_SSTL18_II; |
32 | NET "cntrl0_ddr2_ck_n[*]" IOSTANDARD = DIFF_SSTL18_II; |
33 | |
34 | ################################################################################
|
35 | NET "cntrl0_DDR2_DQ[0]" LOC = "V21" ; #Bank 7 |
36 | NET "cntrl0_DDR2_DQ[1]" LOC = "V22" ; #Bank 7 |
37 | NET "cntrl0_DDR2_DQ[2]" LOC = "W25" ; #Bank 7 |
38 | NET "cntrl0_DDR2_DQ[3]" LOC = "W26" ; #Bank 7 |
39 | NET "cntrl0_DDR2_DQ[4]" LOC = "W21" ; #Bank 7 |
40 | NET "cntrl0_DDR2_DQ[5]" LOC = "W22" ; #Bank 7 |
41 | NET "cntrl0_DDR2_DQ[6]" LOC = "W23" ; #Bank 7 |
42 | NET "cntrl0_DDR2_DQ[7]" LOC = "W20" ; #Bank 7 |
43 | NET "cntrl0_DDR2_DQ[8]" LOC = "Y25" ; #Bank 7 |
44 | NET "cntrl0_DDR2_DQ[9]" LOC = "Y26" ; #Bank 7 |
45 | NET "cntrl0_DDR2_DQ[10]" LOC = "AB24" ; #Bank 7 |
46 | NET "cntrl0_DDR2_DQ[11]" LOC = "AB25" ; #Bank 7 |
47 | NET "cntrl0_DDR2_DQ[12]" LOC = "AB26" ; #Bank 7 |
48 | NET "cntrl0_DDR2_DQ[13]" LOC = "AA26" ; #Bank 7 |
49 | NET "cntrl0_DDR2_DQ[14]" LOC = "AD25" ; #Bank 7 |
50 | NET "cntrl0_DDR2_DQ[15]" LOC = "AD26" ; #Bank 7 |
51 | NET "cntrl0_DDR2_DQ[16]" LOC = "AC22" ; #Bank 7 |
52 | NET "cntrl0_DDR2_DQ[17]" LOC = "AB22" ; #Bank 7 |
53 | NET "cntrl0_DDR2_DQ[18]" LOC = "AB23" ; #Bank 7 |
54 | NET "cntrl0_DDR2_DQ[19]" LOC = "AA23" ; #Bank 7 |
55 | NET "cntrl0_DDR2_DQ[20]" LOC = "AD22" ; #Bank 7 |
56 | NET "cntrl0_DDR2_DQ[21]" LOC = "AD23" ; #Bank 7 |
57 | NET "cntrl0_DDR2_DQ[22]" LOC = "AC23" ; #Bank 7 |
58 | NET "cntrl0_DDR2_DQ[23]" LOC = "AC24" ; #Bank 7 |
59 | NET "cntrl0_DDR2_DQ[24]" LOC = "AF20" ; #Bank 7 |
60 | NET "cntrl0_DDR2_DQ[25]" LOC = "Y19" ; #Bank 7 |
61 | NET "cntrl0_DDR2_DQ[26]" LOC = "W19" ; #Bank 7 |
62 | NET "cntrl0_DDR2_DQ[27]" LOC = "AF23" ; #Bank 7 |
63 | NET "cntrl0_DDR2_DQ[28]" LOC = "AE23" ; #Bank 7 |
64 | NET "cntrl0_DDR2_DQ[29]" LOC = "Y20" ; #Bank 7 |
65 | NET "cntrl0_DDR2_DQ[30]" LOC = "AA18" ; #Bank 7 |
66 | NET "cntrl0_DDR2_DQ[31]" LOC = "Y18" ; #Bank 7 |
67 | NET "cntrl0_DDR2_DQ[32]" LOC = "W2" ; #Bank 8 |
68 | NET "cntrl0_DDR2_DQ[33]" LOC = "W1" ; #Bank 8 |
69 | NET "cntrl0_DDR2_DQ[34]" LOC = "V6" ; #Bank 8 |
70 | NET "cntrl0_DDR2_DQ[35]" LOC = "V5" ; #Bank 8 |
71 | NET "cntrl0_DDR2_DQ[36]" LOC = "W7" ; #Bank 8 |
72 | NET "cntrl0_DDR2_DQ[37]" LOC = "V7" ; #Bank 8 |
73 | NET "cntrl0_DDR2_DQ[38]" LOC = "W4" ; #Bank 8 |
74 | NET "cntrl0_DDR2_DQ[39]" LOC = "W6" ; #Bank 8 |
75 | NET "cntrl0_DDR2_DQ[40]" LOC = "Y2" ; #Bank 8 |
76 | NET "cntrl0_DDR2_DQ[41]" LOC = "Y1" ; #Bank 8 |
77 | NET "cntrl0_DDR2_DQ[42]" LOC = "AA4" ; #Bank 8 |
78 | NET "cntrl0_DDR2_DQ[43]" LOC = "AA3" ; #Bank 8 |
79 | NET "cntrl0_DDR2_DQ[44]" LOC = "AB1" ; #Bank 8 |
80 | NET "cntrl0_DDR2_DQ[45]" LOC = "AA1" ; #Bank 8 |
81 | NET "cntrl0_DDR2_DQ[46]" LOC = "AC4" ; #Bank 8 |
82 | NET "cntrl0_DDR2_DQ[47]" LOC = "AB4" ; #Bank 8 |
83 | NET "cntrl0_DDR2_DQ[48]" LOC = "AC5" ; #Bank 8 |
84 | NET "cntrl0_DDR2_DQ[49]" LOC = "AB5" ; #Bank 8 |
85 | NET "cntrl0_DDR2_DQ[50]" LOC = "AC2" ; #Bank 8 |
86 | NET "cntrl0_DDR2_DQ[51]" LOC = "AC1" ; #Bank 8 |
87 | NET "cntrl0_DDR2_DQ[52]" LOC = "AF3" ; #Bank 8 |
88 | NET "cntrl0_DDR2_DQ[53]" LOC = "AE3" ; #Bank 8 |
89 | NET "cntrl0_DDR2_DQ[54]" LOC = "AD2" ; #Bank 8 |
90 | NET "cntrl0_DDR2_DQ[55]" LOC = "AD1" ; #Bank 8 |
91 | NET "cntrl0_DDR2_DQ[56]" LOC = "AE4" ; #Bank 8 |
92 | NET "cntrl0_DDR2_DQ[57]" LOC = "AD3" ; #Bank 8 |
93 | NET "cntrl0_DDR2_DQ[58]" LOC = "AC3" ; #Bank 8 |
94 | NET "cntrl0_DDR2_DQ[59]" LOC = "AF6" ; #Bank 8 |
95 | NET "cntrl0_DDR2_DQ[60]" LOC = "AF5" ; #Bank 8 |
96 | NET "cntrl0_DDR2_DQ[61]" LOC = "AA7" ; #Bank 8 |
97 | NET "cntrl0_DDR2_DQ[62]" LOC = "AA9" ; #Bank 8 |
98 | NET "cntrl0_DDR2_DQ[63]" LOC = "Y9" ; #Bank 8 |
99 | |
100 | NET "cntrl0_DDR2_A[13]" LOC = "L1" ; #Bank 10 NEU |
101 | NET "cntrl0_DDR2_A[12]" LOC = "AE24" ; #Bank 7 |
102 | NET "cntrl0_DDR2_A[11]" LOC = "AB20" ; #Bank 7 |
103 | NET "cntrl0_DDR2_A[10]" LOC = "AC18" ; #Bank 7 |
104 | NET "cntrl0_DDR2_A[9]" LOC = "AB18" ; #Bank 7 |
105 | NET "cntrl0_DDR2_A[8]" LOC = "AF21" ; #Bank 7 |
106 | NET "cntrl0_DDR2_A[7]" LOC = "AF22" ; #Bank 7 |
107 | NET "cntrl0_DDR2_A[6]" LOC = "AF18" ; #Bank 7 |
108 | NET "cntrl0_DDR2_A[5]" LOC = "AE18" ; #Bank 7 |
109 | NET "cntrl0_DDR2_A[4]" LOC = "AE21" ; #Bank 7 |
110 | NET "cntrl0_DDR2_A[3]" LOC = "AD21" ; #Bank 7 |
111 | NET "cntrl0_DDR2_A[2]" LOC = "J7" ; #Bank 10 |
112 | NET "cntrl0_DDR2_A[1]" LOC = "J6" ; #Bank 10 |
113 | NET "cntrl0_DDR2_A[0]" LOC = "J5" ; #Bank 10 |
114 | |
115 | |
116 | NET "cntrl0_DDR2_BA[2]" LOC = "AF9" ; #Bank 8 NEU |
117 | NET "cntrl0_DDR2_BA[1]" LOC = "J4" ; #Bank 10 |
118 | NET "cntrl0_DDR2_BA[0]" LOC = "K7" ; #Bank 10 |
119 | |
120 | NET "cntrl0_DDR2_RAS_N" LOC = "K6" ; #Bank 10 |
121 | NET "cntrl0_DDR2_CAS_N" LOC = "J2" ; #Bank 10 |
122 | NET "cntrl0_DDR2_WE_N" LOC = "L7" ; #Bank 10 |
123 | NET "cntrl0_DDR2_CS_N[0]" LOC = "L6" ; #Bank 10 |
124 | #NET "cntrl0_DDR2_CS_N[1]" LOC = "K5" ; #Bank 10 |
125 | NET "cntrl0_DDR2_ODT[0]" LOC = "K4" ; #Bank 10 |
126 | #NET "cntrl0_DDR2_ODT[1]" LOC = "K3" ; #Bank 10 |
127 | NET "cntrl0_DDR2_CKE[0]" LOC = "K2" ; #Bank 10 |
128 | #NET "cntrl0_DDR2_CKE[1]" LOC = "L4" ; #Bank 10 |
129 | NET "cntrl0_DDR2_DM[0]" LOC = "V20" ; #Bank 7 |
130 | NET "cntrl0_DDR2_DM[1]" LOC = "Y22" ; #Bank 7 |
131 | NET "cntrl0_DDR2_DM[2]" LOC = "AF19" ; #Bank 7 |
132 | NET "cntrl0_DDR2_DM[3]" LOC = "AF24" ; #Bank 7 |
133 | NET "cntrl0_DDR2_DM[4]" LOC = "W5" ; #Bank 8 |
134 | NET "cntrl0_DDR2_DM[5]" LOC = "AB3" ; #Bank 8 |
135 | NET "cntrl0_DDR2_DM[6]" LOC = "AF4" ; #Bank 8 |
136 | NET "cntrl0_DDR2_DM[7]" LOC = "AD5" ; #Bank 8 |
137 | NET "SYS_CLK_P" LOC = "B15" ; #Bank 3 |
138 | NET "SYS_CLK_N" LOC = "B14" ; #Bank 3 |
139 | NET "CLK200_P" LOC = "C15" ; #Bank 3 |
140 | NET "CLK200_N" LOC = "C14" ; #Bank 3 |
141 | NET "cntrl0_DDR2_DQS[0]" LOC = "AA24" ; #Bank 7 |
142 | NET "cntrl0_DDR2_DQS_N[0]" LOC = "Y24" ; #Bank 7 |
143 | NET "cntrl0_DDR2_DQS[1]" LOC = "AC25" ; #Bank 7 |
144 | NET "cntrl0_DDR2_DQS_N[1]" LOC = "AC26" ; #Bank 7 |
145 | NET "cntrl0_DDR2_DQS[2]" LOC = "AC21" ; #Bank 7 |
146 | NET "cntrl0_DDR2_DQS_N[2]" LOC = "AB21" ; #Bank 7 |
147 | NET "cntrl0_DDR2_DQS[3]" LOC = "AD19" ; #Bank 7 |
148 | NET "cntrl0_DDR2_DQS_N[3]" LOC = "AC19" ; #Bank 7 |
149 | NET "cntrl0_DDR2_DQS[4]" LOC = "Y4" ; #Bank 8 |
150 | NET "cntrl0_DDR2_DQS_N[4]" LOC = "Y3" ; #Bank 8 |
151 | NET "cntrl0_DDR2_DQS[5]" LOC = "Y6" ; #Bank 8 |
152 | NET "cntrl0_DDR2_DQS_N[5]" LOC = "Y5" ; #Bank 8 |
153 | NET "cntrl0_DDR2_DQS[6]" LOC = "AC6" ; #Bank 8 |
154 | NET "cntrl0_DDR2_DQS_N[6]" LOC = "AB6" ; #Bank 8 |
155 | NET "cntrl0_DDR2_DQS[7]" LOC = "AF8" ; #Bank 8 |
156 | NET "cntrl0_DDR2_DQS_N[7]" LOC = "AF7" ; #Bank 8 |
157 | NET "cntrl0_DDR2_CK[0]" LOC = "AA19" ; #Bank 7 |
158 | NET "cntrl0_DDR2_CK_N[0]" LOC = "AA20" ; #Bank 7 |
159 | NET "cntrl0_DDR2_CK[1]" LOC = "Y17" ; #Bank 7 |
160 | NET "cntrl0_DDR2_CK_N[1]" LOC = "AA17" ; #Bank 7 |
161 | |
162 | |
163 | ################################################################################
|
164 | #IDELAYCTRL Location Constraints |
165 | ################################################################################
|
166 | |
167 | INST "inst_sl_ddr2/cntrl0/idelay_ctrl0/IDELAYCTRL_INST[0].u_idelayctrl" LOC=IDELAYCTRL_X0Y5; |
168 | INST "inst_sl_ddr2/cntrl0/idelay_ctrl0/IDELAYCTRL_INST[1].u_idelayctrl" LOC=IDELAYCTRL_X0Y4; |
169 | INST "inst_sl_ddr2/cntrl0/idelay_ctrl0/IDELAYCTRL_INST[2].u_idelayctrl" LOC=IDELAYCTRL_X0Y3; |
170 | INST "inst_sl_ddr2/cntrl0/idelay_ctrl0/IDELAYCTRL_INST[3].u_idelayctrl" LOC=IDELAYCTRL_X0Y2; |
dort kann man sehen, dass cntrl0_DDR2_CS_N cntrl0_DDR2_CKE ein Pin weniger benötigt wird. cntrl0_DDR2_A[13] & cntrl0_DDR2_BA[2] sind hingegen neu. Fallen auch ein bisschen aus der Reihe, was die Bank betrifft... Aber inwieweit die mit dem IDELAY_CTRL zusammenhängen kann ich nicht beurteilen... Der letzte Abschnitt „IDELAYCTRL Location Constraints“ war im alten Design auch nicht da. Ach so ja -bei den Zeilen habe ich „inst_sl_ddr2/cntrl0/“ hinzugefügt. Ich hoffe das war korrekt? Mmm.. Also den neusten MIG verwende ich... aber _CTRL Blöcke habe ich nirgends distanziert. Wo muss ich denn das machen? Ich hoffe ich habe nicht irgend eine Frage ausgelassen... Grüße Torsten
Torsten Müller schrieb: >INST "inst_sl_ddr2/cntrl0/idelay_ctrl0/IDELAYCTRL_INST[0].u_idelayctrl" LOC=IDELAYCTRL_X0Y5; >INST "inst_sl_ddr2/cntrl0/idelay_ctrl0/IDELAYCTRL_INST[1].u_idelayctrl" LOC=IDELAYCTRL_X0Y4; >INST "inst_sl_ddr2/cntrl0/idelay_ctrl0/IDELAYCTRL_INST[2].u_idelayctrl" LOC=IDELAYCTRL_X0Y3; >INST "inst_sl_ddr2/cntrl0/idelay_ctrl0/IDELAYCTRL_INST[3].u_idelayctrl" LOC=IDELAYCTRL_X0Y2; > cntrl0_DDR2_A[13] & cntrl0_DDR2_BA[2] sind hingegen neu. Fallen auch ein > bisschen aus der Reihe, was die Bank betrifft... Aber inwieweit die mit > dem IDELAY_CTRL zusammenhängen kann ich nicht beurteilen... > > Der letzte Abschnitt „IDELAYCTRL Location Constraints“ war im alten > Design auch nicht da. > Ach so ja -bei den Zeilen habe ich „inst_sl_ddr2/cntrl0/“ hinzugefügt. > Ich hoffe das war korrekt? > > Mmm.. Also den neusten MIG verwende ich... aber _CTRL Blöcke habe ich > nirgends distanziert. Wo muss ich denn das machen? > > Ich hoffe ich habe nicht irgend eine Frage ausgelassen... Bin leider nur kurz im Forum und eigentlich schon wieder auf dem Sprug, daher nur ganz kurz... Man sieht dass der MIG den IDELAY_CTRL instantiiert hat und der Meinung ist, vier Stück instantiieren zu müssen. Das wiederum bedeutet dass der MIG die Dinger selbst im HDL Code instantiiert hat. Der Fehler dürfte nun darin liegen, dass die ISE während dem MAP merkt (oder meint) dass (ein) weiterer IDELAYCTRL benötigt wird (weil instantiierte IO-Zellen das Ding nutzen) und selbständig weitere IDELAY_CTRL initiert. Weil aber mehr als ein IDELAY_CTRL bzw. deren IOs von Hand genutzt werden dürfte es schief gehen. Das weitere Vorgehen wäre nun folgendes: Herausfinden welcher IDELAY_CTRL für welche Bins zuständig sind (BA2 und A13) wären die Kandidaten weil die ja auch von der Bank her abweichen... Wenn du da fündig wirst, muss dann der Generate Construct für den IDELAY_CTRL gesucht werden, entsprechend erweitert und dann im UCF dazugetragen werden... Ich hoffe ich konnte Dir weiterhelfen, ansonsten gehts erst in den nächsten Tagen weiter... Gruß Vanilla
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.