URL
https://opencores.org/ocsvn/neorv32/neorv32/trunk
Subversion Repositories neorv32
Compare Revisions
- This comparison shows the changes necessary to convert path
/neorv32/trunk/rtl
- from Rev 68 to Rev 69
- ↔ Reverse comparison
Rev 68 → Rev 69
/core/neorv32_bootloader_image.vhd
1,6 → 1,6
-- The NEORV32 RISC-V Processor, https://github.com/stnolting/neorv32 |
-- Auto-generated memory init file (for BOOTLOADER) from source file <bootloader/main.bin> |
-- Size: 4068 bytes |
-- Size: 4040 bytes |
|
library ieee; |
use ieee.std_logic_1164.all; |
51,7 → 51,7
00000037 => x"00158593", |
00000038 => x"ff5ff06f", |
00000039 => x"00001597", |
00000040 => x"f4858593", |
00000040 => x"f2c58593", |
00000041 => x"80010617", |
00000042 => x"f5c60613", |
00000043 => x"80010697", |
105,929 → 105,922
00000091 => x"0007a023", |
00000092 => x"8001a223", |
00000093 => x"ffff07b7", |
00000094 => x"4c478793", |
00000094 => x"4ac78793", |
00000095 => x"30579073", |
00000096 => x"00000693", |
00000097 => x"00000613", |
00000098 => x"00000593", |
00000099 => x"00200513", |
00000100 => x"385000ef", |
00000101 => x"419000ef", |
00000100 => x"369000ef", |
00000101 => x"3fd000ef", |
00000102 => x"00048493", |
00000103 => x"00050863", |
00000104 => x"00100513", |
00000105 => x"00000593", |
00000106 => x"445000ef", |
00000106 => x"429000ef", |
00000107 => x"00005537", |
00000108 => x"00000613", |
00000109 => x"00000593", |
00000110 => x"b0050513", |
00000111 => x"1f5000ef", |
00000112 => x"1b9000ef", |
00000113 => x"02050a63", |
00000114 => x"321000ef", |
00000111 => x"1d9000ef", |
00000112 => x"19d000ef", |
00000113 => x"02050663", |
00000114 => x"305000ef", |
00000115 => x"fe002783", |
00000116 => x"0027d793", |
00000117 => x"00a78533", |
00000118 => x"00f537b3", |
00000119 => x"00b785b3", |
00000120 => x"1a9000ef", |
00000120 => x"18d000ef", |
00000121 => x"08000793", |
00000122 => x"30479073", |
00000123 => x"30046073", |
00000124 => x"00000013", |
00000125 => x"00000013", |
00000126 => x"ffff1537", |
00000127 => x"f1450513", |
00000128 => x"291000ef", |
00000129 => x"f1302573", |
00000130 => x"24c000ef", |
00000131 => x"ffff1537", |
00000132 => x"f4c50513", |
00000133 => x"27d000ef", |
00000134 => x"fe002503", |
00000135 => x"238000ef", |
00000136 => x"ffff1537", |
00000137 => x"f5450513", |
00000138 => x"269000ef", |
00000139 => x"30102573", |
00000140 => x"224000ef", |
00000141 => x"ffff1537", |
00000142 => x"f5c50513", |
00000143 => x"255000ef", |
00000144 => x"fe402503", |
00000145 => x"ffff1437", |
00000146 => x"20c000ef", |
00000147 => x"ffff1537", |
00000148 => x"f6450513", |
00000149 => x"23d000ef", |
00000150 => x"fe802503", |
00000151 => x"1f8000ef", |
00000152 => x"ffff1537", |
00000153 => x"f6c50513", |
00000154 => x"229000ef", |
00000155 => x"ff802503", |
00000156 => x"1e4000ef", |
00000157 => x"f7440513", |
00000158 => x"219000ef", |
00000159 => x"ff002503", |
00000160 => x"1d4000ef", |
00000161 => x"ffff1537", |
00000162 => x"f8050513", |
00000163 => x"205000ef", |
00000164 => x"ffc02503", |
00000165 => x"1c0000ef", |
00000166 => x"f7440513", |
00000167 => x"1f5000ef", |
00000168 => x"ff402503", |
00000169 => x"1b0000ef", |
00000170 => x"0d1000ef", |
00000171 => x"06050663", |
00000172 => x"ffff1537", |
00000173 => x"f8850513", |
00000174 => x"1d9000ef", |
00000175 => x"22d000ef", |
00000176 => x"fe002403", |
00000177 => x"00341413", |
00000178 => x"00a40933", |
00000179 => x"00893433", |
00000180 => x"00b40433", |
00000181 => x"0cd000ef", |
00000182 => x"02051663", |
00000183 => x"20d000ef", |
00000184 => x"fe85eae3", |
00000185 => x"00b41463", |
00000186 => x"ff2566e3", |
00000187 => x"00100513", |
00000188 => x"4dc000ef", |
00000189 => x"ffff1537", |
00000190 => x"fb050513", |
00000191 => x"195000ef", |
00000192 => x"0d4000ef", |
00000193 => x"181000ef", |
00000194 => x"fc050ae3", |
00000195 => x"ffff1537", |
00000196 => x"fb450513", |
00000197 => x"17d000ef", |
00000198 => x"0b0000ef", |
00000199 => x"ffff19b7", |
00000200 => x"ffff1a37", |
00000201 => x"07200a93", |
00000202 => x"06800b13", |
00000203 => x"07500b93", |
00000204 => x"07300c13", |
00000205 => x"ffff1937", |
00000206 => x"ffff1cb7", |
00000207 => x"fc098513", |
00000208 => x"151000ef", |
00000209 => x"131000ef", |
00000210 => x"00050413", |
00000211 => x"0f5000ef", |
00000212 => x"fb0a0513", |
00000213 => x"13d000ef", |
00000214 => x"101000ef", |
00000215 => x"fe051ee3", |
00000216 => x"01541863", |
00000217 => x"ffff02b7", |
00000218 => x"00028067", |
00000219 => x"fd1ff06f", |
00000220 => x"01641663", |
00000221 => x"054000ef", |
00000222 => x"fc5ff06f", |
00000223 => x"01741663", |
00000224 => x"44c000ef", |
00000225 => x"fb9ff06f", |
00000226 => x"01841663", |
00000227 => x"670000ef", |
00000228 => x"fadff06f", |
00000229 => x"06c00793", |
00000230 => x"00f41663", |
00000231 => x"00100513", |
00000232 => x"fe1ff06f", |
00000233 => x"06500793", |
00000234 => x"00f41c63", |
00000235 => x"0004a783", |
00000236 => x"f40798e3", |
00000237 => x"ebcc8513", |
00000238 => x"0d9000ef", |
00000239 => x"f81ff06f", |
00000240 => x"fc890513", |
00000241 => x"ff5ff06f", |
00000242 => x"ffff1537", |
00000243 => x"dfc50513", |
00000244 => x"0c10006f", |
00000245 => x"ff010113", |
00000246 => x"00112623", |
00000247 => x"30047073", |
00000248 => x"00000013", |
00000249 => x"00000013", |
00000250 => x"ffff1537", |
00000251 => x"e6050513", |
00000252 => x"0a1000ef", |
00000253 => x"065000ef", |
00000254 => x"fe051ee3", |
00000255 => x"ff002783", |
00000256 => x"00078067", |
00000257 => x"0000006f", |
00000258 => x"ff010113", |
00000259 => x"00812423", |
00000260 => x"00050413", |
00000261 => x"ffff1537", |
00000262 => x"e7050513", |
00000263 => x"00112623", |
00000264 => x"071000ef", |
00000265 => x"03040513", |
00000266 => x"0ff57513", |
00000267 => x"015000ef", |
00000268 => x"30047073", |
00000269 => x"00000013", |
00000270 => x"00000013", |
00000271 => x"171000ef", |
00000272 => x"00050863", |
00000273 => x"00100513", |
00000274 => x"00000593", |
00000275 => x"1a1000ef", |
00000276 => x"0000006f", |
00000277 => x"fe010113", |
00000278 => x"01212823", |
00000279 => x"00050913", |
00000280 => x"ffff1537", |
00000281 => x"00912a23", |
00000282 => x"e7c50513", |
00000283 => x"ffff14b7", |
00000284 => x"00812c23", |
00000285 => x"01312623", |
00000286 => x"00112e23", |
00000287 => x"01c00413", |
00000288 => x"011000ef", |
00000289 => x"fd448493", |
00000290 => x"ffc00993", |
00000291 => x"008957b3", |
00000292 => x"00f7f793", |
00000293 => x"00f487b3", |
00000294 => x"0007c503", |
00000295 => x"ffc40413", |
00000296 => x"7a0000ef", |
00000297 => x"ff3414e3", |
00000298 => x"01c12083", |
00000299 => x"01812403", |
00000300 => x"01412483", |
00000301 => x"01012903", |
00000302 => x"00c12983", |
00000303 => x"02010113", |
00000304 => x"00008067", |
00000305 => x"fb010113", |
00000306 => x"04112623", |
00000307 => x"04512423", |
00000308 => x"04612223", |
00000309 => x"04712023", |
00000310 => x"02812e23", |
00000311 => x"02912c23", |
00000312 => x"02a12a23", |
00000313 => x"02b12823", |
00000314 => x"02c12623", |
00000315 => x"02d12423", |
00000316 => x"02e12223", |
00000317 => x"02f12023", |
00000318 => x"01012e23", |
00000319 => x"01112c23", |
00000320 => x"01c12a23", |
00000321 => x"01d12823", |
00000322 => x"01e12623", |
00000323 => x"01f12423", |
00000324 => x"342024f3", |
00000325 => x"800007b7", |
00000326 => x"00778793", |
00000327 => x"08f49463", |
00000328 => x"08d000ef", |
00000329 => x"00050663", |
00000330 => x"00000513", |
00000331 => x"091000ef", |
00000332 => x"648000ef", |
00000333 => x"02050063", |
00000334 => x"7b0000ef", |
00000335 => x"fe002783", |
00000336 => x"0027d793", |
00000337 => x"00a78533", |
00000338 => x"00f537b3", |
00000339 => x"00b785b3", |
00000340 => x"638000ef", |
00000341 => x"03c12403", |
00000342 => x"04c12083", |
00000343 => x"04812283", |
00000344 => x"04412303", |
00000345 => x"04012383", |
00000346 => x"03812483", |
00000347 => x"03412503", |
00000348 => x"03012583", |
00000349 => x"02c12603", |
00000350 => x"02812683", |
00000351 => x"02412703", |
00000352 => x"02012783", |
00000353 => x"01c12803", |
00000354 => x"01812883", |
00000355 => x"01412e03", |
00000356 => x"01012e83", |
00000357 => x"00c12f03", |
00000358 => x"00812f83", |
00000359 => x"05010113", |
00000360 => x"30200073", |
00000361 => x"00700793", |
00000362 => x"00f49a63", |
00000363 => x"8041a783", |
00000364 => x"00078663", |
00000365 => x"00100513", |
00000366 => x"e51ff0ef", |
00000367 => x"34102473", |
00000368 => x"5e0000ef", |
00000369 => x"04050263", |
00000370 => x"ffff1537", |
00000371 => x"e8050513", |
00000372 => x"6c0000ef", |
00000373 => x"00048513", |
00000374 => x"e7dff0ef", |
00000375 => x"02000513", |
00000376 => x"660000ef", |
00000377 => x"00040513", |
00000378 => x"e6dff0ef", |
00000379 => x"02000513", |
00000380 => x"650000ef", |
00000381 => x"34302573", |
00000382 => x"e5dff0ef", |
00000383 => x"ffff1537", |
00000384 => x"e8850513", |
00000385 => x"68c000ef", |
00000386 => x"00440413", |
00000387 => x"34141073", |
00000388 => x"f45ff06f", |
00000389 => x"ff010113", |
00000124 => x"ffff1537", |
00000125 => x"ef850513", |
00000126 => x"27d000ef", |
00000127 => x"f1302573", |
00000128 => x"23c000ef", |
00000129 => x"ffff1537", |
00000130 => x"f3050513", |
00000131 => x"269000ef", |
00000132 => x"fe002503", |
00000133 => x"228000ef", |
00000134 => x"ffff1537", |
00000135 => x"f3850513", |
00000136 => x"255000ef", |
00000137 => x"30102573", |
00000138 => x"214000ef", |
00000139 => x"ffff1537", |
00000140 => x"f4050513", |
00000141 => x"241000ef", |
00000142 => x"fe402503", |
00000143 => x"ffff1437", |
00000144 => x"1fc000ef", |
00000145 => x"ffff1537", |
00000146 => x"f4850513", |
00000147 => x"229000ef", |
00000148 => x"fe802503", |
00000149 => x"1e8000ef", |
00000150 => x"ffff1537", |
00000151 => x"f5050513", |
00000152 => x"215000ef", |
00000153 => x"ff802503", |
00000154 => x"1d4000ef", |
00000155 => x"f5840513", |
00000156 => x"205000ef", |
00000157 => x"ff002503", |
00000158 => x"1c4000ef", |
00000159 => x"ffff1537", |
00000160 => x"f6450513", |
00000161 => x"1f1000ef", |
00000162 => x"ffc02503", |
00000163 => x"1b0000ef", |
00000164 => x"f5840513", |
00000165 => x"1e1000ef", |
00000166 => x"ff402503", |
00000167 => x"1a0000ef", |
00000168 => x"0bd000ef", |
00000169 => x"06050663", |
00000170 => x"ffff1537", |
00000171 => x"f6c50513", |
00000172 => x"1c5000ef", |
00000173 => x"219000ef", |
00000174 => x"fe002403", |
00000175 => x"00341413", |
00000176 => x"00a40933", |
00000177 => x"00893433", |
00000178 => x"00b40433", |
00000179 => x"0b9000ef", |
00000180 => x"02051663", |
00000181 => x"1f9000ef", |
00000182 => x"fe85eae3", |
00000183 => x"00b41463", |
00000184 => x"ff2566e3", |
00000185 => x"00100513", |
00000186 => x"4c8000ef", |
00000187 => x"ffff1537", |
00000188 => x"f9450513", |
00000189 => x"181000ef", |
00000190 => x"0d4000ef", |
00000191 => x"16d000ef", |
00000192 => x"fc050ae3", |
00000193 => x"ffff1537", |
00000194 => x"f9850513", |
00000195 => x"169000ef", |
00000196 => x"0b0000ef", |
00000197 => x"ffff19b7", |
00000198 => x"ffff1a37", |
00000199 => x"07200a93", |
00000200 => x"06800b13", |
00000201 => x"07500b93", |
00000202 => x"07300c13", |
00000203 => x"ffff1937", |
00000204 => x"ffff1cb7", |
00000205 => x"fa498513", |
00000206 => x"13d000ef", |
00000207 => x"11d000ef", |
00000208 => x"00050413", |
00000209 => x"0e1000ef", |
00000210 => x"f94a0513", |
00000211 => x"129000ef", |
00000212 => x"0ed000ef", |
00000213 => x"fe051ee3", |
00000214 => x"01541863", |
00000215 => x"ffff02b7", |
00000216 => x"00028067", |
00000217 => x"fd1ff06f", |
00000218 => x"01641663", |
00000219 => x"054000ef", |
00000220 => x"fc5ff06f", |
00000221 => x"01741663", |
00000222 => x"438000ef", |
00000223 => x"fb9ff06f", |
00000224 => x"01841663", |
00000225 => x"65c000ef", |
00000226 => x"fadff06f", |
00000227 => x"06c00793", |
00000228 => x"00f41663", |
00000229 => x"00100513", |
00000230 => x"fe1ff06f", |
00000231 => x"06500793", |
00000232 => x"00f41c63", |
00000233 => x"0004a783", |
00000234 => x"f40798e3", |
00000235 => x"ea0c8513", |
00000236 => x"0c5000ef", |
00000237 => x"f81ff06f", |
00000238 => x"fac90513", |
00000239 => x"ff5ff06f", |
00000240 => x"ffff1537", |
00000241 => x"de050513", |
00000242 => x"0ad0006f", |
00000243 => x"ff010113", |
00000244 => x"00112623", |
00000245 => x"30047073", |
00000246 => x"ffff1537", |
00000247 => x"e4450513", |
00000248 => x"095000ef", |
00000249 => x"059000ef", |
00000250 => x"fe051ee3", |
00000251 => x"ff002783", |
00000252 => x"00078067", |
00000253 => x"0000006f", |
00000254 => x"ff010113", |
00000255 => x"00812423", |
00000256 => x"00050413", |
00000257 => x"ffff1537", |
00000258 => x"e5450513", |
00000259 => x"00112623", |
00000260 => x"065000ef", |
00000261 => x"03040513", |
00000262 => x"0ff57513", |
00000263 => x"009000ef", |
00000264 => x"30047073", |
00000265 => x"16d000ef", |
00000266 => x"00050863", |
00000267 => x"00100513", |
00000268 => x"00000593", |
00000269 => x"19d000ef", |
00000270 => x"0000006f", |
00000271 => x"fe010113", |
00000272 => x"01212823", |
00000273 => x"00050913", |
00000274 => x"ffff1537", |
00000275 => x"00912a23", |
00000276 => x"e6050513", |
00000277 => x"ffff14b7", |
00000278 => x"00812c23", |
00000279 => x"01312623", |
00000280 => x"00112e23", |
00000281 => x"01c00413", |
00000282 => x"00d000ef", |
00000283 => x"fb848493", |
00000284 => x"ffc00993", |
00000285 => x"008957b3", |
00000286 => x"00f7f793", |
00000287 => x"00f487b3", |
00000288 => x"0007c503", |
00000289 => x"ffc40413", |
00000290 => x"79c000ef", |
00000291 => x"ff3414e3", |
00000292 => x"01c12083", |
00000293 => x"01812403", |
00000294 => x"01412483", |
00000295 => x"01012903", |
00000296 => x"00c12983", |
00000297 => x"02010113", |
00000298 => x"00008067", |
00000299 => x"fb010113", |
00000300 => x"04112623", |
00000301 => x"04512423", |
00000302 => x"04612223", |
00000303 => x"04712023", |
00000304 => x"02812e23", |
00000305 => x"02912c23", |
00000306 => x"02a12a23", |
00000307 => x"02b12823", |
00000308 => x"02c12623", |
00000309 => x"02d12423", |
00000310 => x"02e12223", |
00000311 => x"02f12023", |
00000312 => x"01012e23", |
00000313 => x"01112c23", |
00000314 => x"01c12a23", |
00000315 => x"01d12823", |
00000316 => x"01e12623", |
00000317 => x"01f12423", |
00000318 => x"342024f3", |
00000319 => x"800007b7", |
00000320 => x"00778793", |
00000321 => x"08f49463", |
00000322 => x"089000ef", |
00000323 => x"00050663", |
00000324 => x"00000513", |
00000325 => x"08d000ef", |
00000326 => x"644000ef", |
00000327 => x"02050063", |
00000328 => x"7ac000ef", |
00000329 => x"fe002783", |
00000330 => x"0027d793", |
00000331 => x"00a78533", |
00000332 => x"00f537b3", |
00000333 => x"00b785b3", |
00000334 => x"634000ef", |
00000335 => x"03c12403", |
00000336 => x"04c12083", |
00000337 => x"04812283", |
00000338 => x"04412303", |
00000339 => x"04012383", |
00000340 => x"03812483", |
00000341 => x"03412503", |
00000342 => x"03012583", |
00000343 => x"02c12603", |
00000344 => x"02812683", |
00000345 => x"02412703", |
00000346 => x"02012783", |
00000347 => x"01c12803", |
00000348 => x"01812883", |
00000349 => x"01412e03", |
00000350 => x"01012e83", |
00000351 => x"00c12f03", |
00000352 => x"00812f83", |
00000353 => x"05010113", |
00000354 => x"30200073", |
00000355 => x"00700793", |
00000356 => x"00f49a63", |
00000357 => x"8041a783", |
00000358 => x"00078663", |
00000359 => x"00100513", |
00000360 => x"e59ff0ef", |
00000361 => x"34102473", |
00000362 => x"5dc000ef", |
00000363 => x"04050263", |
00000364 => x"ffff1537", |
00000365 => x"e6450513", |
00000366 => x"6bc000ef", |
00000367 => x"00048513", |
00000368 => x"e7dff0ef", |
00000369 => x"02000513", |
00000370 => x"65c000ef", |
00000371 => x"00040513", |
00000372 => x"e6dff0ef", |
00000373 => x"02000513", |
00000374 => x"64c000ef", |
00000375 => x"34302573", |
00000376 => x"e5dff0ef", |
00000377 => x"ffff1537", |
00000378 => x"e6c50513", |
00000379 => x"688000ef", |
00000380 => x"00440413", |
00000381 => x"34141073", |
00000382 => x"f45ff06f", |
00000383 => x"ff010113", |
00000384 => x"00000513", |
00000385 => x"00112623", |
00000386 => x"00812423", |
00000387 => x"72c000ef", |
00000388 => x"09e00513", |
00000389 => x"768000ef", |
00000390 => x"00000513", |
00000391 => x"00112623", |
00000392 => x"00812423", |
00000393 => x"730000ef", |
00000394 => x"09e00513", |
00000395 => x"76c000ef", |
00000396 => x"00000513", |
00000397 => x"764000ef", |
00000398 => x"00050413", |
00000399 => x"00000513", |
00000400 => x"734000ef", |
00000401 => x"00c12083", |
00000402 => x"0ff47513", |
00000403 => x"00812403", |
00000404 => x"01010113", |
00000405 => x"00008067", |
00000406 => x"ff010113", |
00000407 => x"00112623", |
00000408 => x"00812423", |
00000409 => x"00000513", |
00000410 => x"6ec000ef", |
00000411 => x"00500513", |
00000412 => x"728000ef", |
00000413 => x"00000513", |
00000414 => x"720000ef", |
00000415 => x"00050413", |
00000416 => x"00147413", |
00000417 => x"00000513", |
00000418 => x"6ec000ef", |
00000419 => x"fc041ce3", |
00000420 => x"00c12083", |
00000421 => x"00812403", |
00000422 => x"01010113", |
00000423 => x"00008067", |
00000424 => x"ff010113", |
00000391 => x"760000ef", |
00000392 => x"00050413", |
00000393 => x"00000513", |
00000394 => x"730000ef", |
00000395 => x"00c12083", |
00000396 => x"0ff47513", |
00000397 => x"00812403", |
00000398 => x"01010113", |
00000399 => x"00008067", |
00000400 => x"ff010113", |
00000401 => x"00112623", |
00000402 => x"00812423", |
00000403 => x"00000513", |
00000404 => x"6e8000ef", |
00000405 => x"00500513", |
00000406 => x"724000ef", |
00000407 => x"00000513", |
00000408 => x"71c000ef", |
00000409 => x"00050413", |
00000410 => x"00147413", |
00000411 => x"00000513", |
00000412 => x"6e8000ef", |
00000413 => x"fc041ce3", |
00000414 => x"00c12083", |
00000415 => x"00812403", |
00000416 => x"01010113", |
00000417 => x"00008067", |
00000418 => x"ff010113", |
00000419 => x"00000513", |
00000420 => x"00112623", |
00000421 => x"6a4000ef", |
00000422 => x"00600513", |
00000423 => x"6e0000ef", |
00000424 => x"00c12083", |
00000425 => x"00000513", |
00000426 => x"00112623", |
00000427 => x"6a8000ef", |
00000428 => x"00600513", |
00000429 => x"6e4000ef", |
00000430 => x"00c12083", |
00000431 => x"00000513", |
00000432 => x"01010113", |
00000433 => x"6b00006f", |
00000434 => x"ff010113", |
00000435 => x"00812423", |
00000436 => x"00050413", |
00000437 => x"01055513", |
00000438 => x"0ff57513", |
00000439 => x"00112623", |
00000440 => x"6b8000ef", |
00000441 => x"00845513", |
00000442 => x"0ff57513", |
00000443 => x"6ac000ef", |
00000444 => x"0ff47513", |
00000445 => x"00812403", |
00000446 => x"00c12083", |
00000447 => x"01010113", |
00000448 => x"6980006f", |
00000449 => x"ff010113", |
00000450 => x"00812423", |
00000451 => x"00050413", |
00000452 => x"00000513", |
00000453 => x"00112623", |
00000454 => x"63c000ef", |
00000455 => x"00300513", |
00000456 => x"678000ef", |
00000457 => x"00040513", |
00000458 => x"fa1ff0ef", |
00000459 => x"00000513", |
00000460 => x"668000ef", |
00000461 => x"00050413", |
00000462 => x"00000513", |
00000463 => x"638000ef", |
00000464 => x"00c12083", |
00000465 => x"0ff47513", |
00000466 => x"00812403", |
00000467 => x"01010113", |
00000468 => x"00008067", |
00000469 => x"fd010113", |
00000470 => x"02812423", |
00000471 => x"02912223", |
00000472 => x"03212023", |
00000473 => x"01312e23", |
00000474 => x"01412c23", |
00000475 => x"02112623", |
00000476 => x"00050913", |
00000477 => x"00058993", |
00000478 => x"00c10493", |
00000479 => x"00000413", |
00000480 => x"00400a13", |
00000481 => x"02091e63", |
00000482 => x"4ec000ef", |
00000483 => x"00a48023", |
00000484 => x"00140413", |
00000485 => x"00148493", |
00000486 => x"ff4416e3", |
00000487 => x"02c12083", |
00000488 => x"02812403", |
00000489 => x"00c12503", |
00000490 => x"02412483", |
00000491 => x"02012903", |
00000492 => x"01c12983", |
00000493 => x"01812a03", |
00000494 => x"03010113", |
00000495 => x"00008067", |
00000496 => x"00898533", |
00000497 => x"f41ff0ef", |
00000498 => x"fc5ff06f", |
00000499 => x"fd010113", |
00000500 => x"01412c23", |
00000501 => x"02812423", |
00000502 => x"80418793", |
00000503 => x"02112623", |
00000504 => x"02912223", |
00000505 => x"03212023", |
00000506 => x"01312e23", |
00000507 => x"01512a23", |
00000508 => x"01612823", |
00000509 => x"01712623", |
00000510 => x"01812423", |
00000511 => x"00100713", |
00000512 => x"00e7a023", |
00000513 => x"00050413", |
00000514 => x"80418a13", |
00000515 => x"02051863", |
00000516 => x"ffff1537", |
00000517 => x"e8c50513", |
00000518 => x"478000ef", |
00000519 => x"080005b7", |
00000520 => x"00040513", |
00000521 => x"f31ff0ef", |
00000522 => x"4788d7b7", |
00000523 => x"afe78793", |
00000524 => x"02f50463", |
00000525 => x"00000513", |
00000526 => x"01c0006f", |
00000527 => x"ffff1537", |
00000528 => x"eac50513", |
00000529 => x"44c000ef", |
00000530 => x"dcdff0ef", |
00000531 => x"fc0518e3", |
00000532 => x"00300513", |
00000533 => x"bb5ff0ef", |
00000534 => x"080009b7", |
00000535 => x"00498593", |
00000536 => x"00040513", |
00000537 => x"ef1ff0ef", |
00000538 => x"00050a93", |
00000539 => x"00898593", |
00000540 => x"00040513", |
00000541 => x"ee1ff0ef", |
00000542 => x"ff002c03", |
00000543 => x"00050b13", |
00000544 => x"ffcafb93", |
00000545 => x"00000913", |
00000546 => x"00000493", |
00000547 => x"00c98993", |
00000548 => x"013905b3", |
00000549 => x"052b9c63", |
00000550 => x"016484b3", |
00000551 => x"00200513", |
00000552 => x"fa049ae3", |
00000553 => x"ffff1537", |
00000554 => x"eb850513", |
00000555 => x"3e4000ef", |
00000556 => x"02c12083", |
00000557 => x"02812403", |
00000558 => x"800007b7", |
00000559 => x"0157a023", |
00000560 => x"000a2023", |
00000561 => x"02412483", |
00000562 => x"02012903", |
00000563 => x"01c12983", |
00000564 => x"01812a03", |
00000565 => x"01412a83", |
00000566 => x"01012b03", |
00000567 => x"00c12b83", |
00000568 => x"00812c03", |
00000569 => x"03010113", |
00000570 => x"00008067", |
00000571 => x"00040513", |
00000572 => x"e65ff0ef", |
00000573 => x"012c07b3", |
00000574 => x"00a484b3", |
00000575 => x"00a7a023", |
00000576 => x"00490913", |
00000577 => x"f8dff06f", |
00000578 => x"ff010113", |
00000579 => x"00112623", |
00000580 => x"00812423", |
00000581 => x"00912223", |
00000582 => x"00058413", |
00000583 => x"00050493", |
00000584 => x"d81ff0ef", |
00000585 => x"00000513", |
00000586 => x"42c000ef", |
00000587 => x"00200513", |
00000588 => x"468000ef", |
00000589 => x"00048513", |
00000590 => x"d91ff0ef", |
00000591 => x"00040513", |
00000592 => x"458000ef", |
00000593 => x"00000513", |
00000594 => x"42c000ef", |
00000595 => x"00812403", |
00000596 => x"00c12083", |
00000597 => x"00412483", |
00000598 => x"01010113", |
00000599 => x"cfdff06f", |
00000600 => x"fe010113", |
00000601 => x"00812c23", |
00000602 => x"00912a23", |
00000603 => x"01212823", |
00000604 => x"00112e23", |
00000605 => x"00050493", |
00000606 => x"00b12623", |
00000607 => x"00000413", |
00000608 => x"00400913", |
00000609 => x"00c10793", |
00000610 => x"008787b3", |
00000611 => x"0007c583", |
00000612 => x"00848533", |
00000613 => x"00140413", |
00000614 => x"f71ff0ef", |
00000615 => x"ff2414e3", |
00000616 => x"01c12083", |
00000617 => x"01812403", |
00000618 => x"01412483", |
00000619 => x"01012903", |
00000620 => x"02010113", |
00000621 => x"00008067", |
00000622 => x"ff010113", |
00000623 => x"00112623", |
00000624 => x"00812423", |
00000625 => x"00050413", |
00000626 => x"cd9ff0ef", |
00000627 => x"00000513", |
00000628 => x"384000ef", |
00000629 => x"0d800513", |
00000630 => x"3c0000ef", |
00000631 => x"00040513", |
00000632 => x"ce9ff0ef", |
00000633 => x"00000513", |
00000634 => x"38c000ef", |
00000635 => x"00812403", |
00000636 => x"00c12083", |
00000637 => x"01010113", |
00000638 => x"c61ff06f", |
00000639 => x"fe010113", |
00000640 => x"800007b7", |
00000641 => x"00812c23", |
00000642 => x"0007a403", |
00000643 => x"00112e23", |
00000644 => x"00912a23", |
00000645 => x"01212823", |
00000646 => x"01312623", |
00000647 => x"01412423", |
00000648 => x"01512223", |
00000649 => x"02041863", |
00000650 => x"ffff1537", |
00000651 => x"ebc50513", |
00000652 => x"01812403", |
00000653 => x"01c12083", |
00000654 => x"01412483", |
00000655 => x"01012903", |
00000656 => x"00c12983", |
00000657 => x"00812a03", |
00000658 => x"00412a83", |
00000659 => x"02010113", |
00000660 => x"2400006f", |
00000661 => x"ffff1537", |
00000662 => x"ed850513", |
00000663 => x"234000ef", |
00000664 => x"00040513", |
00000665 => x"9f1ff0ef", |
00000666 => x"ffff1537", |
00000667 => x"ee050513", |
00000668 => x"220000ef", |
00000669 => x"08000537", |
00000670 => x"9ddff0ef", |
00000671 => x"ffff1537", |
00000672 => x"ef850513", |
00000673 => x"20c000ef", |
00000674 => x"1ec000ef", |
00000675 => x"00050493", |
00000676 => x"1b0000ef", |
00000677 => x"07900793", |
00000678 => x"0af49e63", |
00000679 => x"b79ff0ef", |
00000680 => x"00051663", |
00000681 => x"00300513", |
00000682 => x"961ff0ef", |
00000683 => x"ffff1537", |
00000684 => x"f0450513", |
00000685 => x"01045493", |
00000686 => x"1d8000ef", |
00000687 => x"00148493", |
00000688 => x"08000937", |
00000689 => x"fff00993", |
00000690 => x"00010a37", |
00000691 => x"fff48493", |
00000692 => x"07349063", |
00000693 => x"4788d5b7", |
00000694 => x"afe58593", |
00000695 => x"08000537", |
00000696 => x"e81ff0ef", |
00000697 => x"08000537", |
00000698 => x"00040593", |
00000699 => x"00450513", |
00000700 => x"e71ff0ef", |
00000701 => x"ff002a03", |
00000702 => x"080009b7", |
00000703 => x"ffc47413", |
00000704 => x"00000493", |
00000705 => x"00000913", |
00000706 => x"00c98a93", |
00000707 => x"01548533", |
00000708 => x"009a07b3", |
00000709 => x"02849663", |
00000710 => x"00898513", |
00000711 => x"412005b3", |
00000712 => x"e41ff0ef", |
00000713 => x"ffff1537", |
00000714 => x"eb850513", |
00000715 => x"f05ff06f", |
00000716 => x"00090513", |
00000717 => x"e85ff0ef", |
00000718 => x"01490933", |
00000719 => x"f91ff06f", |
00000720 => x"0007a583", |
00000721 => x"00448493", |
00000722 => x"00b90933", |
00000723 => x"e15ff0ef", |
00000724 => x"fbdff06f", |
00000725 => x"01c12083", |
00000726 => x"01812403", |
00000727 => x"01412483", |
00000728 => x"01012903", |
00000729 => x"00c12983", |
00000730 => x"00812a03", |
00000731 => x"00412a83", |
00000732 => x"02010113", |
00000733 => x"00008067", |
00000734 => x"fe802503", |
00000735 => x"01155513", |
00000736 => x"00157513", |
00000737 => x"00008067", |
00000738 => x"f9000793", |
00000739 => x"fff00713", |
00000740 => x"00e7a423", |
00000741 => x"00b7a623", |
00000742 => x"00a7a423", |
00000743 => x"00008067", |
00000744 => x"fe802503", |
00000745 => x"01255513", |
00000746 => x"00157513", |
00000747 => x"00008067", |
00000748 => x"fa002023", |
00000749 => x"fe002703", |
00000750 => x"00151513", |
00000751 => x"00000793", |
00000752 => x"04a77463", |
00000753 => x"000016b7", |
00000754 => x"00000713", |
00000755 => x"ffe68693", |
00000756 => x"04f6e663", |
00000757 => x"00367613", |
00000758 => x"0035f593", |
00000759 => x"fff78793", |
00000760 => x"01461613", |
00000761 => x"00c7e7b3", |
00000762 => x"01659593", |
00000763 => x"01871713", |
00000764 => x"00b7e7b3", |
00000765 => x"00e7e7b3", |
00000766 => x"10000737", |
00000767 => x"00e7e7b3", |
00000768 => x"faf02023", |
00000769 => x"00008067", |
00000770 => x"00178793", |
00000771 => x"01079793", |
00000772 => x"40a70733", |
00000773 => x"0107d793", |
00000774 => x"fa9ff06f", |
00000775 => x"ffe70513", |
00000776 => x"0fd57513", |
00000777 => x"00051a63", |
00000778 => x"0037d793", |
00000779 => x"00170713", |
00000780 => x"0ff77713", |
00000781 => x"f9dff06f", |
00000782 => x"0017d793", |
00000783 => x"ff1ff06f", |
00000784 => x"00040737", |
00000785 => x"fa002783", |
00000786 => x"00e7f7b3", |
00000787 => x"fe079ce3", |
00000788 => x"faa02223", |
00000426 => x"01010113", |
00000427 => x"6ac0006f", |
00000428 => x"ff010113", |
00000429 => x"00812423", |
00000430 => x"00050413", |
00000431 => x"01055513", |
00000432 => x"0ff57513", |
00000433 => x"00112623", |
00000434 => x"6b4000ef", |
00000435 => x"00845513", |
00000436 => x"0ff57513", |
00000437 => x"6a8000ef", |
00000438 => x"0ff47513", |
00000439 => x"00812403", |
00000440 => x"00c12083", |
00000441 => x"01010113", |
00000442 => x"6940006f", |
00000443 => x"ff010113", |
00000444 => x"00812423", |
00000445 => x"00050413", |
00000446 => x"00000513", |
00000447 => x"00112623", |
00000448 => x"638000ef", |
00000449 => x"00300513", |
00000450 => x"674000ef", |
00000451 => x"00040513", |
00000452 => x"fa1ff0ef", |
00000453 => x"00000513", |
00000454 => x"664000ef", |
00000455 => x"00050413", |
00000456 => x"00000513", |
00000457 => x"634000ef", |
00000458 => x"00c12083", |
00000459 => x"0ff47513", |
00000460 => x"00812403", |
00000461 => x"01010113", |
00000462 => x"00008067", |
00000463 => x"fd010113", |
00000464 => x"02812423", |
00000465 => x"02912223", |
00000466 => x"03212023", |
00000467 => x"01312e23", |
00000468 => x"02112623", |
00000469 => x"00050993", |
00000470 => x"00058493", |
00000471 => x"00c10913", |
00000472 => x"00358413", |
00000473 => x"04099063", |
00000474 => x"4f0000ef", |
00000475 => x"00a90023", |
00000476 => x"fff40793", |
00000477 => x"00190913", |
00000478 => x"02849263", |
00000479 => x"02c12083", |
00000480 => x"02812403", |
00000481 => x"00c12503", |
00000482 => x"02412483", |
00000483 => x"02012903", |
00000484 => x"01c12983", |
00000485 => x"03010113", |
00000486 => x"00008067", |
00000487 => x"00078413", |
00000488 => x"fc5ff06f", |
00000489 => x"00040513", |
00000490 => x"f45ff0ef", |
00000491 => x"fc1ff06f", |
00000492 => x"fd010113", |
00000493 => x"01412c23", |
00000494 => x"02812423", |
00000495 => x"80418793", |
00000496 => x"02112623", |
00000497 => x"02912223", |
00000498 => x"03212023", |
00000499 => x"01312e23", |
00000500 => x"01512a23", |
00000501 => x"01612823", |
00000502 => x"01712623", |
00000503 => x"01812423", |
00000504 => x"00100713", |
00000505 => x"00e7a023", |
00000506 => x"00050413", |
00000507 => x"80418a13", |
00000508 => x"02051863", |
00000509 => x"ffff1537", |
00000510 => x"e7050513", |
00000511 => x"478000ef", |
00000512 => x"080005b7", |
00000513 => x"00040513", |
00000514 => x"f35ff0ef", |
00000515 => x"4788d7b7", |
00000516 => x"afe78793", |
00000517 => x"02f50463", |
00000518 => x"00000513", |
00000519 => x"01c0006f", |
00000520 => x"ffff1537", |
00000521 => x"e9050513", |
00000522 => x"44c000ef", |
00000523 => x"dd1ff0ef", |
00000524 => x"fc0518e3", |
00000525 => x"00300513", |
00000526 => x"bc1ff0ef", |
00000527 => x"080009b7", |
00000528 => x"00498593", |
00000529 => x"00040513", |
00000530 => x"ef5ff0ef", |
00000531 => x"00050a93", |
00000532 => x"00898593", |
00000533 => x"00040513", |
00000534 => x"ee5ff0ef", |
00000535 => x"ff002c03", |
00000536 => x"00050b13", |
00000537 => x"ffcafb93", |
00000538 => x"00000913", |
00000539 => x"00000493", |
00000540 => x"00c98993", |
00000541 => x"013905b3", |
00000542 => x"052b9c63", |
00000543 => x"016484b3", |
00000544 => x"00200513", |
00000545 => x"fa049ae3", |
00000546 => x"ffff1537", |
00000547 => x"e9c50513", |
00000548 => x"3e4000ef", |
00000549 => x"02c12083", |
00000550 => x"02812403", |
00000551 => x"800007b7", |
00000552 => x"0157a023", |
00000553 => x"000a2023", |
00000554 => x"02412483", |
00000555 => x"02012903", |
00000556 => x"01c12983", |
00000557 => x"01812a03", |
00000558 => x"01412a83", |
00000559 => x"01012b03", |
00000560 => x"00c12b83", |
00000561 => x"00812c03", |
00000562 => x"03010113", |
00000563 => x"00008067", |
00000564 => x"00040513", |
00000565 => x"e69ff0ef", |
00000566 => x"012c07b3", |
00000567 => x"00a484b3", |
00000568 => x"00a7a023", |
00000569 => x"00490913", |
00000570 => x"f8dff06f", |
00000571 => x"ff010113", |
00000572 => x"00112623", |
00000573 => x"00812423", |
00000574 => x"00912223", |
00000575 => x"00058413", |
00000576 => x"00050493", |
00000577 => x"d85ff0ef", |
00000578 => x"00000513", |
00000579 => x"42c000ef", |
00000580 => x"00200513", |
00000581 => x"468000ef", |
00000582 => x"00048513", |
00000583 => x"d95ff0ef", |
00000584 => x"00040513", |
00000585 => x"458000ef", |
00000586 => x"00000513", |
00000587 => x"42c000ef", |
00000588 => x"00812403", |
00000589 => x"00c12083", |
00000590 => x"00412483", |
00000591 => x"01010113", |
00000592 => x"d01ff06f", |
00000593 => x"fe010113", |
00000594 => x"00812c23", |
00000595 => x"00912a23", |
00000596 => x"01212823", |
00000597 => x"00112e23", |
00000598 => x"00050413", |
00000599 => x"00b12623", |
00000600 => x"00c10913", |
00000601 => x"00350493", |
00000602 => x"00094583", |
00000603 => x"00048513", |
00000604 => x"00190913", |
00000605 => x"f79ff0ef", |
00000606 => x"00048793", |
00000607 => x"fff48493", |
00000608 => x"fef414e3", |
00000609 => x"01c12083", |
00000610 => x"01812403", |
00000611 => x"01412483", |
00000612 => x"01012903", |
00000613 => x"02010113", |
00000614 => x"00008067", |
00000615 => x"ff010113", |
00000616 => x"00112623", |
00000617 => x"00812423", |
00000618 => x"00050413", |
00000619 => x"cddff0ef", |
00000620 => x"00000513", |
00000621 => x"384000ef", |
00000622 => x"0d800513", |
00000623 => x"3c0000ef", |
00000624 => x"00040513", |
00000625 => x"cedff0ef", |
00000626 => x"00000513", |
00000627 => x"38c000ef", |
00000628 => x"00812403", |
00000629 => x"00c12083", |
00000630 => x"01010113", |
00000631 => x"c65ff06f", |
00000632 => x"fe010113", |
00000633 => x"800007b7", |
00000634 => x"00812c23", |
00000635 => x"0007a403", |
00000636 => x"00112e23", |
00000637 => x"00912a23", |
00000638 => x"01212823", |
00000639 => x"01312623", |
00000640 => x"01412423", |
00000641 => x"01512223", |
00000642 => x"02041863", |
00000643 => x"ffff1537", |
00000644 => x"ea050513", |
00000645 => x"01812403", |
00000646 => x"01c12083", |
00000647 => x"01412483", |
00000648 => x"01012903", |
00000649 => x"00c12983", |
00000650 => x"00812a03", |
00000651 => x"00412a83", |
00000652 => x"02010113", |
00000653 => x"2400006f", |
00000654 => x"ffff1537", |
00000655 => x"ebc50513", |
00000656 => x"234000ef", |
00000657 => x"00040513", |
00000658 => x"9f5ff0ef", |
00000659 => x"ffff1537", |
00000660 => x"ec450513", |
00000661 => x"220000ef", |
00000662 => x"08000537", |
00000663 => x"9e1ff0ef", |
00000664 => x"ffff1537", |
00000665 => x"edc50513", |
00000666 => x"20c000ef", |
00000667 => x"1ec000ef", |
00000668 => x"00050493", |
00000669 => x"1b0000ef", |
00000670 => x"07900793", |
00000671 => x"0af49e63", |
00000672 => x"b7dff0ef", |
00000673 => x"00051663", |
00000674 => x"00300513", |
00000675 => x"96dff0ef", |
00000676 => x"ffff1537", |
00000677 => x"ee850513", |
00000678 => x"01045493", |
00000679 => x"1d8000ef", |
00000680 => x"00148493", |
00000681 => x"08000937", |
00000682 => x"fff00993", |
00000683 => x"00010a37", |
00000684 => x"fff48493", |
00000685 => x"07349063", |
00000686 => x"4788d5b7", |
00000687 => x"afe58593", |
00000688 => x"08000537", |
00000689 => x"e81ff0ef", |
00000690 => x"08000537", |
00000691 => x"00040593", |
00000692 => x"00450513", |
00000693 => x"e71ff0ef", |
00000694 => x"ff002a03", |
00000695 => x"080009b7", |
00000696 => x"ffc47413", |
00000697 => x"00000493", |
00000698 => x"00000913", |
00000699 => x"00c98a93", |
00000700 => x"01548533", |
00000701 => x"009a07b3", |
00000702 => x"02849663", |
00000703 => x"00898513", |
00000704 => x"412005b3", |
00000705 => x"e41ff0ef", |
00000706 => x"ffff1537", |
00000707 => x"e9c50513", |
00000708 => x"f05ff06f", |
00000709 => x"00090513", |
00000710 => x"e85ff0ef", |
00000711 => x"01490933", |
00000712 => x"f91ff06f", |
00000713 => x"0007a583", |
00000714 => x"00448493", |
00000715 => x"00b90933", |
00000716 => x"e15ff0ef", |
00000717 => x"fbdff06f", |
00000718 => x"01c12083", |
00000719 => x"01812403", |
00000720 => x"01412483", |
00000721 => x"01012903", |
00000722 => x"00c12983", |
00000723 => x"00812a03", |
00000724 => x"00412a83", |
00000725 => x"02010113", |
00000726 => x"00008067", |
00000727 => x"fe802503", |
00000728 => x"01155513", |
00000729 => x"00157513", |
00000730 => x"00008067", |
00000731 => x"f9000793", |
00000732 => x"fff00713", |
00000733 => x"00e7a423", |
00000734 => x"00b7a623", |
00000735 => x"00a7a423", |
00000736 => x"00008067", |
00000737 => x"fe802503", |
00000738 => x"01255513", |
00000739 => x"00157513", |
00000740 => x"00008067", |
00000741 => x"fa002023", |
00000742 => x"fe002703", |
00000743 => x"00151513", |
00000744 => x"00000793", |
00000745 => x"04a77463", |
00000746 => x"000016b7", |
00000747 => x"00000713", |
00000748 => x"ffe68693", |
00000749 => x"04f6e663", |
00000750 => x"00367613", |
00000751 => x"0035f593", |
00000752 => x"fff78793", |
00000753 => x"01461613", |
00000754 => x"00c7e7b3", |
00000755 => x"01659593", |
00000756 => x"01871713", |
00000757 => x"00b7e7b3", |
00000758 => x"00e7e7b3", |
00000759 => x"10000737", |
00000760 => x"00e7e7b3", |
00000761 => x"faf02023", |
00000762 => x"00008067", |
00000763 => x"00178793", |
00000764 => x"01079793", |
00000765 => x"40a70733", |
00000766 => x"0107d793", |
00000767 => x"fa9ff06f", |
00000768 => x"ffe70513", |
00000769 => x"0fd57513", |
00000770 => x"00051a63", |
00000771 => x"0037d793", |
00000772 => x"00170713", |
00000773 => x"0ff77713", |
00000774 => x"f9dff06f", |
00000775 => x"0017d793", |
00000776 => x"ff1ff06f", |
00000777 => x"00040737", |
00000778 => x"fa002783", |
00000779 => x"00e7f7b3", |
00000780 => x"fe079ce3", |
00000781 => x"faa02223", |
00000782 => x"00008067", |
00000783 => x"fa002783", |
00000784 => x"00100513", |
00000785 => x"0007c863", |
00000786 => x"0107d513", |
00000787 => x"00154513", |
00000788 => x"00157513", |
00000789 => x"00008067", |
00000790 => x"fa002783", |
00000791 => x"00100513", |
00000792 => x"0007c863", |
00000793 => x"0107d513", |
00000794 => x"00154513", |
00000795 => x"00157513", |
00000790 => x"fa402503", |
00000791 => x"fe055ee3", |
00000792 => x"0ff57513", |
00000793 => x"00008067", |
00000794 => x"fa402503", |
00000795 => x"01f55513", |
00000796 => x"00008067", |
00000797 => x"fa402503", |
00000798 => x"fe055ee3", |
00000799 => x"0ff57513", |
00000800 => x"00008067", |
00000801 => x"fa402503", |
00000802 => x"01f55513", |
00000803 => x"00008067", |
00000804 => x"ff010113", |
00000805 => x"00812423", |
00000806 => x"01212023", |
00000807 => x"00112623", |
00000808 => x"00912223", |
00000809 => x"00050413", |
00000810 => x"00a00913", |
00000811 => x"00044483", |
00000812 => x"00140413", |
00000813 => x"00049e63", |
00000814 => x"00c12083", |
00000815 => x"00812403", |
00000816 => x"00412483", |
00000817 => x"00012903", |
00000818 => x"01010113", |
00000819 => x"00008067", |
00000820 => x"01249663", |
00000821 => x"00d00513", |
00000822 => x"f69ff0ef", |
00000823 => x"00048513", |
00000824 => x"f61ff0ef", |
00000825 => x"fc9ff06f", |
00000826 => x"ff010113", |
00000827 => x"c81026f3", |
00000828 => x"c0102773", |
00000829 => x"c81027f3", |
00000830 => x"fed79ae3", |
00000831 => x"00e12023", |
00000832 => x"00f12223", |
00000833 => x"00012503", |
00000834 => x"00412583", |
00000835 => x"01010113", |
00000836 => x"00008067", |
00000837 => x"00757513", |
00000838 => x"0036f793", |
00000839 => x"00167613", |
00000840 => x"00a51513", |
00000841 => x"00d79793", |
00000842 => x"0015f593", |
00000843 => x"00f567b3", |
00000844 => x"00f61613", |
00000845 => x"00c7e7b3", |
00000846 => x"00959593", |
00000847 => x"fa800713", |
00000848 => x"00b7e7b3", |
00000849 => x"00072023", |
00000850 => x"1007e793", |
00000851 => x"00f72023", |
00000852 => x"00008067", |
00000853 => x"fa800713", |
00000854 => x"00072683", |
00000855 => x"00757793", |
00000856 => x"00100513", |
00000857 => x"00f51533", |
00000858 => x"00d56533", |
00000859 => x"00a72023", |
00000860 => x"00008067", |
00000861 => x"fa800713", |
00000862 => x"00072683", |
00000863 => x"00757513", |
00000864 => x"00100793", |
00000865 => x"00a797b3", |
00000866 => x"fff7c793", |
00000867 => x"00d7f7b3", |
00000868 => x"00f72023", |
00000869 => x"00008067", |
00000870 => x"faa02623", |
00000871 => x"fa802783", |
00000872 => x"fe07cee3", |
00000873 => x"fac02503", |
00000874 => x"00008067", |
00000875 => x"fe802503", |
00000876 => x"01055513", |
00000877 => x"00157513", |
00000878 => x"00008067", |
00000879 => x"00100793", |
00000880 => x"01f00713", |
00000881 => x"00a797b3", |
00000882 => x"00a74a63", |
00000883 => x"fc802703", |
00000884 => x"00f747b3", |
00000885 => x"fcf02423", |
00000886 => x"00008067", |
00000887 => x"fcc02703", |
00000888 => x"00f747b3", |
00000889 => x"fcf02623", |
00000890 => x"00008067", |
00000891 => x"fc000793", |
00000892 => x"00a7a423", |
00000893 => x"00b7a623", |
00000894 => x"00008067", |
00000895 => x"69617641", |
00000896 => x"6c62616c", |
00000897 => x"4d432065", |
00000898 => x"0a3a7344", |
00000899 => x"203a6820", |
00000900 => x"706c6548", |
00000901 => x"3a72200a", |
00000902 => x"73655220", |
00000903 => x"74726174", |
00000904 => x"3a75200a", |
00000905 => x"6c705520", |
00000906 => x"0a64616f", |
00000907 => x"203a7320", |
00000908 => x"726f7453", |
00000909 => x"6f742065", |
00000910 => x"616c6620", |
00000911 => x"200a6873", |
00000912 => x"4c203a6c", |
00000913 => x"2064616f", |
00000914 => x"6d6f7266", |
00000915 => x"616c6620", |
00000916 => x"200a6873", |
00000917 => x"45203a65", |
00000918 => x"75636578", |
00000919 => x"00006574", |
00000920 => x"746f6f42", |
00000921 => x"2e676e69", |
00000922 => x"0a0a2e2e", |
00000923 => x"00000000", |
00000924 => x"52450a07", |
00000925 => x"5f524f52", |
00000926 => x"00000000", |
00000927 => x"00007830", |
00000928 => x"52455b0a", |
00000929 => x"00002052", |
00000930 => x"00000a5d", |
00000931 => x"69617741", |
00000932 => x"676e6974", |
00000933 => x"6f656e20", |
00000934 => x"32337672", |
00000935 => x"6578655f", |
00000936 => x"6e69622e", |
00000937 => x"202e2e2e", |
00000938 => x"00000000", |
00000939 => x"64616f4c", |
00000940 => x"2e676e69", |
00000941 => x"00202e2e", |
00000942 => x"00004b4f", |
00000943 => x"65206f4e", |
00000944 => x"75636578", |
00000945 => x"6c626174", |
00000946 => x"76612065", |
00000947 => x"616c6961", |
00000948 => x"2e656c62", |
00000949 => x"00000000", |
00000950 => x"74697257", |
00000951 => x"00002065", |
00000952 => x"74796220", |
00000953 => x"74207365", |
00000954 => x"5053206f", |
00000955 => x"6c662049", |
00000956 => x"20687361", |
00000957 => x"00783040", |
00000958 => x"7928203f", |
00000959 => x"20296e2f", |
00000960 => x"00000000", |
00000961 => x"616c460a", |
00000962 => x"6e696873", |
00000963 => x"2e2e2e67", |
00000964 => x"00000020", |
00000965 => x"3c0a0a0a", |
00000966 => x"454e203c", |
00000967 => x"3356524f", |
00000968 => x"6f422032", |
00000969 => x"6f6c746f", |
00000970 => x"72656461", |
00000971 => x"0a3e3e20", |
00000972 => x"444c420a", |
00000973 => x"4f203a56", |
00000974 => x"32207463", |
00000975 => x"30322037", |
00000976 => x"480a3132", |
00000977 => x"203a5657", |
00000978 => x"00000020", |
00000979 => x"4b4c430a", |
00000980 => x"0020203a", |
00000981 => x"53494d0a", |
00000982 => x"00203a41", |
00000983 => x"5550430a", |
00000984 => x"0020203a", |
00000985 => x"434f530a", |
00000986 => x"0020203a", |
00000987 => x"454d490a", |
00000988 => x"00203a4d", |
00000989 => x"74796220", |
00000990 => x"40207365", |
00000991 => x"00000000", |
00000992 => x"454d440a", |
00000993 => x"00203a4d", |
00000994 => x"75410a0a", |
00000995 => x"6f626f74", |
00000996 => x"6920746f", |
00000997 => x"7338206e", |
00000998 => x"7250202e", |
00000999 => x"20737365", |
00001000 => x"2079656b", |
00001001 => x"61206f74", |
00001002 => x"74726f62", |
00001003 => x"00000a2e", |
00001004 => x"0000000a", |
00001005 => x"726f6241", |
00001006 => x"2e646574", |
00001007 => x"00000a0a", |
00001008 => x"444d430a", |
00001009 => x"00203e3a", |
00001010 => x"61766e49", |
00001011 => x"2064696c", |
00001012 => x"00444d43", |
00001013 => x"33323130", |
00001014 => x"37363534", |
00001015 => x"62613938", |
00001016 => x"66656463" |
00000797 => x"ff010113", |
00000798 => x"00812423", |
00000799 => x"01212023", |
00000800 => x"00112623", |
00000801 => x"00912223", |
00000802 => x"00050413", |
00000803 => x"00a00913", |
00000804 => x"00044483", |
00000805 => x"00140413", |
00000806 => x"00049e63", |
00000807 => x"00c12083", |
00000808 => x"00812403", |
00000809 => x"00412483", |
00000810 => x"00012903", |
00000811 => x"01010113", |
00000812 => x"00008067", |
00000813 => x"01249663", |
00000814 => x"00d00513", |
00000815 => x"f69ff0ef", |
00000816 => x"00048513", |
00000817 => x"f61ff0ef", |
00000818 => x"fc9ff06f", |
00000819 => x"ff010113", |
00000820 => x"c81026f3", |
00000821 => x"c0102773", |
00000822 => x"c81027f3", |
00000823 => x"fed79ae3", |
00000824 => x"00e12023", |
00000825 => x"00f12223", |
00000826 => x"00012503", |
00000827 => x"00412583", |
00000828 => x"01010113", |
00000829 => x"00008067", |
00000830 => x"00757513", |
00000831 => x"0036f793", |
00000832 => x"00167613", |
00000833 => x"00a51513", |
00000834 => x"00d79793", |
00000835 => x"0015f593", |
00000836 => x"00f567b3", |
00000837 => x"00f61613", |
00000838 => x"00c7e7b3", |
00000839 => x"00959593", |
00000840 => x"fa800713", |
00000841 => x"00b7e7b3", |
00000842 => x"00072023", |
00000843 => x"1007e793", |
00000844 => x"00f72023", |
00000845 => x"00008067", |
00000846 => x"fa800713", |
00000847 => x"00072683", |
00000848 => x"00757793", |
00000849 => x"00100513", |
00000850 => x"00f51533", |
00000851 => x"00d56533", |
00000852 => x"00a72023", |
00000853 => x"00008067", |
00000854 => x"fa800713", |
00000855 => x"00072683", |
00000856 => x"00757513", |
00000857 => x"00100793", |
00000858 => x"00a797b3", |
00000859 => x"fff7c793", |
00000860 => x"00d7f7b3", |
00000861 => x"00f72023", |
00000862 => x"00008067", |
00000863 => x"faa02623", |
00000864 => x"fa802783", |
00000865 => x"fe07cee3", |
00000866 => x"fac02503", |
00000867 => x"00008067", |
00000868 => x"fe802503", |
00000869 => x"01055513", |
00000870 => x"00157513", |
00000871 => x"00008067", |
00000872 => x"00100793", |
00000873 => x"01f00713", |
00000874 => x"00a797b3", |
00000875 => x"00a74a63", |
00000876 => x"fc802703", |
00000877 => x"00f747b3", |
00000878 => x"fcf02423", |
00000879 => x"00008067", |
00000880 => x"fcc02703", |
00000881 => x"00f747b3", |
00000882 => x"fcf02623", |
00000883 => x"00008067", |
00000884 => x"fc000793", |
00000885 => x"00a7a423", |
00000886 => x"00b7a623", |
00000887 => x"00008067", |
00000888 => x"69617641", |
00000889 => x"6c62616c", |
00000890 => x"4d432065", |
00000891 => x"0a3a7344", |
00000892 => x"203a6820", |
00000893 => x"706c6548", |
00000894 => x"3a72200a", |
00000895 => x"73655220", |
00000896 => x"74726174", |
00000897 => x"3a75200a", |
00000898 => x"6c705520", |
00000899 => x"0a64616f", |
00000900 => x"203a7320", |
00000901 => x"726f7453", |
00000902 => x"6f742065", |
00000903 => x"616c6620", |
00000904 => x"200a6873", |
00000905 => x"4c203a6c", |
00000906 => x"2064616f", |
00000907 => x"6d6f7266", |
00000908 => x"616c6620", |
00000909 => x"200a6873", |
00000910 => x"45203a65", |
00000911 => x"75636578", |
00000912 => x"00006574", |
00000913 => x"746f6f42", |
00000914 => x"2e676e69", |
00000915 => x"0a0a2e2e", |
00000916 => x"00000000", |
00000917 => x"52450a07", |
00000918 => x"5f524f52", |
00000919 => x"00000000", |
00000920 => x"00007830", |
00000921 => x"52455b0a", |
00000922 => x"00002052", |
00000923 => x"00000a5d", |
00000924 => x"69617741", |
00000925 => x"676e6974", |
00000926 => x"6f656e20", |
00000927 => x"32337672", |
00000928 => x"6578655f", |
00000929 => x"6e69622e", |
00000930 => x"202e2e2e", |
00000931 => x"00000000", |
00000932 => x"64616f4c", |
00000933 => x"2e676e69", |
00000934 => x"00202e2e", |
00000935 => x"00004b4f", |
00000936 => x"65206f4e", |
00000937 => x"75636578", |
00000938 => x"6c626174", |
00000939 => x"76612065", |
00000940 => x"616c6961", |
00000941 => x"2e656c62", |
00000942 => x"00000000", |
00000943 => x"74697257", |
00000944 => x"00002065", |
00000945 => x"74796220", |
00000946 => x"74207365", |
00000947 => x"5053206f", |
00000948 => x"6c662049", |
00000949 => x"20687361", |
00000950 => x"00783040", |
00000951 => x"7928203f", |
00000952 => x"20296e2f", |
00000953 => x"00000000", |
00000954 => x"616c460a", |
00000955 => x"6e696873", |
00000956 => x"2e2e2e67", |
00000957 => x"00000020", |
00000958 => x"3c0a0a0a", |
00000959 => x"454e203c", |
00000960 => x"3356524f", |
00000961 => x"6f422032", |
00000962 => x"6f6c746f", |
00000963 => x"72656461", |
00000964 => x"0a3e3e20", |
00000965 => x"444c420a", |
00000966 => x"4e203a56", |
00000967 => x"3220766f", |
00000968 => x"30322038", |
00000969 => x"480a3132", |
00000970 => x"203a5657", |
00000971 => x"00000020", |
00000972 => x"4b4c430a", |
00000973 => x"0020203a", |
00000974 => x"53494d0a", |
00000975 => x"00203a41", |
00000976 => x"5550430a", |
00000977 => x"0020203a", |
00000978 => x"434f530a", |
00000979 => x"0020203a", |
00000980 => x"454d490a", |
00000981 => x"00203a4d", |
00000982 => x"74796220", |
00000983 => x"40207365", |
00000984 => x"00000000", |
00000985 => x"454d440a", |
00000986 => x"00203a4d", |
00000987 => x"75410a0a", |
00000988 => x"6f626f74", |
00000989 => x"6920746f", |
00000990 => x"7338206e", |
00000991 => x"7250202e", |
00000992 => x"20737365", |
00000993 => x"2079656b", |
00000994 => x"61206f74", |
00000995 => x"74726f62", |
00000996 => x"00000a2e", |
00000997 => x"0000000a", |
00000998 => x"726f6241", |
00000999 => x"2e646574", |
00001000 => x"00000a0a", |
00001001 => x"444d430a", |
00001002 => x"00203e3a", |
00001003 => x"61766e49", |
00001004 => x"2064696c", |
00001005 => x"00444d43", |
00001006 => x"33323130", |
00001007 => x"37363534", |
00001008 => x"62613938", |
00001009 => x"66656463" |
); |
|
end neorv32_bootloader_image; |
/core/neorv32_bus_keeper.vhd
87,7 → 87,7
-- controller -- |
type control_t is record |
pending : std_ulogic; |
timeout : std_ulogic_vector(index_size_f(max_proc_int_response_time_c)-1 downto 0); |
timeout : std_ulogic_vector(index_size_f(max_proc_int_response_time_c) downto 0); |
err_type : std_ulogic; |
bus_err : std_ulogic; |
end record; |
148,7 → 148,7
|
-- access monitor: IDLE -- |
if (control.pending = '0') then |
control.timeout <= std_ulogic_vector(to_unsigned(max_proc_int_response_time_c, index_size_f(max_proc_int_response_time_c))); |
control.timeout <= std_ulogic_vector(to_unsigned(max_proc_int_response_time_c, index_size_f(max_proc_int_response_time_c)+1)); |
if (bus_rden_i = '1') or (bus_wren_i = '1') then |
control.pending <= '1'; |
end if; |
/core/neorv32_cfs.vhd
174,10 → 174,10
-- Interrupt ------------------------------------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
-- The CFS features a single interrupt signal, which is connected to the CPU's "fast interrupt" channel 1. |
-- The interrupt is high-level-active. When set, the interrupt appears as "pending" in the CPU's mie register |
-- ready to trigger execution of the according interrupt handler. |
-- Once set, the irq_o signal **has to stay set** until explicitly acknowledged by the CPU |
-- (for example by reading/writing from/to a specific CFS interface register address). |
-- The interrupt is triggered by a one-shot rising edge. After triggering, the interrupt appears as "pending" in the CPU's mie register |
-- ready to trigger execution of the according interrupt handler. The interrupt request signal should be triggered |
-- whenever an interrupt condition is fulfilled. It is the task of the application to programmer to enable/clear the CFS interrupt |
-- using the CPU's mie and mip registers when reuqired. |
|
irq_o <= '0'; -- not used for this minimal example |
|
/core/neorv32_cpu.vhd
94,6 → 94,7
clk_i : in std_ulogic; -- global clock, rising edge |
rstn_i : in std_ulogic; -- global reset, low-active, async |
sleep_o : out std_ulogic; -- cpu is in sleep mode when set |
debug_o : out std_ulogic; -- cpu is in debug mode when set |
-- instruction bus interface -- |
i_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address |
i_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data |
316,7 → 317,10
-- CPU is sleeping? -- |
sleep_o <= ctrl(ctrl_sleep_c); -- set when CPU is sleeping (after WFI) |
|
-- CPU is in debug mode? -- |
debug_o <= ctrl(ctrl_debug_running_c); |
|
|
-- Register File -------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
neorv32_cpu_regfile_inst: neorv32_cpu_regfile |
/core/neorv32_cpu_control.vhd
287,6 → 287,8
mie_mtie : std_ulogic; -- mie.MEIE: machine timer interrupt enable (R/W) |
mie_firqe : std_ulogic_vector(15 downto 0); -- mie.firq*e: fast interrupt enabled (R/W) |
-- |
mip_clr : std_ulogic_vector(15 downto 0); -- clear pending FIRQ |
-- |
mcounteren_cy : std_ulogic; -- mcounteren.cy: allow cycle[h] access from user-mode |
mcounteren_tm : std_ulogic; -- mcounteren.tm: allow time[h] access from user-mode |
mcounteren_ir : std_ulogic; -- mcounteren.ir: allow instret[h] access from user-mode |
392,7 → 394,7
elsif rising_edge(clk_i) then |
fetch_engine.state <= fetch_engine.state_nxt; |
fetch_engine.state_prev <= fetch_engine.state; |
fetch_engine.restart <= fetch_engine.restart_nxt; |
fetch_engine.restart <= fetch_engine.restart_nxt or fetch_engine.reset; |
if (fetch_engine.restart = '1') then |
fetch_engine.pc <= execute_engine.pc(data_width_c-1 downto 1) & '0'; -- initialize with "real" application PC |
else |
414,9 → 416,9
fetch_engine.state_nxt <= fetch_engine.state; |
fetch_engine.pc_nxt <= fetch_engine.pc; |
fetch_engine.bus_err_ack <= '0'; |
fetch_engine.restart_nxt <= fetch_engine.restart or fetch_engine.reset; |
fetch_engine.restart_nxt <= fetch_engine.restart; |
|
-- instruction prefetch buffer interface -- |
-- instruction prefetch buffer defaults -- |
ipb.we <= '0'; |
ipb.wdata <= be_instr_i & ma_instr_i & instr_i(31 downto 0); -- store exception info and instruction word |
ipb.clear <= fetch_engine.restart; |
430,20 → 432,16
bus_fast_ir <= '1'; -- fast instruction fetch request |
fetch_engine.state_nxt <= IFETCH_ISSUE; |
end if; |
if (fetch_engine.restart = '1') then -- reset request? |
fetch_engine.restart_nxt <= '0'; |
end if; |
fetch_engine.restart_nxt <= '0'; |
|
when IFETCH_ISSUE => -- store instruction data to prefetch buffer |
-- ------------------------------------------------------------ |
fetch_engine.bus_err_ack <= be_instr_i or ma_instr_i; -- ACK bus/alignment errors |
if (bus_i_wait_i = '0') or (be_instr_i = '1') or (ma_instr_i = '1') then -- wait for bus response |
fetch_engine.pc_nxt <= std_ulogic_vector(unsigned(fetch_engine.pc) + 4); |
ipb.we <= not fetch_engine.restart; -- write to IPB if not being reset |
if (fetch_engine.restart = '1') then -- reset request? |
fetch_engine.restart_nxt <= '0'; |
end if; |
fetch_engine.state_nxt <= IFETCH_REQUEST; |
fetch_engine.pc_nxt <= std_ulogic_vector(unsigned(fetch_engine.pc) + 4); |
ipb.we <= not fetch_engine.restart; -- write to IPB if not being reset |
fetch_engine.restart_nxt <= '0'; |
fetch_engine.state_nxt <= IFETCH_REQUEST; |
end if; |
|
when others => -- undefined |
504,7 → 502,7
issue_engine.align <= '1'; -- aligned on 16-bit boundary |
else |
issue_engine.state <= issue_engine.state_nxt; |
issue_engine.align <= '0'; -- always aligned on 32-bit boundaries |
issue_engine.align <= '0'; -- aligned on 32-bit boundary |
end if; |
else |
issue_engine.state <= issue_engine.state_nxt; |
541,14 → 539,13
|
if (issue_engine.align = '0') or (CPU_EXTENSION_RISCV_C = false) then -- begin check in LOW instruction half-word |
if (execute_engine.state = DISPATCH) then -- ready to issue new command? |
ipb.re <= '1'; |
cmd_issue.valid <= '1'; |
issue_engine.buf_nxt <= ipb.rdata(33 downto 32) & ipb.rdata(31 downto 16); -- store high half-word - we might need it for an unaligned uncompressed instruction |
if (ipb.rdata(1 downto 0) = "11") or (CPU_EXTENSION_RISCV_C = false) then -- uncompressed and "aligned" |
ipb.re <= '1'; |
cmd_issue.data <= '0' & ipb.rdata(33 downto 32) & '0' & ipb.rdata(31 downto 0); |
else -- compressed |
ipb.re <= '1'; |
cmd_issue.data <= ci_illegal & ipb.rdata(33 downto 32) & '1' & ci_instr32; |
cmd_issue.data <= ci_illegal & ipb.rdata(33 downto 32) & '1' & ci_instr32; |
issue_engine.align_nxt <= '1'; |
end if; |
end if; |
558,11 → 555,11
cmd_issue.valid <= '1'; |
issue_engine.buf_nxt <= ipb.rdata(33 downto 32) & ipb.rdata(31 downto 16); -- store high half-word - we might need it for an unaligned uncompressed instruction |
if (issue_engine.buf(1 downto 0) = "11") then -- uncompressed and "unaligned" |
ipb.re <= '1'; |
ipb.re <= '1'; |
cmd_issue.data <= '0' & (ipb.rdata(33 downto 32) or issue_engine.buf(17 downto 16)) & '0' & (ipb.rdata(15 downto 0) & issue_engine.buf(15 downto 0)); |
else -- compressed |
-- do not read from ipb here! |
cmd_issue.data <= ci_illegal & ipb.rdata(33 downto 32) & '1' & ci_instr32; |
cmd_issue.data <= ci_illegal & ipb.rdata(33 downto 32) & '1' & ci_instr32; |
issue_engine.align_nxt <= '0'; |
end if; |
end if; |
573,7 → 570,7
-- ------------------------------------------------------------ |
issue_engine.buf_nxt <= ipb.rdata(33 downto 32) & ipb.rdata(31 downto 16); |
if (ipb.avail = '1') then -- instructions available? |
ipb.re <= '1'; |
ipb.re <= '1'; |
issue_engine.state_nxt <= ISSUE_ACTIVE; |
end if; |
|
787,7 → 784,7
ctrl_o(ctrl_rf_rs1_adr4_c downto ctrl_rf_rs1_adr0_c) <= execute_engine.i_reg(instr_rs1_msb_c downto instr_rs1_lsb_c); |
ctrl_o(ctrl_rf_rs2_adr4_c downto ctrl_rf_rs2_adr0_c) <= execute_engine.i_reg(instr_rs2_msb_c downto instr_rs2_lsb_c); |
ctrl_o(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c) <= execute_engine.i_reg(instr_rd_msb_c downto instr_rd_lsb_c); |
-- fast bus access requests -- |
-- instruction fetch request -- |
ctrl_o(ctrl_bus_if_c) <= bus_fast_ir; |
-- bus error control -- |
ctrl_o(ctrl_bus_ierr_ack_c) <= fetch_engine.bus_err_ack; -- instruction fetch bus access error ACK |
1040,14 → 1037,13
ctrl_nxt(ctrl_alu_op2_c downto ctrl_alu_op0_c) <= alu_op_and_c; |
end case; |
|
-- Check if single-cycle or multi-cycle (co-processor) operation -- |
-- co-processor MULDIV operation? -- |
-- co-processor MULDIV operation (multi-cycle)? -- |
if ((CPU_EXTENSION_RISCV_M = true) and ((decode_aux.is_m_mul = '1') or (decode_aux.is_m_div = '1'))) or -- MUL/DIV |
((CPU_EXTENSION_RISCV_Zmmul = true) and (decode_aux.is_m_mul = '1')) then -- MUL |
ctrl_nxt(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) <= cp_sel_muldiv_c; -- use MULDIV CP |
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_copro_c; |
execute_engine.state_nxt <= ALU_WAIT; |
-- co-processor BIT-MANIPULATION operation? -- |
-- co-processor BIT-MANIPULATION operation (multi-cycle)? -- |
elsif (CPU_EXTENSION_RISCV_B = true) and |
(((execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alu_c(5)) and (decode_aux.is_bitmanip_reg = '1')) or -- register operation |
((execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alui_c(5)) and (decode_aux.is_bitmanip_imm = '1'))) then -- immediate operation |
1054,13 → 1050,13
ctrl_nxt(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) <= cp_sel_bitmanip_c; -- use BITMANIP CP |
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_copro_c; |
execute_engine.state_nxt <= ALU_WAIT; |
-- co-processor SHIFT operation? -- |
-- co-processor SHIFT operation (multi-cycle)? -- |
elsif (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sll_c) or |
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sr_c) then |
ctrl_nxt(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) <= cp_sel_shifter_c; -- use SHIFTER CP (only relevant for shift operations) |
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_copro_c; |
execute_engine.state_nxt <= ALU_WAIT; |
-- ALU core operations (single-cycle) -- |
-- ALU CORE operation (single-cycle) -- |
else |
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_core_c; |
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back |
1152,7 → 1148,7
when funct12_ecall_c => trap_ctrl.env_call <= '1'; -- ECALL |
when funct12_ebreak_c => trap_ctrl.break_point <= '1'; -- EBREAK |
when funct12_mret_c => execute_engine.state_nxt <= TRAP_EXIT; -- MRET |
when funct12_dret_c => -- DRET |
when funct12_dret_c => -- DRET |
if (CPU_EXTENSION_RISCV_DEBUG = true) then |
execute_engine.state_nxt <= TRAP_EXIT; |
debug_ctrl.dret <= '1'; |
1177,7 → 1173,7
if (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_csrrw_c) or |
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_csrrwi_c) then -- CSRRW(I) |
csr.we_nxt <= '1'; -- always write CSR |
else -- CSRRS(I) / CSRRC(I) [invalid CSR instruction are already checked by the illegal instruction logic] |
else -- CSRRS(I) / CSRRC(I) [invalid CSR instructions are already checked by the illegal instruction logic] |
csr.we_nxt <= not decode_aux.rs1_zero; -- write CSR if rs1/imm is not zero |
end if; |
-- register file write back -- |
1294,7 → 1290,7
-- machine trap setup/handling & counters -- |
when csr_mstatus_c | csr_mstatush_c | csr_misa_c | csr_mie_c | csr_mtvec_c | csr_mscratch_c | csr_mepc_c | csr_mcause_c | csr_mip_c | csr_mtval_c | |
csr_mcycle_c | csr_mcycleh_c | csr_minstret_c | csr_minstreth_c | csr_mcountinhibit_c => |
-- NOTE: MISA, MIP and MTVAL are read-only in the NEORV32 but we do not cause an exception here for compatibility. |
-- NOTE: MISA and MTVAL are read-only in the NEORV32 but we do not cause an exception here for compatibility. |
-- Machine-level code should read-back those CSRs after writing them to realize they are read-only. |
csr_acc_valid <= csr.priv_m_mode; -- M-mode only |
|
1632,8 → 1628,8
trap_ctrl.irq_buf(interrupt_mext_irq_c) <= csr.mie_meie and mext_irq_i; |
trap_ctrl.irq_buf(interrupt_mtime_irq_c) <= csr.mie_mtie and mtime_irq_i; |
|
-- interrupt buffer: NEORV32-specific fast interrupts (FIRQ) -- |
trap_ctrl.irq_buf(interrupt_firq_15_c downto interrupt_firq_0_c) <= csr.mie_firqe(15 downto 0) and firq_i(15 downto 0); |
-- interrupt queue: NEORV32-specific fast interrupts (FIRQ) -- |
trap_ctrl.irq_buf(interrupt_firq_15_c downto interrupt_firq_0_c) <= (trap_ctrl.irq_buf(interrupt_firq_15_c downto interrupt_firq_0_c) or (csr.mie_firqe and firq_i)) and (not csr.mip_clr); |
|
-- trap environment control -- |
if (trap_ctrl.env_start = '0') then -- no started trap handler |
1722,7 → 1718,7
|
|
-- ---------------------------------------------------------------------------------------- |
-- (re-)enter debug mode requests; basically, these are standard traps that have some |
-- (re-)enter debug mode requests: basically, these are standard traps that have some |
-- special handling - they have the highest INTERRUPT priority in order to go to debug when requested |
-- even if other IRQs are pending right now |
-- ---------------------------------------------------------------------------------------- |
1878,6 → 1874,7
csr.mepc <= (others => def_rst_val_c); |
csr.mcause <= (others => def_rst_val_c); |
csr.mtval <= (others => def_rst_val_c); |
csr.mip_clr <= (others => def_rst_val_c); |
-- |
csr.pmpcfg <= (others => (others => '0')); |
csr.pmpaddr <= (others => (others => def_rst_val_c)); |
1907,6 → 1904,9
-- write access? -- |
csr.we <= csr.we_nxt; |
|
-- defaults -- |
csr.mip_clr <= (others => '0'); |
|
if (CPU_EXTENSION_RISCV_Zicsr = true) then |
-- -------------------------------------------------------------------------------- |
-- CSR access by application software |
1965,20 → 1965,24
|
-- machine trap handling -- |
-- -------------------------------------------------------------------- |
if (csr.addr(11 downto 3) = csr_class_trap_c) then -- machine trap handling CSR class |
if (csr.addr(11 downto 4) = csr_class_trap_c) then -- machine trap handling CSR class |
-- R/W: mscratch - machine scratch register -- |
if (csr.addr(2 downto 0) = csr_mscratch_c(2 downto 0)) then |
if (csr.addr(3 downto 0) = csr_mscratch_c(3 downto 0)) then |
csr.mscratch <= csr.wdata; |
end if; |
-- R/W: mepc - machine exception program counter -- |
if (csr.addr(2 downto 0) = csr_mepc_c(2 downto 0)) then |
if (csr.addr(3 downto 0) = csr_mepc_c(3 downto 0)) then |
csr.mepc <= csr.wdata; |
end if; |
-- R/W: mcause - machine trap cause -- |
if (csr.addr(2 downto 0) = csr_mcause_c(2 downto 0)) then |
if (csr.addr(3 downto 0) = csr_mcause_c(3 downto 0)) then |
csr.mcause(csr.mcause'left) <= csr.wdata(31); -- 1: async/interrupt, 0: sync/exception |
csr.mcause(4 downto 0) <= csr.wdata(4 downto 0); -- identifier |
end if; |
-- R/W: mip - machine interrupt pending -- |
if (csr.addr(3 downto 0) = csr_mip_c(3 downto 0)) then |
csr.mip_clr <= csr.wdata(31 downto 16); |
end if; |
end if; |
|
-- physical memory protection: R/W: pmpcfg* - PMP configuration registers -- |
2491,7 → 2495,7
csr.rdata(csr.mcause'left-1 downto 0) <= csr.mcause(csr.mcause'left-1 downto 0); |
when csr_mtval_c => -- mtval (r/-): machine bad address or instruction |
csr.rdata <= csr.mtval; |
when csr_mip_c => -- mip (r/-): machine interrupt pending |
when csr_mip_c => -- mip (r/w): machine interrupt pending |
csr.rdata(03) <= trap_ctrl.irq_buf(interrupt_msw_irq_c); |
csr.rdata(07) <= trap_ctrl.irq_buf(interrupt_mtime_irq_c); |
csr.rdata(11) <= trap_ctrl.irq_buf(interrupt_mext_irq_c); |
/core/neorv32_cpu_cp_muldiv.vhd
79,7 → 79,7
constant cp_op_remu_c : std_ulogic_vector(2 downto 0) := "111"; -- remu |
|
-- controller -- |
type state_t is (IDLE, DIV_PREPROCESS, PROCESSING, FINALIZE, COMPLETED); |
type state_t is (IDLE, DIV_PREPROCESS, PROCESSING, FINALIZE); |
signal state : state_t; |
signal cnt : std_ulogic_vector(4 downto 0); |
signal cp_op : std_ulogic_vector(2 downto 0); -- operation to execute |
87,13 → 87,12
signal start_div : std_ulogic; |
signal start_mul : std_ulogic; |
signal operation : std_ulogic; |
signal div_opx : std_ulogic_vector(data_width_c-1 downto 0); |
signal div_opy : std_ulogic_vector(data_width_c-1 downto 0); |
signal rs1_is_signed : std_ulogic; |
signal rs2_is_signed : std_ulogic; |
signal opy_is_zero : std_ulogic; |
signal div_res_corr : std_ulogic; |
signal valid : std_ulogic; |
signal out_en : std_ulogic; |
|
-- divider core -- |
signal remainder : std_ulogic_vector(data_width_c-1 downto 0); |
110,7 → 109,6
signal mul_p_sext : std_ulogic; |
signal mul_op_x : signed(32 downto 0); -- for using DSPs |
signal mul_op_y : signed(32 downto 0); -- for using DSPs |
signal mul_buf_ff : signed(65 downto 0); -- for using DSPs |
|
begin |
|
120,31 → 118,34
begin |
if (rstn_i = '0') then |
state <= IDLE; |
div_opx <= (others => def_rst_val_c); |
div_opy <= (others => def_rst_val_c); |
cnt <= (others => def_rst_val_c); |
cp_op_ff <= (others => def_rst_val_c); |
start_div <= '0'; |
valid <= '0'; |
out_en <= '0'; |
valid_o <= '0'; |
div_res_corr <= def_rst_val_c; |
opy_is_zero <= def_rst_val_c; |
elsif rising_edge(clk_i) then |
-- defaults -- |
start_div <= '0'; |
valid <= '0'; |
out_en <= '0'; |
valid_o <= '0'; |
|
-- FSM -- |
case state is |
|
when IDLE => |
cp_op_ff <= cp_op; |
cnt <= "11110"; |
if (start_i = '1') then |
if (operation = '1') and (DIVISION_EN = true) then -- division |
cnt <= "11111"; |
state <= DIV_PREPROCESS; |
else |
cnt <= "11110"; |
start_div <= '1'; |
state <= DIV_PREPROCESS; |
else -- multiplication |
if (FAST_MUL_EN = true) then |
state <= FINALIZE; |
valid_o <= '1'; |
state <= FINALIZE; |
else |
state <= PROCESSING; |
end if; |
152,47 → 153,37
end if; |
|
when DIV_PREPROCESS => |
if (DIVISION_EN = true) then |
-- check rlevatn input signs -- |
if (cp_op = cp_op_div_c) then -- result sign compensation for div? |
div_res_corr <= rs1_i(rs1_i'left) xor rs2_i(rs2_i'left); |
elsif (cp_op = cp_op_rem_c) then -- result sign compensation for rem? |
div_res_corr <= rs1_i(rs1_i'left); |
else |
div_res_corr <= '0'; |
end if; |
-- divide by zero? -- |
opy_is_zero <= not or_reduce_f(rs2_i); -- set if rs2 = 0 |
-- abs(rs1) -- |
if ((rs1_i(rs1_i'left) and rs1_is_signed) = '1') then -- signed division? |
div_opx <= std_ulogic_vector(0 - unsigned(rs1_i)); -- make positive |
else |
div_opx <= rs1_i; |
end if; |
-- abs(rs2) -- |
if ((rs2_i(rs2_i'left) and rs2_is_signed) = '1') then -- signed division? |
div_opy <= std_ulogic_vector(0 - unsigned(rs2_i)); -- make positive |
else |
div_opy <= rs2_i; |
end if; |
-- |
start_div <= '1'; |
state <= PROCESSING; |
-- check relevant input signs -- |
if (cp_op = cp_op_div_c) then -- result sign compensation for div? |
div_res_corr <= rs1_i(rs1_i'left) xor rs2_i(rs2_i'left); |
elsif (cp_op = cp_op_rem_c) then -- result sign compensation for rem? |
div_res_corr <= rs1_i(rs1_i'left); |
else |
state <= IDLE; |
div_res_corr <= '0'; |
end if; |
-- divide by zero? -- |
opy_is_zero <= not or_reduce_f(rs2_i); -- set if rs2 = 0 |
-- abs(rs2) -- |
if ((rs2_i(rs2_i'left) and rs2_is_signed) = '1') then -- signed division? |
div_opy <= std_ulogic_vector(0 - unsigned(rs2_i)); -- make positive |
else |
div_opy <= rs2_i; |
end if; |
-- |
state <= PROCESSING; |
|
when PROCESSING => |
cnt <= std_ulogic_vector(unsigned(cnt) - 1); |
if (cnt = "00000") then |
state <= FINALIZE; |
valid_o <= '1'; |
state <= FINALIZE; |
end if; |
|
when FINALIZE => |
state <= COMPLETED; |
out_en <= '1'; |
state <= IDLE; |
|
when COMPLETED => |
valid <= '1'; |
when others => |
state <= IDLE; |
end case; |
end if; |
235,10 → 226,11
end process multiplier_core; |
end generate; |
|
-- parallel multiplication -- |
-- parallel multiplication (using DSP blocks) -- |
multiplier_core_dsp: |
if (FAST_MUL_EN = true) generate |
multiplier_core: process(clk_i) |
variable tmp_v : signed(65 downto 0); |
begin |
if rising_edge(clk_i) then |
if (start_mul = '1') then |
245,8 → 237,10
mul_op_x <= signed((rs1_i(rs1_i'left) and rs1_is_signed) & rs1_i); |
mul_op_y <= signed((rs2_i(rs2_i'left) and rs2_is_signed) & rs2_i); |
end if; |
mul_buf_ff <= mul_op_x * mul_op_y; |
mul_product <= std_ulogic_vector(mul_buf_ff(63 downto 0)); -- let the register balancing do the magic here |
tmp_v := mul_op_x * mul_op_y; |
mul_product <= std_ulogic_vector(tmp_v(63 downto 0)); |
--mul_buf_ff <= mul_op_x * mul_op_y; |
--mul_product <= std_ulogic_vector(mul_buf_ff(63 downto 0)); -- let the register balancing do the magic here |
end if; |
end process multiplier_core; |
end generate; |
282,7 → 276,11
remainder <= (others => def_rst_val_c); |
elsif rising_edge(clk_i) then |
if (start_div = '1') then -- start new division |
quotient <= div_opx; |
if ((rs1_i(rs1_i'left) and rs1_is_signed) = '1') then -- signed division? |
quotient <= std_ulogic_vector(0 - unsigned(rs1_i)); -- make positive |
else |
quotient <= rs1_i; |
end if; |
remainder <= (others => '0'); |
elsif (state = PROCESSING) or (state = FINALIZE) then -- running? |
quotient <= quotient(30 downto 0) & (not div_sub(32)); |
307,49 → 305,39
-- no divider -- |
divider_core_serial_none: |
if (DIVISION_EN = false) generate |
remainder <= (others => '-'); |
quotient <= (others => '-'); |
div_res <= (others => '-'); |
remainder <= (others => '0'); |
quotient <= (others => '0'); |
div_res <= (others => '0'); |
end generate; |
|
|
-- Data Output ---------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
operation_result: process(rstn_i, clk_i) |
operation_result: process(out_en, cp_op_ff, mul_product, div_res, quotient, opy_is_zero, rs1_i, remainder) |
begin |
if (rstn_i = '0') then |
res_o <= (others => def_rst_val_c); |
elsif rising_edge(clk_i) then |
if (out_en = '1') then |
case cp_op_ff is |
when cp_op_mul_c => |
res_o <= mul_product(31 downto 00); |
when cp_op_mulh_c | cp_op_mulhsu_c | cp_op_mulhu_c => |
res_o <= mul_product(63 downto 32); |
when cp_op_div_c => |
res_o <= div_res; |
when cp_op_divu_c => |
res_o <= quotient; |
when cp_op_rem_c => |
if (opy_is_zero = '0') then |
res_o <= div_res; |
else |
res_o <= rs1_i; |
end if; |
when others => -- cp_op_remu_c |
res_o <= remainder; |
end case; |
else |
res_o <= (others => '0'); |
if (valid = '1') then |
case cp_op_ff is |
when cp_op_mul_c => |
res_o <= mul_product(31 downto 00); |
when cp_op_mulh_c | cp_op_mulhsu_c | cp_op_mulhu_c => |
res_o <= mul_product(63 downto 32); |
when cp_op_div_c => |
if (DIVISION_EN = true) then res_o <= div_res; else NULL; end if; |
when cp_op_divu_c => |
if (DIVISION_EN = true) then res_o <= quotient; else NULL; end if; |
when cp_op_rem_c => |
if (DIVISION_EN = true) then |
if (opy_is_zero = '0') then |
res_o <= div_res; |
else |
res_o <= rs1_i; |
end if; |
else |
NULL; |
end if; |
when others => -- cp_op_remu_c |
if (DIVISION_EN = true) then res_o <= remainder; else NULL; end if; |
end case; |
end if; |
end if; |
end process operation_result; |
|
-- status output -- |
valid_o <= valid; |
|
|
end neorv32_cpu_cp_muldiv_rtl; |
/core/neorv32_gptmr.vhd
74,7 → 74,6
constant ctrl_prsc1_c : natural := 2; -- r/w: clock prescaler select bit 1 |
constant ctrl_prsc2_c : natural := 3; -- r/w: clock prescaler select bit 2 |
constant ctrl_mode_c : natural := 4; -- r/w: mode (0=single-shot, 1=continuous) |
constant ctrl_alarm_c : natural := 5; -- r/c: alarm flag (interrupt), cleared by writing zero |
-- |
signal ctrl : std_ulogic_vector(4 downto 0); |
|
96,13 → 95,8
end record; |
signal timer : timer_t; |
|
-- interrupt generator -- |
type irq_t is record |
pending : std_ulogic; -- pending interrupt request |
detect : std_ulogic_vector(1 downto 0); -- rising-edge detector |
clearn : std_ulogic; -- clear/ack IRQ request, active-low |
end record; |
signal irq : irq_t; |
-- interrupt detector -- |
signal irq_detect : std_ulogic_vector(1 downto 0); |
|
begin |
|
123,7 → 117,6
ack_o <= rden or wren; |
|
-- write access -- |
irq.clearn <= '1'; |
timer.cnt_we <= '0'; |
if (wren = '1') then |
if (addr = gptmr_ctrl_addr_c) then -- control register |
132,7 → 125,6
ctrl(ctrl_prsc1_c) <= data_i(ctrl_prsc1_c); |
ctrl(ctrl_prsc2_c) <= data_i(ctrl_prsc2_c); |
ctrl(ctrl_mode_c) <= data_i(ctrl_mode_c); |
irq.clearn <= data_i(ctrl_alarm_c); |
end if; |
if (addr = gptmr_thres_addr_c) then -- threshold register |
timer.thres <= data_i; |
152,7 → 144,6
data_o(ctrl_prsc1_c) <= ctrl(ctrl_prsc1_c); |
data_o(ctrl_prsc2_c) <= ctrl(ctrl_prsc2_c); |
data_o(ctrl_mode_c) <= ctrl(ctrl_mode_c); |
data_o(ctrl_alarm_c) <= irq.pending; |
when "01" => -- threshold register |
data_o <= timer.thres; |
when others => -- counter register |
198,21 → 189,15
begin |
if rising_edge(clk_i) then |
if (ctrl(ctrl_en_c) = '0') then |
irq.detect <= "00"; |
irq.pending <= '0'; |
irq_detect <= "00"; |
else |
irq.detect <= irq.detect(0) & timer.match; |
if (irq.detect = "01") then -- rising edge |
irq.pending <= '1'; |
elsif (irq.clearn = '0') then |
irq.pending <= '0'; |
end if; |
irq_detect <= irq_detect(0) & timer.match; |
end if; |
end if; |
end process irq_generator; |
|
-- IRQ request to CPU -- |
irq_o <= irq.pending; |
irq_o <= '1' when (irq_detect = "01") else '0'; |
|
|
end neorv32_gptmr_rtl; |
/core/neorv32_neoled.vhd
155,9 → 155,8
|
-- interrupt generator -- |
type irq_t is record |
pending : std_ulogic; -- pending interrupt request |
set : std_ulogic; |
clr : std_ulogic; |
set : std_ulogic; |
buf : std_ulogic_vector(1 downto 0); |
end record; |
signal irq : irq_t; |
|
250,42 → 249,31
|
-- IRQ Generator -------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
irq_select: process(ctrl, tx_buffer) |
irq_select: process(ctrl, tx_buffer, serial.done) |
begin |
if (FIFO_DEPTH = 1) then |
irq.set <= tx_buffer.free; -- fire IRQ if FIFO is empty |
if (FIFO_DEPTH = 1) or (ctrl.irq_conf = '1') then |
irq.set <= tx_buffer.free and serial.done; -- fire IRQ if FIFO is empty |
else |
if (ctrl.irq_conf = '0') then -- fire IRQ if FIFO is less than half-full |
irq.set <= not tx_buffer.half; |
else -- fire IRQ if FIFO is empty |
irq.set <= tx_buffer.free; |
end if; |
irq.set <= not tx_buffer.half; -- fire IRQ if FIFO is less than half-full |
end if; |
end process irq_select; |
|
-- Interrupt Arbiter -- |
irq_generator: process(clk_i) |
-- Interrupt Edge Detector -- |
irq_detect: process(clk_i) |
begin |
if rising_edge(clk_i) then |
if (ctrl.enable = '0') then |
irq.pending <= '0'; |
irq.buf <= "00"; |
else |
if (irq.set = '1') and (serial.done = '1') then -- evaluate IRQ condition when transmitter is done again |
irq.pending <= '1'; |
elsif (irq.clr = '1') then |
irq.pending <= '0'; |
end if; |
irq.buf <= irq.buf(0) & irq.set; |
end if; |
end if; |
end process irq_generator; |
end process irq_detect; |
|
-- IRQ request to CPU -- |
irq_o <= irq.pending; |
irq_o <= '1' when (irq.buf = "01") else '0'; |
|
-- IRQ acknowledge -- |
irq.clr <= '1' when (wren = '1') else '0'; -- write data or control register |
|
|
-- TX Buffer (FIFO) ----------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
tx_data_fifo: neorv32_fifo |
/core/neorv32_package.vhd
53,7 → 53,7
-- increasing instruction fetch & data access latency by +1 cycle but also reducing critical path length |
constant pmp_num_regions_critical_c : natural := 8; -- default=8 |
|
-- "response time window" for processor-internal memories and IO devices |
-- "response time window" for processor-internal modules -- |
constant max_proc_int_response_time_c : natural := 15; -- cycles after which an *unacknowledged* internal bus access will timeout and trigger a bus fault exception (min 2) |
|
-- jtag tap - identifier -- |
64,9 → 64,23
-- Architecture Constants (do not modify!) ------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
constant data_width_c : natural := 32; -- native data path width - do not change! |
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01060400"; -- no touchy! |
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01060500"; -- no touchy! |
constant archid_c : natural := 19; -- official NEORV32 architecture ID - hands off! |
|
-- Check if we're inside the Matrix ------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
constant is_simulation_c : boolean := false -- seems like we're on real hardware |
-- pragma translate_off |
-- synthesis translate_off |
-- synthesis synthesis_off |
-- RTL_SYNTHESIS OFF |
or true -- this MIGHT be a simulation |
-- RTL_SYNTHESIS ON |
-- synthesis synthesis_on |
-- synthesis translate_on |
-- pragma translate_on |
; |
|
-- External Interface Types --------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
type sdata_8x32_t is array (0 to 7) of std_ulogic_vector(31 downto 0); |
575,7 → 589,7
constant csr_mhpmevent30_c : std_ulogic_vector(11 downto 0) := x"33e"; |
constant csr_mhpmevent31_c : std_ulogic_vector(11 downto 0) := x"33f"; |
-- machine trap handling -- |
constant csr_class_trap_c : std_ulogic_vector(08 downto 0) := x"34" & '0'; -- machine trap handling |
constant csr_class_trap_c : std_ulogic_vector(07 downto 0) := x"34"; -- machine trap handling |
constant csr_mscratch_c : std_ulogic_vector(11 downto 0) := x"340"; |
constant csr_mepc_c : std_ulogic_vector(11 downto 0) := x"341"; |
constant csr_mcause_c : std_ulogic_vector(11 downto 0) := x"342"; |
1089,6 → 1103,7
clk_i : in std_ulogic; -- global clock, rising edge |
rstn_i : in std_ulogic; -- global reset, low-active, async |
sleep_o : out std_ulogic; -- cpu is in sleep mode when set |
debug_o : out std_ulogic; -- cpu is in debug mode when set |
-- instruction bus interface -- |
i_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address |
i_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data |
1616,6 → 1631,9
-- Component: Watchdog Timer (WDT) -------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
component neorv32_wdt |
generic ( |
DEBUG_EN : boolean -- CPU debug mode implemented? |
); |
port ( |
-- host access -- |
clk_i : in std_ulogic; -- global clock line |
1626,6 → 1644,8
data_i : in std_ulogic_vector(31 downto 0); -- data in |
data_o : out std_ulogic_vector(31 downto 0); -- data out |
ack_o : out std_ulogic; -- transfer acknowledge |
-- CPU in debug mode? -- |
cpu_debug_i : in std_ulogic; |
-- clock generator -- |
clkgen_en_o : out std_ulogic; -- enable clock generator |
clkgen_i : in std_ulogic_vector(07 downto 0); |
2090,7 → 2110,7
|
package body neorv32_package is |
|
-- Function: Minimal required number of bits to represent input number -------------------- |
-- Function: Minimal required number of bits to represent <input> numbers ----------------- |
-- ------------------------------------------------------------------------------------------- |
function index_size_f(input : natural) return natural is |
begin |
/core/neorv32_slink.vhd
153,11 → 153,9
-- interrupt generator -- |
type detect_t is array (0 to 7) of std_ulogic_vector(1 downto 0); |
type irq_t is record |
pending : std_ulogic; -- pending interrupt request |
detect : detect_t; -- rising-edge detector |
trigger : std_ulogic_vector(7 downto 0); |
set : std_ulogic_vector(7 downto 0); |
clr : std_ulogic; |
end record; |
signal rx_irq, tx_irq : irq_t; |
|
261,65 → 259,59
|
-- Interrupt Generator -------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
irq_type: process(irq_rx_mode, rx_fifo_avail, rx_fifo_half, |
irq_tx_mode, tx_fifo_free, tx_fifo_half) |
-- interrupt trigger type / condition -- |
irq_type: process(irq_rx_mode, rx_fifo_avail, rx_fifo_half, irq_tx_mode, tx_fifo_free, tx_fifo_half, tx_fifo_we) |
begin |
-- RX interrupt -- |
rx_irq.trigger <= (others => '0'); |
for i in 0 to SLINK_NUM_RX-1 loop |
if (SLINK_RX_FIFO = 1) then |
rx_irq.trigger(i) <= rx_fifo_avail(i); -- fire if any RX_FIFO is not empty |
if (SLINK_RX_FIFO = 1) or (irq_rx_mode(i) = '0') then |
rx_irq.trigger(i) <= rx_fifo_avail(i); -- fire if any RX_FIFO is not empty (= data available) |
else |
if (irq_rx_mode(i) = '0') then -- fire if any RX_FIFO is at least half-full |
rx_irq.trigger(i) <= rx_fifo_half(i); |
else -- fire if any RX_FIFO is not empty (= data available) |
rx_irq.trigger(i) <= rx_fifo_avail(i); |
end if; |
rx_irq.trigger(i) <= rx_fifo_half(i); |
end if; |
end loop; |
-- TX interrupt -- |
tx_irq.trigger <= (others => '0'); |
for i in 0 to SLINK_NUM_TX-1 loop |
if (SLINK_TX_FIFO = 1) then |
tx_irq.trigger(i) <= tx_fifo_free(i); -- fire if any TX_FIFO is not full |
if (SLINK_TX_FIFO = 1) or (irq_tx_mode(i) = '0') then |
tx_irq.trigger(i) <= tx_fifo_free(i) and tx_fifo_we(i); -- fire if any TX_FIFO is not full (= free buffer space available) |
else |
if (irq_tx_mode(i) = '0') then -- fire if any TX_FIFO is less than half-full |
tx_irq.trigger(i) <= not tx_fifo_half(i); |
else -- fire if any TX_FIFO is not full (= free buffer space available) |
tx_irq.trigger(i) <= tx_fifo_free(i); |
end if; |
tx_irq.trigger(i) <= not tx_fifo_half(i); |
end if; |
end loop; |
end process irq_type; |
|
-- interrupt trigger -- |
irq_trigger_sync: process(clk_i) |
-- edge detector - sync -- |
irq_edge_detect_sync: process(clk_i) |
begin |
if rising_edge(clk_i) then |
-- RX -- |
rx_irq.detect <= (others => (others => '0')); -- default |
if (enable = '1') then |
for i in 0 to SLINK_NUM_RX-1 loop |
for i in 0 to SLINK_NUM_RX-1 loop |
if (enable = '1') and (irq_rx_en(i) = '1') then |
rx_irq.detect(i) <= rx_irq.detect(i)(0) & rx_irq.trigger(i); |
end loop; |
end if; |
else |
rx_irq.detect(i) <= "00"; |
end if; |
end loop; |
-- TX -- |
tx_irq.detect <= (others => (others => '0')); -- default |
if (enable = '1') then |
for i in 0 to SLINK_NUM_TX-1 loop |
for i in 0 to SLINK_NUM_TX-1 loop |
if (enable = '1') and (irq_tx_en(i) = '1') then |
tx_irq.detect(i) <= tx_irq.detect(i)(0) & tx_irq.trigger(i); |
end loop; |
end if; |
else |
tx_irq.detect(i) <= "00"; |
end if; |
end loop; |
end if; |
end process irq_trigger_sync; |
end process irq_edge_detect_sync; |
|
-- interrupt trigger -- |
irq_trigger_comb: process(rx_irq, irq_rx_en, tx_irq, irq_tx_en) |
-- edge detector - sync -- |
irq_edge_detect_comb: process(rx_irq, irq_rx_en, tx_irq, irq_tx_en) |
begin |
-- RX -- |
rx_irq.set <= (others => '0'); |
for i in 0 to SLINK_NUM_RX-1 loop |
if (rx_irq.detect(i) = "01") and (irq_rx_en(i) = '1') then -- rising-edge |
if (rx_irq.detect(i) = "01") then -- rising-edge |
rx_irq.set(i) <= '1'; |
end if; |
end loop; |
326,45 → 318,22
-- TX -- |
tx_irq.set <= (others => '0'); |
for i in 0 to SLINK_NUM_TX-1 loop |
if (tx_irq.detect(i) = "01") and (irq_tx_en(i) = '1') then -- rising-edge |
if (tx_irq.detect(i) = "01") then -- rising-edge |
tx_irq.set(i) <= '1'; |
end if; |
end loop; |
end process irq_trigger_comb; |
end process irq_edge_detect_comb; |
|
-- interrupt arbiter -- |
irq_generator: process(clk_i) |
begin |
if rising_edge(clk_i) then |
if (enable = '0') then |
rx_irq.pending <= '0'; |
tx_irq.pending <= '0'; |
else |
-- RX -- |
if (or_reduce_f(rx_irq.set) = '1') then |
rx_irq.pending <= '1'; |
elsif (rx_irq.clr = '1') then |
rx_irq.pending <= '0'; |
end if; |
-- TX -- |
if (or_reduce_f(tx_irq.set) = '1') then |
tx_irq.pending <= '1'; |
elsif (tx_irq.clr = '1') then |
tx_irq.pending <= '0'; |
end if; |
end if; |
irq_rx_o <= or_reduce_f(rx_irq.set); |
irq_tx_o <= or_reduce_f(tx_irq.set); |
end if; |
end process irq_generator; |
|
-- IRQ requests to CPU -- |
irq_rx_o <= rx_irq.pending; |
irq_tx_o <= tx_irq.pending; |
|
-- IRQ acknowledge -- |
rx_irq.clr <= '1' when ((rden = '1') and (addr(5) = '1')) or ((wren = '1') and (addr(5 downto 3) = "000")) else '0'; -- read from data FIFO OR write to control register |
tx_irq.clr <= '1' when ((wren = '1') and (addr(5) = '1')) or ((wren = '1') and (addr(5 downto 3) = "000")) else '0'; -- write to data FIFO OR write to control register |
|
|
-- Link Select ---------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
link_select: process(addr) |
/core/neorv32_spi.vhd
116,14 → 116,6
end record; |
signal rtx_engine : rtx_engine_t; |
|
-- interrupt generator -- |
type irq_t is record |
pending : std_ulogic; -- pending interrupt request |
set : std_ulogic; |
clr : std_ulogic; |
end record; |
signal irq : irq_t; |
|
begin |
|
-- Access Control ------------------------------------------------------------------------- |
239,7 → 231,7
|
-- defaults -- |
spi_sck_o <= ctrl(ctrl_cpol_c); |
irq.set <= '0'; |
irq_o <= '0'; |
|
-- serial engine -- |
rtx_engine.state(2) <= ctrl(ctrl_en_c); |
273,7 → 265,7
if (spi_clk_en = '1') then |
rtx_engine.sreg <= rtx_engine.sreg(30 downto 0) & rtx_engine.sdi_sync(rtx_engine.sdi_sync'left); |
if (rtx_engine.bitcnt(5 downto 3) = rtx_engine.bytecnt) then -- all bits transferred? |
irq.set <= '1'; -- interrupt! |
irq_o <= '1'; -- interrupt! |
rtx_engine.state(1 downto 0) <= "00"; -- transmission done |
else |
rtx_engine.state(1 downto 0) <= "10"; |
292,28 → 284,4
rtx_engine.busy <= '0' when (rtx_engine.state(1 downto 0) = "00") else '1'; |
|
|
-- Interrupt Generator -------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
irq_generator: process(clk_i) |
begin |
if rising_edge(clk_i) then |
if (ctrl(ctrl_en_c) = '0') then |
irq.pending <= '0'; |
else |
if (irq.set = '1') then |
irq.pending <= '1'; |
elsif (irq.clr = '1') then |
irq.pending <= '0'; |
end if; |
end if; |
end if; |
end process irq_generator; |
|
-- IRQ request to CPU -- |
irq_o <= irq.pending; |
|
-- IRQ acknowledge -- |
irq.clr <= '1' when ((rden = '1') and (addr = spi_rtx_addr_c)) or (wren = '1') else '0'; -- read data register OR write data/control register |
|
|
end neorv32_spi_rtl; |
/core/neorv32_sysinfo.vhd
163,8 → 163,9
sysinfo_mem(2)(04) <= bool_to_ulogic_f(MEM_EXT_BIG_ENDIAN); -- is external memory bus interface using BIG-endian byte-order? |
sysinfo_mem(2)(05) <= bool_to_ulogic_f(ICACHE_EN); -- processor-internal instruction cache implemented? |
-- |
sysinfo_mem(2)(13 downto 06) <= (others => '0'); -- reserved |
sysinfo_mem(2)(12 downto 06) <= (others => '0'); -- reserved |
-- Misc -- |
sysinfo_mem(2)(13) <= bool_to_ulogic_f(is_simulation_c); -- is this a simulation? |
sysinfo_mem(2)(14) <= bool_to_ulogic_f(ON_CHIP_DEBUGGER_EN); -- on-chip debugger implemented? |
sysinfo_mem(2)(15) <= bool_to_ulogic_f(dedicated_reset_c); -- dedicated hardware reset of all core registers? |
-- IO -- |
/core/neorv32_top.vhd
340,6 → 340,7
signal mtime_time : std_ulogic_vector(63 downto 0); -- current system time from MTIME |
signal ext_timeout : std_ulogic; |
signal ext_access : std_ulogic; |
signal debug_mode : std_ulogic; |
|
begin |
|
492,6 → 493,7
clk_i => clk_i, -- global clock, rising edge |
rstn_i => sys_rstn, -- global reset, low-active, async |
sleep_o => open, -- cpu is in sleep mode when set |
debug_o => debug_mode, -- cpu is in debug mode when set |
-- instruction bus interface -- |
i_bus_addr_o => cpu_i.addr, -- bus access address |
i_bus_rdata_i => cpu_i.rdata, -- bus read data |
537,7 → 539,7
fencei_o <= cpu_i.fence; -- indicates an executed FENCEI operation |
|
-- fast interrupt requests (FIRQs) -- |
-- these stay asserted until explicitly acknowledged -- |
-- these signals are single-shot -- |
fast_irq(00) <= wdt_irq; -- HIGHEST PRIORITY - watchdog |
fast_irq(01) <= cfs_irq; -- custom functions subsystem |
fast_irq(02) <= uart0_rxd_irq; -- primary UART (UART0) RX |
937,6 → 939,9
neorv32_wdt_inst_true: |
if (IO_WDT_EN = true) generate |
neorv32_wdt_inst: neorv32_wdt |
generic map( |
DEBUG_EN => ON_CHIP_DEBUGGER_EN -- CPU debug mode implemented? |
) |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
947,6 → 952,8
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_WDT).rdata, -- data out |
ack_o => resp_bus(RESP_WDT).ack, -- transfer acknowledge |
-- CPU in debug mode? -- |
cpu_debug_i => debug_mode, |
-- clock generator -- |
clkgen_en_o => wdt_cg_en, -- enable clock generator |
clkgen_i => clk_gen, |
/core/neorv32_twi.vhd
111,14 → 111,6
signal twi_sda_out : std_ulogic; |
signal twi_scl_out : std_ulogic; |
|
-- interrupt generator -- |
type irq_t is record |
pending : std_ulogic; -- pending interrupt request |
set : std_ulogic; |
clr : std_ulogic; |
end record; |
signal irq : irq_t; |
|
begin |
|
-- Access Control ------------------------------------------------------------------------- |
198,7 → 190,7
twi_scl_in_ff <= twi_scl_in_ff(0) & twi_scl_in; |
|
-- defaults -- |
irq.set <= '0'; |
irq_o <= '0'; |
|
-- serial engine -- |
arbiter(2) <= ctrl(ctrl_en_c); -- still activated? |
232,7 → 224,7
twi_scl_out <= '1'; |
elsif (twi_clk_phase(3) = '1') then |
twi_scl_out <= '0'; |
irq.set <= '1'; -- Interrupt! |
irq_o <= '1'; -- Interrupt! |
arbiter(1 downto 0) <= "00"; -- go back to IDLE |
end if; |
|
241,7 → 233,7
twi_sda_out <= '0'; |
elsif (twi_clk_phase(3) = '1') then |
twi_sda_out <= '1'; |
irq.set <= '1'; -- Interrupt! |
irq_o <= '1'; -- Interrupt! |
arbiter(1 downto 0) <= "00"; -- go back to IDLE |
end if; |
-- |
264,7 → 256,7
end if; |
-- |
if (bitcnt = "1010") then -- 8 data bits + 1 bit for ACK + 1 tick delay |
irq.set <= '1'; -- Interrupt! |
irq_o <= '1'; -- Interrupt! |
arbiter(1 downto 0) <= "00"; -- go back to IDLE |
end if; |
|
295,28 → 287,4
twi_scl_in <= std_ulogic(twi_scl_io); |
|
|
-- Interrupt Generator -------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
irq_generator: process(clk_i) |
begin |
if rising_edge(clk_i) then |
if (ctrl(ctrl_en_c) = '0') then |
irq.pending <= '0'; |
else |
if (irq.set = '1') then |
irq.pending <= '1'; |
elsif (irq.clr = '1') then |
irq.pending <= '0'; |
end if; |
end if; |
end if; |
end process irq_generator; |
|
-- IRQ request to CPU -- |
irq_o <= irq.pending; |
|
-- IRQ acknowledge -- |
irq.clr <= '1' when ((rden = '1') and (addr = twi_rtx_addr_c)) or (wren = '1') else '0'; -- read data register OR write data/control register |
|
|
end neorv32_twi_rtl; |
/core/neorv32_uart.vhd
231,9 → 231,8
|
-- interrupt generator -- |
type irq_t is record |
pending : std_ulogic; -- pending interrupt request |
set : std_ulogic; |
clr : std_ulogic; |
set : std_ulogic; |
buf : std_ulogic_vector(1 downto 0); |
end record; |
signal rx_irq, tx_irq : irq_t; |
|
490,9 → 489,9
|
-- overrun flag -- |
if (rden = '1') and (addr = uart_id_rtx_addr_c) then -- clear when reading data register |
rx_engine.overr <= '0'; |
elsif (rx_buffer.we = '1') and (rx_buffer.free = '0') then -- write to full FIFO |
rx_engine.overr <= '1'; |
elsif (rx_buffer.we = '1') and (rx_buffer.free = '0') then -- write to full FIFO |
rx_engine.overr <= '0'; |
end if; |
end if; |
end if; |
556,64 → 555,41
|
-- Interrupt Generator -------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
irq_type: process(ctrl, tx_buffer, rx_buffer) |
irq_type: process(ctrl, tx_buffer, rx_buffer, tx_engine.done) |
begin |
-- TX interrupt -- |
if (UART_TX_FIFO = 1) then |
tx_irq.set <= tx_buffer.free; -- fire IRQ if FIFO is not full |
if (UART_TX_FIFO = 1) or (ctrl(ctrl_tx_irq_c) = '0') then |
tx_irq.set <= tx_buffer.free and tx_engine.done; -- fire IRQ if FIFO is not full |
else |
if (ctrl(ctrl_tx_irq_c) = '1') then |
tx_irq.set <= not tx_buffer.half; -- fire IRQ if FIFO is less than half-full |
else |
tx_irq.set <= tx_buffer.free; -- fire IRQ if FIFO is not full |
end if; |
tx_irq.set <= (not tx_buffer.half) and tx_engine.done; -- fire IRQ if FIFO is less than half-full |
end if; |
|
-- RX interrupt -- |
if (UART_RX_FIFO = 1) then |
if (UART_RX_FIFO = 1) or (ctrl(ctrl_rx_irq_c) = '0') then |
rx_irq.set <= rx_buffer.avail; -- fire IRQ if FIFO is not empty |
else |
if (ctrl(ctrl_rx_irq_c) = '1') then |
rx_irq.set <= rx_buffer.half; -- fire IRQ if FIFO is at least half-full |
else |
rx_irq.set <= rx_buffer.avail; -- fire IRQ is FIFO is not empty |
end if; |
rx_irq.set <= rx_buffer.half; -- fire IRQ if FIFO is at least half-full |
end if; |
end process irq_type; |
|
-- interrupt arbiter -- |
irq_generator: process(clk_i) |
-- interrupt edge detector -- |
irq_detect: process(clk_i) |
begin |
if rising_edge(clk_i) then |
if (ctrl(ctrl_en_c) = '0') then |
rx_irq.pending <= '0'; |
tx_irq.pending <= '0'; |
tx_irq.buf <= "00"; |
rx_irq.buf <= "00"; |
else |
-- TX -- |
if (tx_irq.set = '1') and (tx_engine.done = '1') then -- evaluate IRQ condition when TX is done with current sending |
tx_irq.pending <= '1'; |
elsif (tx_irq.clr = '1') then |
tx_irq.pending <= '0'; |
end if; |
-- RX -- |
if (rx_irq.set = '1') and (rx_engine.done = '1') then -- evaluate IRQ condition when RX is done with current receiving |
rx_irq.pending <= '1'; |
elsif (rx_irq.clr = '1') then |
rx_irq.pending <= '0'; |
end if; |
tx_irq.buf <= tx_irq.buf(0) & tx_irq.set; |
rx_irq.buf <= rx_irq.buf(0) & rx_irq.set; |
end if; |
end if; |
end process irq_generator; |
end process irq_detect; |
|
-- IRQ requests to CPU -- |
irq_txd_o <= tx_irq.pending; |
irq_rxd_o <= rx_irq.pending; |
irq_txd_o <= '1' when (tx_irq.buf = "01") else '0'; |
irq_rxd_o <= '1' when (rx_irq.buf = "01") else '0'; |
|
-- IRQ acknowledge -- |
tx_irq.clr <= '1' when (tx_buffer.we = '1') or ((wren = '1') and (addr = uart_id_ctrl_addr_c)) else '0'; -- write to data reg OR write to control reg |
rx_irq.clr <= '1' when (rx_buffer.re = '1') or ((wren = '1') and (addr = uart_id_ctrl_addr_c)) else '0'; -- read from data reg OR write to control reg |
|
|
-- SIMULATION Transmitter ----------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
-- pragma translate_off |
/core/neorv32_wdt.vhd
48,6 → 48,9
use neorv32.neorv32_package.all; |
|
entity neorv32_wdt is |
generic ( |
DEBUG_EN : boolean -- CPU debug mode implemented? |
); |
port ( |
-- host access -- |
clk_i : in std_ulogic; -- global clock line |
58,6 → 61,8
data_i : in std_ulogic_vector(31 downto 0); -- data in |
data_o : out std_ulogic_vector(31 downto 0); -- data out |
ack_o : out std_ulogic; -- transfer acknowledge |
-- CPU in debug mode? -- |
cpu_debug_i : in std_ulogic; |
-- clock generator -- |
clkgen_en_o : out std_ulogic; -- enable clock generator |
clkgen_i : in std_ulogic_vector(07 downto 0); |
74,15 → 79,17
constant lo_abb_c : natural := index_size_f(wdt_size_c); -- low address boundary bit |
|
-- Control register bits -- |
constant ctrl_enable_c : natural := 0; -- r/w: WDT enable |
constant ctrl_clksel0_c : natural := 1; -- r/w: prescaler select bit 0 |
constant ctrl_clksel1_c : natural := 2; -- r/w: prescaler select bit 1 |
constant ctrl_clksel2_c : natural := 3; -- r/w: prescaler select bit 2 |
constant ctrl_mode_c : natural := 4; -- r/w: 0: WDT timeout triggers interrupt, 1: WDT timeout triggers hard reset |
constant ctrl_rcause_c : natural := 5; -- r/-: cause of last action (reset/IRQ): 0=external reset, 1=watchdog overflow |
constant ctrl_reset_c : natural := 6; -- -/w: reset WDT if set |
constant ctrl_force_c : natural := 7; -- -/w: force WDT action |
constant ctrl_lock_c : natural := 8; -- r/w: lock access to control register when set |
constant ctrl_enable_c : natural := 0; -- r/w: WDT enable |
constant ctrl_clksel0_c : natural := 1; -- r/w: prescaler select bit 0 |
constant ctrl_clksel1_c : natural := 2; -- r/w: prescaler select bit 1 |
constant ctrl_clksel2_c : natural := 3; -- r/w: prescaler select bit 2 |
constant ctrl_mode_c : natural := 4; -- r/w: 0: WDT timeout triggers interrupt, 1: WDT timeout triggers hard reset |
constant ctrl_rcause_c : natural := 5; -- r/-: cause of last action (reset/IRQ): 0=external reset, 1=watchdog overflow |
constant ctrl_reset_c : natural := 6; -- -/w: reset WDT if set |
constant ctrl_force_c : natural := 7; -- -/w: force WDT action |
constant ctrl_lock_c : natural := 8; -- r/w: lock access to control register when set |
constant ctrl_dben_c : natural := 9; -- r/w: allow WDT to continue operation even when in debug mode |
constant ctrl_half_c : natural := 10; -- r/-: set if at least half of the max. timeout counter value has been reached |
|
-- access control -- |
signal acc_en : std_ulogic; -- module access enable |
90,7 → 97,7
signal rden : std_ulogic; |
|
-- control register -- |
type ctrl_reg_t is record |
type ctrl_t is record |
enable : std_ulogic; -- 1=WDT enabled |
clk_sel : std_ulogic_vector(2 downto 0); |
mode : std_ulogic; -- 0=trigger IRQ on overflow; 1=trigger hard reset on overflow |
98,8 → 105,9
reset : std_ulogic; -- reset WDT |
enforce : std_ulogic; -- force action |
lock : std_ulogic; -- lock control register |
dben : std_ulogic; -- allow operation also in debug mode |
end record; |
signal ctrl_reg : ctrl_reg_t; |
signal ctrl : ctrl_t; |
|
-- prescaler clock generator -- |
signal prsc_tick : std_ulogic; |
108,18 → 116,11
signal wdt_cnt : std_ulogic_vector(20 downto 0); |
signal hw_rst : std_ulogic; |
signal rst_gen : std_ulogic_vector(03 downto 0); |
signal cnt_en : std_ulogic; |
|
-- internal reset (sync, low-active) -- |
signal rstn_sync : std_ulogic; |
|
-- cpu interrupt -- |
type cpu_irq_t is record |
pending : std_ulogic; |
set : std_ulogic; |
clr : std_ulogic; |
end record; |
signal cpu_irq : cpu_irq_t; |
|
begin |
|
-- Access Control ------------------------------------------------------------------------- |
134,34 → 135,36
write_access: process(rstn_i, clk_i) |
begin |
if (rstn_i = '0') then |
ctrl_reg.reset <= '0'; |
ctrl_reg.enforce <= '0'; |
ctrl_reg.enable <= '0'; -- disable WDT |
ctrl_reg.mode <= '0'; -- trigger interrupt on WDT overflow |
ctrl_reg.clk_sel <= (others => '1'); -- slowest clock source |
ctrl_reg.lock <= '0'; |
ctrl.reset <= '1'; -- reset counter on start-up |
ctrl.enforce <= '0'; |
ctrl.enable <= '0'; -- disable WDT |
ctrl.mode <= '0'; |
ctrl.clk_sel <= (others => '0'); |
ctrl.lock <= '0'; |
ctrl.dben <= '0'; |
elsif rising_edge(clk_i) then |
-- acknowledge interrupt when resetting WDT -- |
if (rstn_sync = '0') then -- internal reset |
ctrl_reg.reset <= '0'; |
ctrl_reg.enforce <= '0'; |
ctrl_reg.enable <= '0'; -- disable WDT |
ctrl_reg.mode <= '0'; -- trigger interrupt on WDT overflow |
ctrl_reg.clk_sel <= (others => '1'); -- slowest clock source |
ctrl_reg.lock <= '0'; |
ctrl.reset <= '1'; -- reset counter on start-up |
ctrl.enforce <= '0'; |
ctrl.enable <= '0'; -- disable WDT |
ctrl.mode <= '0'; |
ctrl.clk_sel <= (others => '0'); |
ctrl.lock <= '0'; |
ctrl.dben <= '0'; |
else |
-- auto-clear WDT reset and WDT force flags -- |
ctrl_reg.reset <= '0'; |
ctrl_reg.enforce <= '0'; |
ctrl.reset <= '0'; |
ctrl.enforce <= '0'; |
-- actual write access -- |
if (wren = '1') then |
ctrl_reg.reset <= data_i(ctrl_reset_c); |
ctrl_reg.enforce <= data_i(ctrl_force_c); |
if (ctrl_reg.lock = '0') then -- update configuration only if unlocked |
ctrl_reg.enable <= data_i(ctrl_enable_c); |
ctrl_reg.mode <= data_i(ctrl_mode_c); |
ctrl_reg.clk_sel <= data_i(ctrl_clksel2_c downto ctrl_clksel0_c); |
ctrl_reg.lock <= data_i(ctrl_lock_c); |
ctrl.reset <= data_i(ctrl_reset_c); |
ctrl.enforce <= data_i(ctrl_force_c); |
if (ctrl.lock = '0') then -- update configuration only if not locked |
ctrl.enable <= data_i(ctrl_enable_c); |
ctrl.mode <= data_i(ctrl_mode_c); |
ctrl.clk_sel <= data_i(ctrl_clksel2_c downto ctrl_clksel0_c); |
ctrl.lock <= data_i(ctrl_lock_c); |
ctrl.dben <= data_i(ctrl_dben_c) and bool_to_ulogic_f(DEBUG_EN); |
end if; |
end if; |
end if; |
169,8 → 172,8
end process write_access; |
|
-- clock generator -- |
clkgen_en_o <= ctrl_reg.enable; -- enable clock generator |
prsc_tick <= clkgen_i(to_integer(unsigned(ctrl_reg.clk_sel))); -- clock enable tick |
clkgen_en_o <= ctrl.enable; -- enable clock generator |
prsc_tick <= clkgen_i(to_integer(unsigned(ctrl.clk_sel))); -- clock enable tick |
|
|
-- Watchdog Counter ----------------------------------------------------------------------- |
178,53 → 181,32
wdt_counter: process(clk_i) |
begin |
if rising_edge(clk_i) then |
if (ctrl_reg.reset = '1') then -- watchdog reset |
if (ctrl.reset = '1') then -- watchdog reset |
wdt_cnt <= (others => '0'); |
elsif (ctrl_reg.enable = '1') and (prsc_tick = '1') then |
wdt_cnt <= std_ulogic_vector(unsigned(wdt_cnt) + 1); |
elsif (cnt_en = '1') then |
wdt_cnt <= std_ulogic_vector(unsigned('0' & wdt_cnt(wdt_cnt'left-1 downto 0)) + 1); |
end if; |
end if; |
end process wdt_counter; |
|
-- WDT counter enable -- |
cnt_en <= ctrl.enable and prsc_tick and ((not cpu_debug_i) or ctrl.dben); |
|
-- action trigger -- |
cpu_irq.set <= ctrl_reg.enable and (wdt_cnt(wdt_cnt'left) or ctrl_reg.enforce) and (not ctrl_reg.mode); -- mode 0: IRQ |
cpu_irq.clr <= ctrl_reg.reset; -- ack IRQ on WDT reset |
hw_rst <= ctrl_reg.enable and (wdt_cnt(wdt_cnt'left) or ctrl_reg.enforce) and ( ctrl_reg.mode); -- mode 1: RESET |
irq_o <= ctrl.enable and (wdt_cnt(wdt_cnt'left) or ctrl.enforce) and (not ctrl.mode); -- mode 0: IRQ |
hw_rst <= ctrl.enable and (wdt_cnt(wdt_cnt'left) or ctrl.enforce) and ( ctrl.mode); -- mode 1: RESET |
|
|
-- Interrupt ------------------------------------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
irq_gen: process(clk_i) |
begin |
if rising_edge(clk_i) then |
if (ctrl_reg.enable = '0') then |
cpu_irq.pending <= '0'; |
else |
if (cpu_irq.set = '1') then |
cpu_irq.pending <= '1'; |
elsif(cpu_irq.clr = '1') then |
cpu_irq.pending <= '0'; |
else |
cpu_irq.pending <= cpu_irq.pending; |
end if; |
end if; |
end if; |
end process irq_gen; |
|
-- CPU IRQ -- |
irq_o <= cpu_irq.pending; |
|
|
-- Reset Generator & Action Cause Indicator ----------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
reset_generator: process(rstn_i, clk_i) |
begin |
if (rstn_i = '0') then |
ctrl_reg.rcause <= '0'; |
rst_gen <= (others => '1'); -- do NOT fire on reset! |
rstn_sync <= '1'; |
ctrl.rcause <= '0'; |
rst_gen <= (others => '1'); -- do NOT fire on reset! |
rstn_sync <= '1'; |
elsif rising_edge(clk_i) then |
ctrl_reg.rcause <= ctrl_reg.rcause or hw_rst; -- sticky-set on WDT timeout/force |
ctrl.rcause <= ctrl.rcause or hw_rst; -- sticky-set on WDT timeout/force |
if (hw_rst = '1') then |
rst_gen <= (others => '0'); |
else |
243,13 → 225,15
read_access: process(clk_i) |
begin |
if rising_edge(clk_i) then |
ack_o <= rden or wren; |
ack_o <= rden or wren; |
if (rden = '1') then |
data_o(ctrl_enable_c) <= ctrl_reg.enable; |
data_o(ctrl_mode_c) <= ctrl_reg.mode; |
data_o(ctrl_rcause_c) <= ctrl_reg.rcause; |
data_o(ctrl_clksel2_c downto ctrl_clksel0_c) <= ctrl_reg.clk_sel; |
data_o(ctrl_lock_c) <= ctrl_reg.lock; |
data_o(ctrl_enable_c) <= ctrl.enable; |
data_o(ctrl_mode_c) <= ctrl.mode; |
data_o(ctrl_rcause_c) <= ctrl.rcause; |
data_o(ctrl_clksel2_c downto ctrl_clksel0_c) <= ctrl.clk_sel; |
data_o(ctrl_lock_c) <= ctrl.lock; |
data_o(ctrl_dben_c) <= ctrl.dben; |
data_o(ctrl_half_c) <= wdt_cnt(wdt_cnt'left-1); |
else |
data_o <= (others => '0'); |
end if; |
/core/neorv32_wishbone.vhd
118,7 → 118,7
ack : std_ulogic; |
err : std_ulogic; |
tmo : std_ulogic; |
timeout : std_ulogic_vector(index_size_f(BUS_TIMEOUT)-1 downto 0); |
timeout : std_ulogic_vector(index_size_f(BUS_TIMEOUT) downto 0); |
src : std_ulogic; |
lock : std_ulogic; |
priv : std_ulogic_vector(01 downto 0); |
142,7 → 142,7
|
-- bus timeout -- |
assert not (BUS_TIMEOUT /= 0) report "NEORV32 PROCESSOR CONFIG NOTE: External Bus Interface - Implementing auto-timeout (" & integer'image(BUS_TIMEOUT) & " cycles)." severity note; |
assert not (BUS_TIMEOUT = 0) report "NEORV32 PROCESSOR CONFIG NOTE: External Bus Interface - Implementing no auto-timeout (can cause permanent CPU stall!)." severity note; |
assert not (BUS_TIMEOUT = 0) report "NEORV32 PROCESSOR CONFIG WARNING: External Bus Interface - Implementing NO auto-timeout (can cause permanent CPU stall!)." severity warning; |
|
-- endianness -- |
assert not (BIG_ENDIAN = false) report "NEORV32 PROCESSOR CONFIG NOTE: External Bus Interface - Implementing LITTLE-endian byte order." severity note; |
190,7 → 190,7
ctrl.ack <= '0'; |
ctrl.err <= '0'; |
ctrl.tmo <= '0'; |
ctrl.timeout <= std_ulogic_vector(to_unsigned(BUS_TIMEOUT, index_size_f(BUS_TIMEOUT))); |
ctrl.timeout <= std_ulogic_vector(to_unsigned(BUS_TIMEOUT, index_size_f(BUS_TIMEOUT)+1)); |
|
-- state machine -- |
case ctrl.state is |
/core/neorv32_xirq.vhd
210,10 → 210,12
irq_arbiter: process(clk_i) |
begin |
if rising_edge(clk_i) then |
cpu_irq_o <= '0'; |
if (irq_run = '0') then -- no active IRQ |
if (irq_fire = '1') then |
irq_run <= '1'; |
irq_src <= irq_src_nxt; |
cpu_irq_o <= '1'; |
irq_run <= '1'; |
irq_src <= irq_src_nxt; |
end if; |
else -- active IRQ, wait for CPU to acknowledge |
if (wren = '1') and (addr = xirq_source_addr_c) then -- write _any_ value to acknowledge |
223,8 → 225,5
end if; |
end process irq_arbiter; |
|
-- interrupt request -- |
cpu_irq_o <= irq_run; |
|
|
end neorv32_xirq_rtl; |
/processor_templates/README.md
1,3 → 1,35
# SoC Templates |
# SoC/Processor Templates |
|
:construction: Work in Progress :construction: |
This folder provides exemplary templates that wrap the processor top entity and provide a simplified |
set of configuration generics and IOs. These setups are intended to allow beginner an easy start by |
hiding much of the processor's configuration complexity. Furthermore, these setups are used by many |
of the provided [example setups](https://github.com/stnolting/neorv32/tree/master/setups). |
|
Alternatively, you can directly instantiate the processor's top entity |
[`rtl/core/neorv32_top.vhd`](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_top.vhd) |
to have full access to _all_ features. |
|
### [`neorv32_ProcessorTop_Minimal.vhd`](https://github.com/stnolting/neorv32/blob/master/rtl/processor_templates/neorv32_ProcessorTop_Minimal.vhd) |
|
This setup used the ["Direct Boot Configuration"](https://stnolting.github.io/neorv32/#_boot_configuration). |
Application software is installed directly into the processor-internal instruction memory (IMEM) during |
synthesis. This memory is implemented as ROM and these is no bootloader available. Hence, the executable |
remains unchangeable is executed right after reset. |
|
The setup only provides 3 PWM channels as IO. |
|
### [`neorv32_ProcessorTop_MinimalBoot.vhd`](https://github.com/stnolting/neorv32/blob/master/rtl/processor_templates/neorv32_ProcessorTop_MinimalBoot.vhd) |
|
This setup used the ["Indirect Boot Configuration"](https://stnolting.github.io/neorv32/#_boot_configuration). |
The NEORV32 bootloader is enabled in this setup allowing to upload new application software at any time |
via a UART connection. |
|
The setup provides 8 GPIO outputs and the UART communication lines as IO. |
|
### [`neorv32_ProcessorTop_UP5KDemo.vhd`](https://github.com/stnolting/neorv32/blob/master/rtl/processor_templates/neorv32_ProcessorTop_UP5KDemo.vhd) |
|
This is a more complex template that implements a small microcontroller-like NEORV32. |
It was originally designed for _UPDuino V3_ board, which features a Lattice iCE40up5k FPGA, but has |
also been ported to other boards that provide the same FPGA. |
|
This setup provides a rich set of IOs including GPIO, SPI, TWI and PWM. |
/system_integration/neorv32_SystemTop_axi4lite.vhd
103,7 → 103,7
IO_TWI_EN : boolean := true; -- implement two-wire interface (TWI)? |
IO_PWM_NUM_CH : natural := 4; -- number of PWM channels to implement (0..60); 0 = disabled |
IO_WDT_EN : boolean := true; -- implement watch dog timer (WDT)? |
IO_TRNG_EN : boolean := false; -- implement true random number generator (TRNG)? |
IO_TRNG_EN : boolean := true; -- implement true random number generator (TRNG)? |
IO_CFS_EN : boolean := false; -- implement custom functions subsystem (CFS)? |
IO_CFS_CONFIG : std_logic_vector(31 downto 0) := x"00000000"; -- custom CFS configuration generic |
IO_CFS_IN_SIZE : positive := 32; -- size of CFS input conduit in bits |
/test_setups/README.md
3,8 → 3,7
This folder contains very simple test setups that are intended for project beginners |
to setup a minimal NEORV32 SoC. These setups are used in the :books: |
[NEORV32 User Guide](https://stnolting.github.io/neorv32/ug/). |
|
:information_source: Note that these setups provides a minimalistic configuration to keep |
Note that these setups provides a minimalistic configuration to keep |
things at a simple level at first. Additional CPU ISA extensions, performance options and |
optional peripheral modules can be enabled by specifying the according :book: |
[configuration generics](https://stnolting.github.io/neorv32/#_processor_top_entity_generics). |
33,7 → 32,7
This setup configures a `rv32imc_Zicsr` CPU with 16kB IMEM (as pre-initialized ROM), |
8kB DMEM and includes the GPIO module to drive 8 external signals (`gpio_o`) |
and the MTIME module for generating timer interrupts. |
The setup uses the [indidrect boot](https://stnolting.github.io/neorv32/#_indirect_boot) |
The setup uses the ["indirect boot"](https://stnolting.github.io/neorv32/#_indirect_boot) |
configuration, so software applications are "installed" directly into the |
processor-internal IMEM during synthesis. |
|
46,7 → 45,7
and includes the GPIO module to drive 8 external signals (`gpio_o`), the MTIME |
module for generating timer interrupts and UART0 to interface with the bootloader |
(via `uart0_txd_o` and `uart0_rxd_i`) via a serial terminal. |
The setup uses the [direct boot](https://stnolting.github.io/neorv32/#_direct_boot) |
The setup uses the ["direct boot"](https://stnolting.github.io/neorv32/#_direct_boot) |
configuration, so software applications can be uploaded and run at any timer via a serial terminal. |
|
:books: See User Guide section |