OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /neorv32/trunk
    from Rev 38 to Rev 39
    Reverse comparison

Rev 38 → Rev 39

/.ci/sw_check.sh
26,9 → 26,9
make -C $srcdir_bootloader clean_all info bootloader
 
# Compile and install test application
# Redirect UART TX to text.iosimulation_output via <UART_SIM_MODE> user flag
echo "Compiling and installing test application"
make -C $test_app_dir clean_all USER_FLAGS+=-DRUN_CPUTEST USER_FLAGS+=-DUART_SIM_MODE MARCH=-march=rv32imc info all
# Redirect UART TX to text.io simulation output via <UART_SIM_MODE> user flag
echo "Compiling and installing CPU (/Processor) test application"
make -C $test_app_dir clean_all USER_FLAGS+=-DRUN_CPUTEST USER_FLAGS+=-DUART_SIM_MODE MARCH=-march=rv32imac info all
 
# Verification reference string
touch $homedir/check_reference.out
/docs/figures/neorv32_cpu.png Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
docs/figures/neorv32_cpu.png Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: docs/NEORV32.pdf =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: rtl/core/neorv32_application_image.vhd =================================================================== --- rtl/core/neorv32_application_image.vhd (revision 38) +++ rtl/core/neorv32_application_image.vhd (revision 39) @@ -1,5 +1,5 @@ -- The NEORV32 Processor by Stephan Nolting, https://github.com/stnolting/neorv32 --- Auto-generated memory init file (for APPLICATION) from source file +-- Auto-generated memory init file (for APPLICATION) from source file library ieee; use ieee.std_logic_1164.all; @@ -6,7 +6,7 @@ package neorv32_application_image is - type application_init_image_t is array (0 to 3656) of std_ulogic_vector(31 downto 0); + type application_init_image_t is array (0 to 783) of std_ulogic_vector(31 downto 0); constant application_init_image : application_init_image_t := ( 00000000 => x"00000093", 00000001 => x"00000113", @@ -35,3635 +35,762 @@ 00000024 => x"00000e93", 00000025 => x"00000f13", 00000026 => x"00000f93", - 00000027 => x"05136509", - 00000028 => x"10738005", - 00000029 => x"10733005", - 00000030 => x"21173040", - 00000031 => x"01138000", - 00000032 => x"7113f821", - 00000033 => x"0413ffc1", - 00000034 => x"01970001", - 00000035 => x"81938000", - 00000036 => x"05977761", - 00000037 => x"85930000", - 00000038 => x"907306a5", - 00000039 => x"05933055", - 00000040 => x"a023f800", - 00000041 => x"05910005", - 00000042 => x"feb01de3", - 00000043 => x"81818593", - 00000044 => x"86418613", - 00000045 => x"00c5d663", - 00000046 => x"00058023", - 00000047 => x"bfdd0585", - 00000048 => x"00004597", - 00000049 => x"84858593", - 00000050 => x"80000617", - 00000051 => x"f3860613", - 00000052 => x"81818693", - 00000053 => x"00d65963", - 00000054 => x"00058703", - 00000055 => x"00e60023", - 00000056 => x"06050585", - 00000057 => x"0513bfc5", - 00000058 => x"05930000", - 00000059 => x"00ef0000", - 00000060 => x"707304a0", - 00000061 => x"00733004", - 00000062 => x"a0011050", - 00000063 => x"c0221161", - 00000064 => x"2473c226", - 00000065 => x"43633420", - 00000066 => x"24730204", - 00000067 => x"14833410", - 00000068 => x"888d0004", - 00000069 => x"10730409", - 00000070 => x"04133414", - 00000071 => x"17630030", - 00000072 => x"24730094", - 00000073 => x"04093410", - 00000074 => x"34141073", - 00000075 => x"44124482", - 00000076 => x"00730121", - 00000077 => x"00003020", - 00000078 => x"45017139", - 00000079 => x"de064581", - 00000080 => x"d64edc22", - 00000081 => x"d84ada26", - 00000082 => x"d256d452", - 00000083 => x"ce5ed05a", - 00000084 => x"10efcc62", - 00000085 => x"450153f0", - 00000086 => x"10ef4581", - 00000087 => x"65155230", - 00000088 => x"45814601", - 00000089 => x"b0050513", - 00000090 => x"2ad010ef", - 00000091 => x"45814501", - 00000092 => x"1a9010ef", - 00000093 => x"557d55fd", - 00000094 => x"1e5010ef", - 00000095 => x"05136509", - 00000096 => x"10ef0205", - 00000097 => x"65093330", - 00000098 => x"04050513", - 00000099 => x"329010ef", - 00000100 => x"05136509", - 00000101 => x"69850605", - 00000102 => x"31d010ef", - 00000103 => x"141010ef", - 00000104 => x"149010ef", - 00000105 => x"400010ef", - 00000106 => x"2c8010ef", - 00000107 => x"04498593", - 00000108 => x"10ef4501", - 00000109 => x"842a3220", - 00000110 => x"04498593", - 00000111 => x"10ef4505", - 00000112 => x"87aa3160", - 00000113 => x"04498593", - 00000114 => x"943e4509", - 00000115 => x"308010ef", - 00000116 => x"859387aa", - 00000117 => x"450d0449", - 00000118 => x"10ef943e", - 00000119 => x"87aa2fa0", - 00000120 => x"04498593", - 00000121 => x"943e4511", - 00000122 => x"2ec010ef", - 00000123 => x"859387aa", - 00000124 => x"45150449", - 00000125 => x"10ef943e", - 00000126 => x"87aa2de0", - 00000127 => x"04498593", - 00000128 => x"943e4519", - 00000129 => x"2d0010ef", - 00000130 => x"859387aa", - 00000131 => x"451d0449", - 00000132 => x"10ef943e", - 00000133 => x"87aa2c20", - 00000134 => x"04498593", - 00000135 => x"943e4521", - 00000136 => x"2b4010ef", - 00000137 => x"859387aa", - 00000138 => x"45290449", - 00000139 => x"10ef943e", - 00000140 => x"87aa2a60", - 00000141 => x"04498593", - 00000142 => x"943e4525", - 00000143 => x"298010ef", - 00000144 => x"859387aa", - 00000145 => x"45290449", - 00000146 => x"10ef943e", - 00000147 => x"87aa28a0", - 00000148 => x"04498593", - 00000149 => x"943e4531", - 00000150 => x"27c010ef", - 00000151 => x"859387aa", - 00000152 => x"45350449", - 00000153 => x"10ef943e", - 00000154 => x"87aa26e0", - 00000155 => x"04498593", - 00000156 => x"943e4539", - 00000157 => x"260010ef", - 00000158 => x"859387aa", - 00000159 => x"453d0449", - 00000160 => x"10ef943e", - 00000161 => x"05b32520", - 00000162 => x"996300a4", - 00000163 => x"450d1005", - 00000164 => x"3bd010ef", - 00000165 => x"451d842a", - 00000166 => x"3b5010ef", - 00000167 => x"452d87aa", - 00000168 => x"10ef943e", - 00000169 => x"87aa3ab0", - 00000170 => x"943e4541", - 00000171 => x"3a1010ef", - 00000172 => x"454587aa", - 00000173 => x"10ef943e", - 00000174 => x"87aa3970", - 00000175 => x"943e4549", - 00000176 => x"38d010ef", - 00000177 => x"454d85aa", - 00000178 => x"10ef942e", - 00000179 => x"942a3830", - 00000180 => x"6509e055", - 00000181 => x"10050513", - 00000182 => x"1dd010ef", - 00000183 => x"30046073", - 00000184 => x"34241073", - 00000185 => x"82018913", - 00000186 => x"00092583", - 00000187 => x"05136509", - 00000188 => x"10ef1185", - 00000189 => x"2b831c30", - 00000190 => x"6785fa00", - 00000191 => x"00fbfbb3", - 00000192 => x"0a0b9463", - 00000193 => x"00092783", - 00000194 => x"05136509", - 00000195 => x"07851145", - 00000196 => x"800004b7", - 00000197 => x"20236a19", - 00000198 => x"849300f9", - 00000199 => x"10ef0004", - 00000200 => x"44011970", - 00000201 => x"0a134b01", - 00000202 => x"6c09073a", - 00000203 => x"a0296a85", - 00000204 => x"0b630405", - 00000205 => x"00010354", - 00000206 => x"342b1073", - 00000207 => x"01441793", - 00000208 => x"0147e7b3", - 00000209 => x"100fc09c", - 00000210 => x"80e70000", - 00000211 => x"27f30004", - 00000212 => x"fff93420", - 00000213 => x"051385a2", - 00000214 => x"0405138c", - 00000215 => x"159010ef", - 00000216 => x"1be30b85", - 00000217 => x"0001fd54", - 00000218 => x"280b88e3", - 00000219 => x"4e9000ef", - 00000220 => x"0001a091", - 00000221 => x"85a26509", - 00000222 => x"0e850513", - 00000223 => x"139010ef", - 00000224 => x"546250f2", - 00000225 => x"594254d2", - 00000226 => x"5a2259b2", - 00000227 => x"5b025a92", - 00000228 => x"4c624bf2", - 00000229 => x"61214501", - 00000230 => x"00018082", - 00000231 => x"05136509", - 00000232 => x"10ef0cc5", - 00000233 => x"bfe91130", - 00000234 => x"05136509", - 00000235 => x"10ef1445", - 00000236 => x"00011070", - 00000237 => x"90734781", - 00000238 => x"25833427", - 00000239 => x"65090009", - 00000240 => x"16850513", - 00000241 => x"0f1010ef", - 00000242 => x"72c010ef", - 00000243 => x"380502e3", - 00000244 => x"00092703", - 00000245 => x"012347b7", - 00000246 => x"56778793", - 00000247 => x"20230705", - 00000248 => x"373700e9", - 00000249 => x"20237654", - 00000250 => x"0713fcf0", - 00000251 => x"b6b72107", - 00000252 => x"2223abcd", - 00000253 => x"8693fce0", - 00000254 => x"0637bcd6", - 00000255 => x"2423ffab", - 00000256 => x"0613fcd0", - 00000257 => x"2623faa6", - 00000258 => x"2583fcc0", - 00000259 => x"9b63fc00", - 00000260 => x"278300f5", - 00000261 => x"9763fc40", - 00000262 => x"278300e7", - 00000263 => x"89e3fc80", - 00000264 => x"00013cd7", - 00000265 => x"455000ef", - 00000266 => x"90734781", - 00000267 => x"25833427", - 00000268 => x"65090009", - 00000269 => x"1a850513", - 00000270 => x"07d010ef", - 00000271 => x"6c4010ef", - 00000272 => x"320508e3", - 00000273 => x"00092703", - 00000274 => x"223347b7", - 00000275 => x"45578793", - 00000276 => x"20230705", - 00000277 => x"373700e9", - 00000278 => x"28234478", - 00000279 => x"0713fcf0", - 00000280 => x"c6b79317", - 00000281 => x"2a23ddaa", - 00000282 => x"8693fce0", - 00000283 => x"d637bff6", - 00000284 => x"2c23a0b0", - 00000285 => x"0613fcd0", - 00000286 => x"2e230c06", - 00000287 => x"2583fcc0", - 00000288 => x"9b63fd00", - 00000289 => x"278300f5", - 00000290 => x"9763fd40", - 00000291 => x"278300e7", - 00000292 => x"8be3fd80", - 00000293 => x"000136d7", - 00000294 => x"3e1000ef", - 00000295 => x"90734781", - 00000296 => x"25833427", - 00000297 => x"65090009", - 00000298 => x"1e850513", - 00000299 => x"009010ef", - 00000300 => x"c00027f3", - 00000301 => x"f0002023", - 00000302 => x"c00025f3", - 00000303 => x"00018d9d", - 00000304 => x"342027f3", - 00000305 => x"6509dff5", - 00000306 => x"05138189", - 00000307 => x"10ef2105", - 00000308 => x"47817e60", - 00000309 => x"34279073", - 00000310 => x"00092583", - 00000311 => x"06376509", - 00000312 => x"0513f000", - 00000313 => x"10ef21c5", - 00000314 => x"27837ce0", - 00000315 => x"6705fa00", - 00000316 => x"87e38ff9", - 00000317 => x"27832607", - 00000318 => x"8b89fe80", - 00000319 => x"100782e3", - 00000320 => x"00092703", - 00000321 => x"800007b7", - 00000322 => x"00878793", - 00000323 => x"43d44390", - 00000324 => x"00170793", - 00000325 => x"00f92023", - 00000326 => x"f00007b7", - 00000327 => x"c3d4c390", - 00000328 => x"000780e7", - 00000329 => x"342027f3", - 00000330 => x"2773e791", - 00000331 => x"47bd3400", - 00000332 => x"2ef70ce3", - 00000333 => x"345000ef", - 00000334 => x"00092583", - 00000335 => x"05136509", - 00000336 => x"10ef29c5", - 00000337 => x"27837720", - 00000338 => x"07850009", - 00000339 => x"00f92023", - 00000340 => x"155010ef", - 00000341 => x"84ae842a", - 00000342 => x"5e0010ef", - 00000343 => x"408507b3", - 00000344 => x"00f53533", - 00000345 => x"95e38d85", - 00000346 => x"67050ca5", - 00000347 => x"0ce7f2e3", - 00000348 => x"2e5000ef", - 00000349 => x"90734781", - 00000350 => x"25833427", - 00000351 => x"65090009", - 00000352 => x"2c850513", - 00000353 => x"730010ef", - 00000354 => x"00092783", - 00000355 => x"20230785", - 00000356 => x"000f00f9", - 00000357 => x"27f30ff0", - 00000358 => x"87e33420", - 00000359 => x"00ef0807", - 00000360 => x"00012db0", - 00000361 => x"10734401", - 00000362 => x"25833424", - 00000363 => x"65090009", - 00000364 => x"2e850513", - 00000365 => x"700010ef", - 00000366 => x"0000100f", - 00000367 => x"34202773", - 00000368 => x"05e34789", - 00000369 => x"27831ef7", - 00000370 => x"07850009", - 00000371 => x"00f92023", - 00000372 => x"34241073", - 00000373 => x"0000100f", - 00000374 => x"342027f3", - 00000375 => x"0c0792e3", - 00000376 => x"275000ef", - 00000377 => x"90734781", - 00000378 => x"25833427", - 00000379 => x"65090009", - 00000380 => x"32450513", - 00000381 => x"6c0010ef", - 00000382 => x"00092783", - 00000383 => x"20230785", - 00000384 => x"27f300f9", - 00000385 => x"2773fff0", - 00000386 => x"47893420", - 00000387 => x"0af702e3", - 00000388 => x"269000ef", - 00000389 => x"10734401", - 00000390 => x"25833424", - 00000391 => x"65090009", - 00000392 => x"34c50513", - 00000393 => x"690010ef", - 00000394 => x"00092783", - 00000395 => x"20230785", - 00000396 => x"107300f9", - 00000397 => x"2773c014", - 00000398 => x"47893420", - 00000399 => x"06f70ee3", - 00000400 => x"239000ef", - 00000401 => x"90734781", - 00000402 => x"25833427", - 00000403 => x"65090009", - 00000404 => x"37c50513", - 00000405 => x"660010ef", - 00000406 => x"00092783", - 00000407 => x"20230785", - 00000408 => x"207300f9", - 00000409 => x"27f3c010", - 00000410 => x"9b633420", - 00000411 => x"00ef7a07", - 00000412 => x"00011e70", - 00000413 => x"90734781", - 00000414 => x"25833427", - 00000415 => x"65090009", - 00000416 => x"3b850513", - 00000417 => x"630010ef", - 00000418 => x"301027f3", - 00000419 => x"9fe38b91", - 00000420 => x"27830807", - 00000421 => x"07850009", - 00000422 => x"00f92023", - 00000423 => x"97824789", - 00000424 => x"342027f3", - 00000425 => x"040796e3", - 00000426 => x"05136509", - 00000427 => x"10ef3f05", - 00000428 => x"8a136060", - 00000429 => x"278381c1", - 00000430 => x"8493000a", - 00000431 => x"07858181", - 00000432 => x"00fa2023", - 00000433 => x"90734781", - 00000434 => x"25833427", - 00000435 => x"65090009", - 00000436 => x"43050513", - 00000437 => x"5e0010ef", - 00000438 => x"00092783", - 00000439 => x"20230785", - 00000440 => x"079300f9", - 00000441 => x"9782f000", - 00000442 => x"34202773", - 00000443 => x"0d634785", - 00000444 => x"00ef7ef7", - 00000445 => x"00011870", - 00000446 => x"90734781", - 00000447 => x"25833427", - 00000448 => x"65090009", - 00000449 => x"46850513", - 00000450 => x"5ac010ef", - 00000451 => x"00092783", - 00000452 => x"20230785", - 00000453 => x"107300f9", - 00000454 => x"2773fff0", - 00000455 => x"47893420", - 00000456 => x"00f71a63", - 00000457 => x"34302773", - 00000458 => x"fff017b7", - 00000459 => x"07378793", - 00000460 => x"08f706e3", - 00000461 => x"145000ef", - 00000462 => x"90734781", - 00000463 => x"25833427", - 00000464 => x"65090009", - 00000465 => x"49c50513", - 00000466 => x"56c010ef", - 00000467 => x"301027f3", - 00000468 => x"85638b91", - 00000469 => x"27837c07", - 00000470 => x"07850009", - 00000471 => x"00f92023", - 00000472 => x"81018793", - 00000473 => x"000780e7", - 00000474 => x"34202773", - 00000475 => x"05e34789", - 00000476 => x"00ef02f7", - 00000477 => x"00011070", - 00000478 => x"90734781", - 00000479 => x"25833427", - 00000480 => x"65090009", - 00000481 => x"50850513", - 00000482 => x"52c010ef", - 00000483 => x"00092783", - 00000484 => x"20230785", - 00000485 => x"900200f9", - 00000486 => x"34202773", - 00000487 => x"0163478d", - 00000488 => x"00ef74f7", - 00000489 => x"00010d70", - 00000490 => x"90734781", - 00000491 => x"25833427", - 00000492 => x"65090009", - 00000493 => x"53850513", - 00000494 => x"4fc010ef", - 00000495 => x"00092783", - 00000496 => x"20230785", - 00000497 => x"200300f9", - 00000498 => x"27730020", - 00000499 => x"47913420", - 00000500 => x"70f70463", - 00000501 => x"0a5000ef", - 00000502 => x"90734781", - 00000503 => x"25833427", - 00000504 => x"65090009", - 00000505 => x"57050513", - 00000506 => x"4cc010ef", - 00000507 => x"00092783", - 00000508 => x"20230785", - 00000509 => x"278300f9", - 00000510 => x"c63ef000", - 00000511 => x"34202773", - 00000512 => x"07634795", - 00000513 => x"00ef6cf7", - 00000514 => x"00010730", - 00000515 => x"90734781", - 00000516 => x"25833427", - 00000517 => x"65090009", - 00000518 => x"5a050513", - 00000519 => x"498010ef", - 00000520 => x"00092783", - 00000521 => x"20230785", - 00000522 => x"212300f9", - 00000523 => x"27730000", - 00000524 => x"47993420", - 00000525 => x"68f70a63", - 00000526 => x"041000ef", - 00000527 => x"90734781", - 00000528 => x"25833427", - 00000529 => x"65090009", - 00000530 => x"5d850513", - 00000531 => x"468010ef", - 00000532 => x"00092783", - 00000533 => x"20230785", - 00000534 => x"202300f9", - 00000535 => x"2773f000", - 00000536 => x"479d3420", - 00000537 => x"64f70e63", - 00000538 => x"011000ef", - 00000539 => x"90734781", - 00000540 => x"25833427", - 00000541 => x"65090009", - 00000542 => x"60850513", - 00000543 => x"438010ef", - 00000544 => x"00092783", - 00000545 => x"20230785", - 00000546 => x"007300f9", - 00000547 => x"27730000", - 00000548 => x"47ad3420", - 00000549 => x"60f70a63", - 00000550 => x"7e0000ef", - 00000551 => x"90734781", - 00000552 => x"25833427", - 00000553 => x"65090009", - 00000554 => x"63c50513", - 00000555 => x"408010ef", - 00000556 => x"25c010ef", - 00000557 => x"5e050063", - 00000558 => x"00092783", - 00000559 => x"45814501", - 00000560 => x"20230785", - 00000561 => x"10ef00f9", - 00000562 => x"00012960", - 00000563 => x"00010001", - 00000564 => x"00010001", - 00000565 => x"27730001", - 00000566 => x"07b73420", - 00000567 => x"079d8000", - 00000568 => x"6ef70e63", - 00000569 => x"794000ef", - 00000570 => x"55fd557d", - 00000571 => x"270010ef", - 00000572 => x"90734781", - 00000573 => x"25833427", - 00000574 => x"65090009", - 00000575 => x"68850513", - 00000576 => x"3b4010ef", - 00000577 => x"798000ef", - 00000578 => x"58050063", - 00000579 => x"00092783", - 00000580 => x"45014581", - 00000581 => x"20230785", - 00000582 => x"00ef00f9", - 00000583 => x"00ef78e0", - 00000584 => x"00ef7b20", - 00000585 => x"00017c20", - 00000586 => x"00010001", - 00000587 => x"00010001", - 00000588 => x"27730001", - 00000589 => x"07b73420", - 00000590 => x"07c18000", - 00000591 => x"68f70c63", - 00000592 => x"738000ef", - 00000593 => x"77c000ef", - 00000594 => x"90734781", - 00000595 => x"25833427", - 00000596 => x"65090009", - 00000597 => x"6bc50513", - 00000598 => x"35c010ef", - 00000599 => x"fa002783", - 00000600 => x"8ff96705", - 00000601 => x"50078c63", - 00000602 => x"664010ef", - 00000603 => x"62050063", - 00000604 => x"00092783", - 00000605 => x"07854501", - 00000606 => x"00f92023", - 00000607 => x"670010ef", - 00000608 => x"80000537", - 00000609 => x"670010ef", - 00000610 => x"10ef457d", - 00000611 => x"000164e0", - 00000612 => x"00010001", - 00000613 => x"00010001", - 00000614 => x"27730001", - 00000615 => x"07b73420", - 00000616 => x"07c58000", - 00000617 => x"68f70663", - 00000618 => x"6d0000ef", - 00000619 => x"10ef4501", - 00000620 => x"45016460", - 00000621 => x"638010ef", - 00000622 => x"90734781", - 00000623 => x"25833427", - 00000624 => x"65090009", - 00000625 => x"71050513", - 00000626 => x"2ec010ef", - 00000627 => x"23c010ef", - 00000628 => x"5a050863", - 00000629 => x"00092783", - 00000630 => x"20230785", - 00000631 => x"000100f9", - 00000632 => x"2a0010ef", - 00000633 => x"2403fd75", - 00000634 => x"2783fa00", - 00000635 => x"777dfa00", - 00000636 => x"8ff9177d", - 00000637 => x"faf02023", - 00000638 => x"fa002783", - 00000639 => x"40000737", - 00000640 => x"20238fd9", - 00000641 => x"2223faf0", - 00000642 => x"0001fa00", - 00000643 => x"274010ef", - 00000644 => x"0001fd75", - 00000645 => x"00010001", - 00000646 => x"00010001", - 00000647 => x"00010001", - 00000648 => x"260010ef", - 00000649 => x"2023fd75", - 00000650 => x"2773fa80", - 00000651 => x"07b73420", - 00000652 => x"07c98000", - 00000653 => x"56f70a63", - 00000654 => x"640000ef", - 00000655 => x"90734781", - 00000656 => x"25833427", - 00000657 => x"65090009", - 00000658 => x"76450513", - 00000659 => x"268010ef", - 00000660 => x"518010ef", - 00000661 => x"40050e63", - 00000662 => x"00092783", - 00000663 => x"46854501", - 00000664 => x"46010785", - 00000665 => x"20234581", - 00000666 => x"10ef00f9", - 00000667 => x"450150a0", - 00000668 => x"53c010ef", - 00000669 => x"54c010ef", - 00000670 => x"0001fd75", - 00000671 => x"00010001", - 00000672 => x"00010001", - 00000673 => x"27730001", - 00000674 => x"07b73420", - 00000675 => x"07cd8000", - 00000676 => x"54f70063", - 00000677 => x"5e4000ef", - 00000678 => x"504010ef", - 00000679 => x"90734781", - 00000680 => x"25833427", - 00000681 => x"65090009", - 00000682 => x"7b850513", - 00000683 => x"208010ef", - 00000684 => x"42c010ef", - 00000685 => x"3a050863", - 00000686 => x"00092783", - 00000687 => x"45854601", - 00000688 => x"45010785", - 00000689 => x"00f92023", - 00000690 => x"420010ef", - 00000691 => x"484010ef", - 00000692 => x"10ef4501", - 00000693 => x"10ef44a0", - 00000694 => x"00014620", - 00000695 => x"00010001", - 00000696 => x"00010001", - 00000697 => x"27730001", - 00000698 => x"07b73420", - 00000699 => x"07cd8000", - 00000700 => x"4cf70e63", - 00000701 => x"584000ef", - 00000702 => x"414010ef", - 00000703 => x"90734781", - 00000704 => x"25833427", - 00000705 => x"650d0009", - 00000706 => x"80c50513", - 00000707 => x"1a8010ef", - 00000708 => x"7fd000ef", - 00000709 => x"34050263", - 00000710 => x"00092783", - 00000711 => x"20230785", - 00000712 => x"10ef00f9", - 00000713 => x"87aa0160", - 00000714 => x"3e850513", - 00000715 => x"00f537b3", - 00000716 => x"10ef95be", - 00000717 => x"007302a0", - 00000718 => x"27731050", - 00000719 => x"07b73420", - 00000720 => x"079d8000", - 00000721 => x"48f70263", - 00000722 => x"530000ef", - 00000723 => x"55fd557d", - 00000724 => x"00c010ef", - 00000725 => x"90734781", - 00000726 => x"25833427", - 00000727 => x"650d0009", - 00000728 => x"88050513", - 00000729 => x"150010ef", - 00000730 => x"301027f3", - 00000731 => x"00100737", - 00000732 => x"8d638ff9", - 00000733 => x"27832c07", - 00000734 => x"07850009", - 00000735 => x"00f92023", - 00000736 => x"348010ef", - 00000737 => x"300027f3", - 00000738 => x"34202773", - 00000739 => x"0b634789", - 00000740 => x"00ef42f7", - 00000741 => x"00014e60", - 00000742 => x"90734781", - 00000743 => x"25833427", - 00000744 => x"650d0009", - 00000745 => x"8e450513", - 00000746 => x"10c010ef", - 00000747 => x"00092783", - 00000748 => x"07854509", - 00000749 => x"00f92023", - 00000750 => x"139000ef", - 00000751 => x"fff027f3", - 00000752 => x"05136509", - 00000753 => x"10ef7945", - 00000754 => x"27f30ee0", - 00000755 => x"85633420", - 00000756 => x"00ef2607", - 00000757 => x"00014820", - 00000758 => x"04498593", - 00000759 => x"00ef4509", - 00000760 => x"25830f70", - 00000761 => x"650d0009", - 00000762 => x"93050513", - 00000763 => x"0c8010ef", - 00000764 => x"fc0027f3", - 00000765 => x"87638b91", - 00000766 => x"47013407", - 00000767 => x"34271073", - 00000768 => x"00092783", - 00000769 => x"20230785", - 00000770 => x"107300f9", - 00000771 => x"57fd3a07", - 00000772 => x"3b079073", - 00000773 => x"3b0026f3", - 00000774 => x"a029477d", - 00000775 => x"0d63177d", - 00000776 => x"00014007", - 00000777 => x"00e6d7b3", - 00000778 => x"fbed8b85", - 00000779 => x"ff402983", - 00000780 => x"000186ba", - 00000781 => x"16fd0786", - 00000782 => x"0017e793", - 00000783 => x"0001fee5", - 00000784 => x"00f9e433", - 00000785 => x"4585070d", - 00000786 => x"86a2650d", - 00000787 => x"95b3864e", - 00000788 => x"051300e5", - 00000789 => x"10ef9585", - 00000790 => x"107305e0", - 00000791 => x"47e53b04", - 00000792 => x"3a079073", - 00000793 => x"3b002773", - 00000794 => x"00e41663", - 00000795 => x"3a002773", - 00000796 => x"36f70a63", - 00000797 => x"404000ef", - 00000798 => x"00092583", - 00000799 => x"0513650d", - 00000800 => x"10ef9a85", - 00000801 => x"27830320", - 00000802 => x"07850009", - 00000803 => x"00f92023", - 00000804 => x"90734781", - 00000805 => x"10ef3427", - 00000806 => x"80e72320", - 00000807 => x"27f30009", - 00000808 => x"99633420", - 00000809 => x"00732607", - 00000810 => x"00ef0000", - 00000811 => x"00013ce0", - 00000812 => x"00092583", - 00000813 => x"0513650d", - 00000814 => x"00ef9d85", - 00000815 => x"27837fb0", - 00000816 => x"07850009", - 00000817 => x"00f92023", - 00000818 => x"90734781", - 00000819 => x"10ef3427", - 00000820 => x"a0031fa0", - 00000821 => x"27f30009", - 00000822 => x"99633420", - 00000823 => x"00732207", - 00000824 => x"00ef0000", - 00000825 => x"00013720", - 00000826 => x"00092583", - 00000827 => x"0513650d", - 00000828 => x"00efa085", - 00000829 => x"27837c30", - 00000830 => x"07850009", - 00000831 => x"00f92023", - 00000832 => x"90734781", - 00000833 => x"10ef3427", - 00000834 => x"a0231c20", - 00000835 => x"27730009", - 00000836 => x"479d3420", - 00000837 => x"28f70663", - 00000838 => x"00000073", - 00000839 => x"35c000ef", - 00000840 => x"00092583", - 00000841 => x"0513650d", - 00000842 => x"00efa385", - 00000843 => x"278378b0", - 00000844 => x"07850009", - 00000845 => x"00f92023", - 00000846 => x"90734781", - 00000847 => x"07933427", - 00000848 => x"90730810", - 00000849 => x"27f33a07", - 00000850 => x"47653a00", - 00000851 => x"3a071073", - 00000852 => x"3a002773", - 00000853 => x"00f71663", - 00000854 => x"342027f3", - 00000855 => x"2c078463", - 00000856 => x"00012e21", - 00000857 => x"00092583", - 00000858 => x"0513650d", - 00000859 => x"00efa685", - 00000860 => x"27837470", - 00000861 => x"07850009", - 00000862 => x"00f92023", - 00000863 => x"90734781", - 00000864 => x"07933427", - 00000865 => x"90730810", - 00000866 => x"27733a07", - 00000867 => x"d7b73b00", - 00000868 => x"8793abab", - 00000869 => x"9073dcd7", - 00000870 => x"27f33b07", - 00000871 => x"97633b00", - 00000872 => x"27f300e7", - 00000873 => x"8d633420", - 00000874 => x"00012607", - 00000875 => x"000124f1", - 00000876 => x"c02025f3", - 00000877 => x"0513650d", - 00000878 => x"00efaac5", - 00000879 => x"25f36fb0", - 00000880 => x"650dc000", - 00000881 => x"ac850513", - 00000882 => x"6ed000ef", - 00000883 => x"00092703", - 00000884 => x"000a2583", - 00000885 => x"650d4094", - 00000886 => x"0513863a", - 00000887 => x"00efae45", - 00000888 => x"409c6d70", - 00000889 => x"45ed466d", - 00000890 => x"650de785", - 00000891 => x"b1450513", - 00000892 => x"6c5000ef", - 00000893 => x"d8cff06f", - 00000894 => x"f06f2441", - 00000895 => x"0001dbaf", - 00000896 => x"05136509", - 00000897 => x"00ef2485", - 00000898 => x"f06f6af0", - 00000899 => x"0001f2ef", - 00000900 => x"0513650d", - 00000901 => x"00efb445", - 00000902 => x"f06f69f0", - 00000903 => x"0001d66f", - 00000904 => x"f06f2ca1", - 00000905 => x"0001853f", - 00000906 => x"f06f2435", - 00000907 => x"0001f7af", - 00000908 => x"f06f24a1", - 00000909 => x"0001f42f", - 00000910 => x"25f32481", - 00000911 => x"650d3420", - 00000912 => x"92050513", - 00000913 => x"671000ef", - 00000914 => x"0001bb41", - 00000915 => x"0513650d", - 00000916 => x"00ef8b85", - 00000917 => x"b3896630", - 00000918 => x"0513650d", - 00000919 => x"00ef85c5", - 00000920 => x"b9cd6570", - 00000921 => x"05136509", - 00000922 => x"00ef7ec5", - 00000923 => x"b17964b0", - 00000924 => x"05136509", - 00000925 => x"00ef7985", - 00000926 => x"b10d63f0", - 00000927 => x"05136509", - 00000928 => x"00ef2805", - 00000929 => x"be0d6330", - 00000930 => x"05136509", - 00000931 => x"00ef6685", - 00000932 => x"bc5d6270", - 00000933 => x"05136509", - 00000934 => x"00ef6685", - 00000935 => x"bc8961b0", - 00000936 => x"f06f2ae1", - 00000937 => x"0001f42f", - 00000938 => x"f06f2275", - 00000939 => x"00019f3f", - 00000940 => x"f06f2255", - 00000941 => x"0001f62f", - 00000942 => x"f06f2a71", - 00000943 => x"0001f8af", - 00000944 => x"f06f2a51", - 00000945 => x"00019abf", - 00000946 => x"f06f2271", - 00000947 => x"0001973f", - 00000948 => x"f06f2251", - 00000949 => x"000193bf", - 00000950 => x"f06f2ab5", - 00000951 => x"00018fff", - 00000952 => x"f06f2a95", - 00000953 => x"00018c7f", - 00000954 => x"f06f22b5", - 00000955 => x"000180ff", - 00000956 => x"05136509", - 00000957 => x"00ef3f45", - 00000958 => x"84935bf0", - 00000959 => x"409c8181", - 00000960 => x"81c18a13", - 00000961 => x"c09c0785", - 00000962 => x"fbcff06f", - 00000963 => x"00000073", - 00000964 => x"bbd922a5", - 00000965 => x"00000073", - 00000966 => x"bb592a35", - 00000967 => x"05136509", - 00000968 => x"00ef4dc5", - 00000969 => x"f06f5930", - 00000970 => x"0001853f", - 00000971 => x"05136509", - 00000972 => x"00ef3fc5", - 00000973 => x"8a135830", - 00000974 => x"849381c1", - 00000975 => x"f06f8181", - 00000976 => x"0001f86f", - 00000977 => x"0513650d", - 00000978 => x"00efa985", - 00000979 => x"b58d56b0", - 00000980 => x"05136509", - 00000981 => x"00ef1885", - 00000982 => x"f06f55f0", - 00000983 => x"0001ccef", - 00000984 => x"05136509", - 00000985 => x"00ef2805", - 00000986 => x"f06f54f0", - 00000987 => x"0001dcef", - 00000988 => x"05136509", - 00000989 => x"00ef1c85", - 00000990 => x"f06f53f0", - 00000991 => x"0001d22f", - 00000992 => x"05136509", - 00000993 => x"00ef7445", - 00000994 => x"bc4d52f0", - 00000995 => x"05136509", - 00000996 => x"00ef6f05", - 00000997 => x"b40d5230", - 00000998 => x"f06f2875", - 00000999 => x"0001fdef", - 00001000 => x"00000073", - 00001001 => x"bbad2845", - 00001002 => x"bc492075", - 00001003 => x"05136509", - 00001004 => x"00ef3085", - 00001005 => x"f06f5030", - 00001006 => x"0001e2ef", - 00001007 => x"f06f2861", - 00001008 => x"0001f7af", - 00001009 => x"bec92841", - 00001010 => x"b6492071", - 00001011 => x"b62d2061", - 00001012 => x"b4d92051", - 00001013 => x"f06f2041", - 00001014 => x"000196ff", - 00001015 => x"f06f28a5", - 00001016 => x"000190bf", - 00001017 => x"342027f3", - 00001018 => x"c80796e3", - 00001019 => x"b16920a5", - 00001020 => x"fcc02783", - 00001021 => x"c2c79863", - 00001022 => x"342027f3", - 00001023 => x"c2079463", - 00001024 => x"f06f2891", - 00001025 => x"0001c26f", - 00001026 => x"fdc02783", - 00001027 => x"c8c79663", - 00001028 => x"342027f3", - 00001029 => x"c8079263", - 00001030 => x"f06f2835", - 00001031 => x"0001c82f", - 00001032 => x"b3792815", - 00001033 => x"bb3d2805", - 00001034 => x"f06f2035", - 00001035 => x"0001d0ef", - 00001036 => x"f06f2015", - 00001037 => x"000197bf", - 00001038 => x"ff402983", - 00001039 => x"b1094781", - 00001040 => x"00000000", - 00001041 => x"87936789", - 00001042 => x"a0738007", - 00001043 => x"80823007", - 00001044 => x"00000000", - 00001045 => x"11416509", - 00001046 => x"45ed466d", - 00001047 => x"ffc50513", - 00001048 => x"00efc606", - 00001049 => x"87934530", - 00001050 => x"439881c1", - 00001051 => x"070540b2", - 00001052 => x"0141c398", - 00001053 => x"00008082", - 00001054 => x"11416509", - 00001055 => x"45ed466d", - 00001056 => x"00c50513", - 00001057 => x"00efc606", - 00001058 => x"879342f0", - 00001059 => x"43988181", - 00001060 => x"070540b2", - 00001061 => x"0141c398", - 00001062 => x"00008082", - 00001063 => x"fe802503", - 00001064 => x"89058159", - 00001065 => x"00008082", - 00001066 => x"891d8985", - 00001067 => x"67910592", - 00001068 => x"87938d4d", - 00001069 => x"8d5d7087", - 00001070 => x"f8a02623", - 00001071 => x"00008082", - 00001072 => x"87936791", - 00001073 => x"26237007", - 00001074 => x"8082f8f0", - 00001075 => x"00000000", - 00001076 => x"f8c00693", - 00001077 => x"6711429c", - 00001078 => x"70070713", - 00001079 => x"c29c8fd9", - 00001080 => x"00008082", - 00001081 => x"f8002623", - 00001082 => x"00008082", - 00001083 => x"00000000", - 00001084 => x"de067139", - 00001085 => x"da1adc16", - 00001086 => x"d62ad81e", - 00001087 => x"d232d42e", - 00001088 => x"ce3ad036", - 00001089 => x"ca42cc3e", - 00001090 => x"c672c846", - 00001091 => x"c27ac476", - 00001092 => x"2773c07e", - 00001093 => x"10733410", - 00001094 => x"27f33407", - 00001095 => x"cf633420", - 00001096 => x"16830407", - 00001097 => x"458d0007", - 00001098 => x"06138a8d", - 00001099 => x"87630027", - 00001100 => x"000106b6", - 00001101 => x"34161073", - 00001102 => x"6963472d", - 00001103 => x"670d00f7", - 00001104 => x"0713078a", - 00001105 => x"97bab647", - 00001106 => x"8782439c", - 00001107 => x"87936785", - 00001108 => x"00012287", - 00001109 => x"50f29782", - 00001110 => x"535252e2", - 00001111 => x"553253c2", - 00001112 => x"561255a2", - 00001113 => x"47725682", - 00001114 => x"485247e2", - 00001115 => x"4e3248c2", - 00001116 => x"4f124ea2", - 00001117 => x"61214f82", - 00001118 => x"30200073", - 00001119 => x"80000737", - 00001120 => x"ffd74713", - 00001121 => x"474197ba", - 00001122 => x"fcf762e3", - 00001123 => x"078a670d", - 00001124 => x"b9470713", - 00001125 => x"439c97ba", - 00001126 => x"00018782", - 00001127 => x"00470613", - 00001128 => x"0001bf51", - 00001129 => x"8441a783", - 00001130 => x"0001b775", - 00001131 => x"8241a783", - 00001132 => x"0001b755", - 00001133 => x"8281a783", - 00001134 => x"0001bf71", - 00001135 => x"82c1a783", - 00001136 => x"0001bf51", - 00001137 => x"8301a783", - 00001138 => x"0001b771", - 00001139 => x"8341a783", - 00001140 => x"0001b751", - 00001141 => x"8381a783", - 00001142 => x"0001bfb5", - 00001143 => x"83c1a783", - 00001144 => x"0001bf95", - 00001145 => x"8401a783", - 00001146 => x"0001b7b5", - 00001147 => x"8541a783", - 00001148 => x"0001b795", - 00001149 => x"8581a783", - 00001150 => x"0001bfb1", - 00001151 => x"85c1a783", - 00001152 => x"0001bf91", - 00001153 => x"8601a783", - 00001154 => x"0001b7b1", - 00001155 => x"84c1a783", - 00001156 => x"0001b791", - 00001157 => x"8501a783", - 00001158 => x"0001bf35", - 00001159 => x"8481a783", - 00001160 => x"0000bf15", - 00001161 => x"00000000", - 00001162 => x"1101650d", - 00001163 => x"bd850513", - 00001164 => x"cc22ce06", - 00001165 => x"c84aca26", - 00001166 => x"c452c64e", - 00001167 => x"251000ef", - 00001168 => x"34202473", - 00001169 => x"eb6347ad", - 00001170 => x"670d0087", - 00001171 => x"00241793", - 00001172 => x"d7c70713", - 00001173 => x"439c97ba", - 00001174 => x"00018782", - 00001175 => x"800007b7", - 00001176 => x"ffd7c793", - 00001177 => x"474197a2", - 00001178 => x"00f76a63", - 00001179 => x"078a670d", - 00001180 => x"dac70713", - 00001181 => x"439c97ba", - 00001182 => x"00018782", - 00001183 => x"0513650d", - 00001184 => x"00efd4c5", - 00001185 => x"6a0d20b0", - 00001186 => x"d64a0513", - 00001187 => x"00ef6491", - 00001188 => x"49711ff0", - 00001189 => x"88048493", - 00001190 => x"000159f1", - 00001191 => x"012457b3", - 00001192 => x"97a68bbd", - 00001193 => x"0007c503", - 00001194 => x"00ef1971", - 00001195 => x"17e31cf0", - 00001196 => x"a819ff39", - 00001197 => x"0513650d", - 00001198 => x"6491be05", - 00001199 => x"1d1000ef", - 00001200 => x"84936a0d", - 00001201 => x"00018804", - 00001202 => x"0513650d", - 00001203 => x"00efd685", - 00001204 => x"29f31bf0", - 00001205 => x"05133400", - 00001206 => x"00efd64a", - 00001207 => x"44711b30", - 00001208 => x"00015971", - 00001209 => x"0089d7b3", - 00001210 => x"97a68bbd", - 00001211 => x"0007c503", - 00001212 => x"00ef1471", - 00001213 => x"17e31870", - 00001214 => x"650dff24", - 00001215 => x"d7050513", - 00001216 => x"18d000ef", - 00001217 => x"343029f3", - 00001218 => x"d64a0513", - 00001219 => x"181000ef", - 00001220 => x"59714471", - 00001221 => x"0089d7b3", - 00001222 => x"97a68bbd", - 00001223 => x"0007c503", - 00001224 => x"00ef1471", - 00001225 => x"17e31570", - 00001226 => x"4462ff24", - 00001227 => x"44d240f2", - 00001228 => x"49b24942", - 00001229 => x"650d4a22", - 00001230 => x"e1c50513", - 00001231 => x"006f6105", - 00001232 => x"000114f0", - 00001233 => x"0513650d", - 00001234 => x"6491c005", - 00001235 => x"141000ef", - 00001236 => x"84936a0d", - 00001237 => x"bf8d8804", - 00001238 => x"0513650d", - 00001239 => x"6491c1c5", - 00001240 => x"12d000ef", - 00001241 => x"84936a0d", - 00001242 => x"bfb98804", - 00001243 => x"0513650d", - 00001244 => x"6491c305", - 00001245 => x"119000ef", - 00001246 => x"84936a0d", - 00001247 => x"b7a98804", - 00001248 => x"0513650d", - 00001249 => x"6491c3c5", - 00001250 => x"105000ef", - 00001251 => x"84936a0d", - 00001252 => x"bf1d8804", - 00001253 => x"0513650d", - 00001254 => x"6491c545", - 00001255 => x"0f1000ef", - 00001256 => x"84936a0d", - 00001257 => x"b70d8804", - 00001258 => x"0513650d", - 00001259 => x"6491c685", - 00001260 => x"0dd000ef", - 00001261 => x"84936a0d", - 00001262 => x"b7398804", - 00001263 => x"0513650d", - 00001264 => x"6491c845", - 00001265 => x"0c9000ef", - 00001266 => x"84936a0d", - 00001267 => x"bded8804", - 00001268 => x"0513650d", - 00001269 => x"6491c985", - 00001270 => x"0b5000ef", - 00001271 => x"84936a0d", - 00001272 => x"b5dd8804", - 00001273 => x"0513650d", - 00001274 => x"6491cfc5", - 00001275 => x"0a1000ef", - 00001276 => x"84936a0d", - 00001277 => x"bdc98804", - 00001278 => x"0513650d", - 00001279 => x"6491d105", - 00001280 => x"08d000ef", - 00001281 => x"84936a0d", - 00001282 => x"bd7d8804", - 00001283 => x"0513650d", - 00001284 => x"6491d245", - 00001285 => x"079000ef", - 00001286 => x"84936a0d", - 00001287 => x"b56d8804", - 00001288 => x"0513650d", - 00001289 => x"6491d385", - 00001290 => x"065000ef", - 00001291 => x"84936a0d", - 00001292 => x"bd598804", - 00001293 => x"0513650d", - 00001294 => x"6491cc85", - 00001295 => x"051000ef", - 00001296 => x"84936a0d", - 00001297 => x"b5498804", - 00001298 => x"0513650d", - 00001299 => x"6491cac5", - 00001300 => x"03d000ef", - 00001301 => x"84936a0d", - 00001302 => x"b5bd8804", - 00001303 => x"0513650d", - 00001304 => x"6491ce05", - 00001305 => x"029000ef", - 00001306 => x"84936a0d", - 00001307 => x"bda98804", - 00001308 => x"301027f3", - 00001309 => x"6785c785", - 00001310 => x"0f078793", - 00001311 => x"30579073", - 00001312 => x"82418793", - 00001313 => x"07136705", - 00001314 => x"86932287", - 00001315 => x"00010407", - 00001316 => x"0791c398", - 00001317 => x"fed79ee3", - 00001318 => x"00018082", - 00001319 => x"1141650d", - 00001320 => x"df050513", - 00001321 => x"00efc606", - 00001322 => x"67857e60", - 00001323 => x"0f078793", - 00001324 => x"30579073", - 00001325 => x"82418793", - 00001326 => x"07136705", - 00001327 => x"86932287", - 00001328 => x"00010407", - 00001329 => x"0791c398", - 00001330 => x"fed79ee3", - 00001331 => x"014140b2", - 00001332 => x"00008082", - 00001333 => x"f56347bd", - 00001334 => x"450500a7", - 00001335 => x"00018082", - 00001336 => x"82418793", - 00001337 => x"953e050a", - 00001338 => x"4501c10c", - 00001339 => x"00008082", - 00001340 => x"f56347bd", - 00001341 => x"450500a7", - 00001342 => x"00018082", - 00001343 => x"82418793", - 00001344 => x"953e050a", - 00001345 => x"87936785", - 00001346 => x"c11c2287", - 00001347 => x"80824501", - 00001348 => x"c2261141", - 00001349 => x"c606c04a", - 00001350 => x"44e1c422", - 00001351 => x"2473493d", - 00001352 => x"5433f130", - 00001353 => x"74130094", - 00001354 => x"07930ff4", - 00001355 => x"f793ff04", - 00001356 => x"d5130ff7", - 00001357 => x"05130047", - 00001358 => x"77630315", - 00001359 => x"00010089", - 00001360 => x"00f7f413", - 00001361 => x"734000ef", - 00001362 => x"03040513", - 00001363 => x"0ff57513", - 00001364 => x"728000ef", - 00001365 => x"02e00513", - 00001366 => x"0001cc95", - 00001367 => x"71c000ef", - 00001368 => x"247314e1", - 00001369 => x"5433f130", - 00001370 => x"74130094", - 00001371 => x"07930ff4", - 00001372 => x"f793ff04", - 00001373 => x"d5130ff7", - 00001374 => x"05130047", - 00001375 => x"61e30315", - 00001376 => x"0513fc89", - 00001377 => x"75130304", - 00001378 => x"00ef0ff5", - 00001379 => x"05136ee0", - 00001380 => x"f4e902e0", - 00001381 => x"442240b2", - 00001382 => x"49024492", - 00001383 => x"80820141", - 00001384 => x"00000000", - 00001385 => x"1101650d", - 00001386 => x"e2450513", - 00001387 => x"cc22ce06", - 00001388 => x"c84aca26", - 00001389 => x"00efc64e", - 00001390 => x"650d6fe0", - 00001391 => x"e5050513", - 00001392 => x"6f4000ef", - 00001393 => x"f14025f3", - 00001394 => x"0513650d", - 00001395 => x"00efe705", - 00001396 => x"25f36e60", - 00001397 => x"650df110", - 00001398 => x"e8c50513", - 00001399 => x"6d8000ef", - 00001400 => x"f1202473", - 00001401 => x"85a2650d", - 00001402 => x"ea850513", - 00001403 => x"6c8000ef", - 00001404 => x"096347cd", - 00001405 => x"00014cf4", - 00001406 => x"f13025f3", - 00001407 => x"0513650d", - 00001408 => x"00efecc5", - 00001409 => x"37296b20", - 00001410 => x"05136509", - 00001411 => x"00ef7b45", - 00001412 => x"650d6a60", - 00001413 => x"ee850513", - 00001414 => x"69c000ef", - 00001415 => x"301027f3", - 00001416 => x"876383f9", - 00001417 => x"47054407", - 00001418 => x"34e78863", - 00001419 => x"85634709", - 00001420 => x"650d48e7", - 00001421 => x"f0c50513", - 00001422 => x"67c000ef", - 00001423 => x"0513650d", - 00001424 => x"00eff1c5", - 00001425 => x"29f36720", - 00001426 => x"44013010", - 00001427 => x"44e94905", - 00001428 => x"0001a031", - 00001429 => x"05630405", - 00001430 => x"00010294", - 00001431 => x"008917b3", - 00001432 => x"0137f7b3", - 00001433 => x"0513dbe5", - 00001434 => x"75130414", - 00001435 => x"00ef0ff5", - 00001436 => x"051360a0", - 00001437 => x"04050200", - 00001438 => x"600000ef", - 00001439 => x"fe9410e3", - 00001440 => x"fc002473", - 00001441 => x"00147793", - 00001442 => x"3c079e63", - 00001443 => x"00247793", - 00001444 => x"3c079463", - 00001445 => x"1b638811", - 00001446 => x"00013a04", - 00001447 => x"0513650d", - 00001448 => x"00eff505", - 00001449 => x"27f36120", - 00001450 => x"8b91fc00", - 00001451 => x"38078a63", - 00001452 => x"90734781", - 00001453 => x"57fd3a07", - 00001454 => x"3b079073", - 00001455 => x"3b002773", - 00001456 => x"a029447d", - 00001457 => x"0b63147d", - 00001458 => x"00013a04", - 00001459 => x"008757b3", - 00001460 => x"fbed8b85", - 00001461 => x"0513650d", - 00001462 => x"00eff705", - 00001463 => x"47f15da0", - 00001464 => x"00340593", - 00001465 => x"3e87d663", - 00001466 => x"0513650d", - 00001467 => x"00effa05", - 00001468 => x"00015c60", - 00001469 => x"0513650d", - 00001470 => x"00effb85", - 00001471 => x"47215ba0", - 00001472 => x"3a071073", - 00001473 => x"3a0027f3", - 00001474 => x"0ff7f793", - 00001475 => x"38e78a63", - 00001476 => x"0513650d", - 00001477 => x"00efa985", - 00001478 => x"000159e0", - 00001479 => x"0513650d", - 00001480 => x"00effd45", - 00001481 => x"47415920", - 00001482 => x"3a071073", - 00001483 => x"3a0027f3", - 00001484 => x"0ff7f793", - 00001485 => x"36e78063", - 00001486 => x"0513650d", - 00001487 => x"00efa985", - 00001488 => x"00015760", - 00001489 => x"0513650d", - 00001490 => x"00effe45", - 00001491 => x"476156a0", - 00001492 => x"3a071073", - 00001493 => x"3a0027f3", - 00001494 => x"0ff7f793", - 00001495 => x"34e78863", - 00001496 => x"0513650d", - 00001497 => x"00efa985", - 00001498 => x"000154e0", - 00001499 => x"90734781", - 00001500 => x"00013a07", - 00001501 => x"0513650d", - 00001502 => x"00efff45", - 00001503 => x"258353a0", - 00001504 => x"650dfe00", - 00001505 => x"00850513", - 00001506 => x"25832335", - 00001507 => x"650dfe40", - 00001508 => x"01850513", - 00001509 => x"650d2305", - 00001510 => x"02850513", - 00001511 => x"25832b21", - 00001512 => x"650dff00", - 00001513 => x"05050513", - 00001514 => x"650d2331", - 00001515 => x"06c50513", - 00001516 => x"27832311", - 00001517 => x"8b91fe80", - 00001518 => x"1c078663", - 00001519 => x"0513650d", - 00001520 => x"21e90845", - 00001521 => x"ff802583", - 00001522 => x"0513650d", - 00001523 => x"21dd0945", - 00001524 => x"0513650d", - 00001525 => x"29f90b45", - 00001526 => x"fe802783", - 00001527 => x"8b638ba1", - 00001528 => x"650d2407", - 00001529 => x"08450513", - 00001530 => x"00012155", - 00001531 => x"ff402583", - 00001532 => x"0513650d", - 00001533 => x"297d0cc5", - 00001534 => x"0513650d", - 00001535 => x"295d0e85", - 00001536 => x"fe802783", - 00001537 => x"81638bc1", - 00001538 => x"650d2207", - 00001539 => x"08450513", - 00001540 => x"000129b5", - 00001541 => x"ffc02583", - 00001542 => x"0513650d", - 00001543 => x"29591005", - 00001544 => x"0513650d", - 00001545 => x"21791205", - 00001546 => x"fe802783", - 00001547 => x"87638b85", - 00001548 => x"650d1e07", - 00001549 => x"08450513", - 00001550 => x"00012991", - 00001551 => x"0513650d", - 00001552 => x"298d1385", - 00001553 => x"fe802783", - 00001554 => x"83638b89", - 00001555 => x"650d1c07", - 00001556 => x"08450513", - 00001557 => x"00012925", - 00001558 => x"0513650d", - 00001559 => x"29991505", - 00001560 => x"2403650d", - 00001561 => x"0513fe80", - 00001562 => x"21a91705", - 00001563 => x"8fe167c1", - 00001564 => x"18078a63", - 00001565 => x"0513650d", - 00001566 => x"29090845", - 00001567 => x"0513650d", - 00001568 => x"290d1785", - 00001569 => x"000207b7", - 00001570 => x"87638fe1", - 00001571 => x"650d1607", - 00001572 => x"08450513", - 00001573 => x"00012ee5", - 00001574 => x"0513650d", - 00001575 => x"29191805", - 00001576 => x"000407b7", - 00001577 => x"83638fe1", - 00001578 => x"650d1407", - 00001579 => x"08450513", - 00001580 => x"00012ef1", - 00001581 => x"0513650d", - 00001582 => x"2eed1885", - 00001583 => x"000807b7", - 00001584 => x"8f638fe1", - 00001585 => x"650d1007", - 00001586 => x"08450513", - 00001587 => x"000126c1", - 00001588 => x"0513650d", - 00001589 => x"2ef91905", - 00001590 => x"001007b7", - 00001591 => x"8b638fe1", - 00001592 => x"650d0e07", - 00001593 => x"08450513", - 00001594 => x"00012655", - 00001595 => x"0513650d", - 00001596 => x"26c91985", - 00001597 => x"002007b7", - 00001598 => x"87638fe1", - 00001599 => x"650d0c07", - 00001600 => x"08450513", - 00001601 => x"00012661", - 00001602 => x"0513650d", - 00001603 => x"265d1a05", - 00001604 => x"004007b7", - 00001605 => x"83638fe1", - 00001606 => x"650d0a07", - 00001607 => x"08450513", - 00001608 => x"000126b5", - 00001609 => x"0513650d", - 00001610 => x"26691a85", - 00001611 => x"010007b7", - 00001612 => x"cfbd8fe1", - 00001613 => x"0513650d", - 00001614 => x"2e890845", - 00001615 => x"0513650d", - 00001616 => x"2e8d1b05", - 00001617 => x"008007b7", - 00001618 => x"cfa98fe1", - 00001619 => x"0513650d", - 00001620 => x"2e2d0845", - 00001621 => x"0513650d", - 00001622 => x"2ea91b85", - 00001623 => x"020007b7", - 00001624 => x"c41d8c7d", - 00001625 => x"40f24462", - 00001626 => x"494244d2", - 00001627 => x"650d49b2", - 00001628 => x"08450513", - 00001629 => x"ae196105", - 00001630 => x"0513650d", - 00001631 => x"2e1df045", - 00001632 => x"0001b975", - 00001633 => x"0513650d", - 00001634 => x"260908c5", - 00001635 => x"0001bd25", - 00001636 => x"40f24462", - 00001637 => x"494244d2", - 00001638 => x"650d49b2", - 00001639 => x"08c50513", - 00001640 => x"a4ed6105", - 00001641 => x"0513650d", - 00001642 => x"24cd08c5", - 00001643 => x"0001b765", - 00001644 => x"0513650d", - 00001645 => x"2cd908c5", - 00001646 => x"0001b751", - 00001647 => x"0513650d", - 00001648 => x"24e908c5", - 00001649 => x"0001b785", - 00001650 => x"0513650d", - 00001651 => x"2c7d08c5", - 00001652 => x"0001bf25", - 00001653 => x"0513650d", - 00001654 => x"2c4d08c5", - 00001655 => x"0001bf01", - 00001656 => x"0513650d", - 00001657 => x"245d08c5", - 00001658 => x"0001b5e5", - 00001659 => x"0513650d", - 00001660 => x"2c6908c5", - 00001661 => x"0001b5c1", - 00001662 => x"0513650d", - 00001663 => x"247908c5", - 00001664 => x"0001bd61", - 00001665 => x"0513650d", - 00001666 => x"244908c5", - 00001667 => x"0001bd85", - 00001668 => x"0513650d", - 00001669 => x"2c9d08c5", - 00001670 => x"0001b581", - 00001671 => x"0513650d", - 00001672 => x"24ad08c5", - 00001673 => x"0001bd21", - 00001674 => x"0513650d", - 00001675 => x"2cb908c5", - 00001676 => x"0001b3d5", - 00001677 => x"0513650d", - 00001678 => x"2c8908c5", - 00001679 => x"0001bb45", - 00001680 => x"0513650d", - 00001681 => x"24bda985", - 00001682 => x"0001b335", - 00001683 => x"0513650d", - 00001684 => x"248df485", - 00001685 => x"0001b1a1", - 00001686 => x"0513650d", - 00001687 => x"2c99f3c5", - 00001688 => x"0001b915", - 00001689 => x"0513650d", - 00001690 => x"24a9f345", - 00001691 => x"0001b105", - 00001692 => x"0513650d", - 00001693 => x"2c3defc5", - 00001694 => x"0001b6d1", - 00001695 => x"0513650d", - 00001696 => x"2c0df705", - 00001697 => x"000145a1", - 00001698 => x"0513650d", - 00001699 => x"241df885", - 00001700 => x"0001b195", - 00001701 => x"0513650d", - 00001702 => x"2c29fc85", - 00001703 => x"0001b165", - 00001704 => x"0513650d", - 00001705 => x"2439fc85", - 00001706 => x"0001b995", - 00001707 => x"0513650d", - 00001708 => x"2409fc85", - 00001709 => x"0001b965", - 00001710 => x"0513650d", - 00001711 => x"2addf145", - 00001712 => x"0001beb5", - 00001713 => x"0513650d", - 00001714 => x"22edec05", - 00001715 => x"0001b635", - 00001716 => x"95b34785", - 00001717 => x"bf4d00b7", - 00001718 => x"00000000", - 00001719 => x"0513650d", - 00001720 => x"a26d1c05", - 00001721 => x"00000000", - 00001722 => x"0513650d", - 00001723 => x"aa792345", - 00001724 => x"00000000", - 00001725 => x"fe802503", - 00001726 => x"8905815d", - 00001727 => x"00008082", - 00001728 => x"fe802503", - 00001729 => x"89058165", - 00001730 => x"00008082", - 00001731 => x"fe802503", - 00001732 => x"89058145", - 00001733 => x"00008082", - 00001734 => x"c02a1141", - 00001735 => x"0793c22e", - 00001736 => x"a023f900", - 00001737 => x"47120007", - 00001738 => x"f8e02a23", - 00001739 => x"c3984702", - 00001740 => x"80820141", - 00001741 => x"00000000", - 00001742 => x"00011141", - 00001743 => x"f9402783", - 00001744 => x"f9002683", - 00001745 => x"f9402703", - 00001746 => x"fee79ae3", - 00001747 => x"c23ec036", - 00001748 => x"45924502", - 00001749 => x"80820141", - 00001750 => x"00000000", - 00001751 => x"f9800693", - 00001752 => x"c290567d", - 00001753 => x"c2ccc288", - 00001754 => x"00008082", - 00001755 => x"00541141", - 00001756 => x"85236811", - 00001757 => x"08930005", - 00001758 => x"87b600e1", - 00001759 => x"8e880813", - 00001760 => x"00014629", - 00001761 => x"02c57733", - 00001762 => x"97420785", - 00001763 => x"00074703", - 00001764 => x"02c55533", - 00001765 => x"fee78fa3", - 00001766 => x"fef896e3", - 00001767 => x"051347a5", - 00001768 => x"00010300", - 00001769 => x"0096c703", - 00001770 => x"fff78613", - 00001771 => x"1793883e", - 00001772 => x"83c10106", - 00001773 => x"04a71663", - 00001774 => x"000684a3", - 00001775 => x"f3fd16fd", - 00001776 => x"00414703", - 00001777 => x"46816841", - 00001778 => x"187d88ae", - 00001779 => x"07c217fd", - 00001780 => x"081083c1", - 00001781 => x"00168513", - 00001782 => x"cb09963e", - 00001783 => x"01051693", - 00001784 => x"802382c1", - 00001785 => x"88b300e8", - 00001786 => x"000100d5", - 00001787 => x"01078663", - 00001788 => x"ff464703", - 00001789 => x"0001bfe1", - 00001790 => x"00088023", - 00001791 => x"80820141", - 00001792 => x"b7c987c2", - 00001793 => x"00000000", - 00001794 => x"fe802503", - 00001795 => x"89058149", - 00001796 => x"00008082", - 00001797 => x"fa002023", - 00001798 => x"fe002683", - 00001799 => x"47810506", - 00001800 => x"02a6d6b3", - 00001801 => x"15796505", - 00001802 => x"82c106c2", - 00001803 => x"00d56a63", - 00001804 => x"0001a035", - 00001805 => x"82850785", - 00001806 => x"0ff7f793", - 00001807 => x"00d57e63", - 00001808 => x"ffe78713", - 00001809 => x"0fd77713", - 00001810 => x"0785f775", - 00001811 => x"f793828d", - 00001812 => x"67e30ff7", - 00001813 => x"0001fed5", - 00001814 => x"000107e2", - 00001815 => x"89858a05", - 00001816 => x"8ed1067a", - 00001817 => x"8ecd05f6", - 00001818 => x"17378fd5", - 00001819 => x"8fd91000", - 00001820 => x"faf02023", - 00001821 => x"00008082", - 00001822 => x"faa02223", - 00001823 => x"00008082", - 00001824 => x"fa002503", - 00001825 => x"8082817d", - 00001826 => x"00000000", - 00001827 => x"00054783", - 00001828 => x"cf990505", - 00001829 => x"46b54729", - 00001830 => x"95630505", - 00001831 => x"222300e7", - 00001832 => x"0001fad0", - 00001833 => x"faf02223", - 00001834 => x"fff54783", - 00001835 => x"0001f7f5", - 00001836 => x"00008082", - 00001837 => x"c0ba715d", - 00001838 => x"d422d606", - 00001839 => x"d04ad226", - 00001840 => x"cc52ce4e", - 00001841 => x"dc32da2e", - 00001842 => x"c2bede36", - 00001843 => x"c6c6c4c2", - 00001844 => x"00054783", - 00001845 => x"c03a1858", - 00001846 => x"6a11cf95", - 00001847 => x"07136991", - 00001848 => x"04930015", - 00001849 => x"49350250", - 00001850 => x"890a0a13", - 00001851 => x"8f498993", - 00001852 => x"02978a63", - 00001853 => x"956346a9", - 00001854 => x"222300d7", - 00001855 => x"0001fb20", - 00001856 => x"faf02223", - 00001857 => x"0001853a", - 00001858 => x"00054783", - 00001859 => x"00150713", - 00001860 => x"0001f3e5", - 00001861 => x"542250b2", - 00001862 => x"59025492", - 00001863 => x"4a6249f2", - 00001864 => x"80826161", - 00001865 => x"00154783", - 00001866 => x"04134755", - 00001867 => x"87930025", - 00001868 => x"f793f9d7", - 00001869 => x"6fe30ff7", - 00001870 => x"078afcf7", - 00001871 => x"439c97d2", - 00001872 => x"00018782", - 00001873 => x"00544782", - 00001874 => x"438c4701", - 00001875 => x"c03e0791", - 00001876 => x"02000613", - 00001877 => x"00e5d7b3", - 00001878 => x"97ce8bbd", - 00001879 => x"0007c783", - 00001880 => x"16fd0711", - 00001881 => x"00f68423", - 00001882 => x"fec716e3", - 00001883 => x"00414783", - 00001884 => x"00010623", - 00001885 => x"0713cf91", - 00001886 => x"46a90051", - 00001887 => x"00d79463", - 00001888 => x"fb202223", - 00001889 => x"faf02223", - 00001890 => x"00074783", - 00001891 => x"f7fd0705", - 00001892 => x"bf9d8522", - 00001893 => x"004c4782", - 00001894 => x"07914388", - 00001895 => x"f0efc03e", - 00001896 => x"4783dcff", - 00001897 => x"d7ed0041", - 00001898 => x"00510713", - 00001899 => x"000146a9", - 00001900 => x"00d79463", - 00001901 => x"fb202223", - 00001902 => x"faf02223", - 00001903 => x"00074783", - 00001904 => x"f7fd0705", - 00001905 => x"b7898522", - 00001906 => x"43984782", - 00001907 => x"c03e0791", - 00001908 => x"00074783", - 00001909 => x"dfcd0705", - 00001910 => x"000146a9", - 00001911 => x"00d79463", - 00001912 => x"fb202223", - 00001913 => x"faf02223", - 00001914 => x"00074783", - 00001915 => x"f7fd0705", - 00001916 => x"bf198522", - 00001917 => x"43884782", - 00001918 => x"c03e0791", - 00001919 => x"00055863", - 00001920 => x"02d00793", - 00001921 => x"40a00533", - 00001922 => x"faf02223", - 00001923 => x"f0ef004c", - 00001924 => x"4783d5ff", - 00001925 => x"dfad0041", - 00001926 => x"00510713", - 00001927 => x"000146a9", - 00001928 => x"00d79463", - 00001929 => x"fb202223", - 00001930 => x"faf02223", - 00001931 => x"00074783", - 00001932 => x"f7fd0705", - 00001933 => x"bdc98522", - 00001934 => x"85224782", - 00001935 => x"0007c703", - 00001936 => x"c03e0791", - 00001937 => x"fae02223", - 00001938 => x"0000b5c1", - 00001939 => x"87aa474d", - 00001940 => x"02a76263", - 00001941 => x"000f1737", - 00001942 => x"88870713", - 00001943 => x"00a75733", - 00001944 => x"45058b05", - 00001945 => x"1533cb11", - 00001946 => x"207300f5", - 00001947 => x"45013045", - 00001948 => x"00018082", - 00001949 => x"00014505", - 00001950 => x"00008082", - 00001951 => x"90734781", - 00001952 => x"9073b007", - 00001953 => x"1073b805", - 00001954 => x"8082b005", - 00001955 => x"00000000", - 00001956 => x"90734781", - 00001957 => x"9073b027", - 00001958 => x"1073b825", - 00001959 => x"8082b025", - 00001960 => x"00000000", - 00001961 => x"00011141", - 00001962 => x"c8102773", - 00001963 => x"c01026f3", - 00001964 => x"c81027f3", - 00001965 => x"fee79ae3", - 00001966 => x"c23ec036", - 00001967 => x"45924502", - 00001968 => x"80820141", - 00001969 => x"00000000", - 00001970 => x"34109073", - 00001971 => x"80936089", - 00001972 => x"b0738000", - 00001973 => x"00733000", - 00001974 => x"00003020", - 00001975 => x"fe802503", - 00001976 => x"89058151", - 00001977 => x"00008082", - 00001978 => x"8a05891d", - 00001979 => x"05128985", - 00001980 => x"8d510622", - 00001981 => x"0793058e", - 00001982 => x"8d4dfb00", - 00001983 => x"0007a023", - 00001984 => x"00156513", - 00001985 => x"8082c388", - 00001986 => x"00000000", - 00001987 => x"fb000713", - 00001988 => x"9bdd431c", - 00001989 => x"8082c31c", - 00001990 => x"00000000", - 00001991 => x"faa02a23", - 00001992 => x"fb002783", - 00001993 => x"fe07cee3", - 00001994 => x"fb002503", - 00001995 => x"45138179", - 00001996 => x"89050015", - 00001997 => x"00008082", - 00001998 => x"fb002783", - 00001999 => x"0047e793", - 00002000 => x"faf02823", - 00002001 => x"fb002783", - 00002002 => x"fe07cee3", - 00002003 => x"00008082", - 00002004 => x"fb002783", - 00002005 => x"0027e793", - 00002006 => x"faf02823", - 00002007 => x"fb002783", - 00002008 => x"fe07cee3", - 00002009 => x"00008082", - 00002010 => x"fe802503", - 00002011 => x"8905814d", - 00002012 => x"00008082", - 00002013 => x"8a85891d", - 00002014 => x"052a8a0d", - 00002015 => x"898506be", - 00002016 => x"06368d55", - 00002017 => x"05a68d51", - 00002018 => x"fa800793", - 00002019 => x"a0238d4d", - 00002020 => x"65130007", - 00002021 => x"c3881005", - 00002022 => x"00008082", - 00002023 => x"fa800713", - 00002024 => x"f793431c", - 00002025 => x"c31ceff7", - 00002026 => x"00008082", - 00002027 => x"faa02623", - 00002028 => x"fa802783", - 00002029 => x"fe07cee3", - 00002030 => x"fac02503", - 00002031 => x"00008082", - 00002032 => x"fa802503", - 00002033 => x"8082817d", - 00002034 => x"00000000", - 00002035 => x"fe802503", - 00002036 => x"89058141", - 00002037 => x"00008082", - 00002038 => x"f8400713", - 00002039 => x"47854314", - 00002040 => x"00a797b3", - 00002041 => x"c31c8fd5", - 00002042 => x"00008082", - 00002043 => x"f8a02223", - 00002044 => x"00008082", - 00002045 => x"f8a02023", - 00002046 => x"00008082", - 00002047 => x"315b6325", - 00002048 => x"6b6f5b6d", - 00002049 => x"5b63255d", - 00002050 => x"000a6d30", - 00002051 => x"315b6325", - 00002052 => x"41465b6d", - 00002053 => x"44454c49", - 00002054 => x"5b63255d", - 00002055 => x"000a6d30", - 00002056 => x"2d2d0a0a", - 00002057 => x"5250202d", - 00002058 => x"5345434f", - 00002059 => x"2f524f53", - 00002060 => x"20555043", - 00002061 => x"54534554", - 00002062 => x"2d2d2d20", - 00002063 => x"0000000a", - 00002064 => x"6c697562", - 00002065 => x"4e203a64", - 00002066 => x"2020766f", - 00002067 => x"30322033", - 00002068 => x"31203032", - 00002069 => x"38343a38", - 00002070 => x"0a33303a", - 00002071 => x"00000000", - 00002072 => x"73696854", - 00002073 => x"73657420", - 00002074 => x"75732074", - 00002075 => x"20657469", - 00002076 => x"69207369", - 00002077 => x"6e65746e", - 00002078 => x"20646564", - 00002079 => x"76206f74", - 00002080 => x"66697265", - 00002081 => x"68742079", - 00002082 => x"65642065", - 00002083 => x"6c756166", - 00002084 => x"454e2074", - 00002085 => x"3356524f", - 00002086 => x"72702032", - 00002087 => x"7365636f", - 00002088 => x"20726f73", - 00002089 => x"75746573", - 00002090 => x"73752070", - 00002091 => x"20676e69", - 00002092 => x"20656874", - 00002093 => x"61666564", - 00002094 => x"20746c75", - 00002095 => x"74736574", - 00002096 => x"636e6562", - 00002097 => x"0a0a2e68", - 00002098 => x"00000000", - 00002099 => x"20455452", - 00002100 => x"74736e69", - 00002101 => x"206c6c61", - 00002102 => x"6f727265", - 00002103 => x"25282072", - 00002104 => x"0a212969", - 00002105 => x"00000000", - 00002106 => x"20515249", - 00002107 => x"62616e65", - 00002108 => x"6520656c", - 00002109 => x"726f7272", - 00002110 => x"69252820", - 00002111 => x"000a2129", - 00002112 => x"74530a0a", - 00002113 => x"69747261", - 00002114 => x"7420676e", - 00002115 => x"73747365", - 00002116 => x"0a2e2e2e", - 00002117 => x"0000000a", - 00002118 => x"5d69255b", - 00002119 => x"73694c20", - 00002120 => x"6c612074", - 00002121 => x"6361206c", - 00002122 => x"73736563", - 00002123 => x"656c6269", - 00002124 => x"52534320", - 00002125 => x"00203a73", - 00002126 => x"30202b20", - 00002127 => x"0a782578", - 00002128 => x"00000000", - 00002129 => x"70696b73", - 00002130 => x"20646570", - 00002131 => x"73696428", - 00002132 => x"656c6261", - 00002133 => x"6f662064", - 00002134 => x"69732072", - 00002135 => x"616c756d", - 00002136 => x"6e6f6974", - 00002137 => x"00000a29", - 00002138 => x"5d69255b", - 00002139 => x"66654420", - 00002140 => x"746c7561", - 00002141 => x"55464320", - 00002142 => x"63612030", - 00002143 => x"73736563", - 00002144 => x"73657420", - 00002145 => x"00203a74", - 00002146 => x"70696b73", - 00002147 => x"20646570", - 00002148 => x"55464328", - 00002149 => x"6f6e2030", - 00002150 => x"6d692074", - 00002151 => x"6d656c70", - 00002152 => x"65746e65", - 00002153 => x"000a2964", - 00002154 => x"5d69255b", - 00002155 => x"66654420", - 00002156 => x"746c7561", - 00002157 => x"55464320", - 00002158 => x"63612031", - 00002159 => x"73736563", - 00002160 => x"73657420", - 00002161 => x"00203a74", - 00002162 => x"70696b73", - 00002163 => x"20646570", - 00002164 => x"55464328", - 00002165 => x"6f6e2031", - 00002166 => x"6d692074", - 00002167 => x"6d656c70", - 00002168 => x"65746e65", - 00002169 => x"000a2964", - 00002170 => x"5d69255b", - 00002171 => x"74734520", - 00002172 => x"74616d69", - 00002173 => x"75622065", - 00002174 => x"69742073", - 00002175 => x"6f2d656d", - 00002176 => x"6c207475", - 00002177 => x"6e657461", - 00002178 => x"203a7963", - 00002179 => x"00000000", - 00002180 => x"2075257e", - 00002181 => x"6c637963", - 00002182 => x"000a7365", - 00002183 => x"5d69255b", - 00002184 => x"74784520", - 00002185 => x"616e7265", - 00002186 => x"656d206c", - 00002187 => x"79726f6d", - 00002188 => x"63636120", - 00002189 => x"20737365", - 00002190 => x"30204028", - 00002191 => x"29782578", - 00002192 => x"73657420", - 00002193 => x"00203a74", - 00002194 => x"70696b73", - 00002195 => x"20646570", - 00002196 => x"74786528", - 00002197 => x"616e7265", - 00002198 => x"656d206c", - 00002199 => x"79726f6d", - 00002200 => x"746e6920", - 00002201 => x"61667265", - 00002202 => x"6e206563", - 00002203 => x"6920746f", - 00002204 => x"656c706d", - 00002205 => x"746e656d", - 00002206 => x"0a296465", - 00002207 => x"00000000", - 00002208 => x"70696b73", - 00002209 => x"20646570", - 00002210 => x"206e6f28", - 00002211 => x"6c616572", - 00002212 => x"72616820", - 00002213 => x"72617764", - 00002214 => x"000a2965", - 00002215 => x"5d69255b", - 00002216 => x"6d695420", - 00002217 => x"4d282065", - 00002218 => x"454d4954", - 00002219 => x"6d69742e", - 00002220 => x"73762065", - 00002221 => x"52534320", - 00002222 => x"6d69742e", - 00002223 => x"73202965", - 00002224 => x"3a636e79", - 00002225 => x"00000020", - 00002226 => x"5d69255b", - 00002227 => x"4e454620", - 00002228 => x"69204543", - 00002229 => x"7274736e", - 00002230 => x"69746375", - 00002231 => x"74206e6f", - 00002232 => x"3a747365", - 00002233 => x"00000020", - 00002234 => x"5d69255b", - 00002235 => x"4e454620", - 00002236 => x"492e4543", - 00002237 => x"736e6920", - 00002238 => x"63757274", - 00002239 => x"6e6f6974", - 00002240 => x"73657420", - 00002241 => x"00203a74", - 00002242 => x"70696b73", - 00002243 => x"20646570", - 00002244 => x"746f6e28", - 00002245 => x"706d6920", - 00002246 => x"656d656c", - 00002247 => x"6465746e", - 00002248 => x"00000a29", - 00002249 => x"5d69255b", - 00002250 => x"6c6c4920", - 00002251 => x"6c616765", - 00002252 => x"52534320", - 00002253 => x"78302820", - 00002254 => x"29666666", - 00002255 => x"63636120", - 00002256 => x"20737365", - 00002257 => x"74736574", - 00002258 => x"0000203a", - 00002259 => x"5d69255b", - 00002260 => x"61655220", - 00002261 => x"6e6f2d64", - 00002262 => x"4320796c", - 00002263 => x"28205253", - 00002264 => x"656d6974", - 00002265 => x"72772029", - 00002266 => x"20657469", - 00002267 => x"65636361", - 00002268 => x"74207373", - 00002269 => x"3a747365", - 00002270 => x"00000020", - 00002271 => x"5d69255b", - 00002272 => x"61655220", - 00002273 => x"6e6f2d64", - 00002274 => x"4320796c", - 00002275 => x"28205253", - 00002276 => x"656d6974", - 00002277 => x"6f6e2029", - 00002278 => x"6972772d", - 00002279 => x"28206574", - 00002280 => x"3d317372", - 00002281 => x"61202930", - 00002282 => x"73656363", - 00002283 => x"65742073", - 00002284 => x"203a7473", - 00002285 => x"00000000", - 00002286 => x"5d69255b", - 00002287 => x"415f4920", - 00002288 => x"4e47494c", - 00002289 => x"6e692820", - 00002290 => x"75727473", - 00002291 => x"6f697463", - 00002292 => x"6c61206e", - 00002293 => x"6d6e6769", - 00002294 => x"29746e65", - 00002295 => x"63786520", - 00002296 => x"69747065", - 00002297 => x"74206e6f", - 00002298 => x"3a747365", - 00002299 => x"00000020", - 00002300 => x"000a6b6f", - 00002301 => x"6c696166", - 00002302 => x"0000000a", - 00002303 => x"70696b73", - 00002304 => x"20646570", - 00002305 => x"746f6e28", - 00002306 => x"736f7020", - 00002307 => x"6c626973", - 00002308 => x"68772065", - 00002309 => x"43206e65", - 00002310 => x"74786520", - 00002311 => x"69736e65", - 00002312 => x"69206e6f", - 00002313 => x"6e652073", - 00002314 => x"656c6261", - 00002315 => x"000a2964", - 00002316 => x"5d69255b", - 00002317 => x"415f4920", - 00002318 => x"28204343", - 00002319 => x"74736e69", - 00002320 => x"74637572", - 00002321 => x"206e6f69", - 00002322 => x"20737562", - 00002323 => x"65636361", - 00002324 => x"20297373", - 00002325 => x"65637865", - 00002326 => x"6f697470", - 00002327 => x"6574206e", - 00002328 => x"203a7473", - 00002329 => x"00000000", - 00002330 => x"5d69255b", - 00002331 => x"495f4920", - 00002332 => x"47454c4c", - 00002333 => x"6c692820", - 00002334 => x"6167656c", - 00002335 => x"6e69206c", - 00002336 => x"75727473", - 00002337 => x"6f697463", - 00002338 => x"6520296e", - 00002339 => x"70656378", - 00002340 => x"6e6f6974", - 00002341 => x"73657420", - 00002342 => x"00203a74", - 00002343 => x"5d69255b", - 00002344 => x"5f494320", - 00002345 => x"454c4c49", - 00002346 => x"69282047", - 00002347 => x"67656c6c", - 00002348 => x"63206c61", - 00002349 => x"72706d6f", - 00002350 => x"65737365", - 00002351 => x"6e692064", - 00002352 => x"75727473", - 00002353 => x"6f697463", - 00002354 => x"6520296e", - 00002355 => x"70656378", - 00002356 => x"6e6f6974", - 00002357 => x"73657420", - 00002358 => x"00203a74", - 00002359 => x"70696b73", - 00002360 => x"20646570", - 00002361 => x"746f6e28", - 00002362 => x"736f7020", - 00002363 => x"6c626973", - 00002364 => x"68772065", - 00002365 => x"43206e65", - 00002366 => x"5458452d", - 00002367 => x"73696420", - 00002368 => x"656c6261", - 00002369 => x"000a2964", - 00002370 => x"5d69255b", - 00002371 => x"45524220", - 00002372 => x"28204b41", - 00002373 => x"61657262", - 00002374 => x"6e69206b", - 00002375 => x"75727473", - 00002376 => x"6f697463", - 00002377 => x"6520296e", - 00002378 => x"70656378", - 00002379 => x"6e6f6974", - 00002380 => x"73657420", - 00002381 => x"00203a74", - 00002382 => x"5d69255b", - 00002383 => x"415f4c20", - 00002384 => x"4e47494c", - 00002385 => x"6f6c2820", - 00002386 => x"61206461", - 00002387 => x"65726464", - 00002388 => x"61207373", - 00002389 => x"6e67696c", - 00002390 => x"746e656d", - 00002391 => x"78652029", - 00002392 => x"74706563", - 00002393 => x"206e6f69", - 00002394 => x"74736574", - 00002395 => x"0000203a", - 00002396 => x"5d69255b", - 00002397 => x"415f4c20", - 00002398 => x"28204343", - 00002399 => x"64616f6c", - 00002400 => x"73756220", - 00002401 => x"63636120", - 00002402 => x"29737365", - 00002403 => x"63786520", - 00002404 => x"69747065", - 00002405 => x"74206e6f", - 00002406 => x"3a747365", - 00002407 => x"00000020", - 00002408 => x"5d69255b", - 00002409 => x"415f5320", - 00002410 => x"4e47494c", - 00002411 => x"74732820", - 00002412 => x"2065726f", - 00002413 => x"72646461", - 00002414 => x"20737365", - 00002415 => x"67696c61", - 00002416 => x"6e656d6e", - 00002417 => x"65202974", - 00002418 => x"70656378", - 00002419 => x"6e6f6974", - 00002420 => x"73657420", - 00002421 => x"00203a74", - 00002422 => x"5d69255b", - 00002423 => x"415f5320", - 00002424 => x"28204343", - 00002425 => x"726f7473", - 00002426 => x"75622065", - 00002427 => x"63612073", - 00002428 => x"73736563", - 00002429 => x"78652029", - 00002430 => x"74706563", - 00002431 => x"206e6f69", - 00002432 => x"74736574", - 00002433 => x"0000203a", - 00002434 => x"5d69255b", - 00002435 => x"564e4520", - 00002436 => x"4c4c4143", - 00002437 => x"63652820", - 00002438 => x"206c6c61", - 00002439 => x"74736e69", - 00002440 => x"74637572", - 00002441 => x"296e6f69", - 00002442 => x"63786520", - 00002443 => x"69747065", - 00002444 => x"74206e6f", - 00002445 => x"3a747365", - 00002446 => x"00000020", - 00002447 => x"5d69255b", - 00002448 => x"49544d20", - 00002449 => x"616d2820", - 00002450 => x"6e696863", - 00002451 => x"69742065", - 00002452 => x"2972656d", - 00002453 => x"746e6920", - 00002454 => x"75727265", - 00002455 => x"74207470", - 00002456 => x"3a747365", - 00002457 => x"00000020", - 00002458 => x"70696b73", - 00002459 => x"20646570", - 00002460 => x"54445728", - 00002461 => x"746f6e20", - 00002462 => x"706d6920", - 00002463 => x"656d656c", - 00002464 => x"6465746e", - 00002465 => x"00000a29", - 00002466 => x"5d69255b", - 00002467 => x"52494620", - 00002468 => x"28203051", - 00002469 => x"74736166", - 00002470 => x"51524920", - 00002471 => x"69202930", - 00002472 => x"7265746e", - 00002473 => x"74707572", - 00002474 => x"73657420", - 00002475 => x"76282074", - 00002476 => x"57206169", - 00002477 => x"3a295444", - 00002478 => x"00000020", - 00002479 => x"5d69255b", - 00002480 => x"52494620", - 00002481 => x"28203151", - 00002482 => x"74736166", - 00002483 => x"51524920", - 00002484 => x"69202931", - 00002485 => x"7265746e", - 00002486 => x"74707572", - 00002487 => x"73657420", - 00002488 => x"76282074", - 00002489 => x"47206169", - 00002490 => x"294f4950", - 00002491 => x"0000203a", - 00002492 => x"70696b73", - 00002493 => x"20646570", - 00002494 => x"49504728", - 00002495 => x"6f6e204f", - 00002496 => x"6d692074", - 00002497 => x"6d656c70", - 00002498 => x"65746e65", - 00002499 => x"000a2964", - 00002500 => x"5d69255b", - 00002501 => x"52494620", - 00002502 => x"28203251", - 00002503 => x"74736166", - 00002504 => x"51524920", - 00002505 => x"69202932", - 00002506 => x"7265746e", - 00002507 => x"74707572", - 00002508 => x"73657420", - 00002509 => x"76282074", - 00002510 => x"55206169", - 00002511 => x"29545241", - 00002512 => x"0000203a", - 00002513 => x"70696b73", - 00002514 => x"20646570", - 00002515 => x"52415528", - 00002516 => x"6f6e2054", - 00002517 => x"6d692074", - 00002518 => x"6d656c70", - 00002519 => x"65746e65", - 00002520 => x"000a2964", - 00002521 => x"5d69255b", - 00002522 => x"52494620", - 00002523 => x"28203351", - 00002524 => x"74736166", - 00002525 => x"51524920", - 00002526 => x"69202933", - 00002527 => x"7265746e", - 00002528 => x"74707572", - 00002529 => x"73657420", - 00002530 => x"76282074", - 00002531 => x"53206169", - 00002532 => x"3a294950", - 00002533 => x"00000020", - 00002534 => x"70696b73", - 00002535 => x"20646570", - 00002536 => x"49505328", - 00002537 => x"746f6e20", - 00002538 => x"706d6920", - 00002539 => x"656d656c", - 00002540 => x"6465746e", - 00002541 => x"00000a29", - 00002542 => x"5d69255b", - 00002543 => x"52494620", - 00002544 => x"28203351", - 00002545 => x"74736166", - 00002546 => x"51524920", - 00002547 => x"69202933", - 00002548 => x"7265746e", - 00002549 => x"74707572", - 00002550 => x"73657420", - 00002551 => x"76282074", - 00002552 => x"54206169", - 00002553 => x"3a294957", - 00002554 => x"00000020", - 00002555 => x"70696b73", - 00002556 => x"20646570", - 00002557 => x"49575428", - 00002558 => x"746f6e20", - 00002559 => x"706d6920", - 00002560 => x"656d656c", - 00002561 => x"6465746e", - 00002562 => x"00000a29", - 00002563 => x"5d69255b", - 00002564 => x"49465720", - 00002565 => x"61772820", - 00002566 => x"66207469", - 00002567 => x"6920726f", - 00002568 => x"7265746e", - 00002569 => x"74707572", - 00002570 => x"73202f20", - 00002571 => x"7065656c", - 00002572 => x"736e6920", - 00002573 => x"63757274", - 00002574 => x"6e6f6974", - 00002575 => x"65742029", - 00002576 => x"28207473", - 00002577 => x"656b6177", - 00002578 => x"2070752d", - 00002579 => x"20616976", - 00002580 => x"4d49544d", - 00002581 => x"203a2945", - 00002582 => x"00000000", - 00002583 => x"70696b73", - 00002584 => x"20646570", - 00002585 => x"49544d28", - 00002586 => x"6e20454d", - 00002587 => x"6920746f", - 00002588 => x"656c706d", - 00002589 => x"746e656d", - 00002590 => x"0a296465", - 00002591 => x"00000000", - 00002592 => x"5d69255b", - 00002593 => x"766e4920", - 00002594 => x"64696c61", - 00002595 => x"52534320", - 00002596 => x"63636120", - 00002597 => x"20737365", - 00002598 => x"74736d28", - 00002599 => x"73757461", - 00002600 => x"72662029", - 00002601 => x"75206d6f", - 00002602 => x"20726573", - 00002603 => x"65646f6d", - 00002604 => x"73657420", - 00002605 => x"00203a74", - 00002606 => x"70696b73", - 00002607 => x"20646570", - 00002608 => x"746f6e28", - 00002609 => x"736f7020", - 00002610 => x"6c626973", - 00002611 => x"68772065", - 00002612 => x"55206e65", - 00002613 => x"5458452d", - 00002614 => x"73696420", - 00002615 => x"656c6261", - 00002616 => x"000a2964", - 00002617 => x"5d69255b", - 00002618 => x"45545220", - 00002619 => x"75722820", - 00002620 => x"6d69746e", - 00002621 => x"6e652065", - 00002622 => x"6f726976", - 00002623 => x"6e656d6e", - 00002624 => x"64202974", - 00002625 => x"67756265", - 00002626 => x"61727420", - 00002627 => x"61682070", - 00002628 => x"656c646e", - 00002629 => x"65742072", - 00002630 => x"203a7473", - 00002631 => x"00000000", - 00002632 => x"77736e61", - 00002633 => x"203a7265", - 00002634 => x"78257830", - 00002635 => x"00000000", - 00002636 => x"5d69255b", - 00002637 => x"79685020", - 00002638 => x"61636973", - 00002639 => x"656d206c", - 00002640 => x"79726f6d", - 00002641 => x"6f727020", - 00002642 => x"74636574", - 00002643 => x"206e6f69", - 00002644 => x"504d5028", - 00002645 => x"00203a29", - 00002646 => x"61657243", - 00002647 => x"676e6974", - 00002648 => x"6f727020", - 00002649 => x"74636574", - 00002650 => x"70206465", - 00002651 => x"20656761", - 00002652 => x"50414e28", - 00002653 => x"202c544f", - 00002654 => x"2c58215b", - 00002655 => x"522c5721", - 00002656 => x"25202c5d", - 00002657 => x"79622075", - 00002658 => x"29736574", - 00002659 => x"30204020", - 00002660 => x"20782578", - 00002661 => x"504d5028", - 00002662 => x"52444441", - 00002663 => x"30203d20", - 00002664 => x"29782578", - 00002665 => x"0000203a", - 00002666 => x"5d69255b", - 00002667 => x"50202d20", - 00002668 => x"203a504d", - 00002669 => x"6f6d2d55", - 00002670 => x"5b206564", - 00002671 => x"212c5821", - 00002672 => x"5d522c57", - 00002673 => x"65786520", - 00002674 => x"65747563", - 00002675 => x"73657420", - 00002676 => x"20203a74", - 00002677 => x"00000000", - 00002678 => x"5d69255b", - 00002679 => x"50202d20", - 00002680 => x"203a504d", - 00002681 => x"6f6d2d55", - 00002682 => x"5b206564", - 00002683 => x"212c5821", - 00002684 => x"5d522c57", - 00002685 => x"61657220", - 00002686 => x"65742064", - 00002687 => x"203a7473", - 00002688 => x"20202020", - 00002689 => x"00000000", - 00002690 => x"5d69255b", - 00002691 => x"50202d20", - 00002692 => x"203a504d", - 00002693 => x"6f6d2d55", - 00002694 => x"5b206564", - 00002695 => x"212c5821", - 00002696 => x"5d522c57", - 00002697 => x"69727720", - 00002698 => x"74206574", - 00002699 => x"3a747365", - 00002700 => x"20202020", - 00002701 => x"00000000", - 00002702 => x"5d69255b", - 00002703 => x"50202d20", - 00002704 => x"203a504d", - 00002705 => x"63706d70", - 00002706 => x"2e306766", - 00002707 => x"6d5b2030", - 00002708 => x"3d65646f", - 00002709 => x"5d66666f", - 00002710 => x"636f6c20", - 00002711 => x"6574206b", - 00002712 => x"203a7473", - 00002713 => x"00000000", - 00002714 => x"5d69255b", - 00002715 => x"50202d20", - 00002716 => x"203a504d", - 00002717 => x"61706d70", - 00002718 => x"30726464", - 00002719 => x"6f6d5b20", - 00002720 => x"6f3d6564", - 00002721 => x"205d6666", - 00002722 => x"6b636f6c", - 00002723 => x"73657420", - 00002724 => x"20203a74", - 00002725 => x"00000000", - 00002726 => x"20746f6e", - 00002727 => x"6c706d69", - 00002728 => x"6e656d65", - 00002729 => x"0a646574", - 00002730 => x"00000000", - 00002731 => x"6578450a", - 00002732 => x"65747563", - 00002733 => x"6e692064", - 00002734 => x"75727473", - 00002735 => x"6f697463", - 00002736 => x"203a736e", - 00002737 => x"000a7525", - 00002738 => x"75716552", - 00002739 => x"64657269", - 00002740 => x"6f6c6320", - 00002741 => x"63206b63", - 00002742 => x"656c6379", - 00002743 => x"25203a73", - 00002744 => x"00000a75", - 00002745 => x"7365540a", - 00002746 => x"65722074", - 00002747 => x"746c7573", - 00002748 => x"4f0a3a73", - 00002749 => x"20203a4b", - 00002750 => x"25202020", - 00002751 => x"69252f69", - 00002752 => x"4941460a", - 00002753 => x"3a44454c", - 00002754 => x"2f692520", - 00002755 => x"0a0a6925", - 00002756 => x"00000000", - 00002757 => x"315b6325", - 00002758 => x"50435b6d", - 00002759 => x"45542055", - 00002760 => x"43205453", - 00002761 => x"4c504d4f", - 00002762 => x"44455445", - 00002763 => x"43555320", - 00002764 => x"53534543", - 00002765 => x"4c4c5546", - 00002766 => x"255d2159", - 00002767 => x"6d305b63", - 00002768 => x"0000000a", - 00002769 => x"315b6325", - 00002770 => x"50435b6d", - 00002771 => x"45542055", - 00002772 => x"46205453", - 00002773 => x"454c4941", - 00002774 => x"255d2144", - 00002775 => x"6d305b63", - 00002776 => x"0000000a", - 00002777 => x"000011ac", - 00002778 => x"000011b4", - 00002779 => x"000011bc", - 00002780 => x"000011c4", - 00002781 => x"000011cc", - 00002782 => x"000011d4", - 00002783 => x"000011dc", - 00002784 => x"000011e4", - 00002785 => x"0000114c", - 00002786 => x"0000114c", - 00002787 => x"0000114c", - 00002788 => x"000011a4", - 00002789 => x"0000121c", - 00002790 => x"0000114c", - 00002791 => x"0000114c", - 00002792 => x"0000114c", - 00002793 => x"0000120c", - 00002794 => x"0000114c", - 00002795 => x"0000114c", - 00002796 => x"0000114c", - 00002797 => x"00001214", - 00002798 => x"0000114c", - 00002799 => x"0000114c", - 00002800 => x"0000114c", - 00002801 => x"0000114c", - 00002802 => x"000011ec", - 00002803 => x"000011f4", - 00002804 => x"000011fc", - 00002805 => x"00001204", - 00002806 => x"4554523c", - 00002807 => x"0000203e", - 00002808 => x"74736e49", - 00002809 => x"74637572", - 00002810 => x"206e6f69", - 00002811 => x"72646461", - 00002812 => x"20737365", - 00002813 => x"6173696d", - 00002814 => x"6e67696c", - 00002815 => x"00006465", - 00002816 => x"74736e49", - 00002817 => x"74637572", - 00002818 => x"206e6f69", - 00002819 => x"65636361", - 00002820 => x"66207373", - 00002821 => x"746c7561", - 00002822 => x"00000000", - 00002823 => x"656c6c49", - 00002824 => x"206c6167", - 00002825 => x"74736e69", - 00002826 => x"74637572", - 00002827 => x"006e6f69", - 00002828 => x"61657242", - 00002829 => x"696f706b", - 00002830 => x"0000746e", - 00002831 => x"64616f4c", - 00002832 => x"64646120", - 00002833 => x"73736572", - 00002834 => x"73696d20", - 00002835 => x"67696c61", - 00002836 => x"0064656e", - 00002837 => x"64616f4c", - 00002838 => x"63636120", - 00002839 => x"20737365", - 00002840 => x"6c756166", - 00002841 => x"00000074", - 00002842 => x"726f7453", - 00002843 => x"64612065", - 00002844 => x"73657264", - 00002845 => x"696d2073", - 00002846 => x"696c6173", - 00002847 => x"64656e67", - 00002848 => x"00000000", - 00002849 => x"726f7453", - 00002850 => x"63612065", - 00002851 => x"73736563", - 00002852 => x"75616620", - 00002853 => x"0000746c", - 00002854 => x"69766e45", - 00002855 => x"6d6e6f72", - 00002856 => x"20746e65", - 00002857 => x"6c6c6163", - 00002858 => x"00000000", - 00002859 => x"6863614d", - 00002860 => x"20656e69", - 00002861 => x"74666f73", - 00002862 => x"65726177", - 00002863 => x"746e6920", - 00002864 => x"75727265", - 00002865 => x"00007470", - 00002866 => x"6863614d", - 00002867 => x"20656e69", - 00002868 => x"656d6974", - 00002869 => x"6e692072", - 00002870 => x"72726574", - 00002871 => x"00747075", - 00002872 => x"6863614d", - 00002873 => x"20656e69", - 00002874 => x"65747865", - 00002875 => x"6c616e72", - 00002876 => x"746e6920", - 00002877 => x"75727265", - 00002878 => x"00007470", - 00002879 => x"74736146", - 00002880 => x"746e6920", - 00002881 => x"75727265", - 00002882 => x"30207470", - 00002883 => x"00000000", - 00002884 => x"74736146", - 00002885 => x"746e6920", - 00002886 => x"75727265", - 00002887 => x"31207470", - 00002888 => x"00000000", - 00002889 => x"74736146", - 00002890 => x"746e6920", - 00002891 => x"75727265", - 00002892 => x"32207470", - 00002893 => x"00000000", - 00002894 => x"74736146", - 00002895 => x"746e6920", - 00002896 => x"75727265", - 00002897 => x"33207470", - 00002898 => x"00000000", - 00002899 => x"6e6b6e55", - 00002900 => x"206e776f", - 00002901 => x"70617274", - 00002902 => x"75616320", - 00002903 => x"203a6573", - 00002904 => x"00000000", - 00002905 => x"00007830", - 00002906 => x"50204020", - 00002907 => x"00003d43", - 00002908 => x"544d202c", - 00002909 => x"3d4c4156", - 00002910 => x"00000000", - 00002911 => x"000012b4", - 00002912 => x"00001344", - 00002913 => x"00001358", - 00002914 => x"0000136c", - 00002915 => x"00001380", - 00002916 => x"00001394", - 00002917 => x"000013a8", - 00002918 => x"000013bc", - 00002919 => x"0000127c", - 00002920 => x"0000127c", - 00002921 => x"0000127c", - 00002922 => x"000013d0", - 00002923 => x"00001448", - 00002924 => x"0000127c", - 00002925 => x"0000127c", - 00002926 => x"0000127c", - 00002927 => x"00001434", - 00002928 => x"0000127c", - 00002929 => x"0000127c", - 00002930 => x"0000127c", - 00002931 => x"0000145c", - 00002932 => x"0000127c", - 00002933 => x"0000127c", - 00002934 => x"0000127c", - 00002935 => x"0000127c", - 00002936 => x"000013e4", - 00002937 => x"000013f8", - 00002938 => x"0000140c", - 00002939 => x"00001420", - 00002940 => x"4554523c", - 00002941 => x"4157203e", - 00002942 => x"4e494e52", - 00002943 => x"43202147", - 00002944 => x"43205550", - 00002945 => x"73205253", - 00002946 => x"65747379", - 00002947 => x"6f6e206d", - 00002948 => x"76612074", - 00002949 => x"616c6961", - 00002950 => x"21656c62", - 00002951 => x"522f3c20", - 00002952 => x"003e4554", - 00002953 => x"3c3c0a0a", - 00002954 => x"72614820", - 00002955 => x"72617764", - 00002956 => x"6f432065", - 00002957 => x"6769666e", - 00002958 => x"74617275", - 00002959 => x"206e6f69", - 00002960 => x"7265764f", - 00002961 => x"77656976", - 00002962 => x"0a3e3e20", - 00002963 => x"00000000", - 00002964 => x"202d2d0a", - 00002965 => x"746e6543", - 00002966 => x"206c6172", - 00002967 => x"636f7250", - 00002968 => x"69737365", - 00002969 => x"5520676e", - 00002970 => x"2074696e", - 00002971 => x"000a2d2d", - 00002972 => x"74726148", - 00002973 => x"3a444920", - 00002974 => x"20202020", - 00002975 => x"20202020", - 00002976 => x"30202020", - 00002977 => x"0a782578", - 00002978 => x"00000000", - 00002979 => x"646e6556", - 00002980 => x"4920726f", - 00002981 => x"20203a44", - 00002982 => x"20202020", - 00002983 => x"30202020", - 00002984 => x"0a782578", - 00002985 => x"00000000", - 00002986 => x"68637241", - 00002987 => x"63657469", - 00002988 => x"65727574", - 00002989 => x"3a444920", - 00002990 => x"30202020", - 00002991 => x"00782578", - 00002992 => x"454e2820", - 00002993 => x"3356524f", - 00002994 => x"00002932", - 00002995 => x"706d490a", - 00002996 => x"656d656c", - 00002997 => x"7461746e", - 00002998 => x"206e6f69", - 00002999 => x"203a4449", - 00003000 => x"78257830", - 00003001 => x"00002820", - 00003002 => x"68637241", - 00003003 => x"63657469", - 00003004 => x"65727574", - 00003005 => x"2020203a", - 00003006 => x"00202020", - 00003007 => x"6e6b6e75", - 00003008 => x"006e776f", - 00003009 => x"32335652", - 00003010 => x"00000000", - 00003011 => x"32315652", - 00003012 => x"00000038", - 00003013 => x"34365652", - 00003014 => x"00000000", - 00003015 => x"7478450a", - 00003016 => x"69736e65", - 00003017 => x"3a736e6f", - 00003018 => x"20202020", - 00003019 => x"20202020", - 00003020 => x"00000000", - 00003021 => x"7363695a", - 00003022 => x"00002072", - 00003023 => x"6566695a", - 00003024 => x"6965636e", - 00003025 => x"00000020", - 00003026 => x"20504d50", - 00003027 => x"00000000", - 00003028 => x"68500a0a", - 00003029 => x"63697379", - 00003030 => x"6d206c61", - 00003031 => x"726f6d65", - 00003032 => x"72702079", - 00003033 => x"6365746f", - 00003034 => x"6e6f6974", - 00003035 => x"0000203a", - 00003036 => x"4d202d0a", - 00003037 => x"67206e69", - 00003038 => x"756e6172", - 00003039 => x"6972616c", - 00003040 => x"203a7974", - 00003041 => x"00000000", - 00003042 => x"62207525", - 00003043 => x"73657479", - 00003044 => x"72657020", - 00003045 => x"67657220", - 00003046 => x"0a6e6f69", - 00003047 => x"00000000", - 00003048 => x"75255e32", - 00003049 => x"74796220", - 00003050 => x"70207365", - 00003051 => x"72207265", - 00003052 => x"6f696765", - 00003053 => x"00000a6e", - 00003054 => x"6f4d202d", - 00003055 => x"54206564", - 00003056 => x"203a524f", - 00003057 => x"00002020", - 00003058 => x"69617661", - 00003059 => x"6c62616c", - 00003060 => x"00000a65", - 00003061 => x"6f4d202d", - 00003062 => x"4e206564", - 00003063 => x"203a3441", - 00003064 => x"00002020", - 00003065 => x"6f4d202d", - 00003066 => x"4e206564", - 00003067 => x"544f5041", - 00003068 => x"0000203a", - 00003069 => x"2d2d0a0a", - 00003070 => x"6f725020", - 00003071 => x"73736563", - 00003072 => x"2d20726f", - 00003073 => x"00000a2d", - 00003074 => x"636f6c43", - 00003075 => x"20203a6b", - 00003076 => x"20752520", - 00003077 => x"000a7a48", - 00003078 => x"72657355", - 00003079 => x"3a444920", - 00003080 => x"25783020", - 00003081 => x"00000a78", - 00003082 => x"202d2d0a", - 00003083 => x"636f7250", - 00003084 => x"6f737365", - 00003085 => x"654d2072", - 00003086 => x"79726f6d", - 00003087 => x"6e6f4320", - 00003088 => x"75676966", - 00003089 => x"69746172", - 00003090 => x"2d206e6f", - 00003091 => x"00000a2d", - 00003092 => x"74736e49", - 00003093 => x"62202e72", - 00003094 => x"20657361", - 00003095 => x"72646461", - 00003096 => x"3a737365", - 00003097 => x"78302020", - 00003098 => x"000a7825", - 00003099 => x"65746e49", - 00003100 => x"6c616e72", - 00003101 => x"454d4920", - 00003102 => x"20203a4d", - 00003103 => x"20202020", - 00003104 => x"00002020", - 00003105 => x"65757254", - 00003106 => x"0000000a", - 00003107 => x"736c6146", - 00003108 => x"00000a65", - 00003109 => x"4d454d49", - 00003110 => x"7a697320", - 00003111 => x"20203a65", - 00003112 => x"20202020", - 00003113 => x"20202020", - 00003114 => x"75252020", - 00003115 => x"74796220", - 00003116 => x"000a7365", - 00003117 => x"65746e49", - 00003118 => x"6c616e72", - 00003119 => x"454d4920", - 00003120 => x"7361204d", - 00003121 => x"4d4f5220", - 00003122 => x"0000203a", - 00003123 => x"61746144", - 00003124 => x"73616220", - 00003125 => x"64612065", - 00003126 => x"73657264", - 00003127 => x"20203a73", - 00003128 => x"78302020", - 00003129 => x"000a7825", - 00003130 => x"65746e49", - 00003131 => x"6c616e72", - 00003132 => x"454d4420", - 00003133 => x"20203a4d", - 00003134 => x"20202020", - 00003135 => x"00002020", - 00003136 => x"4d454d44", - 00003137 => x"7a697320", - 00003138 => x"20203a65", - 00003139 => x"20202020", - 00003140 => x"20202020", - 00003141 => x"75252020", - 00003142 => x"74796220", - 00003143 => x"000a7365", - 00003144 => x"746f6f42", - 00003145 => x"64616f6c", - 00003146 => x"203a7265", - 00003147 => x"20202020", - 00003148 => x"20202020", - 00003149 => x"00002020", - 00003150 => x"65747845", - 00003151 => x"6c616e72", - 00003152 => x"69204d20", - 00003153 => x"7265746e", - 00003154 => x"65636166", - 00003155 => x"0000203a", - 00003156 => x"202d2d0a", - 00003157 => x"636f7250", - 00003158 => x"6f737365", - 00003159 => x"65502072", - 00003160 => x"68706972", - 00003161 => x"6c617265", - 00003162 => x"2d2d2073", - 00003163 => x"0000000a", - 00003164 => x"4f495047", - 00003165 => x"0020203a", - 00003166 => x"4d49544d", - 00003167 => x"00203a45", - 00003168 => x"54524155", - 00003169 => x"0020203a", - 00003170 => x"3a495053", - 00003171 => x"00202020", - 00003172 => x"3a495754", - 00003173 => x"00202020", - 00003174 => x"3a4d5750", - 00003175 => x"00202020", - 00003176 => x"3a544457", - 00003177 => x"00202020", - 00003178 => x"474e5254", - 00003179 => x"0020203a", - 00003180 => x"30554643", - 00003181 => x"0020203a", - 00003182 => x"31554643", - 00003183 => x"0020203a", - 00003184 => x"68540a0a", - 00003185 => x"454e2065", - 00003186 => x"3356524f", - 00003187 => x"72502032", - 00003188 => x"7365636f", - 00003189 => x"20726f73", - 00003190 => x"6a6f7250", - 00003191 => x"0a746365", - 00003192 => x"53207962", - 00003193 => x"68706574", - 00003194 => x"4e206e61", - 00003195 => x"69746c6f", - 00003196 => x"680a676e", - 00003197 => x"73707474", - 00003198 => x"672f2f3a", - 00003199 => x"75687469", - 00003200 => x"6f632e62", - 00003201 => x"74732f6d", - 00003202 => x"746c6f6e", - 00003203 => x"2f676e69", - 00003204 => x"726f656e", - 00003205 => x"0a323376", - 00003206 => x"6564616d", - 00003207 => x"206e6920", - 00003208 => x"6e6e6148", - 00003209 => x"7265766f", - 00003210 => x"6547202c", - 00003211 => x"6e616d72", - 00003212 => x"000a0a79", - 00003213 => x"53420a0a", - 00003214 => x"2d332044", - 00003215 => x"75616c43", - 00003216 => x"4c206573", - 00003217 => x"6e656369", - 00003218 => x"0a0a6573", - 00003219 => x"79706f43", - 00003220 => x"68676972", - 00003221 => x"63282074", - 00003222 => x"30322029", - 00003223 => x"202c3032", - 00003224 => x"70657453", - 00003225 => x"206e6168", - 00003226 => x"746c6f4e", - 00003227 => x"2e676e69", - 00003228 => x"6c6c4120", - 00003229 => x"67697220", - 00003230 => x"20737468", - 00003231 => x"65736572", - 00003232 => x"64657672", - 00003233 => x"520a0a2e", - 00003234 => x"73696465", - 00003235 => x"62697274", - 00003236 => x"6f697475", - 00003237 => x"6e61206e", - 00003238 => x"73752064", - 00003239 => x"6e692065", - 00003240 => x"756f7320", - 00003241 => x"20656372", - 00003242 => x"20646e61", - 00003243 => x"616e6962", - 00003244 => x"66207972", - 00003245 => x"736d726f", - 00003246 => x"6977202c", - 00003247 => x"6f206874", - 00003248 => x"69772072", - 00003249 => x"756f6874", - 00003250 => x"6f6d2074", - 00003251 => x"69666964", - 00003252 => x"69746163", - 00003253 => x"202c6e6f", - 00003254 => x"0a657261", - 00003255 => x"6d726570", - 00003256 => x"65747469", - 00003257 => x"72702064", - 00003258 => x"6469766f", - 00003259 => x"74206465", - 00003260 => x"20746168", - 00003261 => x"20656874", - 00003262 => x"6c6c6f66", - 00003263 => x"6e69776f", - 00003264 => x"6f632067", - 00003265 => x"7469646e", - 00003266 => x"736e6f69", - 00003267 => x"65726120", - 00003268 => x"74656d20", - 00003269 => x"310a0a3a", - 00003270 => x"6552202e", - 00003271 => x"74736964", - 00003272 => x"75626972", - 00003273 => x"6e6f6974", - 00003274 => x"666f2073", - 00003275 => x"756f7320", - 00003276 => x"20656372", - 00003277 => x"65646f63", - 00003278 => x"73756d20", - 00003279 => x"65722074", - 00003280 => x"6e696174", - 00003281 => x"65687420", - 00003282 => x"6f626120", - 00003283 => x"63206576", - 00003284 => x"7279706f", - 00003285 => x"74686769", - 00003286 => x"746f6e20", - 00003287 => x"2c656369", - 00003288 => x"69687420", - 00003289 => x"696c2073", - 00003290 => x"6f207473", - 00003291 => x"20200a66", - 00003292 => x"6e6f6320", - 00003293 => x"69746964", - 00003294 => x"20736e6f", - 00003295 => x"20646e61", - 00003296 => x"20656874", - 00003297 => x"6c6c6f66", - 00003298 => x"6e69776f", - 00003299 => x"69642067", - 00003300 => x"616c6373", - 00003301 => x"72656d69", - 00003302 => x"320a0a2e", - 00003303 => x"6552202e", - 00003304 => x"74736964", - 00003305 => x"75626972", - 00003306 => x"6e6f6974", - 00003307 => x"6e692073", - 00003308 => x"6e696220", - 00003309 => x"20797261", - 00003310 => x"6d726f66", - 00003311 => x"73756d20", - 00003312 => x"65722074", - 00003313 => x"646f7270", - 00003314 => x"20656375", - 00003315 => x"20656874", - 00003316 => x"766f6261", - 00003317 => x"6f632065", - 00003318 => x"69727970", - 00003319 => x"20746867", - 00003320 => x"69746f6e", - 00003321 => x"202c6563", - 00003322 => x"73696874", - 00003323 => x"73696c20", - 00003324 => x"666f2074", - 00003325 => x"2020200a", - 00003326 => x"646e6f63", - 00003327 => x"6f697469", - 00003328 => x"6120736e", - 00003329 => x"7420646e", - 00003330 => x"66206568", - 00003331 => x"6f6c6c6f", - 00003332 => x"676e6977", - 00003333 => x"73696420", - 00003334 => x"69616c63", - 00003335 => x"2072656d", - 00003336 => x"74206e69", - 00003337 => x"64206568", - 00003338 => x"6d75636f", - 00003339 => x"61746e65", - 00003340 => x"6e6f6974", - 00003341 => x"646e6120", - 00003342 => x"20726f2f", - 00003343 => x"6568746f", - 00003344 => x"616d2072", - 00003345 => x"69726574", - 00003346 => x"0a736c61", - 00003347 => x"70202020", - 00003348 => x"69766f72", - 00003349 => x"20646564", - 00003350 => x"68746977", - 00003351 => x"65687420", - 00003352 => x"73696420", - 00003353 => x"62697274", - 00003354 => x"6f697475", - 00003355 => x"0a0a2e6e", - 00003356 => x"4e202e33", - 00003357 => x"68746965", - 00003358 => x"74207265", - 00003359 => x"6e206568", - 00003360 => x"20656d61", - 00003361 => x"7420666f", - 00003362 => x"63206568", - 00003363 => x"7279706f", - 00003364 => x"74686769", - 00003365 => x"6c6f6820", - 00003366 => x"20726564", - 00003367 => x"20726f6e", - 00003368 => x"20656874", - 00003369 => x"656d616e", - 00003370 => x"666f2073", - 00003371 => x"73746920", - 00003372 => x"6e6f6320", - 00003373 => x"62697274", - 00003374 => x"726f7475", - 00003375 => x"616d2073", - 00003376 => x"65622079", - 00003377 => x"65737520", - 00003378 => x"6f742064", - 00003379 => x"2020200a", - 00003380 => x"6f646e65", - 00003381 => x"20657372", - 00003382 => x"7020726f", - 00003383 => x"6f6d6f72", - 00003384 => x"70206574", - 00003385 => x"75646f72", - 00003386 => x"20737463", - 00003387 => x"69726564", - 00003388 => x"20646576", - 00003389 => x"6d6f7266", - 00003390 => x"69687420", - 00003391 => x"6f732073", - 00003392 => x"61777466", - 00003393 => x"77206572", - 00003394 => x"6f687469", - 00003395 => x"73207475", - 00003396 => x"69636570", - 00003397 => x"20636966", - 00003398 => x"6f697270", - 00003399 => x"72772072", - 00003400 => x"65747469", - 00003401 => x"20200a6e", - 00003402 => x"72657020", - 00003403 => x"7373696d", - 00003404 => x"2e6e6f69", - 00003405 => x"48540a0a", - 00003406 => x"53205349", - 00003407 => x"5754464f", - 00003408 => x"20455241", - 00003409 => x"50205349", - 00003410 => x"49564f52", - 00003411 => x"20444544", - 00003412 => x"54205942", - 00003413 => x"43204548", - 00003414 => x"5259504f", - 00003415 => x"54484749", - 00003416 => x"4c4f4820", - 00003417 => x"53524544", - 00003418 => x"444e4120", - 00003419 => x"4e4f4320", - 00003420 => x"42495254", - 00003421 => x"524f5455", - 00003422 => x"41222053", - 00003423 => x"53492053", - 00003424 => x"4e412022", - 00003425 => x"4e412044", - 00003426 => x"58452059", - 00003427 => x"53455250", - 00003428 => x"524f0a53", - 00003429 => x"504d4920", - 00003430 => x"4445494c", - 00003431 => x"52415720", - 00003432 => x"544e4152", - 00003433 => x"2c534549", - 00003434 => x"434e4920", - 00003435 => x"4944554c", - 00003436 => x"202c474e", - 00003437 => x"20545542", - 00003438 => x"20544f4e", - 00003439 => x"494d494c", - 00003440 => x"20444554", - 00003441 => x"202c4f54", - 00003442 => x"20454854", - 00003443 => x"4c504d49", - 00003444 => x"20444549", - 00003445 => x"52524157", - 00003446 => x"49544e41", - 00003447 => x"4f205345", - 00003448 => x"454d0a46", - 00003449 => x"41484352", - 00003450 => x"4241544e", - 00003451 => x"54494c49", - 00003452 => x"4e412059", - 00003453 => x"49462044", - 00003454 => x"53454e54", - 00003455 => x"4f462053", - 00003456 => x"20412052", - 00003457 => x"54524150", - 00003458 => x"4c554349", - 00003459 => x"50205241", - 00003460 => x"4f505255", - 00003461 => x"41204553", - 00003462 => x"44204552", - 00003463 => x"4c435349", - 00003464 => x"454d4941", - 00003465 => x"49202e44", - 00003466 => x"4f4e204e", - 00003467 => x"45564520", - 00003468 => x"5320544e", - 00003469 => x"4c4c4148", - 00003470 => x"45485420", - 00003471 => x"504f430a", - 00003472 => x"47495259", - 00003473 => x"48205448", - 00003474 => x"45444c4f", - 00003475 => x"524f2052", - 00003476 => x"4e4f4320", - 00003477 => x"42495254", - 00003478 => x"524f5455", - 00003479 => x"45422053", - 00003480 => x"41494c20", - 00003481 => x"20454c42", - 00003482 => x"20524f46", - 00003483 => x"20594e41", - 00003484 => x"45524944", - 00003485 => x"202c5443", - 00003486 => x"49444e49", - 00003487 => x"54434552", - 00003488 => x"4e49202c", - 00003489 => x"45444943", - 00003490 => x"4c41544e", - 00003491 => x"5053202c", - 00003492 => x"41494345", - 00003493 => x"450a2c4c", - 00003494 => x"504d4558", - 00003495 => x"5952414c", - 00003496 => x"524f202c", - 00003497 => x"4e4f4320", - 00003498 => x"55514553", - 00003499 => x"49544e45", - 00003500 => x"44204c41", - 00003501 => x"47414d41", - 00003502 => x"28205345", - 00003503 => x"4c434e49", - 00003504 => x"4e494455", - 00003505 => x"42202c47", - 00003506 => x"4e205455", - 00003507 => x"4c20544f", - 00003508 => x"54494d49", - 00003509 => x"54204445", - 00003510 => x"50202c4f", - 00003511 => x"55434f52", - 00003512 => x"454d4552", - 00003513 => x"4f20544e", - 00003514 => x"55532046", - 00003515 => x"49545342", - 00003516 => x"45545554", - 00003517 => x"4f4f470a", - 00003518 => x"4f205344", - 00003519 => x"45532052", - 00003520 => x"43495652", - 00003521 => x"203b5345", - 00003522 => x"53534f4c", - 00003523 => x"20464f20", - 00003524 => x"2c455355", - 00003525 => x"54414420", - 00003526 => x"4f202c41", - 00003527 => x"52502052", - 00003528 => x"5449464f", - 00003529 => x"4f203b53", - 00003530 => x"55422052", - 00003531 => x"454e4953", - 00003532 => x"49205353", - 00003533 => x"5245544e", - 00003534 => x"54505552", - 00003535 => x"294e4f49", - 00003536 => x"574f4820", - 00003537 => x"52455645", - 00003538 => x"55414320", - 00003539 => x"0a444553", - 00003540 => x"20444e41", - 00003541 => x"41204e4f", - 00003542 => x"5420594e", - 00003543 => x"524f4548", - 00003544 => x"464f2059", - 00003545 => x"41494c20", - 00003546 => x"494c4942", - 00003547 => x"202c5954", - 00003548 => x"54454857", - 00003549 => x"20524548", - 00003550 => x"43204e49", - 00003551 => x"52544e4f", - 00003552 => x"2c544341", - 00003553 => x"52545320", - 00003554 => x"20544349", - 00003555 => x"4241494c", - 00003556 => x"54494c49", - 00003557 => x"4f202c59", - 00003558 => x"4f542052", - 00003559 => x"28205452", - 00003560 => x"4c434e49", - 00003561 => x"4e494455", - 00003562 => x"454e0a47", - 00003563 => x"47494c47", - 00003564 => x"45434e45", - 00003565 => x"20524f20", - 00003566 => x"4548544f", - 00003567 => x"53495752", - 00003568 => x"41202945", - 00003569 => x"49534952", - 00003570 => x"4920474e", - 00003571 => x"4e41204e", - 00003572 => x"41572059", - 00003573 => x"554f2059", - 00003574 => x"464f2054", - 00003575 => x"45485420", - 00003576 => x"45535520", - 00003577 => x"20464f20", - 00003578 => x"53494854", - 00003579 => x"464f5320", - 00003580 => x"52415754", - 00003581 => x"45202c45", - 00003582 => x"204e4556", - 00003583 => x"41204649", - 00003584 => x"53495644", - 00003585 => x"4f0a4445", - 00003586 => x"48542046", - 00003587 => x"4f502045", - 00003588 => x"42495353", - 00003589 => x"54494c49", - 00003590 => x"464f2059", - 00003591 => x"43555320", - 00003592 => x"41442048", - 00003593 => x"4547414d", - 00003594 => x"540a0a2e", - 00003595 => x"4e206568", - 00003596 => x"56524f45", - 00003597 => x"50203233", - 00003598 => x"65636f72", - 00003599 => x"726f7373", - 00003600 => x"68202d20", - 00003601 => x"73707474", - 00003602 => x"672f2f3a", - 00003603 => x"75687469", - 00003604 => x"6f632e62", - 00003605 => x"74732f6d", - 00003606 => x"746c6f6e", - 00003607 => x"2f676e69", - 00003608 => x"726f656e", - 00003609 => x"20323376", - 00003610 => x"20296328", - 00003611 => x"70657453", - 00003612 => x"206e6168", - 00003613 => x"746c6f4e", - 00003614 => x"0a676e69", - 00003615 => x"00000a0a", - 00003616 => x"33323130", - 00003617 => x"37363534", - 00003618 => x"42413938", - 00003619 => x"46454443", - 00003620 => x"00001e38", - 00003621 => x"00001d14", - 00003622 => x"00001d14", - 00003623 => x"00001d14", - 00003624 => x"00001d14", - 00003625 => x"00001d14", - 00003626 => x"00001df4", - 00003627 => x"00001d14", - 00003628 => x"00001d14", - 00003629 => x"00001d14", - 00003630 => x"00001d14", - 00003631 => x"00001d14", - 00003632 => x"00001d14", - 00003633 => x"00001d14", - 00003634 => x"00001d14", - 00003635 => x"00001d14", - 00003636 => x"00001dc8", - 00003637 => x"00001d14", - 00003638 => x"00001d94", - 00003639 => x"00001d14", - 00003640 => x"00001d14", - 00003641 => x"00001d44", - 00003642 => x"33323130", - 00003643 => x"37363534", - 00003644 => x"00003938", - 00003645 => x"33323130", - 00003646 => x"37363534", - 00003647 => x"62613938", - 00003648 => x"66656463", - 00003649 => x"00000000", - 00003650 => x"00006073", - 00003651 => x"00008067", - 00003652 => x"3407d073", - 00003653 => x"00008067", - 00003654 => x"00000001", - 00003655 => x"00008067", + 00000027 => x"00002537", + 00000028 => x"80050513", + 00000029 => x"30051073", + 00000030 => x"30401073", + 00000031 => x"80002117", + 00000032 => x"f8010113", + 00000033 => x"ffc17113", + 00000034 => x"00010413", + 00000035 => x"80000197", + 00000036 => x"77418193", + 00000037 => x"00000597", + 00000038 => x"09458593", + 00000039 => x"30559073", + 00000040 => x"f8000593", + 00000041 => x"0005a023", + 00000042 => x"00458593", + 00000043 => x"feb01ce3", + 00000044 => x"80000597", + 00000045 => x"f5058593", + 00000046 => x"84018613", + 00000047 => x"00c5d863", + 00000048 => x"00058023", + 00000049 => x"00158593", + 00000050 => x"ff5ff06f", + 00000051 => x"00001597", + 00000052 => x"b7058593", + 00000053 => x"80000617", + 00000054 => x"f2c60613", + 00000055 => x"80000697", + 00000056 => x"f2468693", + 00000057 => x"00d65c63", + 00000058 => x"00058703", + 00000059 => x"00e60023", + 00000060 => x"00158593", + 00000061 => x"00160613", + 00000062 => x"fedff06f", + 00000063 => x"00000513", + 00000064 => x"00000593", + 00000065 => x"b0001073", + 00000066 => x"b8001073", + 00000067 => x"b0201073", + 00000068 => x"b8201073", + 00000069 => x"060000ef", + 00000070 => x"30047073", + 00000071 => x"00000013", + 00000072 => x"10500073", + 00000073 => x"0000006f", + 00000074 => x"ff810113", + 00000075 => x"00812023", + 00000076 => x"00912223", + 00000077 => x"34202473", + 00000078 => x"02044663", + 00000079 => x"34102473", + 00000080 => x"00041483", + 00000081 => x"0034f493", + 00000082 => x"00240413", + 00000083 => x"34141073", + 00000084 => x"00300413", + 00000085 => x"00941863", + 00000086 => x"34102473", + 00000087 => x"00240413", + 00000088 => x"34141073", + 00000089 => x"00012483", + 00000090 => x"00412403", + 00000091 => x"00810113", + 00000092 => x"30200073", + 00000093 => x"00005537", + 00000094 => x"ff010113", + 00000095 => x"00000613", + 00000096 => x"00000593", + 00000097 => x"b0050513", + 00000098 => x"00112623", + 00000099 => x"490000ef", + 00000100 => x"61c000ef", + 00000101 => x"00050c63", + 00000102 => x"428000ef", + 00000103 => x"00001537", + 00000104 => x"95050513", + 00000105 => x"514000ef", + 00000106 => x"020000ef", + 00000107 => x"00001537", + 00000108 => x"92c50513", + 00000109 => x"504000ef", + 00000110 => x"00c12083", + 00000111 => x"00000513", + 00000112 => x"01010113", + 00000113 => x"00008067", + 00000114 => x"ff010113", + 00000115 => x"00000513", + 00000116 => x"00812423", + 00000117 => x"00112623", + 00000118 => x"00000413", + 00000119 => x"5e0000ef", + 00000120 => x"0ff47513", + 00000121 => x"5d8000ef", + 00000122 => x"0c800513", + 00000123 => x"550000ef", + 00000124 => x"00140413", + 00000125 => x"fedff06f", + 00000126 => x"00000000", + 00000127 => x"00000000", + 00000128 => x"fc010113", + 00000129 => x"02112e23", + 00000130 => x"02512c23", + 00000131 => x"02612a23", + 00000132 => x"02712823", + 00000133 => x"02a12623", + 00000134 => x"02b12423", + 00000135 => x"02c12223", + 00000136 => x"02d12023", + 00000137 => x"00e12e23", + 00000138 => x"00f12c23", + 00000139 => x"01012a23", + 00000140 => x"01112823", + 00000141 => x"01c12623", + 00000142 => x"01d12423", + 00000143 => x"01e12223", + 00000144 => x"01f12023", + 00000145 => x"34102773", + 00000146 => x"34071073", + 00000147 => x"342027f3", + 00000148 => x"0807c863", + 00000149 => x"00071683", + 00000150 => x"00300593", + 00000151 => x"0036f693", + 00000152 => x"00270613", + 00000153 => x"00b69463", + 00000154 => x"00470613", + 00000155 => x"34161073", + 00000156 => x"00b00713", + 00000157 => x"04f77a63", + 00000158 => x"41000793", + 00000159 => x"000780e7", + 00000160 => x"03c12083", + 00000161 => x"03812283", + 00000162 => x"03412303", + 00000163 => x"03012383", + 00000164 => x"02c12503", + 00000165 => x"02812583", + 00000166 => x"02412603", + 00000167 => x"02012683", + 00000168 => x"01c12703", + 00000169 => x"01812783", + 00000170 => x"01412803", + 00000171 => x"01012883", + 00000172 => x"00c12e03", + 00000173 => x"00812e83", + 00000174 => x"00412f03", + 00000175 => x"00012f83", + 00000176 => x"04010113", + 00000177 => x"30200073", + 00000178 => x"00001737", + 00000179 => x"00279793", + 00000180 => x"96c70713", + 00000181 => x"00e787b3", + 00000182 => x"0007a783", + 00000183 => x"00078067", + 00000184 => x"80000737", + 00000185 => x"ffd74713", + 00000186 => x"00e787b3", + 00000187 => x"01000713", + 00000188 => x"f8f764e3", + 00000189 => x"00001737", + 00000190 => x"00279793", + 00000191 => x"99c70713", + 00000192 => x"00e787b3", + 00000193 => x"0007a783", + 00000194 => x"00078067", + 00000195 => x"800007b7", + 00000196 => x"0007a783", + 00000197 => x"f69ff06f", + 00000198 => x"800007b7", + 00000199 => x"0047a783", + 00000200 => x"f5dff06f", + 00000201 => x"800007b7", + 00000202 => x"0087a783", + 00000203 => x"f51ff06f", + 00000204 => x"800007b7", + 00000205 => x"00c7a783", + 00000206 => x"f45ff06f", + 00000207 => x"8101a783", + 00000208 => x"f3dff06f", + 00000209 => x"8141a783", + 00000210 => x"f35ff06f", + 00000211 => x"8181a783", + 00000212 => x"f2dff06f", + 00000213 => x"81c1a783", + 00000214 => x"f25ff06f", + 00000215 => x"8201a783", + 00000216 => x"f1dff06f", + 00000217 => x"8241a783", + 00000218 => x"f15ff06f", + 00000219 => x"8281a783", + 00000220 => x"f0dff06f", + 00000221 => x"82c1a783", + 00000222 => x"f05ff06f", + 00000223 => x"8301a783", + 00000224 => x"efdff06f", + 00000225 => x"8341a783", + 00000226 => x"ef5ff06f", + 00000227 => x"8381a783", + 00000228 => x"eedff06f", + 00000229 => x"83c1a783", + 00000230 => x"ee5ff06f", + 00000231 => x"00000000", + 00000232 => x"fe010113", + 00000233 => x"01212823", + 00000234 => x"00050913", + 00000235 => x"00001537", + 00000236 => x"00912a23", + 00000237 => x"9e050513", + 00000238 => x"000014b7", + 00000239 => x"00812c23", + 00000240 => x"01312623", + 00000241 => x"00112e23", + 00000242 => x"01c00413", + 00000243 => x"2ec000ef", + 00000244 => x"c2c48493", + 00000245 => x"ffc00993", + 00000246 => x"008957b3", + 00000247 => x"00f7f793", + 00000248 => x"00f487b3", + 00000249 => x"0007c503", + 00000250 => x"ffc40413", + 00000251 => x"2bc000ef", + 00000252 => x"ff3414e3", + 00000253 => x"01c12083", + 00000254 => x"01812403", + 00000255 => x"01412483", + 00000256 => x"01012903", + 00000257 => x"00c12983", + 00000258 => x"02010113", + 00000259 => x"00008067", + 00000260 => x"00001537", + 00000261 => x"ff010113", + 00000262 => x"9e450513", + 00000263 => x"00112623", + 00000264 => x"00812423", + 00000265 => x"294000ef", + 00000266 => x"34202473", + 00000267 => x"00b00793", + 00000268 => x"0487f463", + 00000269 => x"800007b7", + 00000270 => x"ffd7c793", + 00000271 => x"00f407b3", + 00000272 => x"01000713", + 00000273 => x"00f77e63", + 00000274 => x"00001537", + 00000275 => x"b5850513", + 00000276 => x"268000ef", + 00000277 => x"00040513", + 00000278 => x"f49ff0ef", + 00000279 => x"0400006f", + 00000280 => x"00001737", + 00000281 => x"00279793", + 00000282 => x"b8470713", + 00000283 => x"00e787b3", + 00000284 => x"0007a783", + 00000285 => x"00078067", + 00000286 => x"00001737", + 00000287 => x"00241793", + 00000288 => x"bc870713", + 00000289 => x"00e787b3", + 00000290 => x"0007a783", + 00000291 => x"00078067", + 00000292 => x"00001537", + 00000293 => x"9ec50513", + 00000294 => x"220000ef", + 00000295 => x"00001537", + 00000296 => x"b7050513", + 00000297 => x"214000ef", + 00000298 => x"34002573", + 00000299 => x"ef5ff0ef", + 00000300 => x"00001537", + 00000301 => x"b7850513", + 00000302 => x"200000ef", + 00000303 => x"34302573", + 00000304 => x"ee1ff0ef", + 00000305 => x"00812403", + 00000306 => x"00c12083", + 00000307 => x"00001537", + 00000308 => x"c2450513", + 00000309 => x"01010113", + 00000310 => x"1e00006f", + 00000311 => x"00001537", + 00000312 => x"a0c50513", + 00000313 => x"fb5ff06f", + 00000314 => x"00001537", + 00000315 => x"a2850513", + 00000316 => x"fa9ff06f", + 00000317 => x"00001537", + 00000318 => x"a3c50513", + 00000319 => x"f9dff06f", + 00000320 => x"00001537", + 00000321 => x"a4850513", + 00000322 => x"f91ff06f", + 00000323 => x"00001537", + 00000324 => x"a6050513", + 00000325 => x"f85ff06f", + 00000326 => x"00001537", + 00000327 => x"a7450513", + 00000328 => x"f79ff06f", + 00000329 => x"00001537", + 00000330 => x"a9050513", + 00000331 => x"f6dff06f", + 00000332 => x"00001537", + 00000333 => x"aa450513", + 00000334 => x"f61ff06f", + 00000335 => x"00001537", + 00000336 => x"ab850513", + 00000337 => x"f55ff06f", + 00000338 => x"00001537", + 00000339 => x"ad450513", + 00000340 => x"f49ff06f", + 00000341 => x"00001537", + 00000342 => x"aec50513", + 00000343 => x"f3dff06f", + 00000344 => x"00001537", + 00000345 => x"b0850513", + 00000346 => x"f31ff06f", + 00000347 => x"00001537", + 00000348 => x"b1c50513", + 00000349 => x"f25ff06f", + 00000350 => x"00001537", + 00000351 => x"b3050513", + 00000352 => x"f19ff06f", + 00000353 => x"00001537", + 00000354 => x"b4450513", + 00000355 => x"f0dff06f", + 00000356 => x"00f00793", + 00000357 => x"02a7e263", + 00000358 => x"800007b7", + 00000359 => x"00078793", + 00000360 => x"00251513", + 00000361 => x"00a78533", + 00000362 => x"41000793", + 00000363 => x"00f52023", + 00000364 => x"00000513", + 00000365 => x"00008067", + 00000366 => x"00100513", + 00000367 => x"00008067", + 00000368 => x"ff010113", + 00000369 => x"00112623", + 00000370 => x"00812423", + 00000371 => x"00912223", + 00000372 => x"301027f3", + 00000373 => x"00079863", + 00000374 => x"00001537", + 00000375 => x"bf850513", + 00000376 => x"0d8000ef", + 00000377 => x"20000793", + 00000378 => x"30579073", + 00000379 => x"00000413", + 00000380 => x"01000493", + 00000381 => x"00040513", + 00000382 => x"00140413", + 00000383 => x"0ff47413", + 00000384 => x"f91ff0ef", + 00000385 => x"fe9418e3", + 00000386 => x"00c12083", + 00000387 => x"00812403", + 00000388 => x"00412483", + 00000389 => x"01010113", + 00000390 => x"00008067", + 00000391 => x"fa002023", + 00000392 => x"fe002683", + 00000393 => x"00151513", + 00000394 => x"00000713", + 00000395 => x"04a6f263", + 00000396 => x"000016b7", + 00000397 => x"00000793", + 00000398 => x"ffe68693", + 00000399 => x"04e6e463", + 00000400 => x"00167613", + 00000401 => x"0015f593", + 00000402 => x"01879793", + 00000403 => x"01e61613", + 00000404 => x"00c7e7b3", + 00000405 => x"01d59593", + 00000406 => x"00b7e7b3", + 00000407 => x"00e7e7b3", + 00000408 => x"10000737", + 00000409 => x"00e7e7b3", + 00000410 => x"faf02023", + 00000411 => x"00008067", + 00000412 => x"00170793", + 00000413 => x"01079713", + 00000414 => x"40a686b3", + 00000415 => x"01075713", + 00000416 => x"fadff06f", + 00000417 => x"ffe78513", + 00000418 => x"0fd57513", + 00000419 => x"00051a63", + 00000420 => x"00375713", + 00000421 => x"00178793", + 00000422 => x"0ff7f793", + 00000423 => x"fa1ff06f", + 00000424 => x"00175713", + 00000425 => x"ff1ff06f", + 00000426 => x"fa002783", + 00000427 => x"fe07cee3", + 00000428 => x"faa02223", + 00000429 => x"00008067", + 00000430 => x"ff010113", + 00000431 => x"00812423", + 00000432 => x"01212023", + 00000433 => x"00112623", + 00000434 => x"00912223", + 00000435 => x"00050413", + 00000436 => x"00a00913", + 00000437 => x"00044483", + 00000438 => x"00140413", + 00000439 => x"00049e63", + 00000440 => x"00c12083", + 00000441 => x"00812403", + 00000442 => x"00412483", + 00000443 => x"00012903", + 00000444 => x"01010113", + 00000445 => x"00008067", + 00000446 => x"01249663", + 00000447 => x"00d00513", + 00000448 => x"fa9ff0ef", + 00000449 => x"00048513", + 00000450 => x"fa1ff0ef", + 00000451 => x"fc9ff06f", + 00000452 => x"ff010113", + 00000453 => x"c80026f3", + 00000454 => x"c0002773", + 00000455 => x"c80027f3", + 00000456 => x"fed79ae3", + 00000457 => x"00e12023", + 00000458 => x"00f12223", + 00000459 => x"00012503", + 00000460 => x"00412583", + 00000461 => x"01010113", + 00000462 => x"00008067", + 00000463 => x"fe010113", + 00000464 => x"00112e23", + 00000465 => x"00812c23", + 00000466 => x"00912a23", + 00000467 => x"00a12623", + 00000468 => x"fc1ff0ef", + 00000469 => x"00050493", + 00000470 => x"fe002503", + 00000471 => x"00058413", + 00000472 => x"3e800593", + 00000473 => x"0f8000ef", + 00000474 => x"00c12603", + 00000475 => x"00000693", + 00000476 => x"00000593", + 00000477 => x"050000ef", + 00000478 => x"009504b3", + 00000479 => x"00a4b533", + 00000480 => x"00858433", + 00000481 => x"00850433", + 00000482 => x"f89ff0ef", + 00000483 => x"fe85eee3", + 00000484 => x"00b41463", + 00000485 => x"fe956ae3", + 00000486 => x"01c12083", + 00000487 => x"01812403", + 00000488 => x"01412483", + 00000489 => x"02010113", + 00000490 => x"00008067", + 00000491 => x"fe802503", + 00000492 => x"01055513", + 00000493 => x"00157513", + 00000494 => x"00008067", + 00000495 => x"f8a02223", + 00000496 => x"00008067", + 00000497 => x"00050313", + 00000498 => x"ff010113", + 00000499 => x"00060513", + 00000500 => x"00068893", + 00000501 => x"00112623", + 00000502 => x"00030613", + 00000503 => x"00050693", + 00000504 => x"00000713", + 00000505 => x"00000793", + 00000506 => x"00000813", + 00000507 => x"0016fe13", + 00000508 => x"00171e93", + 00000509 => x"000e0c63", + 00000510 => x"01060e33", + 00000511 => x"010e3833", + 00000512 => x"00e787b3", + 00000513 => x"00f807b3", + 00000514 => x"000e0813", + 00000515 => x"01f65713", + 00000516 => x"0016d693", + 00000517 => x"00eee733", + 00000518 => x"00161613", + 00000519 => x"fc0698e3", + 00000520 => x"00058663", + 00000521 => x"0e4000ef", + 00000522 => x"00a787b3", + 00000523 => x"00088a63", + 00000524 => x"00030513", + 00000525 => x"00088593", + 00000526 => x"0d0000ef", + 00000527 => x"00f507b3", + 00000528 => x"00c12083", + 00000529 => x"00080513", + 00000530 => x"00078593", + 00000531 => x"01010113", + 00000532 => x"00008067", + 00000533 => x"06054063", + 00000534 => x"0605c663", + 00000535 => x"00058613", + 00000536 => x"00050593", + 00000537 => x"fff00513", + 00000538 => x"02060c63", + 00000539 => x"00100693", + 00000540 => x"00b67a63", + 00000541 => x"00c05863", + 00000542 => x"00161613", + 00000543 => x"00169693", + 00000544 => x"feb66ae3", + 00000545 => x"00000513", + 00000546 => x"00c5e663", + 00000547 => x"40c585b3", + 00000548 => x"00d56533", + 00000549 => x"0016d693", + 00000550 => x"00165613", + 00000551 => x"fe0696e3", + 00000552 => x"00008067", + 00000553 => x"00008293", + 00000554 => x"fb5ff0ef", + 00000555 => x"00058513", + 00000556 => x"00028067", + 00000557 => x"40a00533", + 00000558 => x"00b04863", + 00000559 => x"40b005b3", + 00000560 => x"f9dff06f", + 00000561 => x"40b005b3", + 00000562 => x"00008293", + 00000563 => x"f91ff0ef", + 00000564 => x"40a00533", + 00000565 => x"00028067", + 00000566 => x"00008293", + 00000567 => x"0005ca63", + 00000568 => x"00054c63", + 00000569 => x"f79ff0ef", + 00000570 => x"00058513", + 00000571 => x"00028067", + 00000572 => x"40b005b3", + 00000573 => x"fe0558e3", + 00000574 => x"40a00533", + 00000575 => x"f61ff0ef", + 00000576 => x"40b00533", + 00000577 => x"00028067", + 00000578 => x"00050613", + 00000579 => x"00000513", + 00000580 => x"0015f693", + 00000581 => x"00068463", + 00000582 => x"00c50533", + 00000583 => x"0015d593", + 00000584 => x"00161613", + 00000585 => x"fe0596e3", + 00000586 => x"00008067", + 00000587 => x"6f727245", + 00000588 => x"4e202172", + 00000589 => x"5047206f", + 00000590 => x"75204f49", + 00000591 => x"2074696e", + 00000592 => x"746e7973", + 00000593 => x"69736568", + 00000594 => x"2164657a", + 00000595 => x"0000000a", + 00000596 => x"6e696c42", + 00000597 => x"676e696b", + 00000598 => x"44454c20", + 00000599 => x"6d656420", + 00000600 => x"7270206f", + 00000601 => x"6172676f", + 00000602 => x"00000a6d", + 00000603 => x"0000030c", + 00000604 => x"00000318", + 00000605 => x"00000324", + 00000606 => x"00000330", + 00000607 => x"0000033c", + 00000608 => x"00000344", + 00000609 => x"0000034c", + 00000610 => x"00000354", + 00000611 => x"00000278", + 00000612 => x"00000278", + 00000613 => x"00000278", + 00000614 => x"0000035c", + 00000615 => x"00000364", + 00000616 => x"00000278", + 00000617 => x"00000278", + 00000618 => x"00000278", + 00000619 => x"0000036c", + 00000620 => x"00000278", + 00000621 => x"00000278", + 00000622 => x"00000278", + 00000623 => x"00000374", + 00000624 => x"00000278", + 00000625 => x"00000278", + 00000626 => x"00000278", + 00000627 => x"00000278", + 00000628 => x"0000037c", + 00000629 => x"00000384", + 00000630 => x"0000038c", + 00000631 => x"00000394", + 00000632 => x"00007830", + 00000633 => x"4554523c", + 00000634 => x"0000203e", + 00000635 => x"74736e49", + 00000636 => x"74637572", + 00000637 => x"206e6f69", + 00000638 => x"72646461", + 00000639 => x"20737365", + 00000640 => x"6173696d", + 00000641 => x"6e67696c", + 00000642 => x"00006465", + 00000643 => x"74736e49", + 00000644 => x"74637572", + 00000645 => x"206e6f69", + 00000646 => x"65636361", + 00000647 => x"66207373", + 00000648 => x"746c7561", + 00000649 => x"00000000", + 00000650 => x"656c6c49", + 00000651 => x"206c6167", + 00000652 => x"74736e69", + 00000653 => x"74637572", + 00000654 => x"006e6f69", + 00000655 => x"61657242", + 00000656 => x"696f706b", + 00000657 => x"0000746e", + 00000658 => x"64616f4c", + 00000659 => x"64646120", + 00000660 => x"73736572", + 00000661 => x"73696d20", + 00000662 => x"67696c61", + 00000663 => x"0064656e", + 00000664 => x"64616f4c", + 00000665 => x"63636120", + 00000666 => x"20737365", + 00000667 => x"6c756166", + 00000668 => x"00000074", + 00000669 => x"726f7453", + 00000670 => x"64612065", + 00000671 => x"73657264", + 00000672 => x"696d2073", + 00000673 => x"696c6173", + 00000674 => x"64656e67", + 00000675 => x"00000000", + 00000676 => x"726f7453", + 00000677 => x"63612065", + 00000678 => x"73736563", + 00000679 => x"75616620", + 00000680 => x"0000746c", + 00000681 => x"69766e45", + 00000682 => x"6d6e6f72", + 00000683 => x"20746e65", + 00000684 => x"6c6c6163", + 00000685 => x"00000000", + 00000686 => x"6863614d", + 00000687 => x"20656e69", + 00000688 => x"74666f73", + 00000689 => x"65726177", + 00000690 => x"746e6920", + 00000691 => x"75727265", + 00000692 => x"00007470", + 00000693 => x"6863614d", + 00000694 => x"20656e69", + 00000695 => x"656d6974", + 00000696 => x"6e692072", + 00000697 => x"72726574", + 00000698 => x"00747075", + 00000699 => x"6863614d", + 00000700 => x"20656e69", + 00000701 => x"65747865", + 00000702 => x"6c616e72", + 00000703 => x"746e6920", + 00000704 => x"75727265", + 00000705 => x"00007470", + 00000706 => x"74736146", + 00000707 => x"746e6920", + 00000708 => x"75727265", + 00000709 => x"30207470", + 00000710 => x"00000000", + 00000711 => x"74736146", + 00000712 => x"746e6920", + 00000713 => x"75727265", + 00000714 => x"31207470", + 00000715 => x"00000000", + 00000716 => x"74736146", + 00000717 => x"746e6920", + 00000718 => x"75727265", + 00000719 => x"32207470", + 00000720 => x"00000000", + 00000721 => x"74736146", + 00000722 => x"746e6920", + 00000723 => x"75727265", + 00000724 => x"33207470", + 00000725 => x"00000000", + 00000726 => x"6e6b6e55", + 00000727 => x"206e776f", + 00000728 => x"70617274", + 00000729 => x"75616320", + 00000730 => x"203a6573", + 00000731 => x"00000000", + 00000732 => x"50204020", + 00000733 => x"00003d43", + 00000734 => x"544d202c", + 00000735 => x"3d4c4156", + 00000736 => x"00000000", + 00000737 => x"0000053c", + 00000738 => x"00000448", + 00000739 => x"00000448", + 00000740 => x"00000448", + 00000741 => x"00000548", + 00000742 => x"00000448", + 00000743 => x"00000448", + 00000744 => x"00000448", + 00000745 => x"00000554", + 00000746 => x"00000448", + 00000747 => x"00000448", + 00000748 => x"00000448", + 00000749 => x"00000448", + 00000750 => x"00000560", + 00000751 => x"0000056c", + 00000752 => x"00000578", + 00000753 => x"00000584", + 00000754 => x"00000490", + 00000755 => x"000004dc", + 00000756 => x"000004e8", + 00000757 => x"000004f4", + 00000758 => x"00000500", + 00000759 => x"0000050c", + 00000760 => x"00000518", + 00000761 => x"00000524", + 00000762 => x"00000448", + 00000763 => x"00000448", + 00000764 => x"00000448", + 00000765 => x"00000530", + 00000766 => x"4554523c", + 00000767 => x"4157203e", + 00000768 => x"4e494e52", + 00000769 => x"43202147", + 00000770 => x"43205550", + 00000771 => x"73205253", + 00000772 => x"65747379", + 00000773 => x"6f6e206d", + 00000774 => x"76612074", + 00000775 => x"616c6961", + 00000776 => x"21656c62", + 00000777 => x"522f3c20", + 00000778 => x"003e4554", + 00000779 => x"33323130", + 00000780 => x"37363534", + 00000781 => x"42413938", + 00000782 => x"46454443", others => x"00000000" );
/rtl/core/neorv32_bootloader_image.vhd
6,7 → 6,7
 
package neorv32_bootloader_image is
 
type bootloader_init_image_t is array (0 to 973) of std_ulogic_vector(31 downto 0);
type bootloader_init_image_t is array (0 to 974) of std_ulogic_vector(31 downto 0);
constant bootloader_init_image : bootloader_init_image_t := (
00000000 => x"00000093",
00000001 => x"00000113",
30,7 → 30,7
00000019 => x"80010197",
00000020 => x"7b418193",
00000021 => x"00000597",
00000022 => x"08058593",
00000022 => x"09458593",
00000023 => x"30559073",
00000024 => x"f8000593",
00000025 => x"0005a023",
44,7 → 44,7
00000033 => x"00158593",
00000034 => x"ff5ff06f",
00000035 => x"00001597",
00000036 => x"ea858593",
00000036 => x"eac58593",
00000037 => x"80010617",
00000038 => x"f6c60613",
00000039 => x"80010697",
57,930 → 57,931
00000046 => x"fedff06f",
00000047 => x"00000513",
00000048 => x"00000593",
00000049 => x"05c000ef",
00000050 => x"30047073",
00000051 => x"10500073",
00000052 => x"0000006f",
00000053 => x"ff810113",
00000054 => x"00812023",
00000055 => x"00912223",
00000056 => x"34202473",
00000057 => x"02044663",
00000058 => x"34102473",
00000059 => x"00041483",
00000060 => x"0034f493",
00000061 => x"00240413",
00000062 => x"34141073",
00000063 => x"00300413",
00000064 => x"00941863",
00000065 => x"34102473",
00000049 => x"b0001073",
00000050 => x"b8001073",
00000051 => x"b0201073",
00000052 => x"b8201073",
00000053 => x"060000ef",
00000054 => x"30047073",
00000055 => x"00000013",
00000056 => x"10500073",
00000057 => x"0000006f",
00000058 => x"ff810113",
00000059 => x"00812023",
00000060 => x"00912223",
00000061 => x"34202473",
00000062 => x"02044663",
00000063 => x"34102473",
00000064 => x"00041483",
00000065 => x"0034f493",
00000066 => x"00240413",
00000067 => x"34141073",
00000068 => x"00012483",
00000069 => x"00412403",
00000070 => x"00810113",
00000071 => x"30200073",
00000072 => x"fd010113",
00000073 => x"02812423",
00000074 => x"fe002403",
00000075 => x"026267b7",
00000076 => x"02112623",
00000077 => x"02912223",
00000078 => x"03212023",
00000079 => x"01312e23",
00000080 => x"01412c23",
00000081 => x"01512a23",
00000082 => x"01612823",
00000083 => x"01712623",
00000084 => x"01812423",
00000085 => x"9ff78793",
00000086 => x"00000693",
00000087 => x"00000613",
00000088 => x"00000593",
00000089 => x"00200513",
00000090 => x"0087f463",
00000091 => x"00400513",
00000092 => x"301000ef",
00000093 => x"00005537",
00000094 => x"00000613",
00000095 => x"00000593",
00000096 => x"b0050513",
00000097 => x"1dd000ef",
00000098 => x"195000ef",
00000099 => x"00245793",
00000100 => x"00a78533",
00000101 => x"00f537b3",
00000102 => x"00b785b3",
00000103 => x"1ad000ef",
00000104 => x"ffff07b7",
00000105 => x"49478793",
00000106 => x"30579073",
00000107 => x"08000793",
00000108 => x"30479073",
00000109 => x"30046073",
00000110 => x"00100513",
00000111 => x"369000ef",
00000112 => x"ffff1537",
00000113 => x"800007b7",
00000114 => x"e5050513",
00000115 => x"0007a023",
00000116 => x"249000ef",
00000117 => x"f1302573",
00000118 => x"24c000ef",
00000068 => x"00300413",
00000069 => x"00941863",
00000070 => x"34102473",
00000071 => x"00240413",
00000072 => x"34141073",
00000073 => x"00012483",
00000074 => x"00412403",
00000075 => x"00810113",
00000076 => x"30200073",
00000077 => x"800007b7",
00000078 => x"fd010113",
00000079 => x"0007a023",
00000080 => x"ffff07b7",
00000081 => x"02112623",
00000082 => x"02812423",
00000083 => x"02912223",
00000084 => x"03212023",
00000085 => x"01312e23",
00000086 => x"01412c23",
00000087 => x"01512a23",
00000088 => x"01612823",
00000089 => x"01712623",
00000090 => x"01812423",
00000091 => x"49878793",
00000092 => x"30579073",
00000093 => x"fe002403",
00000094 => x"026267b7",
00000095 => x"9ff78793",
00000096 => x"00000693",
00000097 => x"00000613",
00000098 => x"00000593",
00000099 => x"00200513",
00000100 => x"0087f463",
00000101 => x"00400513",
00000102 => x"2dd000ef",
00000103 => x"00100513",
00000104 => x"389000ef",
00000105 => x"00005537",
00000106 => x"00000613",
00000107 => x"00000593",
00000108 => x"b0050513",
00000109 => x"1b1000ef",
00000110 => x"169000ef",
00000111 => x"00245793",
00000112 => x"00a78533",
00000113 => x"00f537b3",
00000114 => x"00b785b3",
00000115 => x"181000ef",
00000116 => x"08000793",
00000117 => x"30479073",
00000118 => x"30046073",
00000119 => x"ffff1537",
00000120 => x"e8850513",
00000121 => x"235000ef",
00000122 => x"fe002503",
00000123 => x"238000ef",
00000120 => x"e5450513",
00000121 => x"239000ef",
00000122 => x"f1302573",
00000123 => x"23c000ef",
00000124 => x"ffff1537",
00000125 => x"e9050513",
00000126 => x"221000ef",
00000127 => x"fe402503",
00000128 => x"224000ef",
00000125 => x"e8c50513",
00000126 => x"225000ef",
00000127 => x"fe002503",
00000128 => x"228000ef",
00000129 => x"ffff1537",
00000130 => x"e9c50513",
00000131 => x"20d000ef",
00000132 => x"30102573",
00000133 => x"210000ef",
00000130 => x"e9450513",
00000131 => x"211000ef",
00000132 => x"fe402503",
00000133 => x"214000ef",
00000134 => x"ffff1537",
00000135 => x"ea450513",
00000136 => x"1f9000ef",
00000137 => x"fe802503",
00000138 => x"ffff14b7",
00000139 => x"00341413",
00000140 => x"1f4000ef",
00000141 => x"ffff1537",
00000142 => x"eac50513",
00000143 => x"1dd000ef",
00000144 => x"ff802503",
00000145 => x"1e0000ef",
00000146 => x"eb448513",
00000147 => x"1cd000ef",
00000148 => x"ff002503",
00000149 => x"1d0000ef",
00000150 => x"ffff1537",
00000151 => x"ec050513",
00000152 => x"1b9000ef",
00000153 => x"ffc02503",
00000154 => x"1bc000ef",
00000155 => x"eb448513",
00000156 => x"1a9000ef",
00000157 => x"ff402503",
00000158 => x"1ac000ef",
00000159 => x"ffff1537",
00000160 => x"ec850513",
00000161 => x"195000ef",
00000162 => x"095000ef",
00000163 => x"00a404b3",
00000164 => x"0084b433",
00000165 => x"00b40433",
00000166 => x"fa402783",
00000167 => x"0207d263",
00000168 => x"ffff1537",
00000169 => x"ef050513",
00000170 => x"171000ef",
00000171 => x"161000ef",
00000172 => x"02300793",
00000173 => x"02f51263",
00000174 => x"00000513",
00000175 => x"0180006f",
00000176 => x"05d000ef",
00000177 => x"fc85eae3",
00000178 => x"00b41463",
00000179 => x"fc9566e3",
00000180 => x"00100513",
00000181 => x"5b8000ef",
00000182 => x"0b4000ef",
00000183 => x"ffff1937",
00000184 => x"ffff19b7",
00000185 => x"02300a13",
00000186 => x"07200a93",
00000187 => x"06800b13",
00000188 => x"07500b93",
00000189 => x"ffff14b7",
00000190 => x"ffff1c37",
00000191 => x"efc90513",
00000192 => x"119000ef",
00000193 => x"0f9000ef",
00000194 => x"00050413",
00000195 => x"0e1000ef",
00000196 => x"e0898513",
00000197 => x"105000ef",
00000198 => x"fb4400e3",
00000199 => x"01541863",
00000200 => x"ffff02b7",
00000201 => x"00028067",
00000202 => x"fd5ff06f",
00000203 => x"01641663",
00000204 => x"05c000ef",
00000205 => x"fc9ff06f",
00000206 => x"00000513",
00000207 => x"03740063",
00000208 => x"07300793",
00000209 => x"00f41663",
00000210 => x"658000ef",
00000211 => x"fb1ff06f",
00000212 => x"06c00793",
00000213 => x"00f41863",
00000214 => x"00100513",
00000215 => x"3f4000ef",
00000216 => x"f9dff06f",
00000217 => x"06500793",
00000218 => x"00f41663",
00000219 => x"02c000ef",
00000220 => x"f8dff06f",
00000221 => x"03f00793",
00000222 => x"f04c0513",
00000223 => x"00f40463",
00000224 => x"f1848513",
00000225 => x"095000ef",
00000226 => x"f75ff06f",
00000227 => x"ffff1537",
00000228 => x"d2c50513",
00000229 => x"0850006f",
00000230 => x"800007b7",
00000231 => x"0007a783",
00000232 => x"00079863",
00000233 => x"ffff1537",
00000234 => x"d9050513",
00000235 => x"06d0006f",
00000236 => x"ff010113",
00000237 => x"00112623",
00000238 => x"30047073",
00000239 => x"ffff1537",
00000240 => x"dac50513",
00000241 => x"055000ef",
00000242 => x"fa002783",
00000243 => x"fe07cee3",
00000244 => x"b0001073",
00000245 => x"b8001073",
00000246 => x"b0201073",
00000247 => x"b8201073",
00000248 => x"ff002783",
00000249 => x"00078067",
00000250 => x"0000006f",
00000251 => x"ff010113",
00000252 => x"00812423",
00000253 => x"00050413",
00000254 => x"ffff1537",
00000255 => x"dbc50513",
00000256 => x"00112623",
00000257 => x"015000ef",
00000258 => x"03040513",
00000259 => x"0ff57513",
00000260 => x"7dc000ef",
00000261 => x"30047073",
00000262 => x"00100513",
00000263 => x"109000ef",
00000264 => x"0000006f",
00000265 => x"fe010113",
00000266 => x"01212823",
00000267 => x"00050913",
00000268 => x"ffff1537",
00000269 => x"00912a23",
00000270 => x"dd450513",
00000271 => x"ffff14b7",
00000272 => x"00812c23",
00000273 => x"01312623",
00000274 => x"00112e23",
00000275 => x"01c00413",
00000276 => x"7c8000ef",
00000277 => x"f2448493",
00000278 => x"ffc00993",
00000279 => x"008957b3",
00000280 => x"00f7f793",
00000281 => x"00f487b3",
00000282 => x"0007c503",
00000283 => x"ffc40413",
00000284 => x"77c000ef",
00000285 => x"ff3414e3",
00000286 => x"01c12083",
00000287 => x"01812403",
00000288 => x"01412483",
00000289 => x"01012903",
00000290 => x"00c12983",
00000291 => x"02010113",
00000292 => x"00008067",
00000293 => x"fb010113",
00000294 => x"04112623",
00000295 => x"04512423",
00000296 => x"04612223",
00000297 => x"04712023",
00000298 => x"02812e23",
00000299 => x"02a12c23",
00000300 => x"02b12a23",
00000301 => x"02c12823",
00000302 => x"02d12623",
00000303 => x"02e12423",
00000304 => x"02f12223",
00000305 => x"03012023",
00000306 => x"01112e23",
00000307 => x"01c12c23",
00000308 => x"01d12a23",
00000309 => x"01e12823",
00000310 => x"01f12623",
00000311 => x"34202473",
00000312 => x"800007b7",
00000313 => x"00778793",
00000314 => x"06f41a63",
00000315 => x"00000513",
00000316 => x"019000ef",
00000317 => x"628000ef",
00000318 => x"fe002783",
00000319 => x"0027d793",
00000320 => x"00a78533",
00000321 => x"00f537b3",
00000322 => x"00b785b3",
00000323 => x"63c000ef",
00000324 => x"03c12403",
00000325 => x"04c12083",
00000326 => x"04812283",
00000327 => x"04412303",
00000328 => x"04012383",
00000329 => x"03812503",
00000330 => x"03412583",
00000331 => x"03012603",
00000332 => x"02c12683",
00000333 => x"02812703",
00000334 => x"02412783",
00000335 => x"02012803",
00000336 => x"01c12883",
00000337 => x"01812e03",
00000338 => x"01412e83",
00000339 => x"01012f03",
00000340 => x"00c12f83",
00000341 => x"05010113",
00000342 => x"30200073",
00000343 => x"00700793",
00000344 => x"00100513",
00000345 => x"02f40863",
00000346 => x"ffff1537",
00000347 => x"dc850513",
00000348 => x"6a8000ef",
00000349 => x"00040513",
00000350 => x"eadff0ef",
00000351 => x"ffff1537",
00000352 => x"dd050513",
00000353 => x"694000ef",
00000354 => x"34102573",
00000355 => x"e99ff0ef",
00000356 => x"00500513",
00000357 => x"e59ff0ef",
00000358 => x"ff010113",
00000359 => x"00000513",
00000360 => x"00112623",
00000361 => x"00812423",
00000362 => x"708000ef",
00000363 => x"09e00513",
00000364 => x"744000ef",
00000365 => x"00000513",
00000366 => x"73c000ef",
00000367 => x"00050413",
00000368 => x"00000513",
00000369 => x"70c000ef",
00000370 => x"00c12083",
00000371 => x"0ff47513",
00000372 => x"00812403",
00000373 => x"01010113",
00000374 => x"00008067",
00000375 => x"ff010113",
00000376 => x"00112623",
00000377 => x"00812423",
00000378 => x"00000513",
00000379 => x"6c4000ef",
00000380 => x"00500513",
00000381 => x"700000ef",
00000382 => x"00000513",
00000383 => x"6f8000ef",
00000384 => x"00050413",
00000385 => x"00147413",
00000386 => x"00000513",
00000387 => x"6c4000ef",
00000388 => x"fc041ce3",
00000389 => x"00c12083",
00000390 => x"00812403",
00000391 => x"01010113",
00000392 => x"00008067",
00000393 => x"ff010113",
00000394 => x"00000513",
00000395 => x"00112623",
00000396 => x"680000ef",
00000397 => x"00600513",
00000398 => x"6bc000ef",
00000399 => x"00c12083",
00000400 => x"00000513",
00000401 => x"01010113",
00000402 => x"6880006f",
00000403 => x"ff010113",
00000404 => x"00812423",
00000405 => x"00050413",
00000406 => x"01055513",
00000407 => x"0ff57513",
00000408 => x"00112623",
00000409 => x"690000ef",
00000410 => x"00845513",
00000411 => x"0ff57513",
00000412 => x"684000ef",
00000413 => x"0ff47513",
00000414 => x"00812403",
00000415 => x"00c12083",
00000416 => x"01010113",
00000417 => x"6700006f",
00000418 => x"ff010113",
00000419 => x"00812423",
00000420 => x"00050413",
00000421 => x"00000513",
00000422 => x"00112623",
00000423 => x"614000ef",
00000424 => x"00300513",
00000425 => x"650000ef",
00000426 => x"00040513",
00000427 => x"fa1ff0ef",
00000428 => x"00000513",
00000429 => x"640000ef",
00000430 => x"00050413",
00000431 => x"00000513",
00000432 => x"610000ef",
00000433 => x"00c12083",
00000434 => x"0ff47513",
00000435 => x"00812403",
00000436 => x"01010113",
00000437 => x"00008067",
00000438 => x"fd010113",
00000439 => x"02812423",
00000440 => x"02912223",
00000441 => x"03212023",
00000442 => x"01312e23",
00000443 => x"01412c23",
00000444 => x"02112623",
00000445 => x"00050913",
00000446 => x"00058993",
00000447 => x"00c10493",
00000448 => x"00000413",
00000449 => x"00400a13",
00000450 => x"02091e63",
00000451 => x"4f0000ef",
00000452 => x"00a481a3",
00000453 => x"00140413",
00000454 => x"fff48493",
00000455 => x"ff4416e3",
00000456 => x"02c12083",
00000457 => x"02812403",
00000458 => x"00c12503",
00000459 => x"02412483",
00000460 => x"02012903",
00000461 => x"01c12983",
00000462 => x"01812a03",
00000463 => x"03010113",
00000464 => x"00008067",
00000465 => x"00898533",
00000466 => x"f41ff0ef",
00000467 => x"fc5ff06f",
00000468 => x"fe802783",
00000469 => x"fd010113",
00000470 => x"02812423",
00000471 => x"02112623",
00000472 => x"02912223",
00000473 => x"03212023",
00000474 => x"01312e23",
00000475 => x"01412c23",
00000476 => x"01512a23",
00000477 => x"01612823",
00000478 => x"01712623",
00000479 => x"0087f793",
00000480 => x"00050413",
00000481 => x"00078a63",
00000482 => x"fe802783",
00000483 => x"00400513",
00000484 => x"0047f793",
00000485 => x"04079663",
00000486 => x"02041863",
00000487 => x"ffff1537",
00000488 => x"dd850513",
00000489 => x"474000ef",
00000490 => x"008005b7",
00000491 => x"00040513",
00000492 => x"f29ff0ef",
00000493 => x"4788d7b7",
00000494 => x"afe78793",
00000495 => x"02f50463",
00000496 => x"00000513",
00000497 => x"01c0006f",
00000498 => x"ffff1537",
00000499 => x"df850513",
00000500 => x"448000ef",
00000501 => x"dc5ff0ef",
00000502 => x"fc0518e3",
00000503 => x"00300513",
00000504 => x"c0dff0ef",
00000505 => x"008009b7",
00000506 => x"00498593",
00000507 => x"00040513",
00000508 => x"ee9ff0ef",
00000509 => x"00050a13",
00000510 => x"00898593",
00000511 => x"00040513",
00000512 => x"ed9ff0ef",
00000513 => x"ff002b83",
00000514 => x"00050a93",
00000515 => x"ffca7b13",
00000516 => x"00000913",
00000517 => x"00000493",
00000518 => x"00c98993",
00000519 => x"013905b3",
00000520 => x"052b1863",
00000521 => x"015484b3",
00000522 => x"00200513",
00000523 => x"fa049ae3",
00000524 => x"ffff1537",
00000525 => x"e0450513",
00000526 => x"3e0000ef",
00000527 => x"02c12083",
00000528 => x"02812403",
00000529 => x"800007b7",
00000530 => x"0147a023",
00000531 => x"02412483",
00000532 => x"02012903",
00000533 => x"01c12983",
00000534 => x"01812a03",
00000535 => x"01412a83",
00000536 => x"01012b03",
00000537 => x"00c12b83",
00000538 => x"03010113",
00000539 => x"00008067",
00000540 => x"00040513",
00000541 => x"e65ff0ef",
00000542 => x"012b87b3",
00000543 => x"00a484b3",
00000544 => x"00a7a023",
00000545 => x"00490913",
00000546 => x"f95ff06f",
00000547 => x"ff010113",
00000548 => x"00112623",
00000549 => x"ebdff0ef",
00000550 => x"ffff1537",
00000551 => x"e0850513",
00000552 => x"378000ef",
00000553 => x"af5ff0ef",
00000554 => x"0000006f",
00000555 => x"ff010113",
00000556 => x"00112623",
00000557 => x"00812423",
00000558 => x"00912223",
00000559 => x"00058413",
00000560 => x"00050493",
00000561 => x"d61ff0ef",
00000562 => x"00000513",
00000563 => x"3e4000ef",
00000564 => x"00200513",
00000565 => x"420000ef",
00000566 => x"00048513",
00000567 => x"d71ff0ef",
00000568 => x"00040513",
00000569 => x"410000ef",
00000570 => x"00000513",
00000571 => x"3e4000ef",
00000572 => x"00812403",
00000573 => x"00c12083",
00000574 => x"00412483",
00000575 => x"01010113",
00000576 => x"cddff06f",
00000577 => x"fe010113",
00000578 => x"00812c23",
00000579 => x"00912a23",
00000580 => x"01212823",
00000581 => x"00112e23",
00000582 => x"00b12623",
00000583 => x"00300413",
00000584 => x"00350493",
00000585 => x"fff00913",
00000586 => x"00c10793",
00000587 => x"008787b3",
00000588 => x"0007c583",
00000589 => x"40848533",
00000590 => x"fff40413",
00000591 => x"f71ff0ef",
00000592 => x"ff2414e3",
00000593 => x"01c12083",
00000594 => x"01812403",
00000595 => x"01412483",
00000596 => x"01012903",
00000597 => x"02010113",
00000598 => x"00008067",
00000599 => x"ff010113",
00000600 => x"00112623",
00000601 => x"00812423",
00000602 => x"00050413",
00000603 => x"cb9ff0ef",
00000604 => x"00000513",
00000605 => x"33c000ef",
00000606 => x"0d800513",
00000607 => x"378000ef",
00000608 => x"00040513",
00000609 => x"cc9ff0ef",
00000610 => x"00000513",
00000611 => x"344000ef",
00000612 => x"00812403",
00000613 => x"00c12083",
00000614 => x"01010113",
00000615 => x"c41ff06f",
00000616 => x"fe010113",
00000617 => x"800007b7",
00000618 => x"00812c23",
00000619 => x"0007a403",
00000620 => x"00112e23",
00000621 => x"00912a23",
00000622 => x"01212823",
00000623 => x"01312623",
00000624 => x"01412423",
00000625 => x"01512223",
00000626 => x"02041863",
00000627 => x"ffff1537",
00000628 => x"d9050513",
00000629 => x"01812403",
00000630 => x"01c12083",
00000631 => x"01412483",
00000632 => x"01012903",
00000633 => x"00c12983",
00000634 => x"00812a03",
00000635 => x"00412a83",
00000636 => x"02010113",
00000637 => x"2240006f",
00000638 => x"ffff1537",
00000639 => x"e0c50513",
00000640 => x"218000ef",
00000641 => x"00040513",
00000642 => x"a1dff0ef",
00000643 => x"ffff1537",
00000644 => x"e1850513",
00000645 => x"204000ef",
00000646 => x"00800537",
00000647 => x"a09ff0ef",
00000648 => x"ffff1537",
00000649 => x"e3450513",
00000650 => x"1f0000ef",
00000651 => x"1d0000ef",
00000652 => x"00050493",
00000653 => x"1b8000ef",
00000654 => x"07900793",
00000655 => x"0af49e63",
00000656 => x"b59ff0ef",
00000657 => x"00051663",
00000658 => x"00300513",
00000659 => x"9a1ff0ef",
00000660 => x"ffff1537",
00000661 => x"e4050513",
00000662 => x"01045493",
00000663 => x"1bc000ef",
00000664 => x"00148493",
00000665 => x"00800937",
00000666 => x"fff00993",
00000667 => x"00010a37",
00000668 => x"fff48493",
00000669 => x"07349063",
00000670 => x"4788d5b7",
00000671 => x"afe58593",
00000672 => x"00800537",
00000673 => x"e81ff0ef",
00000674 => x"00800537",
00000675 => x"00040593",
00000676 => x"00450513",
00000677 => x"e71ff0ef",
00000678 => x"ff002a03",
00000679 => x"008009b7",
00000680 => x"ffc47413",
00000681 => x"00000493",
00000682 => x"00000913",
00000683 => x"00c98a93",
00000684 => x"01548533",
00000685 => x"009a07b3",
00000686 => x"02849663",
00000687 => x"00898513",
00000688 => x"412005b3",
00000689 => x"e41ff0ef",
00000690 => x"ffff1537",
00000691 => x"e0450513",
00000692 => x"f05ff06f",
00000693 => x"00090513",
00000694 => x"e85ff0ef",
00000695 => x"01490933",
00000696 => x"f91ff06f",
00000697 => x"0007a583",
00000698 => x"00448493",
00000699 => x"00b90933",
00000700 => x"e15ff0ef",
00000701 => x"fbdff06f",
00000702 => x"01c12083",
00000703 => x"01812403",
00000704 => x"01412483",
00000705 => x"01012903",
00000706 => x"00c12983",
00000707 => x"00812a03",
00000708 => x"00412a83",
00000709 => x"02010113",
00000710 => x"00008067",
00000711 => x"ff010113",
00000712 => x"f9402783",
00000713 => x"f9002703",
00000714 => x"f9402683",
00000715 => x"fed79ae3",
00000716 => x"00e12023",
00000717 => x"00f12223",
00000718 => x"00012503",
00000719 => x"00412583",
00000720 => x"01010113",
00000721 => x"00008067",
00000722 => x"f9800693",
00000723 => x"fff00613",
00000724 => x"00c6a023",
00000725 => x"00a6a023",
00000726 => x"00b6a223",
00000727 => x"00008067",
00000728 => x"fa002023",
00000729 => x"fe002683",
00000730 => x"00151513",
00000731 => x"00000713",
00000732 => x"04a6f263",
00000733 => x"000016b7",
00000734 => x"00000793",
00000735 => x"ffe68693",
00000736 => x"04e6e463",
00000737 => x"00167613",
00000738 => x"0015f593",
00000739 => x"01879793",
00000740 => x"01e61613",
00000741 => x"00c7e7b3",
00000742 => x"01d59593",
00000743 => x"00b7e7b3",
00000744 => x"00e7e7b3",
00000745 => x"10000737",
00000746 => x"00e7e7b3",
00000747 => x"faf02023",
00000748 => x"00008067",
00000749 => x"00170793",
00000750 => x"01079713",
00000751 => x"40a686b3",
00000752 => x"01075713",
00000753 => x"fadff06f",
00000754 => x"ffe78513",
00000755 => x"0fd57513",
00000756 => x"00051a63",
00000757 => x"00375713",
00000758 => x"00178793",
00000759 => x"0ff7f793",
00000760 => x"fa1ff06f",
00000761 => x"00175713",
00000762 => x"ff1ff06f",
00000763 => x"fa002783",
00000764 => x"fe07cee3",
00000765 => x"faa02223",
00000766 => x"00008067",
00000767 => x"fa402503",
00000768 => x"fe055ee3",
00000769 => x"0ff57513",
00000770 => x"00008067",
00000771 => x"fa402503",
00000772 => x"0ff57513",
00000773 => x"00008067",
00000774 => x"ff010113",
00000775 => x"00812423",
00000776 => x"01212023",
00000777 => x"00112623",
00000778 => x"00912223",
00000779 => x"00050413",
00000780 => x"00a00913",
00000781 => x"00044483",
00000782 => x"00140413",
00000783 => x"00049e63",
00000784 => x"00c12083",
00000785 => x"00812403",
00000786 => x"00412483",
00000787 => x"00012903",
00000788 => x"01010113",
00000789 => x"00008067",
00000790 => x"01249663",
00000791 => x"00d00513",
00000792 => x"f8dff0ef",
00000793 => x"00048513",
00000794 => x"f85ff0ef",
00000795 => x"fc9ff06f",
00000796 => x"00757513",
00000797 => x"0016f793",
00000798 => x"00367613",
00000799 => x"00a51513",
00000800 => x"00f79793",
00000801 => x"0015f593",
00000802 => x"00f567b3",
00000803 => x"00d61613",
00000804 => x"00c7e7b3",
00000805 => x"00959593",
00000806 => x"fa800713",
00000807 => x"00b7e7b3",
00000808 => x"00072023",
00000809 => x"1007e793",
00000810 => x"00f72023",
00000811 => x"00008067",
00000812 => x"fa800713",
00000813 => x"00072683",
00000814 => x"00757793",
00000815 => x"00100513",
00000816 => x"00f51533",
00000817 => x"00d56533",
00000818 => x"00a72023",
00000819 => x"00008067",
00000820 => x"fa800713",
00000821 => x"00072683",
00000822 => x"00757513",
00000823 => x"00100793",
00000824 => x"00a797b3",
00000825 => x"fff7c793",
00000826 => x"00d7f7b3",
00000827 => x"00f72023",
00000828 => x"00008067",
00000829 => x"faa02623",
00000830 => x"fa802783",
00000831 => x"fe07cee3",
00000832 => x"fac02503",
00000833 => x"00008067",
00000834 => x"f8400713",
00000835 => x"00072683",
00000836 => x"00100793",
00000837 => x"00a797b3",
00000838 => x"00d7c7b3",
00000839 => x"00f72023",
00000840 => x"00008067",
00000841 => x"f8a02223",
00000842 => x"00008067",
00000843 => x"69617641",
00000844 => x"6c62616c",
00000845 => x"4d432065",
00000846 => x"0a3a7344",
00000847 => x"203a6820",
00000848 => x"706c6548",
00000849 => x"3a72200a",
00000850 => x"73655220",
00000851 => x"74726174",
00000852 => x"3a75200a",
00000853 => x"6c705520",
00000854 => x"0a64616f",
00000855 => x"203a7320",
00000856 => x"726f7453",
00000857 => x"6f742065",
00000858 => x"616c6620",
00000859 => x"200a6873",
00000860 => x"4c203a6c",
00000861 => x"2064616f",
00000862 => x"6d6f7266",
00000863 => x"616c6620",
00000864 => x"200a6873",
00000865 => x"45203a65",
00000866 => x"75636578",
00000867 => x"00006574",
00000868 => x"65206f4e",
00000869 => x"75636578",
00000870 => x"6c626174",
00000871 => x"76612065",
00000872 => x"616c6961",
00000873 => x"2e656c62",
00000874 => x"00000000",
00000875 => x"746f6f42",
00000876 => x"2e676e69",
00000877 => x"0a0a2e2e",
00000878 => x"00000000",
00000879 => x"52450a07",
00000880 => x"5f524f52",
00000881 => x"00000000",
00000882 => x"58450a0a",
00000883 => x"00282043",
00000884 => x"20402029",
00000885 => x"00007830",
00000886 => x"69617741",
00000887 => x"676e6974",
00000888 => x"6f656e20",
00000889 => x"32337672",
00000890 => x"6578655f",
00000891 => x"6e69622e",
00000892 => x"202e2e2e",
00000893 => x"00000000",
00000894 => x"64616f4c",
00000895 => x"2e676e69",
00000896 => x"00202e2e",
00000897 => x"00004b4f",
00000898 => x"0000000a",
00000899 => x"74697257",
00000900 => x"78302065",
00000901 => x"00000000",
00000902 => x"74796220",
00000903 => x"74207365",
00000904 => x"5053206f",
00000905 => x"6c662049",
00000906 => x"20687361",
00000907 => x"78302040",
00000908 => x"00000000",
00000909 => x"7928203f",
00000910 => x"20296e2f",
00000911 => x"00000000",
00000912 => x"616c460a",
00000913 => x"6e696873",
00000914 => x"2e2e2e67",
00000915 => x"00000020",
00000916 => x"0a0a0a0a",
00000917 => x"4e203c3c",
00000918 => x"56524f45",
00000919 => x"42203233",
00000920 => x"6c746f6f",
00000921 => x"6564616f",
00000922 => x"3e3e2072",
00000923 => x"4c420a0a",
00000924 => x"203a5644",
00000925 => x"20766f4e",
00000926 => x"32203720",
00000927 => x"0a303230",
00000928 => x"3a565748",
00000929 => x"00002020",
00000930 => x"4b4c430a",
00000931 => x"0020203a",
00000932 => x"0a7a4820",
00000933 => x"52455355",
00000934 => x"0000203a",
00000935 => x"53494d0a",
00000936 => x"00203a41",
00000937 => x"4f52500a",
00000938 => x"00203a43",
00000939 => x"454d490a",
00000940 => x"00203a4d",
00000941 => x"74796220",
00000942 => x"40207365",
00000943 => x"00000020",
00000944 => x"454d440a",
00000945 => x"00203a4d",
00000946 => x"75410a0a",
00000947 => x"6f626f74",
00000948 => x"6920746f",
00000949 => x"7338206e",
00000950 => x"7250202e",
00000951 => x"20737365",
00000952 => x"2079656b",
00000953 => x"61206f74",
00000954 => x"74726f62",
00000955 => x"00000a2e",
00000956 => x"726f6241",
00000957 => x"2e646574",
00000958 => x"00000a0a",
00000959 => x"444d430a",
00000960 => x"00203e3a",
00000961 => x"53207962",
00000962 => x"68706574",
00000963 => x"4e206e61",
00000964 => x"69746c6f",
00000965 => x"0000676e",
00000966 => x"61766e49",
00000967 => x"2064696c",
00000968 => x"00444d43",
00000969 => x"33323130",
00000970 => x"37363534",
00000971 => x"42413938",
00000972 => x"46454443",
00000135 => x"ea050513",
00000136 => x"1fd000ef",
00000137 => x"30102573",
00000138 => x"200000ef",
00000139 => x"ffff1537",
00000140 => x"ea850513",
00000141 => x"1e9000ef",
00000142 => x"fe802503",
00000143 => x"ffff14b7",
00000144 => x"00341413",
00000145 => x"1e4000ef",
00000146 => x"ffff1537",
00000147 => x"eb050513",
00000148 => x"1cd000ef",
00000149 => x"ff802503",
00000150 => x"1d0000ef",
00000151 => x"eb848513",
00000152 => x"1bd000ef",
00000153 => x"ff002503",
00000154 => x"1c0000ef",
00000155 => x"ffff1537",
00000156 => x"ec450513",
00000157 => x"1a9000ef",
00000158 => x"ffc02503",
00000159 => x"1ac000ef",
00000160 => x"eb848513",
00000161 => x"199000ef",
00000162 => x"ff402503",
00000163 => x"19c000ef",
00000164 => x"ffff1537",
00000165 => x"ecc50513",
00000166 => x"185000ef",
00000167 => x"085000ef",
00000168 => x"00a404b3",
00000169 => x"0084b433",
00000170 => x"00b40433",
00000171 => x"fa402783",
00000172 => x"0207d263",
00000173 => x"ffff1537",
00000174 => x"ef450513",
00000175 => x"161000ef",
00000176 => x"151000ef",
00000177 => x"02300793",
00000178 => x"02f51263",
00000179 => x"00000513",
00000180 => x"0180006f",
00000181 => x"04d000ef",
00000182 => x"fc85eae3",
00000183 => x"00b41463",
00000184 => x"fc9566e3",
00000185 => x"00100513",
00000186 => x"5a8000ef",
00000187 => x"0b4000ef",
00000188 => x"ffff1937",
00000189 => x"ffff19b7",
00000190 => x"02300a13",
00000191 => x"07200a93",
00000192 => x"06800b13",
00000193 => x"07500b93",
00000194 => x"ffff14b7",
00000195 => x"ffff1c37",
00000196 => x"f0090513",
00000197 => x"109000ef",
00000198 => x"0e9000ef",
00000199 => x"00050413",
00000200 => x"0d1000ef",
00000201 => x"e0c98513",
00000202 => x"0f5000ef",
00000203 => x"fb4400e3",
00000204 => x"01541863",
00000205 => x"ffff02b7",
00000206 => x"00028067",
00000207 => x"fd5ff06f",
00000208 => x"01641663",
00000209 => x"05c000ef",
00000210 => x"fc9ff06f",
00000211 => x"00000513",
00000212 => x"03740063",
00000213 => x"07300793",
00000214 => x"00f41663",
00000215 => x"648000ef",
00000216 => x"fb1ff06f",
00000217 => x"06c00793",
00000218 => x"00f41863",
00000219 => x"00100513",
00000220 => x"3e4000ef",
00000221 => x"f9dff06f",
00000222 => x"06500793",
00000223 => x"00f41663",
00000224 => x"02c000ef",
00000225 => x"f8dff06f",
00000226 => x"03f00793",
00000227 => x"f08c0513",
00000228 => x"00f40463",
00000229 => x"f1c48513",
00000230 => x"085000ef",
00000231 => x"f75ff06f",
00000232 => x"ffff1537",
00000233 => x"d3050513",
00000234 => x"0750006f",
00000235 => x"800007b7",
00000236 => x"0007a783",
00000237 => x"00079863",
00000238 => x"ffff1537",
00000239 => x"d9450513",
00000240 => x"05d0006f",
00000241 => x"ff010113",
00000242 => x"00112623",
00000243 => x"30047073",
00000244 => x"ffff1537",
00000245 => x"db050513",
00000246 => x"045000ef",
00000247 => x"fa002783",
00000248 => x"fe07cee3",
00000249 => x"ff002783",
00000250 => x"00078067",
00000251 => x"0000006f",
00000252 => x"ff010113",
00000253 => x"00812423",
00000254 => x"00050413",
00000255 => x"ffff1537",
00000256 => x"dc050513",
00000257 => x"00112623",
00000258 => x"015000ef",
00000259 => x"03040513",
00000260 => x"0ff57513",
00000261 => x"7dc000ef",
00000262 => x"30047073",
00000263 => x"00100513",
00000264 => x"109000ef",
00000265 => x"0000006f",
00000266 => x"fe010113",
00000267 => x"01212823",
00000268 => x"00050913",
00000269 => x"ffff1537",
00000270 => x"00912a23",
00000271 => x"dd850513",
00000272 => x"ffff14b7",
00000273 => x"00812c23",
00000274 => x"01312623",
00000275 => x"00112e23",
00000276 => x"01c00413",
00000277 => x"7c8000ef",
00000278 => x"f2848493",
00000279 => x"ffc00993",
00000280 => x"008957b3",
00000281 => x"00f7f793",
00000282 => x"00f487b3",
00000283 => x"0007c503",
00000284 => x"ffc40413",
00000285 => x"77c000ef",
00000286 => x"ff3414e3",
00000287 => x"01c12083",
00000288 => x"01812403",
00000289 => x"01412483",
00000290 => x"01012903",
00000291 => x"00c12983",
00000292 => x"02010113",
00000293 => x"00008067",
00000294 => x"fb010113",
00000295 => x"04112623",
00000296 => x"04512423",
00000297 => x"04612223",
00000298 => x"04712023",
00000299 => x"02812e23",
00000300 => x"02a12c23",
00000301 => x"02b12a23",
00000302 => x"02c12823",
00000303 => x"02d12623",
00000304 => x"02e12423",
00000305 => x"02f12223",
00000306 => x"03012023",
00000307 => x"01112e23",
00000308 => x"01c12c23",
00000309 => x"01d12a23",
00000310 => x"01e12823",
00000311 => x"01f12623",
00000312 => x"34202473",
00000313 => x"800007b7",
00000314 => x"00778793",
00000315 => x"06f41a63",
00000316 => x"00000513",
00000317 => x"019000ef",
00000318 => x"628000ef",
00000319 => x"fe002783",
00000320 => x"0027d793",
00000321 => x"00a78533",
00000322 => x"00f537b3",
00000323 => x"00b785b3",
00000324 => x"63c000ef",
00000325 => x"03c12403",
00000326 => x"04c12083",
00000327 => x"04812283",
00000328 => x"04412303",
00000329 => x"04012383",
00000330 => x"03812503",
00000331 => x"03412583",
00000332 => x"03012603",
00000333 => x"02c12683",
00000334 => x"02812703",
00000335 => x"02412783",
00000336 => x"02012803",
00000337 => x"01c12883",
00000338 => x"01812e03",
00000339 => x"01412e83",
00000340 => x"01012f03",
00000341 => x"00c12f83",
00000342 => x"05010113",
00000343 => x"30200073",
00000344 => x"00700793",
00000345 => x"00100513",
00000346 => x"02f40863",
00000347 => x"ffff1537",
00000348 => x"dcc50513",
00000349 => x"6a8000ef",
00000350 => x"00040513",
00000351 => x"eadff0ef",
00000352 => x"ffff1537",
00000353 => x"dd450513",
00000354 => x"694000ef",
00000355 => x"34102573",
00000356 => x"e99ff0ef",
00000357 => x"00500513",
00000358 => x"e59ff0ef",
00000359 => x"ff010113",
00000360 => x"00000513",
00000361 => x"00112623",
00000362 => x"00812423",
00000363 => x"708000ef",
00000364 => x"09e00513",
00000365 => x"744000ef",
00000366 => x"00000513",
00000367 => x"73c000ef",
00000368 => x"00050413",
00000369 => x"00000513",
00000370 => x"70c000ef",
00000371 => x"00c12083",
00000372 => x"0ff47513",
00000373 => x"00812403",
00000374 => x"01010113",
00000375 => x"00008067",
00000376 => x"ff010113",
00000377 => x"00112623",
00000378 => x"00812423",
00000379 => x"00000513",
00000380 => x"6c4000ef",
00000381 => x"00500513",
00000382 => x"700000ef",
00000383 => x"00000513",
00000384 => x"6f8000ef",
00000385 => x"00050413",
00000386 => x"00147413",
00000387 => x"00000513",
00000388 => x"6c4000ef",
00000389 => x"fc041ce3",
00000390 => x"00c12083",
00000391 => x"00812403",
00000392 => x"01010113",
00000393 => x"00008067",
00000394 => x"ff010113",
00000395 => x"00000513",
00000396 => x"00112623",
00000397 => x"680000ef",
00000398 => x"00600513",
00000399 => x"6bc000ef",
00000400 => x"00c12083",
00000401 => x"00000513",
00000402 => x"01010113",
00000403 => x"6880006f",
00000404 => x"ff010113",
00000405 => x"00812423",
00000406 => x"00050413",
00000407 => x"01055513",
00000408 => x"0ff57513",
00000409 => x"00112623",
00000410 => x"690000ef",
00000411 => x"00845513",
00000412 => x"0ff57513",
00000413 => x"684000ef",
00000414 => x"0ff47513",
00000415 => x"00812403",
00000416 => x"00c12083",
00000417 => x"01010113",
00000418 => x"6700006f",
00000419 => x"ff010113",
00000420 => x"00812423",
00000421 => x"00050413",
00000422 => x"00000513",
00000423 => x"00112623",
00000424 => x"614000ef",
00000425 => x"00300513",
00000426 => x"650000ef",
00000427 => x"00040513",
00000428 => x"fa1ff0ef",
00000429 => x"00000513",
00000430 => x"640000ef",
00000431 => x"00050413",
00000432 => x"00000513",
00000433 => x"610000ef",
00000434 => x"00c12083",
00000435 => x"0ff47513",
00000436 => x"00812403",
00000437 => x"01010113",
00000438 => x"00008067",
00000439 => x"fd010113",
00000440 => x"02812423",
00000441 => x"02912223",
00000442 => x"03212023",
00000443 => x"01312e23",
00000444 => x"01412c23",
00000445 => x"02112623",
00000446 => x"00050913",
00000447 => x"00058993",
00000448 => x"00c10493",
00000449 => x"00000413",
00000450 => x"00400a13",
00000451 => x"02091e63",
00000452 => x"4f0000ef",
00000453 => x"00a481a3",
00000454 => x"00140413",
00000455 => x"fff48493",
00000456 => x"ff4416e3",
00000457 => x"02c12083",
00000458 => x"02812403",
00000459 => x"00c12503",
00000460 => x"02412483",
00000461 => x"02012903",
00000462 => x"01c12983",
00000463 => x"01812a03",
00000464 => x"03010113",
00000465 => x"00008067",
00000466 => x"00898533",
00000467 => x"f41ff0ef",
00000468 => x"fc5ff06f",
00000469 => x"fe802783",
00000470 => x"fd010113",
00000471 => x"02812423",
00000472 => x"02112623",
00000473 => x"02912223",
00000474 => x"03212023",
00000475 => x"01312e23",
00000476 => x"01412c23",
00000477 => x"01512a23",
00000478 => x"01612823",
00000479 => x"01712623",
00000480 => x"0087f793",
00000481 => x"00050413",
00000482 => x"00078a63",
00000483 => x"fe802783",
00000484 => x"00400513",
00000485 => x"0047f793",
00000486 => x"04079663",
00000487 => x"02041863",
00000488 => x"ffff1537",
00000489 => x"ddc50513",
00000490 => x"474000ef",
00000491 => x"008005b7",
00000492 => x"00040513",
00000493 => x"f29ff0ef",
00000494 => x"4788d7b7",
00000495 => x"afe78793",
00000496 => x"02f50463",
00000497 => x"00000513",
00000498 => x"01c0006f",
00000499 => x"ffff1537",
00000500 => x"dfc50513",
00000501 => x"448000ef",
00000502 => x"dc5ff0ef",
00000503 => x"fc0518e3",
00000504 => x"00300513",
00000505 => x"c0dff0ef",
00000506 => x"008009b7",
00000507 => x"00498593",
00000508 => x"00040513",
00000509 => x"ee9ff0ef",
00000510 => x"00050a13",
00000511 => x"00898593",
00000512 => x"00040513",
00000513 => x"ed9ff0ef",
00000514 => x"ff002b83",
00000515 => x"00050a93",
00000516 => x"ffca7b13",
00000517 => x"00000913",
00000518 => x"00000493",
00000519 => x"00c98993",
00000520 => x"013905b3",
00000521 => x"052b1863",
00000522 => x"015484b3",
00000523 => x"00200513",
00000524 => x"fa049ae3",
00000525 => x"ffff1537",
00000526 => x"e0850513",
00000527 => x"3e0000ef",
00000528 => x"02c12083",
00000529 => x"02812403",
00000530 => x"800007b7",
00000531 => x"0147a023",
00000532 => x"02412483",
00000533 => x"02012903",
00000534 => x"01c12983",
00000535 => x"01812a03",
00000536 => x"01412a83",
00000537 => x"01012b03",
00000538 => x"00c12b83",
00000539 => x"03010113",
00000540 => x"00008067",
00000541 => x"00040513",
00000542 => x"e65ff0ef",
00000543 => x"012b87b3",
00000544 => x"00a484b3",
00000545 => x"00a7a023",
00000546 => x"00490913",
00000547 => x"f95ff06f",
00000548 => x"ff010113",
00000549 => x"00112623",
00000550 => x"ebdff0ef",
00000551 => x"ffff1537",
00000552 => x"e0c50513",
00000553 => x"378000ef",
00000554 => x"b05ff0ef",
00000555 => x"0000006f",
00000556 => x"ff010113",
00000557 => x"00112623",
00000558 => x"00812423",
00000559 => x"00912223",
00000560 => x"00058413",
00000561 => x"00050493",
00000562 => x"d61ff0ef",
00000563 => x"00000513",
00000564 => x"3e4000ef",
00000565 => x"00200513",
00000566 => x"420000ef",
00000567 => x"00048513",
00000568 => x"d71ff0ef",
00000569 => x"00040513",
00000570 => x"410000ef",
00000571 => x"00000513",
00000572 => x"3e4000ef",
00000573 => x"00812403",
00000574 => x"00c12083",
00000575 => x"00412483",
00000576 => x"01010113",
00000577 => x"cddff06f",
00000578 => x"fe010113",
00000579 => x"00812c23",
00000580 => x"00912a23",
00000581 => x"01212823",
00000582 => x"00112e23",
00000583 => x"00b12623",
00000584 => x"00300413",
00000585 => x"00350493",
00000586 => x"fff00913",
00000587 => x"00c10793",
00000588 => x"008787b3",
00000589 => x"0007c583",
00000590 => x"40848533",
00000591 => x"fff40413",
00000592 => x"f71ff0ef",
00000593 => x"ff2414e3",
00000594 => x"01c12083",
00000595 => x"01812403",
00000596 => x"01412483",
00000597 => x"01012903",
00000598 => x"02010113",
00000599 => x"00008067",
00000600 => x"ff010113",
00000601 => x"00112623",
00000602 => x"00812423",
00000603 => x"00050413",
00000604 => x"cb9ff0ef",
00000605 => x"00000513",
00000606 => x"33c000ef",
00000607 => x"0d800513",
00000608 => x"378000ef",
00000609 => x"00040513",
00000610 => x"cc9ff0ef",
00000611 => x"00000513",
00000612 => x"344000ef",
00000613 => x"00812403",
00000614 => x"00c12083",
00000615 => x"01010113",
00000616 => x"c41ff06f",
00000617 => x"fe010113",
00000618 => x"800007b7",
00000619 => x"00812c23",
00000620 => x"0007a403",
00000621 => x"00112e23",
00000622 => x"00912a23",
00000623 => x"01212823",
00000624 => x"01312623",
00000625 => x"01412423",
00000626 => x"01512223",
00000627 => x"02041863",
00000628 => x"ffff1537",
00000629 => x"d9450513",
00000630 => x"01812403",
00000631 => x"01c12083",
00000632 => x"01412483",
00000633 => x"01012903",
00000634 => x"00c12983",
00000635 => x"00812a03",
00000636 => x"00412a83",
00000637 => x"02010113",
00000638 => x"2240006f",
00000639 => x"ffff1537",
00000640 => x"e1050513",
00000641 => x"218000ef",
00000642 => x"00040513",
00000643 => x"a1dff0ef",
00000644 => x"ffff1537",
00000645 => x"e1c50513",
00000646 => x"204000ef",
00000647 => x"00800537",
00000648 => x"a09ff0ef",
00000649 => x"ffff1537",
00000650 => x"e3850513",
00000651 => x"1f0000ef",
00000652 => x"1d0000ef",
00000653 => x"00050493",
00000654 => x"1b8000ef",
00000655 => x"07900793",
00000656 => x"0af49e63",
00000657 => x"b59ff0ef",
00000658 => x"00051663",
00000659 => x"00300513",
00000660 => x"9a1ff0ef",
00000661 => x"ffff1537",
00000662 => x"e4450513",
00000663 => x"01045493",
00000664 => x"1bc000ef",
00000665 => x"00148493",
00000666 => x"00800937",
00000667 => x"fff00993",
00000668 => x"00010a37",
00000669 => x"fff48493",
00000670 => x"07349063",
00000671 => x"4788d5b7",
00000672 => x"afe58593",
00000673 => x"00800537",
00000674 => x"e81ff0ef",
00000675 => x"00800537",
00000676 => x"00040593",
00000677 => x"00450513",
00000678 => x"e71ff0ef",
00000679 => x"ff002a03",
00000680 => x"008009b7",
00000681 => x"ffc47413",
00000682 => x"00000493",
00000683 => x"00000913",
00000684 => x"00c98a93",
00000685 => x"01548533",
00000686 => x"009a07b3",
00000687 => x"02849663",
00000688 => x"00898513",
00000689 => x"412005b3",
00000690 => x"e41ff0ef",
00000691 => x"ffff1537",
00000692 => x"e0850513",
00000693 => x"f05ff06f",
00000694 => x"00090513",
00000695 => x"e85ff0ef",
00000696 => x"01490933",
00000697 => x"f91ff06f",
00000698 => x"0007a583",
00000699 => x"00448493",
00000700 => x"00b90933",
00000701 => x"e15ff0ef",
00000702 => x"fbdff06f",
00000703 => x"01c12083",
00000704 => x"01812403",
00000705 => x"01412483",
00000706 => x"01012903",
00000707 => x"00c12983",
00000708 => x"00812a03",
00000709 => x"00412a83",
00000710 => x"02010113",
00000711 => x"00008067",
00000712 => x"ff010113",
00000713 => x"f9402783",
00000714 => x"f9002703",
00000715 => x"f9402683",
00000716 => x"fed79ae3",
00000717 => x"00e12023",
00000718 => x"00f12223",
00000719 => x"00012503",
00000720 => x"00412583",
00000721 => x"01010113",
00000722 => x"00008067",
00000723 => x"f9800693",
00000724 => x"fff00613",
00000725 => x"00c6a023",
00000726 => x"00a6a023",
00000727 => x"00b6a223",
00000728 => x"00008067",
00000729 => x"fa002023",
00000730 => x"fe002683",
00000731 => x"00151513",
00000732 => x"00000713",
00000733 => x"04a6f263",
00000734 => x"000016b7",
00000735 => x"00000793",
00000736 => x"ffe68693",
00000737 => x"04e6e463",
00000738 => x"00167613",
00000739 => x"0015f593",
00000740 => x"01879793",
00000741 => x"01e61613",
00000742 => x"00c7e7b3",
00000743 => x"01d59593",
00000744 => x"00b7e7b3",
00000745 => x"00e7e7b3",
00000746 => x"10000737",
00000747 => x"00e7e7b3",
00000748 => x"faf02023",
00000749 => x"00008067",
00000750 => x"00170793",
00000751 => x"01079713",
00000752 => x"40a686b3",
00000753 => x"01075713",
00000754 => x"fadff06f",
00000755 => x"ffe78513",
00000756 => x"0fd57513",
00000757 => x"00051a63",
00000758 => x"00375713",
00000759 => x"00178793",
00000760 => x"0ff7f793",
00000761 => x"fa1ff06f",
00000762 => x"00175713",
00000763 => x"ff1ff06f",
00000764 => x"fa002783",
00000765 => x"fe07cee3",
00000766 => x"faa02223",
00000767 => x"00008067",
00000768 => x"fa402503",
00000769 => x"fe055ee3",
00000770 => x"0ff57513",
00000771 => x"00008067",
00000772 => x"fa402503",
00000773 => x"0ff57513",
00000774 => x"00008067",
00000775 => x"ff010113",
00000776 => x"00812423",
00000777 => x"01212023",
00000778 => x"00112623",
00000779 => x"00912223",
00000780 => x"00050413",
00000781 => x"00a00913",
00000782 => x"00044483",
00000783 => x"00140413",
00000784 => x"00049e63",
00000785 => x"00c12083",
00000786 => x"00812403",
00000787 => x"00412483",
00000788 => x"00012903",
00000789 => x"01010113",
00000790 => x"00008067",
00000791 => x"01249663",
00000792 => x"00d00513",
00000793 => x"f8dff0ef",
00000794 => x"00048513",
00000795 => x"f85ff0ef",
00000796 => x"fc9ff06f",
00000797 => x"00757513",
00000798 => x"0016f793",
00000799 => x"00367613",
00000800 => x"00a51513",
00000801 => x"00f79793",
00000802 => x"0015f593",
00000803 => x"00f567b3",
00000804 => x"00d61613",
00000805 => x"00c7e7b3",
00000806 => x"00959593",
00000807 => x"fa800713",
00000808 => x"00b7e7b3",
00000809 => x"00072023",
00000810 => x"1007e793",
00000811 => x"00f72023",
00000812 => x"00008067",
00000813 => x"fa800713",
00000814 => x"00072683",
00000815 => x"00757793",
00000816 => x"00100513",
00000817 => x"00f51533",
00000818 => x"00d56533",
00000819 => x"00a72023",
00000820 => x"00008067",
00000821 => x"fa800713",
00000822 => x"00072683",
00000823 => x"00757513",
00000824 => x"00100793",
00000825 => x"00a797b3",
00000826 => x"fff7c793",
00000827 => x"00d7f7b3",
00000828 => x"00f72023",
00000829 => x"00008067",
00000830 => x"faa02623",
00000831 => x"fa802783",
00000832 => x"fe07cee3",
00000833 => x"fac02503",
00000834 => x"00008067",
00000835 => x"f8400713",
00000836 => x"00072683",
00000837 => x"00100793",
00000838 => x"00a797b3",
00000839 => x"00d7c7b3",
00000840 => x"00f72023",
00000841 => x"00008067",
00000842 => x"f8a02223",
00000843 => x"00008067",
00000844 => x"69617641",
00000845 => x"6c62616c",
00000846 => x"4d432065",
00000847 => x"0a3a7344",
00000848 => x"203a6820",
00000849 => x"706c6548",
00000850 => x"3a72200a",
00000851 => x"73655220",
00000852 => x"74726174",
00000853 => x"3a75200a",
00000854 => x"6c705520",
00000855 => x"0a64616f",
00000856 => x"203a7320",
00000857 => x"726f7453",
00000858 => x"6f742065",
00000859 => x"616c6620",
00000860 => x"200a6873",
00000861 => x"4c203a6c",
00000862 => x"2064616f",
00000863 => x"6d6f7266",
00000864 => x"616c6620",
00000865 => x"200a6873",
00000866 => x"45203a65",
00000867 => x"75636578",
00000868 => x"00006574",
00000869 => x"65206f4e",
00000870 => x"75636578",
00000871 => x"6c626174",
00000872 => x"76612065",
00000873 => x"616c6961",
00000874 => x"2e656c62",
00000875 => x"00000000",
00000876 => x"746f6f42",
00000877 => x"2e676e69",
00000878 => x"0a0a2e2e",
00000879 => x"00000000",
00000880 => x"52450a07",
00000881 => x"5f524f52",
00000882 => x"00000000",
00000883 => x"58450a0a",
00000884 => x"00282043",
00000885 => x"20402029",
00000886 => x"00007830",
00000887 => x"69617741",
00000888 => x"676e6974",
00000889 => x"6f656e20",
00000890 => x"32337672",
00000891 => x"6578655f",
00000892 => x"6e69622e",
00000893 => x"202e2e2e",
00000894 => x"00000000",
00000895 => x"64616f4c",
00000896 => x"2e676e69",
00000897 => x"00202e2e",
00000898 => x"00004b4f",
00000899 => x"0000000a",
00000900 => x"74697257",
00000901 => x"78302065",
00000902 => x"00000000",
00000903 => x"74796220",
00000904 => x"74207365",
00000905 => x"5053206f",
00000906 => x"6c662049",
00000907 => x"20687361",
00000908 => x"78302040",
00000909 => x"00000000",
00000910 => x"7928203f",
00000911 => x"20296e2f",
00000912 => x"00000000",
00000913 => x"616c460a",
00000914 => x"6e696873",
00000915 => x"2e2e2e67",
00000916 => x"00000020",
00000917 => x"0a0a0a0a",
00000918 => x"4e203c3c",
00000919 => x"56524f45",
00000920 => x"42203233",
00000921 => x"6c746f6f",
00000922 => x"6564616f",
00000923 => x"3e3e2072",
00000924 => x"4c420a0a",
00000925 => x"203a5644",
00000926 => x"20636544",
00000927 => x"32203320",
00000928 => x"0a303230",
00000929 => x"3a565748",
00000930 => x"00002020",
00000931 => x"4b4c430a",
00000932 => x"0020203a",
00000933 => x"0a7a4820",
00000934 => x"52455355",
00000935 => x"0000203a",
00000936 => x"53494d0a",
00000937 => x"00203a41",
00000938 => x"4f52500a",
00000939 => x"00203a43",
00000940 => x"454d490a",
00000941 => x"00203a4d",
00000942 => x"74796220",
00000943 => x"40207365",
00000944 => x"00000020",
00000945 => x"454d440a",
00000946 => x"00203a4d",
00000947 => x"75410a0a",
00000948 => x"6f626f74",
00000949 => x"6920746f",
00000950 => x"7338206e",
00000951 => x"7250202e",
00000952 => x"20737365",
00000953 => x"2079656b",
00000954 => x"61206f74",
00000955 => x"74726f62",
00000956 => x"00000a2e",
00000957 => x"726f6241",
00000958 => x"2e646574",
00000959 => x"00000a0a",
00000960 => x"444d430a",
00000961 => x"00203e3a",
00000962 => x"53207962",
00000963 => x"68706574",
00000964 => x"4e206e61",
00000965 => x"69746c6f",
00000966 => x"0000676e",
00000967 => x"61766e49",
00000968 => x"2064696c",
00000969 => x"00444d43",
00000970 => x"33323130",
00000971 => x"37363534",
00000972 => x"42413938",
00000973 => x"46454443",
others => x"00000000"
);
 
/rtl/core/neorv32_busswitch.vhd
59,6 → 59,7
ca_bus_we_i : in std_ulogic; -- write enable
ca_bus_re_i : in std_ulogic; -- read enable
ca_bus_cancel_i : in std_ulogic; -- cancel current bus transaction
ca_bus_lock_i : in std_ulogic; -- locked/exclusive access
ca_bus_ack_o : out std_ulogic; -- bus transfer acknowledge
ca_bus_err_o : out std_ulogic; -- bus transfer error
-- controller interface b --
69,6 → 70,7
cb_bus_we_i : in std_ulogic; -- write enable
cb_bus_re_i : in std_ulogic; -- read enable
cb_bus_cancel_i : in std_ulogic; -- cancel current bus transaction
cb_bus_lock_i : in std_ulogic; -- locked/exclusive access
cb_bus_ack_o : out std_ulogic; -- bus transfer acknowledge
cb_bus_err_o : out std_ulogic; -- bus transfer error
-- peripheral bus --
80,6 → 82,7
p_bus_we_o : out std_ulogic; -- write enable
p_bus_re_o : out std_ulogic; -- read enable
p_bus_cancel_o : out std_ulogic; -- cancel current bus transaction
p_bus_lock_o : out std_ulogic; -- locked/exclusive access
p_bus_ack_i : in std_ulogic; -- bus transfer acknowledge
p_bus_err_i : in std_ulogic -- bus transfer error
);
268,6 → 271,7
p_bus_cancel_o <= ca_bus_cancel_i when (arbiter.bus_sel = '0') else cb_bus_cancel_i;
p_bus_we_o <= (p_bus_we or arbiter.we_trig);
p_bus_re_o <= (p_bus_re or arbiter.re_trig);
p_bus_lock_o <= ca_bus_lock_i or cb_bus_lock_i;
 
ca_bus_rdata_o <= p_bus_rdata_i;
cb_bus_rdata_o <= p_bus_rdata_i;
/rtl/core/neorv32_cpu.vhd
58,6 → 58,7
HW_THREAD_ID : std_ulogic_vector(31 downto 0):= (others => '0'); -- hardware thread id
CPU_BOOT_ADDR : std_ulogic_vector(31 downto 0):= (others => '0'); -- cpu boot address
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension?
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension?
88,6 → 89,7
i_bus_err_i : in std_ulogic := '0'; -- bus transfer error
i_bus_fence_o : out std_ulogic; -- executed FENCEI operation
i_bus_priv_o : out std_ulogic_vector(1 downto 0); -- privilege level
i_bus_lock_o : out std_ulogic; -- locked/exclusive access
-- data bus interface --
d_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
d_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data
100,6 → 102,7
d_bus_err_i : in std_ulogic := '0'; -- bus transfer error
d_bus_fence_o : out std_ulogic; -- executed FENCE operation
d_bus_priv_o : out std_ulogic_vector(1 downto 0); -- privilege level
d_bus_lock_o : out std_ulogic; -- locked/exclusive access
-- system time input from MTIME --
time_i : in std_ulogic_vector(63 downto 0) := (others => '0'); -- current system time
-- interrupts (risc-v compliant) --
136,7 → 139,6
signal be_store : std_ulogic; -- bus error on store data access
signal fetch_pc : std_ulogic_vector(data_width_c-1 downto 0); -- pc for instruction fetch
signal curr_pc : std_ulogic_vector(data_width_c-1 downto 0); -- current pc (for current executed instruction)
signal next_pc : std_ulogic_vector(data_width_c-1 downto 0); -- next pc (for next to-be-executed instruction)
 
-- co-processor interface --
signal cp0_data, cp1_data, cp2_data, cp3_data : std_ulogic_vector(data_width_c-1 downto 0);
163,6 → 165,8
assert not (((PMP_GRANULARITY < 1) or (PMP_GRANULARITY > 32)) and (PMP_USE = true)) report "NEORV32 CPU CONFIG ERROR! Invalid PMP granulartiy (0 < PMP_GRANULARITY < 33)." severity error;
-- Instruction prefetch buffer size --
assert not (is_power_of_two_f(ipb_entries_c) = false) report "NEORV32 CPU CONFIG ERROR! Number of entries in instruction prefetch buffer <ipb_entries_c> has to be a power of two." severity error;
-- A extension - only lr.w and sc.w supported yet --
assert not (CPU_EXTENSION_RISCV_A = true) report "NEORV32 CPU CONFIG WARNING! Atomic operations extension (A) only supports >lr.w< and >sc.w< instructions yet." severity warning;
 
 
-- Control Unit ---------------------------------------------------------------------------
173,6 → 177,7
HW_THREAD_ID => HW_THREAD_ID, -- hardware thread id
CPU_BOOT_ADDR => CPU_BOOT_ADDR, -- cpu boot address
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A => CPU_EXTENSION_RISCV_A, -- implement atomic extension?
CPU_EXTENSION_RISCV_C => CPU_EXTENSION_RISCV_C, -- implement compressed extension?
CPU_EXTENSION_RISCV_E => CPU_EXTENSION_RISCV_E, -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M => CPU_EXTENSION_RISCV_M, -- implement muld/div extension?
202,7 → 207,6
imm_o => imm, -- immediate
fetch_pc_o => fetch_pc, -- PC for instruction fetch
curr_pc_o => curr_pc, -- current PC (corresponding to current instruction)
next_pc_o => next_pc, -- next PC (corresponding to current instruction
csr_rdata_o => csr_rdata, -- CSR read data
-- interrupts (risc-v compliant) --
msw_irq_i => msw_irq_i, -- machine software interrupt
240,7 → 244,6
mem_i => rdata, -- memory read data
alu_i => alu_res, -- ALU result
csr_i => csr_rdata, -- CSR read data
pc_i => next_pc, -- next pc (for linking)
-- data output --
rs1_o => rs1, -- operand 1
rs2_o => rs2 -- operand 2
317,12 → 320,21
end generate;
 
 
-- Co-Processor 1: Not implemented (yet) --------------------------------------------------
-- Co-Processor 1: Atomic Memory Access (SC - store-conditional) --------------------------
-- -------------------------------------------------------------------------------------------
-- control: ctrl cp1_start
-- inputs: rs1 rs2 alu_cmp alu_opb
cp1_data <= (others => '0');
cp1_valid <= '0';
atomic_op_cp: process(ctrl, cp1_start)
begin
-- "fake" co-processor for atomic operations
-- used to get the result of a store-conditional operation into the data path
if (CPU_EXTENSION_RISCV_A = true) and (cp1_start = '1') then
cp1_data <= (others => '0');
cp1_data(0) <= not ctrl(ctrl_bus_lock_c);
cp1_valid <= '1';
else
cp1_data <= (others => '0');
cp1_valid <= '0';
end if;
end process;
 
 
-- Co-Processor 2: Not implemented (yet) --------------------------------------------------
364,7 → 376,7
ma_instr_o => ma_instr, -- misaligned instruction address
be_instr_o => be_instr, -- bus error on instruction access
-- cpu data access interface --
addr_i => alu_res, -- ALU result -> access address
addr_i => alu_add, -- ALU.add result -> access address
wdata_i => rs2, -- write data
rdata_o => rdata, -- read data
mar_o => mar, -- current memory address register
388,6 → 400,7
i_bus_ack_i => i_bus_ack_i, -- bus transfer acknowledge
i_bus_err_i => i_bus_err_i, -- bus transfer error
i_bus_fence_o => i_bus_fence_o, -- fence operation
i_bus_lock_o => i_bus_lock_o, -- locked/exclusive access
-- data bus --
d_bus_addr_o => d_bus_addr_o, -- bus access address
d_bus_rdata_i => d_bus_rdata_i, -- bus read data
398,7 → 411,8
d_bus_cancel_o => d_bus_cancel_o, -- cancel current bus transaction
d_bus_ack_i => d_bus_ack_i, -- bus transfer acknowledge
d_bus_err_i => d_bus_err_i, -- bus transfer error
d_bus_fence_o => d_bus_fence_o -- fence operation
d_bus_fence_o => d_bus_fence_o, -- fence operation
d_bus_lock_o => d_bus_lock_o -- locked/exclusive access
);
 
-- current privilege level --
/rtl/core/neorv32_cpu_alu.vhd
86,7 → 86,10
 
-- results --
signal addsub_res : std_ulogic_vector(data_width_c downto 0);
--
signal cp_res : std_ulogic_vector(data_width_c-1 downto 0);
signal arith_res : std_ulogic_vector(data_width_c-1 downto 0);
signal logic_res : std_ulogic_vector(data_width_c-1 downto 0);
 
-- comparator --
signal cmp_opx : std_ulogic_vector(data_width_c downto 0);
167,7 → 170,18
-- direct output of address result --
add_o <= addsub_res(data_width_c-1 downto 0);
 
-- ALU arithmetic logic core --
arithmetic_core: process(ctrl_i, addsub_res)
begin
if (ctrl_i(ctrl_alu_arith_c) = alu_arith_cmd_addsub_c) then -- ADD/SUB
arith_res <= addsub_res(data_width_c-1 downto 0);
else -- SLT
arith_res <= (others => '0');
arith_res(0) <= addsub_res(addsub_res'left); -- => carry/borrow
end if;
end process arithmetic_core;
 
 
-- Shifter Unit ---------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
shifter_unit: process(clk_i)
276,7 → 290,7
end process shifter_unit;
 
-- is shift operation? --
shifter.cmd <= '1' when (ctrl_i(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) = alu_cmd_shift_c) else '0';
shifter.cmd <= '1' when (ctrl_i(ctrl_alu_func1_c downto ctrl_alu_func0_c) = alu_func_cmd_shift_c) else '0';
shifter.start <= '1' when (shifter.cmd = '1') and (shifter.cmd_ff = '0') else '0';
 
-- shift operation running? --
294,10 → 308,10
elsif rising_edge(clk_i) then
if (CPU_EXTENSION_RISCV_M = true) then
cp_ctrl.cmd_ff <= cp_ctrl.cmd;
if (cp_ctrl.start = '1') then
if ((cp0_valid_i or cp1_valid_i or cp2_valid_i or cp3_valid_i) = '1') then -- cp computation done?
cp_ctrl.busy <= '0';
elsif (cp_ctrl.start = '1') then
cp_ctrl.busy <= '1';
elsif ((cp0_valid_i or cp1_valid_i or cp2_valid_i or cp3_valid_i) = '1') then -- cp computation done?
cp_ctrl.busy <= '0';
end if;
else -- no co-processor(s) implemented
cp_ctrl.cmd_ff <= '0';
307,34 → 321,51
end process cp_arbiter;
 
-- is co-processor operation? --
cp_ctrl.cmd <= '1' when (ctrl_i(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) = alu_cmd_cp_c) else '0';
cp_ctrl.cmd <= '1' when (ctrl_i(ctrl_alu_func1_c downto ctrl_alu_func0_c) = alu_func_cmd_copro_c) else '0';
cp_ctrl.start <= '1' when (cp_ctrl.cmd = '1') and (cp_ctrl.cmd_ff = '0') else '0';
cp0_start_o <= '1' when (cp_ctrl.start = '1') and (ctrl_i(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) = "00") else '0'; -- CP0: MULDIV CP
cp1_start_o <= '1' when (cp_ctrl.start = '1') and (ctrl_i(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) = "01") else '0'; -- CP1: not implemented yet
cp2_start_o <= '1' when (cp_ctrl.start = '1') and (ctrl_i(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) = "10") else '0'; -- CP2: not implemented yet
cp3_start_o <= '1' when (cp_ctrl.start = '1') and (ctrl_i(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) = "11") else '0'; -- CP3: not implemented yet
 
-- co-processor operation running? --
cp_ctrl.halt <= cp_ctrl.busy or cp_ctrl.start;
-- co-processor select --
cp0_start_o <= '1' when (cp_ctrl.start = '1') and (ctrl_i(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) = "00") else '0';
cp1_start_o <= '1' when (cp_ctrl.start = '1') and (ctrl_i(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) = "01") else '0';
cp2_start_o <= '1' when (cp_ctrl.start = '1') and (ctrl_i(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) = "10") else '0';
cp3_start_o <= '1' when (cp_ctrl.start = '1') and (ctrl_i(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) = "11") else '0';
 
-- co-processor operation (still) running? --
cp_ctrl.halt <= (cp_ctrl.busy and (not (cp0_valid_i or cp1_valid_i or cp2_valid_i or cp3_valid_i))) or cp_ctrl.start;
 
-- co-processor result --
cp_res <= cp0_data_i or cp1_data_i or cp2_data_i or cp3_data_i; -- only the *actually selected* co-processor may output data != 0
cp_read_back: process(clk_i)
begin
if rising_edge(clk_i) then
cp_res <= cp0_data_i or cp1_data_i or cp2_data_i or cp3_data_i; -- only the *actually selected* co-processor may output data != 0
end if;
end process cp_read_back;
 
 
-- ALU Logic Core -------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
alu_logic_core: process(ctrl_i, rs1_i, opb)
begin
case ctrl_i(ctrl_alu_logic1_c downto ctrl_alu_logic0_c) is
when alu_logic_cmd_movb_c => logic_res <= opb; -- (default)
when alu_logic_cmd_xor_c => logic_res <= rs1_i xor opb; -- only rs1 required for logic ops (opa would also contain pc)
when alu_logic_cmd_or_c => logic_res <= rs1_i or opb;
when alu_logic_cmd_and_c => logic_res <= rs1_i and opb;
when others => logic_res <= opb; -- undefined
end case;
end process alu_logic_core;
 
 
-- ALU Function Select --------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
alu_function_mux: process(ctrl_i, rs1_i, opb, addsub_res, cp_res, shifter.sreg)
alu_function_mux: process(ctrl_i, arith_res, logic_res, shifter.sreg, cp_res)
begin
case ctrl_i(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) is
when alu_cmd_xor_c => res_o <= rs1_i xor opb; -- only rs1 required for logic ops (opa would also contain pc)
when alu_cmd_or_c => res_o <= rs1_i or opb;
when alu_cmd_and_c => res_o <= rs1_i and opb;
when alu_cmd_movb_c => res_o <= opb;
when alu_cmd_addsub_c => res_o <= addsub_res(data_width_c-1 downto 0);
when alu_cmd_cp_c => res_o <= cp_res;
when alu_cmd_shift_c => res_o <= shifter.sreg;
when alu_cmd_slt_c => res_o <= (others => '0'); res_o(0) <= addsub_res(addsub_res'left); -- => carry/borrow
when others => res_o <= opb; -- undefined
case ctrl_i(ctrl_alu_func1_c downto ctrl_alu_func0_c) is
when alu_func_cmd_arith_c => res_o <= arith_res; -- (default)
when alu_func_cmd_logic_c => res_o <= logic_res;
when alu_func_cmd_shift_c => res_o <= shifter.sreg;
when alu_func_cmd_copro_c => res_o <= cp_res;
when others => res_o <= arith_res; -- undefined
end case;
end process alu_function_mux;
 
/rtl/core/neorv32_cpu_bus.vhd
86,6 → 86,7
i_bus_ack_i : in std_ulogic; -- bus transfer acknowledge
i_bus_err_i : in std_ulogic; -- bus transfer error
i_bus_fence_o : out std_ulogic; -- fence operation
i_bus_lock_o : out std_ulogic; -- locked/exclusive access
-- data bus --
d_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
d_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
96,7 → 97,8
d_bus_cancel_o : out std_ulogic; -- cancel current bus transaction
d_bus_ack_i : in std_ulogic; -- bus transfer acknowledge
d_bus_err_i : in std_ulogic; -- bus transfer error
d_bus_fence_o : out std_ulogic -- fence operation
d_bus_fence_o : out std_ulogic; -- fence operation
d_bus_lock_o : out std_ulogic -- locked/exclusive access
);
end neorv32_cpu_bus;
 
165,7 → 167,7
mem_adr_reg: process(clk_i)
begin
if rising_edge(clk_i) then
if (ctrl_i(ctrl_bus_mar_we_c) = '1') then
if (ctrl_i(ctrl_bus_mo_we_c) = '1') then
mar <= addr_i;
end if;
end if;
199,7 → 201,7
mem_do_reg: process(clk_i)
begin
if rising_edge(clk_i) then
if (ctrl_i(ctrl_bus_mdo_we_c) = '1') then
if (ctrl_i(ctrl_bus_mo_we_c) = '1') then
mdo <= wdata_i; -- memory data out register (MDO)
end if;
end if;
240,7 → 242,7
mem_out_buf: process(clk_i)
begin
if rising_edge(clk_i) then
if (ctrl_i(ctrl_bus_mdi_we_c) = '1') then
if (ctrl_i(ctrl_bus_mi_we_c) = '1') then
mdi <= d_bus_rdata; -- memory data in register (MDI)
end if;
end if;
272,22 → 274,59
end process read_align;
 
 
-- Instruction Interface: Check for Misaligned Access -------------------------------------
-- Data Access Arbiter --------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
misaligned_i_check: process(ctrl_i, fetch_pc_i)
data_access_arbiter: process(rstn_i, clk_i)
begin
-- check instruction access --
i_misaligned <= '0'; -- default
if (CPU_EXTENSION_RISCV_C = true) then -- 16-bit and 32-bit instruction accesses
i_misaligned <= '0'; -- no alignment exceptions possible
else -- 32-bit instruction accesses only
if (fetch_pc_i(1) = '1') then -- PC(0) is always zero
i_misaligned <= '1';
end if;
if (rstn_i = '0') then
d_arbiter.wr_req <= '0';
d_arbiter.rd_req <= '0';
d_arbiter.err_align <= '0';
d_arbiter.err_bus <= '0';
d_arbiter.timeout <= (others => '0');
elsif rising_edge(clk_i) then
-- data access request --
if (d_arbiter.wr_req = '0') and (d_arbiter.rd_req = '0') then -- idle
d_arbiter.wr_req <= ctrl_i(ctrl_bus_wr_c);
d_arbiter.rd_req <= ctrl_i(ctrl_bus_rd_c);
d_arbiter.err_align <= d_misaligned;
d_arbiter.err_bus <= '0';
d_arbiter.timeout <= std_ulogic_vector(to_unsigned(bus_timeout_c, index_size_f(bus_timeout_c)));
else -- in progress
d_arbiter.timeout <= std_ulogic_vector(unsigned(d_arbiter.timeout) - 1);
d_arbiter.err_align <= (d_arbiter.err_align or d_misaligned) and (not ctrl_i(ctrl_bus_derr_ack_c));
d_arbiter.err_bus <= (d_arbiter.err_bus or (not or_all_f(d_arbiter.timeout)) or d_bus_err_i) and (not ctrl_i(ctrl_bus_derr_ack_c));
if (d_bus_ack_i = '1') or (ctrl_i(ctrl_bus_derr_ack_c) = '1') then -- wait for normal termination / CPU abort
d_arbiter.wr_req <= '0';
d_arbiter.rd_req <= '0';
end if;
end if;
end if;
end process misaligned_i_check;
end process data_access_arbiter;
 
-- cancel bus access --
d_bus_cancel_o <= (d_arbiter.wr_req or d_arbiter.rd_req) and ctrl_i(ctrl_bus_derr_ack_c);
 
-- wait for bus transaction to finish --
d_wait_o <= (d_arbiter.wr_req or d_arbiter.rd_req) and (not d_bus_ack_i);
 
-- output data access error to controller --
ma_load_o <= d_arbiter.rd_req and d_arbiter.err_align;
be_load_o <= d_arbiter.rd_req and d_arbiter.err_bus;
ma_store_o <= d_arbiter.wr_req and d_arbiter.err_align;
be_store_o <= d_arbiter.wr_req and d_arbiter.err_bus;
 
-- data bus (read/write)--
d_bus_addr_o <= mar;
d_bus_wdata_o <= d_bus_wdata;
d_bus_ben_o <= d_bus_ben;
d_bus_we_o <= ctrl_i(ctrl_bus_wr_c) and (not d_misaligned) and (not st_pmp_fault); -- no actual write when misaligned or PMP fault
d_bus_re_o <= ctrl_i(ctrl_bus_rd_c) and (not d_misaligned) and (not ld_pmp_fault); -- no actual read when misaligned or PMP fault
d_bus_fence_o <= ctrl_i(ctrl_bus_fence_c);
d_bus_rdata <= d_bus_rdata_i;
d_bus_lock_o <= ctrl_i(ctrl_bus_lock_c);
 
 
-- Instruction Fetch Arbiter --------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
ifetch_arbiter: process(rstn_i, clk_i)
335,60 → 374,14
i_bus_re_o <= ctrl_i(ctrl_bus_if_c) and (not i_misaligned) and (not if_pmp_fault); -- no actual read when misaligned or PMP fault
i_bus_fence_o <= ctrl_i(ctrl_bus_fencei_c);
instr_o <= i_bus_rdata_i;
i_bus_lock_o <= '0'; -- instruction fetch cannot be atomic
 
 
-- Data Access Arbiter --------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
data_access_arbiter: process(rstn_i, clk_i)
begin
if (rstn_i = '0') then
d_arbiter.wr_req <= '0';
d_arbiter.rd_req <= '0';
d_arbiter.err_align <= '0';
d_arbiter.err_bus <= '0';
d_arbiter.timeout <= (others => '0');
elsif rising_edge(clk_i) then
-- data access request --
if (d_arbiter.wr_req = '0') and (d_arbiter.rd_req = '0') then -- idle
d_arbiter.wr_req <= ctrl_i(ctrl_bus_wr_c);
d_arbiter.rd_req <= ctrl_i(ctrl_bus_rd_c);
d_arbiter.err_align <= d_misaligned;
d_arbiter.err_bus <= '0';
d_arbiter.timeout <= std_ulogic_vector(to_unsigned(bus_timeout_c, index_size_f(bus_timeout_c)));
else -- in progress
d_arbiter.timeout <= std_ulogic_vector(unsigned(d_arbiter.timeout) - 1);
d_arbiter.err_align <= (d_arbiter.err_align or d_misaligned) and (not ctrl_i(ctrl_bus_derr_ack_c));
d_arbiter.err_bus <= (d_arbiter.err_bus or (not or_all_f(d_arbiter.timeout)) or d_bus_err_i) and (not ctrl_i(ctrl_bus_derr_ack_c));
if (d_bus_ack_i = '1') or (ctrl_i(ctrl_bus_derr_ack_c) = '1') then -- wait for normal termination / CPU abort
d_arbiter.wr_req <= '0';
d_arbiter.rd_req <= '0';
end if;
end if;
end if;
end process data_access_arbiter;
-- check instruction access --
i_misaligned <= '0' when (CPU_EXTENSION_RISCV_C = true) else -- no alignment exceptions possible when using C-extension
'1' when (fetch_pc_i(1) = '1') else '0'; -- 32-bit accesses only
 
-- cancel bus access --
d_bus_cancel_o <= (d_arbiter.wr_req or d_arbiter.rd_req) and ctrl_i(ctrl_bus_derr_ack_c);
 
-- wait for bus transaction to finish --
d_wait_o <= (d_arbiter.wr_req or d_arbiter.rd_req) and (not d_bus_ack_i);
 
-- output data access error to controller --
ma_load_o <= d_arbiter.rd_req and d_arbiter.err_align;
be_load_o <= d_arbiter.rd_req and d_arbiter.err_bus;
ma_store_o <= d_arbiter.wr_req and d_arbiter.err_align;
be_store_o <= d_arbiter.wr_req and d_arbiter.err_bus;
 
-- data bus (read/write)--
d_bus_addr_o <= mar;
d_bus_wdata_o <= d_bus_wdata;
d_bus_ben_o <= d_bus_ben;
d_bus_we_o <= ctrl_i(ctrl_bus_wr_c) and (not d_misaligned) and (not st_pmp_fault); -- no actual write when misaligned or PMP fault
d_bus_re_o <= ctrl_i(ctrl_bus_rd_c) and (not d_misaligned) and (not ld_pmp_fault); -- no actual read when misaligned or PMP fault
d_bus_fence_o <= ctrl_i(ctrl_bus_fence_c);
d_bus_rdata <= d_bus_rdata_i;
 
 
-- Physical Memory Protection (PMP) -------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- compute address masks --
401,7 → 394,7
if (i = PMP_GRANULARITY+1) then
pmp.addr_mask(r)(i) <= '0';
else -- current bit = not AND(all previous bits)
pmp.addr_mask(r)(i) <= not (and_all_f(pmp_addr_i(r)(i-1 downto PMP_GRANULARITY)));
pmp.addr_mask(r)(i) <= not and_all_f(pmp_addr_i(r)(i-1 downto PMP_GRANULARITY));
end if;
end loop; -- i
end loop; -- r
/rtl/core/neorv32_cpu_control.vhd
50,6 → 50,7
HW_THREAD_ID : std_ulogic_vector(31 downto 0):= x"00000000"; -- hardware thread id
CPU_BOOT_ADDR : std_ulogic_vector(31 downto 0):= x"00000000"; -- cpu boot address
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension?
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension?
79,7 → 80,6
imm_o : out std_ulogic_vector(data_width_c-1 downto 0); -- immediate
fetch_pc_o : out std_ulogic_vector(data_width_c-1 downto 0); -- PC for instruction fetch
curr_pc_o : out std_ulogic_vector(data_width_c-1 downto 0); -- current PC (corresponding to current instruction)
next_pc_o : out std_ulogic_vector(data_width_c-1 downto 0); -- next PC (corresponding to current instruction)
csr_rdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- CSR read data
-- interrupts (risc-v compliant) --
msw_irq_i : in std_ulogic; -- machine software interrupt
164,14 → 164,16
signal cmd_issue : cmd_issue_t;
 
-- instruction execution engine --
type execute_engine_state_t is (SYS_WAIT, DISPATCH, TRAP, EXECUTE, ALU_WAIT, BRANCH, LOADSTORE_0, LOADSTORE_1, LOADSTORE_2, CSR_ACCESS);
type execute_engine_state_t is (SYS_WAIT, DISPATCH, TRAP, EXECUTE, ALU_WAIT, BRANCH, FENCE_OP, LOADSTORE_0, LOADSTORE_1, LOADSTORE_2, SYS_ENV, CSR_ACCESS);
type execute_engine_t is record
state : execute_engine_state_t;
state_prev : execute_engine_state_t;
state_nxt : execute_engine_state_t;
--
i_reg : std_ulogic_vector(31 downto 0);
i_reg_nxt : std_ulogic_vector(31 downto 0);
i_reg_last : std_ulogic_vector(31 downto 0); -- last executed instruction
--
is_ci : std_ulogic; -- current instruction is de-compressed instruction
is_ci_nxt : std_ulogic;
is_jump : std_ulogic; -- current instruction is jump instruction
178,16 → 180,18
is_jump_nxt : std_ulogic;
is_cp_op : std_ulogic; -- current instruction is a co-processor operation
is_cp_op_nxt : std_ulogic;
--
branch_taken : std_ulogic; -- branch condition fullfilled
pc : std_ulogic_vector(data_width_c-1 downto 0); -- actual PC, corresponding to current executed instruction
pc_nxt : std_ulogic_vector(data_width_c-1 downto 0);
pc_mux_sel : std_ulogic_vector(1 downto 0); -- source select for PC update
pc_we : std_ulogic; -- PC update enabled
next_pc : std_ulogic_vector(data_width_c-1 downto 0); -- next PC, corresponding to next instruction to be executed
last_pc : std_ulogic_vector(data_width_c-1 downto 0); -- PC of last executed instruction
last_pc_nxt : std_ulogic_vector(data_width_c-1 downto 0); -- PC of last executed instruction
--
sleep : std_ulogic; -- CPU in sleep mode
sleep_nxt : std_ulogic; -- CPU in sleep mode
sleep_nxt : std_ulogic;
if_rst : std_ulogic; -- instruction fetch was reset
if_rst_nxt : std_ulogic; -- instruction fetch was reset
if_rst_nxt : std_ulogic;
end record;
signal execute_engine : execute_engine_t;
 
214,6 → 218,16
break_point : std_ulogic;
end record;
signal trap_ctrl : trap_ctrl_t;
 
-- atomic operations controller --
type atomic_ctrl_t is record
env_start : std_ulogic; -- begin atomic operations
env_end : std_ulogic; -- end atomic operations
env_end_ff : std_ulogic; -- end atomic operations dealyed
env_abort : std_ulogic; -- atomic operations abort (results in failure)
lock : std_ulogic; -- lock status
end record;
signal atomic_ctrl : atomic_ctrl_t;
-- CPU control signals --
signal ctrl_nxt, ctrl : std_ulogic_vector(ctrl_width_c-1 downto 0);
331,10 → 345,9
when IFETCH_ISSUE => -- store instruction data to prefetch buffer
-- ------------------------------------------------------------
if (bus_i_wait_i = '0') or (be_instr_i = '1') or (ma_instr_i = '1') then -- wait for bus response
fetch_engine.bus_err_ack <= '1'; -- acknowledge any instruction bus errors, the execute engine has to take care of them / terminate current transfer
fetch_engine.pc_nxt <= std_ulogic_vector(unsigned(fetch_engine.pc) + 4);
ipb.we <= '1';
fetch_engine.state_nxt <= IFETCH_REQUEST;
fetch_engine.pc_nxt <= std_ulogic_vector(unsigned(fetch_engine.pc) + 4);
ipb.we <= '1';
fetch_engine.state_nxt <= IFETCH_REQUEST;
end if;
 
when others => -- undefined
446,7 → 459,7
 
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
cmd_issue.valid <= '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';
460,7 → 473,7
 
else -- begin check in HIGH instruction half-word
if (execute_engine.state = DISPATCH) then
cmd_issue.valid <= '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 (issue_engine.buf(1 downto 0) = "11") then -- uncompressed and "unaligned"
ipb.re <= '1';
526,35 → 539,41
begin
opcode_v := execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c+2) & "11";
if rising_edge(clk_i) then
case opcode_v is -- save some bits here, LSBs are always 11 for rv32
when opcode_store_c => -- S-immediate
imm_o(31 downto 11) <= (others => execute_engine.i_reg(31)); -- sign extension
imm_o(10 downto 05) <= execute_engine.i_reg(30 downto 25);
imm_o(04 downto 01) <= execute_engine.i_reg(11 downto 08);
imm_o(00) <= execute_engine.i_reg(07);
when opcode_branch_c => -- B-immediate
imm_o(31 downto 12) <= (others => execute_engine.i_reg(31)); -- sign extension
imm_o(11) <= execute_engine.i_reg(07);
imm_o(10 downto 05) <= execute_engine.i_reg(30 downto 25);
imm_o(04 downto 01) <= execute_engine.i_reg(11 downto 08);
imm_o(00) <= '0';
when opcode_lui_c | opcode_auipc_c => -- U-immediate
imm_o(31 downto 20) <= execute_engine.i_reg(31 downto 20);
imm_o(19 downto 12) <= execute_engine.i_reg(19 downto 12);
imm_o(11 downto 00) <= (others => '0');
when opcode_jal_c => -- J-immediate
imm_o(31 downto 20) <= (others => execute_engine.i_reg(31)); -- sign extension
imm_o(19 downto 12) <= execute_engine.i_reg(19 downto 12);
imm_o(11) <= execute_engine.i_reg(20);
imm_o(10 downto 05) <= execute_engine.i_reg(30 downto 25);
imm_o(04 downto 01) <= execute_engine.i_reg(24 downto 21);
imm_o(00) <= '0';
when others => -- I-immediate
imm_o(31 downto 11) <= (others => execute_engine.i_reg(31)); -- sign extension
imm_o(10 downto 05) <= execute_engine.i_reg(30 downto 25);
imm_o(04 downto 01) <= execute_engine.i_reg(24 downto 21);
imm_o(00) <= execute_engine.i_reg(20);
end case;
if (execute_engine.state = BRANCH) then -- next_PC as immediate fro jump-and-link operations (=return address)
imm_o <= execute_engine.next_pc;
else -- "nromal" immediate from instruction
case opcode_v is -- save some bits here, LSBs are always 11 for rv32
when opcode_store_c => -- S-immediate
imm_o(31 downto 11) <= (others => execute_engine.i_reg(31)); -- sign extension
imm_o(10 downto 05) <= execute_engine.i_reg(30 downto 25);
imm_o(04 downto 01) <= execute_engine.i_reg(11 downto 08);
imm_o(00) <= execute_engine.i_reg(07);
when opcode_branch_c => -- B-immediate
imm_o(31 downto 12) <= (others => execute_engine.i_reg(31)); -- sign extension
imm_o(11) <= execute_engine.i_reg(07);
imm_o(10 downto 05) <= execute_engine.i_reg(30 downto 25);
imm_o(04 downto 01) <= execute_engine.i_reg(11 downto 08);
imm_o(00) <= '0';
when opcode_lui_c | opcode_auipc_c => -- U-immediate
imm_o(31 downto 20) <= execute_engine.i_reg(31 downto 20);
imm_o(19 downto 12) <= execute_engine.i_reg(19 downto 12);
imm_o(11 downto 00) <= (others => '0');
when opcode_jal_c => -- J-immediate
imm_o(31 downto 20) <= (others => execute_engine.i_reg(31)); -- sign extension
imm_o(19 downto 12) <= execute_engine.i_reg(19 downto 12);
imm_o(11) <= execute_engine.i_reg(20);
imm_o(10 downto 05) <= execute_engine.i_reg(30 downto 25);
imm_o(04 downto 01) <= execute_engine.i_reg(24 downto 21);
imm_o(00) <= '0';
when opcode_atomic_c => -- atomic memory access
imm_o <= (others => '0'); -- effective address is reg + 0
when others => -- I-immediate
imm_o(31 downto 11) <= (others => execute_engine.i_reg(31)); -- sign extension
imm_o(10 downto 05) <= execute_engine.i_reg(30 downto 25);
imm_o(04 downto 01) <= execute_engine.i_reg(24 downto 21);
imm_o(00) <= execute_engine.i_reg(20);
end case;
end if;
end if;
end process imm_gen;
 
585,13 → 604,20
begin
if (rstn_i = '0') then
execute_engine.pc <= CPU_BOOT_ADDR(data_width_c-1 downto 1) & '0';
execute_engine.last_pc <= CPU_BOOT_ADDR(data_width_c-1 downto 1) & '0';
execute_engine.state <= SYS_WAIT;
execute_engine.sleep <= '0';
execute_engine.if_rst <= '1'; -- instruction fetch is reset after system reset
elsif rising_edge(clk_i) then
execute_engine.pc <= execute_engine.pc_nxt(data_width_c-1 downto 1) & '0';
execute_engine.last_pc <= execute_engine.last_pc_nxt;
-- PC update --
if (execute_engine.pc_we = '1') then
case execute_engine.pc_mux_sel is
when "00" => execute_engine.pc <= execute_engine.next_pc(data_width_c-1 downto 1) & '0'; -- normal (linear) increment
when "01" => execute_engine.pc <= alu_add_i(data_width_c-1 downto 1) & '0'; -- jump/branch
when "10" => execute_engine.pc <= csr.mtvec(data_width_c-1 downto 1) & '0'; -- trap
when others => execute_engine.pc <= csr.mepc(data_width_c-1 downto 1) & '0'; -- trap return
end case;
end if;
--
execute_engine.state <= execute_engine.state_nxt;
execute_engine.sleep <= execute_engine.sleep_nxt;
execute_engine.if_rst <= execute_engine.if_rst_nxt;
608,29 → 634,29
execute_engine.is_ci <= execute_engine.is_ci_nxt;
execute_engine.is_jump <= execute_engine.is_jump_nxt;
execute_engine.is_cp_op <= execute_engine.is_cp_op_nxt;
--
if (execute_engine.state = EXECUTE) then
execute_engine.i_reg_last <= execute_engine.i_reg;
end if;
-- next PC --
-- next PC (next linear instruction) --
if (execute_engine.is_ci = '1') then -- compressed instruction?
execute_engine.next_pc <= std_ulogic_vector(unsigned(execute_engine.pc) + 2);
else
execute_engine.next_pc <= std_ulogic_vector(unsigned(execute_engine.pc) + 4);
end if;
--
-- PC & IR of last "executed" instruction --
if (execute_engine.state = EXECUTE) then
execute_engine.last_pc <= execute_engine.pc;
execute_engine.i_reg_last <= execute_engine.i_reg;
end if;
-- main control bus --
ctrl <= ctrl_nxt;
end if;
end process execute_engine_fsm_sync;
 
-- PC output --
curr_pc_o <= execute_engine.pc(data_width_c-1 downto 1) & '0';
next_pc_o <= execute_engine.next_pc(data_width_c-1 downto 1) & '0';
curr_pc_o <= execute_engine.pc(data_width_c-1 downto 1) & '0'; -- PC for ALU ops
 
 
-- CPU Control Bus Output -----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
ctrl_output: process(ctrl, fetch_engine, trap_ctrl, bus_fast_ir, execute_engine, csr.privilege)
ctrl_output: process(ctrl, fetch_engine, trap_ctrl, atomic_ctrl, bus_fast_ir, execute_engine, csr.privilege)
begin
-- signals from execute engine --
ctrl_o <= ctrl;
648,6 → 674,8
-- instruction's function blocks (for co-processors) --
ctrl_o(ctrl_ir_funct12_11_c downto ctrl_ir_funct12_0_c) <= execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c);
ctrl_o(ctrl_ir_funct3_2_c downto ctrl_ir_funct3_0_c) <= execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c);
-- locked bus operation (for atomica memory operations) --
ctrl_o(ctrl_bus_lock_c) <= atomic_ctrl.lock; -- (bus) lock status
end process ctrl_output;
 
 
654,10 → 682,12
-- Execute Engine FSM Comb ----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
execute_engine_fsm_comb: process(execute_engine, fetch_engine, cmd_issue, trap_ctrl, csr, ctrl, csr_acc_valid,
alu_add_i, alu_wait_i, bus_d_wait_i, ma_load_i, be_load_i, ma_store_i, be_store_i)
alu_wait_i, bus_d_wait_i, ma_load_i, be_load_i, ma_store_i, be_store_i)
variable alu_immediate_v : std_ulogic;
variable rs1_is_r0_v : std_ulogic;
variable opcode_v : std_ulogic_vector(6 downto 0);
variable is_atomic_lr_v : std_ulogic;
variable is_atomic_sc_v : std_ulogic;
begin
-- arbiter defaults --
execute_engine.state_nxt <= execute_engine.state;
665,10 → 695,11
execute_engine.is_jump_nxt <= '0';
execute_engine.is_cp_op_nxt <= execute_engine.is_cp_op;
execute_engine.is_ci_nxt <= execute_engine.is_ci;
execute_engine.pc_nxt <= execute_engine.pc;
execute_engine.last_pc_nxt <= execute_engine.last_pc;
execute_engine.sleep_nxt <= execute_engine.sleep;
execute_engine.if_rst_nxt <= execute_engine.if_rst;
--
execute_engine.pc_mux_sel <= (others => '0');
execute_engine.pc_we <= '0';
 
-- instruction dispatch --
fetch_engine.reset <= '0';
688,7 → 719,12
csr.we_nxt <= '0';
csr.re_nxt <= '0';
 
-- control defaults --
-- atomic operations control --
atomic_ctrl.env_start <= '0';
atomic_ctrl.env_end <= '0';
atomic_ctrl.env_abort <= '0';
 
-- CONTROL DEFAULTS --
ctrl_nxt <= (others => '0'); -- default: all off
if (execute_engine.i_reg(instr_opcode_lsb_c+4) = '1') then -- ALU ops
ctrl_nxt(ctrl_alu_unsigned_c) <= execute_engine.i_reg(instr_funct3_lsb_c+0); -- unsigned ALU operation? (SLTIU, SLTU)
695,12 → 731,19
else -- branches
ctrl_nxt(ctrl_alu_unsigned_c) <= execute_engine.i_reg(instr_funct3_lsb_c+1); -- unsigned branches? (BLTU, BGEU)
end if;
ctrl_nxt(ctrl_bus_unsigned_c) <= execute_engine.i_reg(instr_funct3_msb_c); -- unsigned LOAD (LBU, LHU)
-- memor access --
ctrl_nxt(ctrl_bus_unsigned_c) <= execute_engine.i_reg(instr_funct3_msb_c); -- unsigned LOAD (LBU, LHU)
ctrl_nxt(ctrl_bus_size_msb_c downto ctrl_bus_size_lsb_c) <= execute_engine.i_reg(instr_funct3_lsb_c+1 downto instr_funct3_lsb_c); -- mem transfer size
-- alu.shifter --
ctrl_nxt(ctrl_alu_shift_dir_c) <= execute_engine.i_reg(instr_funct3_msb_c); -- shift direction (left/right)
ctrl_nxt(ctrl_alu_shift_ar_c) <= execute_engine.i_reg(30); -- is arithmetic shift
ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_addsub_c; -- default ALU operation: ADD(I)
ctrl_nxt(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) <= cp_sel_muldiv_c; -- only CP0 (=MULDIV) implemented yet
ctrl_nxt(ctrl_bus_size_msb_c downto ctrl_bus_size_lsb_c) <= execute_engine.i_reg(instr_funct3_lsb_c+1 downto instr_funct3_lsb_c); -- mem transfer size
-- ALU control --
ctrl_nxt(ctrl_alu_addsub_c) <= '0'; -- ADD(I)
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_arith_c; -- default ALU function select: arithmetic
ctrl_nxt(ctrl_alu_arith_c) <= alu_arith_cmd_addsub_c; -- default ALU arithmetic operation: ADDSUB
ctrl_nxt(ctrl_alu_logic1_c downto ctrl_alu_logic0_c) <= alu_logic_cmd_movb_c; -- default ALU logic operation: MOVB
-- co-processor id --
ctrl_nxt(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) <= cp_sel_muldiv_c; -- default CP = MULDIV
 
-- is immediate ALU operation? --
alu_immediate_v := not execute_engine.i_reg(instr_opcode_msb_c-1);
708,7 → 751,16
-- is rs1 == r0? --
rs1_is_r0_v := not or_all_f(execute_engine.i_reg(instr_rs1_msb_c downto instr_rs1_lsb_c));
 
-- is atomic load-reservate/store-conditional? --
if (CPU_EXTENSION_RISCV_A = true) and (execute_engine.i_reg(instr_opcode_lsb_c+2) = '1') then -- valid atomic sub-opcode
is_atomic_lr_v := not execute_engine.i_reg(instr_funct5_lsb_c);
is_atomic_sc_v := execute_engine.i_reg(instr_funct5_lsb_c);
else
is_atomic_lr_v := '0';
is_atomic_sc_v := '0';
end if;
 
 
-- state machine --
case execute_engine.state is
 
722,8 → 774,10
--
execute_engine.state_nxt <= DISPATCH;
 
 
when DISPATCH => -- Get new command from instruction issue engine
-- ------------------------------------------------------------
execute_engine.pc_mux_sel <= "00"; -- linear next PC
if (cmd_issue.valid = '1') then -- instruction available?
-- IR update --
execute_engine.is_ci_nxt <= cmd_issue.data(32); -- flag to indicate this is a de-compressed instruction beeing executed
734,7 → 788,7
-- PC update --
execute_engine.if_rst_nxt <= '0';
if (execute_engine.if_rst = '0') then -- if there was NO non-linear PC modification
execute_engine.pc_nxt <= execute_engine.next_pc(data_width_c-1 downto 1) & '0';
execute_engine.pc_we <= '1';
end if;
-- any reason to go to trap state FAST? --
if (execute_engine.sleep = '1') or (trap_ctrl.env_start = '1') or (trap_ctrl.exc_fire = '1') or ((cmd_issue.data(33) or cmd_issue.data(34)) = '1') then
744,49 → 798,38
end if;
end if;
 
 
when TRAP => -- Start trap environment (also used as cpu sleep state)
-- ------------------------------------------------------------
execute_engine.pc_mux_sel <= "10"; -- csr.mtvec (trap)
-- stay here for sleep
if (trap_ctrl.env_start = '1') then -- trap triggered?
fetch_engine.reset <= '1';
execute_engine.if_rst_nxt <= '1'; -- this is a non-linear PC modification
trap_ctrl.env_start_ack <= '1';
execute_engine.pc_nxt <= csr.mtvec;
execute_engine.pc_we <= '1';
execute_engine.sleep_nxt <= '0'; -- waky waky
execute_engine.state_nxt <= SYS_WAIT;
end if;
 
 
when EXECUTE => -- Decode and execute instruction
-- ------------------------------------------------------------
execute_engine.last_pc_nxt <= execute_engine.pc; -- store address of current instruction for commit
--
opcode_v := execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c+2) & "11"; -- save some bits here, LSBs are always 11 for rv32
case opcode_v is
 
when opcode_alu_c | opcode_alui_c => -- (immediate) ALU operation
-- ------------------------------------------------------------
ctrl_nxt(ctrl_alu_opa_mux_c) <= '0'; -- use RS1 as ALU.OPA
ctrl_nxt(ctrl_alu_opb_mux_c) <= alu_immediate_v; -- use IMM as ALU.OPB for immediate operations
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "00"; -- RF input = ALU result
ctrl_nxt(ctrl_alu_opa_mux_c) <= '0'; -- use RS1 as ALU.OPA
ctrl_nxt(ctrl_alu_opb_mux_c) <= alu_immediate_v; -- use IMM as ALU.OPB for immediate operations
ctrl_nxt(ctrl_rf_in_mux_msb_c) <= '0'; -- RF input = ALU result
 
-- cp access? --
if (CPU_EXTENSION_RISCV_M = true) and (execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alu_c(5)) and
(execute_engine.i_reg(instr_funct7_lsb_c) = '1') then -- MULDIV?
ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_cp_c;
execute_engine.is_cp_op_nxt <= '1'; -- use CP
-- ALU operation --
-- ALU arithmetic operation type and ADD/SUB --
if (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_slt_c) or
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sltu_c) then
ctrl_nxt(ctrl_alu_arith_c) <= alu_arith_cmd_slt_c;
else
case execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) is -- actual ALU operation (re-coding)
when funct3_sll_c => ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_shift_c; -- SLL(I)
when funct3_slt_c => ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_slt_c; -- SLT(I)
when funct3_sltu_c => ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_slt_c; -- SLTU(I)
when funct3_xor_c => ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_xor_c; -- XOR(I)
when funct3_sr_c => ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_shift_c; -- SRL(I) / SRA(I)
when funct3_or_c => ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_or_c; -- OR(I)
when funct3_and_c => ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_and_c; -- AND(I)
when others => ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_addsub_c; -- ADD(I) / SUB
end case;
execute_engine.is_cp_op_nxt <= '0'; -- no CP operation
ctrl_nxt(ctrl_alu_arith_c) <= alu_arith_cmd_addsub_c;
end if;
 
-- ADD/SUB --
798,10 → 841,32
ctrl_nxt(ctrl_alu_addsub_c) <= '0'; -- ADD(I)
end if;
 
-- ALU logic operation --
case execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) is -- actual ALU.logic operation (re-coding)
when funct3_xor_c => ctrl_nxt(ctrl_alu_logic1_c downto ctrl_alu_logic0_c) <= alu_logic_cmd_xor_c; -- XOR(I)
when funct3_or_c => ctrl_nxt(ctrl_alu_logic1_c downto ctrl_alu_logic0_c) <= alu_logic_cmd_or_c; -- OR(I)
when funct3_and_c => ctrl_nxt(ctrl_alu_logic1_c downto ctrl_alu_logic0_c) <= alu_logic_cmd_and_c; -- AND(I)
when others => ctrl_nxt(ctrl_alu_logic1_c downto ctrl_alu_logic0_c) <= alu_logic_cmd_movb_c; -- undefined
end case;
 
-- cp access? --
if (CPU_EXTENSION_RISCV_M = true) and (execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alu_c(5)) and (execute_engine.i_reg(instr_funct7_lsb_c) = '1') then -- MULDIV CP op?
execute_engine.is_cp_op_nxt <= '1'; -- this is a CP operation
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_copro_c;
-- ALU operation - function select --
else
execute_engine.is_cp_op_nxt <= '0'; -- no CP operation
case execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) is -- actual ALU.func operation (re-coding)
when funct3_xor_c | funct3_or_c | funct3_and_c => ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_logic_c;
when funct3_sll_c | funct3_sr_c => ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_shift_c;
when others => ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_arith_c;
end case;
end if;
 
-- multi cycle alu operation? --
if (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sll_c) or -- SLL shift operation?
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sr_c) or -- SR shift operation?
((execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alu_c(5)) and (execute_engine.i_reg(instr_funct7_lsb_c) = '1') and (CPU_EXTENSION_RISCV_M = true)) then -- MULDIV?
((CPU_EXTENSION_RISCV_M = true) and (execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alu_c(5)) and (execute_engine.i_reg(instr_funct7_lsb_c) = '1')) then -- MULDIV CP op?
execute_engine.state_nxt <= ALU_WAIT;
else -- single cycle ALU operation
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back
812,28 → 877,40
-- ------------------------------------------------------------
ctrl_nxt(ctrl_alu_opa_mux_c) <= '1'; -- ALU.OPA = PC (for AUIPC only)
ctrl_nxt(ctrl_alu_opb_mux_c) <= '1'; -- use IMM as ALU.OPB
ctrl_nxt(ctrl_alu_arith_c) <= alu_arith_cmd_addsub_c; -- actual ALU operation = ADD
ctrl_nxt(ctrl_alu_logic1_c downto ctrl_alu_logic0_c) <= alu_logic_cmd_movb_c; -- MOVB
if (execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_lui_c(5)) then -- LUI
ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_movb_c; -- actual ALU operation = MOVB
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_logic_c; -- actual ALU operation = MOVB
else -- AUIPC
ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_addsub_c; -- actual ALU operation = ADD
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_arith_c; -- actual ALU operation = ADD
end if;
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "00"; -- RF input = ALU result
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back
execute_engine.state_nxt <= DISPATCH;
ctrl_nxt(ctrl_rf_in_mux_msb_c) <= '0'; -- RF input = ALU result
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back
execute_engine.state_nxt <= DISPATCH;
 
when opcode_load_c | opcode_store_c => -- load/store
when opcode_load_c | opcode_store_c | opcode_atomic_c => -- load/store / atomic memory access
-- ------------------------------------------------------------
ctrl_nxt(ctrl_alu_opa_mux_c) <= '0'; -- use RS1 as ALU.OPA
ctrl_nxt(ctrl_alu_opb_mux_c) <= '1'; -- use IMM as ALU.OPB
ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_addsub_c; -- actual ALU operation = ADD
ctrl_nxt(ctrl_bus_mar_we_c) <= '1'; -- write to MAR
ctrl_nxt(ctrl_bus_mdo_we_c) <= '1'; -- write to MDO (only relevant for stores)
execute_engine.state_nxt <= LOADSTORE_0;
ctrl_nxt(ctrl_bus_mo_we_c) <= '1'; -- write to MAR and MDO (MDO only relevant for store)
--
if (CPU_EXTENSION_RISCV_A = false) or (execute_engine.i_reg(instr_opcode_lsb_c+2) = '0') then -- atomic (A) extension disabled or normal load/store
execute_engine.state_nxt <= LOADSTORE_0;
else -- atomic operation
atomic_ctrl.env_start <= not execute_engine.i_reg(instr_funct5_lsb_c); -- LR: start LOCKED memory access environment
if (execute_engine.i_reg(instr_funct5_msb_c downto instr_funct5_lsb_c) = funct5_a_sc_c) or -- store-conditional
(execute_engine.i_reg(instr_funct5_msb_c downto instr_funct5_lsb_c) = funct5_a_lr_c) then -- load-reservate
execute_engine.state_nxt <= LOADSTORE_0;
else -- unimplemented (atomic) instruction
execute_engine.state_nxt <= SYS_WAIT;
end if;
end if;
 
when opcode_branch_c | opcode_jal_c | opcode_jalr_c => -- branch / jump and link (with register)
-- ------------------------------------------------------------
ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_addsub_c; -- actual ALU operation = ADD
-- compute target address --
ctrl_nxt(ctrl_alu_arith_c) <= alu_arith_cmd_addsub_c; -- actual ALU operation = ADD
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_arith_c; -- actual ALU operation = ADD
if (execute_engine.i_reg(instr_opcode_lsb_c+3 downto instr_opcode_lsb_c+2) = opcode_jalr_c(3 downto 2)) then -- JALR
ctrl_nxt(ctrl_alu_opa_mux_c) <= '0'; -- use RS1 as ALU.OPA (branch target address base)
else -- JAL / branch
840,62 → 917,53
ctrl_nxt(ctrl_alu_opa_mux_c) <= '1'; -- use PC as ALU.OPA (branch target address base)
end if;
ctrl_nxt(ctrl_alu_opb_mux_c) <= '1'; -- use IMM as ALU.OPB (branch target address offset)
-- save return address --
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "10"; -- RF input = next PC (save return address)
ctrl_nxt(ctrl_rf_wb_en_c) <= execute_engine.i_reg(instr_opcode_lsb_c+2); -- valid RF write-back? (for JAL/JALR)
--
execute_engine.is_jump_nxt <= execute_engine.i_reg(instr_opcode_lsb_c+2); -- is this is a jump operation? (for JAL/JALR)
execute_engine.state_nxt <= BRANCH;
 
when opcode_fence_c => -- fence operations
-- ------------------------------------------------------------
execute_engine.state_nxt <= SYS_WAIT;
-- for simplicity: internally, fence and fence.i perform the same operations (clear and reload instruction prefetch buffer)
-- FENCE.I --
if (CPU_EXTENSION_RISCV_Zifencei = true) then
execute_engine.pc_nxt <= execute_engine.next_pc(data_width_c-1 downto 1) & '0'; -- "refetch" next instruction
execute_engine.if_rst_nxt <= '1'; -- this is a non-linear PC modification
fetch_engine.reset <= '1';
if (execute_engine.i_reg(instr_funct3_lsb_c) = funct3_fencei_c(0)) then
ctrl_nxt(ctrl_bus_fencei_c) <= '1';
end if;
end if;
-- FENCE --
if (execute_engine.i_reg(instr_funct3_lsb_c) = funct3_fence_c(0)) then
ctrl_nxt(ctrl_bus_fence_c) <= '1';
end if;
execute_engine.state_nxt <= FENCE_OP;
 
when opcode_syscsr_c => -- system/csr access
-- ------------------------------------------------------------
if (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_env_c) then -- system
case execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) is
when funct12_ecall_c => -- ECALL
trap_ctrl.env_call <= '1';
when funct12_ebreak_c => -- EBREAK
trap_ctrl.break_point <= '1';
when funct12_mret_c => -- MRET
trap_ctrl.env_end <= '1';
execute_engine.pc_nxt <= csr.mepc;
fetch_engine.reset <= '1';
execute_engine.if_rst_nxt <= '1'; -- this is a non-linear PC modification
when funct12_wfi_c => -- WFI
execute_engine.sleep_nxt <= '1'; -- good night
when others => -- undefined
NULL;
end case;
execute_engine.state_nxt <= SYS_WAIT;
csr.re_nxt <= '1'; -- always read CSR (internally), only relevant for CSR-instructions
if (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_env_c) then -- system/environment
execute_engine.state_nxt <= SYS_ENV;
else -- CSR access
csr.re_nxt <= '1'; -- always read CSR (internally)
execute_engine.state_nxt <= CSR_ACCESS;
end if;
 
when others => -- undefined
-- ------------------------------------------------------------
execute_engine.state_nxt <= DISPATCH;
execute_engine.state_nxt <= SYS_WAIT;
 
end case;
 
when CSR_ACCESS => -- write CSR data to RF, write ALU.res to CSR
 
when SYS_ENV => -- system environment operation - execution
-- ------------------------------------------------------------
execute_engine.pc_mux_sel <= "11"; -- csr.mepc (only for MRET)
case execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) is
when funct12_ecall_c => -- ECALL
trap_ctrl.env_call <= '1';
when funct12_ebreak_c => -- EBREAK
trap_ctrl.break_point <= '1';
when funct12_mret_c => -- MRET
trap_ctrl.env_end <= '1';
execute_engine.pc_we <= '1'; -- linear next PC
fetch_engine.reset <= '1';
execute_engine.if_rst_nxt <= '1'; -- this is a non-linear PC modification
when funct12_wfi_c => -- WFI
execute_engine.sleep_nxt <= '1'; -- good night
when others => -- undefined
NULL;
end case;
execute_engine.state_nxt <= SYS_WAIT;
 
 
when CSR_ACCESS => -- read & write status and control register (CSR)
-- ------------------------------------------------------------
-- CSR write access --
case execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) is
when funct3_csrrw_c | funct3_csrrwi_c => -- CSRRW(I)
908,17 → 976,18
-- register file write back --
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "11"; -- RF input = CSR output
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back
execute_engine.state_nxt <= SYS_WAIT; -- have another cycle to let side-effects kick in (FIXME?)
execute_engine.state_nxt <= DISPATCH;
 
 
when ALU_WAIT => -- wait for multi-cycle ALU operation (shifter or CP) to finish
-- ------------------------------------------------------------
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "00"; -- RF input = ALU result
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back (permanent write-back)
ctrl_nxt(ctrl_rf_in_mux_msb_c) <= '0'; -- RF input = ALU result
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back (permanent write-back)
-- cp access or alu shift? --
if (execute_engine.is_cp_op = '1') then
ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_cp_c;
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_copro_c;
else
ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_shift_c;
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_shift_c;
end if;
-- wait for result --
if (alu_wait_i = '0') then
925,10 → 994,19
execute_engine.state_nxt <= DISPATCH;
end if;
 
 
when BRANCH => -- update PC for taken branches and jumps
-- ------------------------------------------------------------
-- get and store return address (only relevant for jump-and-link operations) --
ctrl_nxt(ctrl_alu_opb_mux_c) <= '1'; -- use IMM as ALU.OPB (next_pc from immediate generator = return address)
ctrl_nxt(ctrl_alu_logic1_c downto ctrl_alu_logic0_c) <= alu_logic_cmd_movb_c; -- MOVB
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_logic_c; -- actual ALU operation = MOVB
ctrl_nxt(ctrl_rf_in_mux_msb_c) <= '0'; -- RF input = ALU result
ctrl_nxt(ctrl_rf_wb_en_c) <= execute_engine.is_jump; -- valid RF write-back? (is jump-and-link?)
-- destination address --
execute_engine.pc_mux_sel <= "01"; -- alu.add = branch/jump destination
if (execute_engine.is_jump = '1') or (execute_engine.branch_taken = '1') then
execute_engine.pc_nxt <= alu_add_i; -- branch/jump destination
execute_engine.pc_we <= '1'; -- update PC
fetch_engine.reset <= '1'; -- trigger new instruction fetch from modified PC
execute_engine.if_rst_nxt <= '1'; -- this is a non-linear PC modification
execute_engine.state_nxt <= SYS_WAIT;
936,33 → 1014,69
execute_engine.state_nxt <= DISPATCH;
end if;
 
 
when FENCE_OP => -- fence operations - execution
-- ------------------------------------------------------------
execute_engine.state_nxt <= SYS_WAIT;
execute_engine.pc_mux_sel <= "00"; -- linear next PC = "refetch" next instruction
-- FENCE.I --
if (execute_engine.i_reg(instr_funct3_lsb_c) = funct3_fencei_c(0)) and (CPU_EXTENSION_RISCV_Zifencei = true) then
execute_engine.pc_we <= '1';
execute_engine.if_rst_nxt <= '1'; -- this is a non-linear PC modification
fetch_engine.reset <= '1';
ctrl_nxt(ctrl_bus_fencei_c) <= '1';
end if;
-- FENCE --
if (execute_engine.i_reg(instr_funct3_lsb_c) = funct3_fence_c(0)) then
ctrl_nxt(ctrl_bus_fence_c) <= '1';
end if;
 
 
when LOADSTORE_0 => -- trigger memory request
-- ------------------------------------------------------------
if (execute_engine.i_reg(instr_opcode_msb_c-1) = '0') then -- LOAD
if (execute_engine.i_reg(instr_opcode_msb_c-1) = '0') or (is_atomic_lr_v = '1') then -- normal load or atomic load-reservate
ctrl_nxt(ctrl_bus_rd_c) <= '1'; -- read request
else -- STORE
else -- store
ctrl_nxt(ctrl_bus_wr_c) <= '1'; -- write request
end if;
execute_engine.state_nxt <= LOADSTORE_1;
 
 
when LOADSTORE_1 => -- memory latency
-- ------------------------------------------------------------
ctrl_nxt(ctrl_bus_mdi_we_c) <= '1'; -- write input data to MDI (only relevant for LOAD)
execute_engine.state_nxt <= LOADSTORE_2;
ctrl_nxt(ctrl_bus_mi_we_c) <= '1'; -- write input data to MDI (only relevant for LOAD)
execute_engine.state_nxt <= LOADSTORE_2;
 
 
when LOADSTORE_2 => -- wait for bus transaction to finish
-- ------------------------------------------------------------
ctrl_nxt(ctrl_bus_mdi_we_c) <= '1'; -- keep writing input data to MDI (only relevant for LOAD)
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "01"; -- RF input = memory input (only relevant for LOAD)
if (CPU_EXTENSION_RISCV_A = true) then -- only relevant for atomic operations
ctrl_nxt(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) <= cp_sel_atomic_c; -- SC: result comes from "atomic co-processor"
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_copro_c;
end if;
--
ctrl_nxt(ctrl_rf_in_mux_lsb_c) <= '0'; -- RF input = ALU.res or MEM
if (is_atomic_sc_v = '1') then
ctrl_nxt(ctrl_rf_in_mux_msb_c) <= '0'; -- RF input = ALU.res
else
ctrl_nxt(ctrl_rf_in_mux_msb_c) <= '1'; -- RF input = memory input (only relevant for LOAD)
end if;
--
ctrl_nxt(ctrl_bus_mi_we_c) <= '1'; -- keep writing input data to MDI (only relevant for load operations)
-- wait for memory response --
if ((ma_load_i or be_load_i or ma_store_i or be_store_i) = '1') then -- abort if exception
execute_engine.state_nxt <= DISPATCH;
atomic_ctrl.env_abort <= '1'; -- LOCKED (atomic) memory access environment failed (forces SC result to be non-zero => failure)
ctrl_nxt(ctrl_rf_wb_en_c) <= is_atomic_sc_v; -- SC failes: allow write back of non-zero result
execute_engine.state_nxt <= DISPATCH;
elsif (bus_d_wait_i = '0') then -- wait for bus to finish transaction
if (execute_engine.i_reg(instr_opcode_msb_c-1) = '0') then -- LOAD
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back (keep writing back all the time)
if (execute_engine.i_reg(instr_opcode_msb_c-1) = '0') or (is_atomic_lr_v = '1') or (is_atomic_sc_v = '1') then -- load / load-reservate / store conditional
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back
end if;
atomic_ctrl.env_end <= '1'; -- normal end of LOCKED (atomic) memory access environment
execute_engine.state_nxt <= DISPATCH;
end if;
 
 
when others => -- undefined
-- ------------------------------------------------------------
execute_engine.state_nxt <= SYS_WAIT;
1003,7 → 1117,7
-- check CSR access --
case execute_engine.i_reg(instr_csr_id_msb_c downto instr_csr_id_lsb_c) is
when csr_mstatus_c => csr_acc_valid <= is_m_mode_v; -- M-mode only
when csr_misa_c => csr_acc_valid <= is_m_mode_v;-- and (not csr_wacc_v); -- M-mode only, MISA is read-only for the NEORV32 but we don't cause an exception here for compatibility
when csr_misa_c => csr_acc_valid <= is_m_mode_v;-- and (not csr_wacc_v); -- M-mode only, MISA is read-only in the NEORV32 but we don't cause an exception here for compatibility
when csr_mie_c => csr_acc_valid <= is_m_mode_v; -- M-mode only
when csr_mtvec_c => csr_acc_valid <= is_m_mode_v; -- M-mode only
when csr_mscratch_c => csr_acc_valid <= is_m_mode_v; -- M-mode only
1095,7 → 1209,7
if (CPU_EXTENSION_RISCV_E = true) and ((execute_engine.i_reg(instr_rs1_msb_c) = '1') or (execute_engine.i_reg(instr_rd_msb_c) = '1')) then
illegal_register <= '1';
end if;
 
when opcode_load_c => -- check LOAD funct3
if (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_lb_c) or
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_lh_c) or
1110,7 → 1224,7
if (CPU_EXTENSION_RISCV_E = true) and ((execute_engine.i_reg(instr_rs1_msb_c) = '1') or (execute_engine.i_reg(instr_rd_msb_c) = '1')) then
illegal_register <= '1';
end if;
 
when opcode_store_c => -- check STORE funct3
if (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sb_c) or
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sh_c) or
1217,6 → 1331,15
illegal_instruction <= '1';
end if;
 
when opcode_atomic_c => -- atomic instructions --
if (CPU_EXTENSION_RISCV_A = true) and -- atomic memory operations (A extension) enabled
((execute_engine.i_reg(instr_funct5_msb_c downto instr_funct5_lsb_c) = funct5_a_lr_c) or -- LR
(execute_engine.i_reg(instr_funct5_msb_c downto instr_funct5_lsb_c) = funct5_a_sc_c)) then -- SC
illegal_instruction <= '0';
else
illegal_instruction <= '1';
end if;
 
when others => -- undefined instruction -> illegal!
illegal_instruction <= '1';
 
1271,11 → 1394,10
trap_ctrl.irq_buf(interrupt_firq_1_c) <= csr.mie_firqe(1) and (trap_ctrl.irq_buf(interrupt_firq_1_c) or firq_i(1)) and (not trap_ctrl.irq_ack(interrupt_firq_1_c));
trap_ctrl.irq_buf(interrupt_firq_2_c) <= csr.mie_firqe(2) and (trap_ctrl.irq_buf(interrupt_firq_2_c) or firq_i(2)) and (not trap_ctrl.irq_ack(interrupt_firq_2_c));
trap_ctrl.irq_buf(interrupt_firq_3_c) <= csr.mie_firqe(3) and (trap_ctrl.irq_buf(interrupt_firq_3_c) or firq_i(3)) and (not trap_ctrl.irq_ack(interrupt_firq_3_c));
 
-- trap control --
if (trap_ctrl.env_start = '0') then -- no started trap handler
if (trap_ctrl.exc_fire = '1') or ((trap_ctrl.irq_fire = '1') and -- exception/IRQ detected!
((execute_engine.state = EXECUTE) or (execute_engine.state = TRAP))) then -- sample IRQs in EXECUTE or TRAP state only -> continue execution even if permanent IRQ
((execute_engine.state = EXECUTE) or (execute_engine.state = TRAP))) then -- sample IRQs in EXECUTE or TRAP state only to continue execution even if permanent IRQ
trap_ctrl.cause <= trap_ctrl.cause_nxt; -- capture source ID for program (for mcause csr)
trap_ctrl.exc_ack <= '1'; -- clear execption
trap_ctrl.irq_ack <= trap_ctrl.irq_ack_nxt; -- capture and clear with interrupt ACK mask
1393,6 → 1515,31
trap_ctrl.irq_ack_nxt <= (others => '0');
end if;
end process trap_priority;
 
 
-- Atomic Operation Controller ------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
atomics_controller: process(rstn_i, clk_i)
begin
if (rstn_i = '0') then
atomic_ctrl.lock <= '0';
atomic_ctrl.env_end_ff <= '0';
elsif rising_edge(clk_i) then
if (CPU_EXTENSION_RISCV_A = true) then
if (atomic_ctrl.env_end_ff = '1') or -- normal termination
(atomic_ctrl.env_abort = '1') or -- fast temrination (error)
(trap_ctrl.env_start = '1') then -- triggered trap -> failure
atomic_ctrl.lock <= '0';
elsif (atomic_ctrl.env_start = '1') then
atomic_ctrl.lock <= '1';
end if;
atomic_ctrl.env_end_ff <= atomic_ctrl.env_end;
else
atomic_ctrl.lock <= '0';
atomic_ctrl.env_end_ff <= '0';
end if;
end if;
end process atomics_controller;
 
-- ****************************************************************************************************************************
1677,12 → 1824,9
csr.rdata(11) <= csr.mstatus_mpp(0); -- MPP: machine previous privilege mode low
csr.rdata(12) <= csr.mstatus_mpp(1); -- MPP: machine previous privilege mode high
when csr_misa_c => -- R/-: misa - ISA and extensions
csr.rdata(00) <= '0'; -- A CPU extension
csr.rdata(01) <= '0'; -- B CPU extension
csr.rdata(00) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_A); -- A CPU extension
csr.rdata(02) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_C); -- C CPU extension
csr.rdata(03) <= '0'; -- D CPU extension
csr.rdata(04) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- E CPU extension
csr.rdata(05) <= '0'; -- F CPU extension
csr.rdata(08) <= not bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- I CPU extension (if not E)
csr.rdata(12) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_M); -- M CPU extension
csr.rdata(20) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_U); -- U CPU extension
1851,7 → 1995,7
csr.rdata <= HW_THREAD_ID;
 
-- custom machine read-only CSRs --
when csr_mzext_c => -- R/-: mzext
when csr_mzext_c => -- R/-: mzext - available Z* extensions
csr.rdata(0) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_Zicsr); -- RISC-V.Zicsr CPU extension
csr.rdata(1) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_Zifencei); -- RISC-V.Zifencei CPU extension
csr.rdata(2) <= bool_to_ulogic_f(PMP_USE); -- RISC-V physical memory protection
/rtl/core/neorv32_cpu_cp_muldiv.vhd
73,6 → 73,7
signal state : state_t;
signal cnt : std_ulogic_vector(4 downto 0);
signal cp_op : std_ulogic_vector(2 downto 0); -- operation to execute
signal cp_op_ff : std_ulogic_vector(2 downto 0); -- operation that was executed
signal start : std_ulogic;
signal operation : std_ulogic;
signal opx, opy : std_ulogic_vector(data_width_c-1 downto 0); -- input operands
80,6 → 81,7
signal opy_is_signed : std_ulogic;
signal opy_is_zero : std_ulogic;
signal div_res_corr : std_ulogic;
signal valid : std_ulogic;
 
-- divider core --
signal remainder : std_ulogic_vector(data_width_c-1 downto 0);
111,13 → 113,15
opy <= (others => '0');
cnt <= (others => '0');
start <= '0';
valid_o <= '0';
valid <= '0';
div_res_corr <= '0';
opy_is_zero <= '0';
cp_op_ff <= (others => '0');
elsif rising_edge(clk_i) then
-- defaults --
start <= '0';
valid_o <= '0';
start <= '0';
valid <= '0';
cp_op_ff <= cp_op;
 
-- FSM --
case state is
182,8 → 186,8
state <= COMPLETED;
 
when COMPLETED =>
valid_o <= '1';
state <= IDLE;
valid <= '1';
state <= IDLE;
end case;
end if;
end process coprocessor_ctrl;
286,11 → 290,11
 
-- Data Output ----------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
operation_result: process(clk_i)
operation_result: process(valid, cp_op_ff, mul_product, div_res, quotient, opy_is_zero, rs1_i, remainder)
begin
if rising_edge(clk_i) then
res_o <= (others => '0'); -- default
case cp_op is
if (valid = '1') then
valid_o <= '1';
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 =>
303,13 → 307,14
if (opy_is_zero = '0') then
res_o <= div_res;
else
res_o <= opx;
res_o <= rs1_i;
end if;
when cp_op_remu_c =>
when others => -- cp_op_remu_c
res_o <= remainder;
when others => -- undefined
res_o <= (others => '0');
end case;
else
valid_o <= '0';
res_o <= (others => '0');
end if;
end process operation_result;
 
/rtl/core/neorv32_cpu_regfile.vhd
2,10 → 2,9
-- # << NEORV32 - CPU Data Register File >> #
-- # ********************************************************************************************* #
-- # General purpose data register file. 32 entries for normal mode (I), 16 entries for embedded #
-- # mode (E) when RISC-V "E" extension is enabled. Register zero (r0) is a normal physical #
-- # registers, that has to be initialized to zero by the CPU control system. For normal #
-- # operations r0 cannot be written. The register file uses synchronous reads. Hence it can be #
-- # mapped to FPGA block RAM. #
-- # mode (E) when RISC-V "E" extension is enabled. Register zero (r0) is a "normal" physical reg #
-- # that has to be initialized to zero by the CPU control system. For normal operations r0 cannot #
-- # be written. The register file uses synchronous reads so it can be mapped to FPGA block RAM. #
-- # ********************************************************************************************* #
-- # BSD 3-Clause License #
-- # #
57,7 → 56,6
mem_i : in std_ulogic_vector(data_width_c-1 downto 0); -- memory read data
alu_i : in std_ulogic_vector(data_width_c-1 downto 0); -- ALU result
csr_i : in std_ulogic_vector(data_width_c-1 downto 0); -- CSR read data
pc_i : in std_ulogic_vector(data_width_c-1 downto 0); -- current pc
-- data output --
rs1_o : out std_ulogic_vector(data_width_c-1 downto 0); -- operand 1
rs2_o : out std_ulogic_vector(data_width_c-1 downto 0) -- operand 2
71,6 → 69,7
type reg_file_emb_t is array (15 downto 0) of std_ulogic_vector(data_width_c-1 downto 0);
signal reg_file : reg_file_t;
signal reg_file_emb : reg_file_emb_t;
signal rf_mux_data : std_ulogic_vector(data_width_c-1 downto 0);
signal rf_write_data : std_ulogic_vector(data_width_c-1 downto 0); -- actual write-back data
signal rd_is_r0 : std_ulogic; -- writing to r0?
signal rf_we : std_ulogic;
78,29 → 77,6
 
begin
 
-- Input mux ------------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
input_mux: process(ctrl_i, mem_i, alu_i, pc_i, csr_i)
begin
case ctrl_i(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) is
when "00" => rf_write_data <= alu_i;
when "01" => rf_write_data <= mem_i;
when "10" => rf_write_data <= pc_i;
when others => rf_write_data <= csr_i;
end case;
end process input_mux;
 
-- check if we are writing to x0 --
rd_is_r0 <= not or_all_f(ctrl_i(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c)) when (CPU_EXTENSION_RISCV_E = false) else
not or_all_f(ctrl_i(ctrl_rf_rd_adr3_c downto ctrl_rf_rd_adr0_c));
 
-- valid RF write access --
rf_we <= (ctrl_i(ctrl_rf_wb_en_c) and (not rd_is_r0)) or ctrl_i(ctrl_rf_r0_we_c);
 
-- destination address --
dst_addr <= ctrl_i(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c) when (ctrl_i(ctrl_rf_r0_we_c) = '0') else (others => '0'); -- force dst=r0?
 
 
-- Register file read/write access --------------------------------------------------------
-- -------------------------------------------------------------------------------------------
rf_access: process(clk_i)
109,7 → 85,7
if (CPU_EXTENSION_RISCV_E = false) then -- normal register file with 32 entries
if (rf_we = '1') then
reg_file(to_integer(unsigned(dst_addr(4 downto 0)))) <= rf_write_data;
else -- read
else
rs1_o <= reg_file(to_integer(unsigned(ctrl_i(ctrl_rf_rs1_adr4_c downto ctrl_rf_rs1_adr0_c))));
rs2_o <= reg_file(to_integer(unsigned(ctrl_i(ctrl_rf_rs2_adr4_c downto ctrl_rf_rs2_adr0_c))));
end if;
116,7 → 92,7
else -- embedded register file with 16 entries
if (rf_we = '1') then
reg_file_emb(to_integer(unsigned(dst_addr(3 downto 0)))) <= rf_write_data;
else -- read
else
rs1_o <= reg_file_emb(to_integer(unsigned(ctrl_i(ctrl_rf_rs1_adr3_c downto ctrl_rf_rs1_adr0_c))));
rs2_o <= reg_file_emb(to_integer(unsigned(ctrl_i(ctrl_rf_rs2_adr3_c downto ctrl_rf_rs2_adr0_c))));
end if;
124,5 → 100,20
end if;
end process rf_access;
 
-- data input mux --
rf_write_data <= alu_i when (ctrl_i(ctrl_rf_in_mux_msb_c) = '0') else rf_mux_data;
rf_mux_data <= mem_i when (ctrl_i(ctrl_rf_in_mux_lsb_c) = '0') else csr_i;
 
-- check if we are writing to x0 --
rd_is_r0 <= not or_all_f(ctrl_i(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c)) when (CPU_EXTENSION_RISCV_E = false) else
not or_all_f(ctrl_i(ctrl_rf_rd_adr3_c downto ctrl_rf_rd_adr0_c));
 
-- valid RF write access --
rf_we <= (ctrl_i(ctrl_rf_wb_en_c) and (not rd_is_r0)) or ctrl_i(ctrl_rf_r0_we_c);
 
-- destination address --
dst_addr <= ctrl_i(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c) when (ctrl_i(ctrl_rf_r0_we_c) = '0') else (others => '0'); -- force dst=r0?
 
 
 
end neorv32_cpu_regfile_rtl;
/rtl/core/neorv32_package.vhd
42,7 → 42,7
-- -------------------------------------------------------------------------------------------
constant ispace_base_c : std_ulogic_vector(31 downto 0) := x"00000000"; -- default instruction memory address space base address
constant dspace_base_c : std_ulogic_vector(31 downto 0) := x"80000000"; -- default data memory address space base address
constant bus_timeout_c : natural := 127; -- cycles after which an *unacknwoledged* bus access will timeout and trigger an access exception
constant bus_timeout_c : natural := 127; -- cycles after which an *unacknowledged* bus access will timeout and trigger an access exception
constant wb_pipe_mode_c : boolean := false; -- false: classic/standard wishbone mode, true: pipelined wishbone mode
constant ipb_entries_c : natural := 2; -- entries in instruction prefetch buffer, must be a power of 2, default=2
constant rf_r0_is_reg_c : boolean := true; -- reg_file.r0 is a physical register that has to be initialized to zero by the CPU HW
50,7 → 50,7
-- Architecture Constants -----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
constant data_width_c : natural := 32; -- data width - do not change!
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01040702"; -- no touchy!
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01040801"; -- no touchy!
constant pmp_max_r_c : natural := 8; -- max PMP regions - FIXED!
constant archid_c : natural := 19; -- official NEORV32 architecture ID - hands off!
 
76,9 → 76,9
-- Processor-Internal Address Space Layout ------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- Internal Instruction Memory (IMEM) and Date Memory (DMEM) --
constant imem_base_c : std_ulogic_vector(data_width_c-1 downto 0) := ispace_base_c; -- internal instruction memory base address
constant dmem_base_c : std_ulogic_vector(data_width_c-1 downto 0) := dspace_base_c; -- internal data memory base address
--> sizea are configured via top's generic
constant imem_base_c : std_ulogic_vector(data_width_c-1 downto 0) := ispace_base_c; -- internal instruction memory base address
constant dmem_base_c : std_ulogic_vector(data_width_c-1 downto 0) := dspace_base_c; -- internal data memory base address
--> memory sizes are configured via top's generics
 
-- Internal Bootloader ROM --
constant boot_rom_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"FFFF0000"; -- bootloader base address, fixed!
161,8 → 161,8
-- Main Control Bus -----------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- register file --
constant ctrl_rf_in_mux_lsb_c : natural := 0; -- input source select lsb (00=ALU, 01=MEM)
constant ctrl_rf_in_mux_msb_c : natural := 1; -- input source select msb (10=PC, 11=CSR)
constant ctrl_rf_in_mux_lsb_c : natural := 0; -- input source select lsb (10=MEM, 11=CSR)
constant ctrl_rf_in_mux_msb_c : natural := 1; -- input source select msb (0-=ALU)
constant ctrl_rf_rs1_adr0_c : natural := 2; -- source register 1 address bit 0
constant ctrl_rf_rs1_adr1_c : natural := 3; -- source register 1 address bit 1
constant ctrl_rf_rs1_adr2_c : natural := 4; -- source register 1 address bit 2
181,53 → 181,55
constant ctrl_rf_wb_en_c : natural := 17; -- write back enable
constant ctrl_rf_r0_we_c : natural := 18; -- force write access and force rd=r0
-- alu --
constant ctrl_alu_cmd0_c : natural := 19; -- ALU command bit 0
constant ctrl_alu_cmd1_c : natural := 20; -- ALU command bit 1
constant ctrl_alu_cmd2_c : natural := 21; -- ALU command bit 2
constant ctrl_alu_addsub_c : natural := 22; -- 0=ADD, 1=SUB
constant ctrl_alu_opa_mux_c : natural := 23; -- operand A select (0=rs1, 1=PC)
constant ctrl_alu_opb_mux_c : natural := 24; -- operand B select (0=rs2, 1=IMM)
constant ctrl_alu_unsigned_c : natural := 25; -- is unsigned ALU operation
constant ctrl_alu_shift_dir_c : natural := 26; -- shift direction (0=left, 1=right)
constant ctrl_alu_shift_ar_c : natural := 27; -- is arithmetic shift
constant ctrl_alu_arith_c : natural := 19; -- ALU arithmetic command
constant ctrl_alu_logic0_c : natural := 20; -- ALU logic command bit 0
constant ctrl_alu_logic1_c : natural := 21; -- ALU logic command bit 1
constant ctrl_alu_func0_c : natural := 22; -- ALU function select command bit 0
constant ctrl_alu_func1_c : natural := 23; -- ALU function select command bit 1
constant ctrl_alu_addsub_c : natural := 24; -- 0=ADD, 1=SUB
constant ctrl_alu_opa_mux_c : natural := 25; -- operand A select (0=rs1, 1=PC)
constant ctrl_alu_opb_mux_c : natural := 26; -- operand B select (0=rs2, 1=IMM)
constant ctrl_alu_unsigned_c : natural := 27; -- is unsigned ALU operation
constant ctrl_alu_shift_dir_c : natural := 28; -- shift direction (0=left, 1=right)
constant ctrl_alu_shift_ar_c : natural := 29; -- is arithmetic shift
-- bus interface --
constant ctrl_bus_size_lsb_c : natural := 28; -- transfer size lsb (00=byte, 01=half-word)
constant ctrl_bus_size_msb_c : natural := 29; -- transfer size msb (10=word, 11=?)
constant ctrl_bus_rd_c : natural := 30; -- read data request
constant ctrl_bus_wr_c : natural := 31; -- write data request
constant ctrl_bus_if_c : natural := 32; -- instruction fetch request
constant ctrl_bus_mar_we_c : natural := 33; -- memory address register write enable
constant ctrl_bus_mdo_we_c : natural := 34; -- memory data out register write enable
constant ctrl_bus_mdi_we_c : natural := 35; -- memory data in register write enable
constant ctrl_bus_unsigned_c : natural := 36; -- is unsigned load
constant ctrl_bus_ierr_ack_c : natural := 37; -- acknowledge instruction fetch bus exceptions
constant ctrl_bus_derr_ack_c : natural := 38; -- acknowledge data access bus exceptions
constant ctrl_bus_fence_c : natural := 39; -- executed fence operation
constant ctrl_bus_fencei_c : natural := 40; -- executed fencei operation
constant ctrl_bus_size_lsb_c : natural := 30; -- transfer size lsb (00=byte, 01=half-word)
constant ctrl_bus_size_msb_c : natural := 31; -- transfer size msb (10=word, 11=?)
constant ctrl_bus_rd_c : natural := 32; -- read data request
constant ctrl_bus_wr_c : natural := 33; -- write data request
constant ctrl_bus_if_c : natural := 34; -- instruction fetch request
constant ctrl_bus_mo_we_c : natural := 35; -- memory address and data output register write enable
constant ctrl_bus_mi_we_c : natural := 36; -- memory data input register write enable
constant ctrl_bus_unsigned_c : natural := 37; -- is unsigned load
constant ctrl_bus_ierr_ack_c : natural := 38; -- acknowledge instruction fetch bus exceptions
constant ctrl_bus_derr_ack_c : natural := 39; -- acknowledge data access bus exceptions
constant ctrl_bus_fence_c : natural := 40; -- executed fence operation
constant ctrl_bus_fencei_c : natural := 41; -- executed fencei operation
constant ctrl_bus_lock_c : natural := 42; -- locked/exclusive bus access
-- co-processors --
constant ctrl_cp_id_lsb_c : natural := 41; -- cp select ID lsb
constant ctrl_cp_id_msb_c : natural := 42; -- cp select ID msb
constant ctrl_cp_id_lsb_c : natural := 43; -- cp select ID lsb
constant ctrl_cp_id_msb_c : natural := 44; -- cp select ID msb
-- current privilege level --
constant ctrl_priv_lvl_lsb_c : natural := 43; -- privilege level lsb
constant ctrl_priv_lvl_msb_c : natural := 44; -- privilege level msb
constant ctrl_priv_lvl_lsb_c : natural := 45; -- privilege level lsb
constant ctrl_priv_lvl_msb_c : natural := 46; -- privilege level msb
-- instruction's control blocks --
constant ctrl_ir_funct3_0_c : natural := 45; -- funct3 bit 0
constant ctrl_ir_funct3_1_c : natural := 46; -- funct3 bit 1
constant ctrl_ir_funct3_2_c : natural := 47; -- funct3 bit 2
constant ctrl_ir_funct12_0_c : natural := 48; -- funct12 bit 0
constant ctrl_ir_funct12_1_c : natural := 49; -- funct12 bit 1
constant ctrl_ir_funct12_2_c : natural := 50; -- funct12 bit 2
constant ctrl_ir_funct12_3_c : natural := 51; -- funct12 bit 3
constant ctrl_ir_funct12_4_c : natural := 52; -- funct12 bit 4
constant ctrl_ir_funct12_5_c : natural := 53; -- funct12 bit 5
constant ctrl_ir_funct12_6_c : natural := 54; -- funct12 bit 6
constant ctrl_ir_funct12_7_c : natural := 55; -- funct12 bit 7
constant ctrl_ir_funct12_8_c : natural := 56; -- funct12 bit 8
constant ctrl_ir_funct12_9_c : natural := 57; -- funct12 bit 9
constant ctrl_ir_funct12_10_c : natural := 58; -- funct12 bit 10
constant ctrl_ir_funct12_11_c : natural := 59; -- funct12 bit 11
constant ctrl_ir_funct3_0_c : natural := 47; -- funct3 bit 0
constant ctrl_ir_funct3_1_c : natural := 48; -- funct3 bit 1
constant ctrl_ir_funct3_2_c : natural := 49; -- funct3 bit 2
constant ctrl_ir_funct12_0_c : natural := 50; -- funct12 bit 0
constant ctrl_ir_funct12_1_c : natural := 51; -- funct12 bit 1
constant ctrl_ir_funct12_2_c : natural := 52; -- funct12 bit 2
constant ctrl_ir_funct12_3_c : natural := 53; -- funct12 bit 3
constant ctrl_ir_funct12_4_c : natural := 54; -- funct12 bit 4
constant ctrl_ir_funct12_5_c : natural := 55; -- funct12 bit 5
constant ctrl_ir_funct12_6_c : natural := 56; -- funct12 bit 6
constant ctrl_ir_funct12_7_c : natural := 57; -- funct12 bit 7
constant ctrl_ir_funct12_8_c : natural := 58; -- funct12 bit 8
constant ctrl_ir_funct12_9_c : natural := 59; -- funct12 bit 9
constant ctrl_ir_funct12_10_c : natural := 60; -- funct12 bit 10
constant ctrl_ir_funct12_11_c : natural := 61; -- funct12 bit 11
-- control bus size --
constant ctrl_width_c : natural := 60; -- control bus size
constant ctrl_width_c : natural := 62; -- control bus size
 
-- ALU Comparator Bus ---------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
256,6 → 258,8
constant instr_imm20_msb_c : natural := 31; -- immediate20 bit 21
constant instr_csr_id_lsb_c : natural := 20; -- csr select bit 0
constant instr_csr_id_msb_c : natural := 31; -- csr select bit 11
constant instr_funct5_lsb_c : natural := 27; -- funct5 select bit 0
constant instr_funct5_msb_c : natural := 31; -- funct5 select bit 4
 
-- RISC-V Opcodes -------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
274,6 → 278,8
-- system/csr --
constant opcode_fence_c : std_ulogic_vector(6 downto 0) := "0001111"; -- fence / fence.i
constant opcode_syscsr_c : std_ulogic_vector(6 downto 0) := "1110011"; -- system/csr access (type via funct3)
-- atomic operations (A) --
constant opcode_atomic_c : std_ulogic_vector(6 downto 0) := "0101111"; -- atomic operations (A extension)
 
-- RISC-V Funct3 --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
315,7 → 321,7
constant funct3_fence_c : std_ulogic_vector(2 downto 0) := "000"; -- fence - order IO/memory access (->NOP)
constant funct3_fencei_c : std_ulogic_vector(2 downto 0) := "001"; -- fencei - instructon stream sync
 
-- RISC-V Funct12 --------------------------------------------------------------------------
-- RISC-V Funct12 -------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- system --
constant funct12_ecall_c : std_ulogic_vector(11 downto 0) := x"000"; -- ECALL
323,6 → 329,12
constant funct12_mret_c : std_ulogic_vector(11 downto 0) := x"302"; -- MRET
constant funct12_wfi_c : std_ulogic_vector(11 downto 0) := x"105"; -- WFI
 
-- RISC-V Funct5 --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- atomic operations --
constant funct5_a_lr_c : std_ulogic_vector(4 downto 0) := "00010"; -- LR
constant funct5_a_sc_c : std_ulogic_vector(4 downto 0) := "00011"; -- SC
 
-- RISC-V CSR Addresses -------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
constant csr_mstatus_c : std_ulogic_vector(11 downto 0) := x"300"; -- mstatus
372,10 → 384,10
-- Co-Processor Operations ----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- cp ids --
constant cp_sel_muldiv_c : std_ulogic_vector(1 downto 0) := "00"; -- MULDIV
constant cp_sel_bitmanip_c : std_ulogic_vector(1 downto 0) := "01"; -- BITMANIP
--constant cp_sel_reserved_c : std_ulogic_vector(1 downto 0) := "10"; -- reserved
--constant cp_sel_reserved_c : std_ulogic_vector(1 downto 0) := "11"; -- reserved
constant cp_sel_muldiv_c : std_ulogic_vector(1 downto 0) := "00"; -- MULDIV
constant cp_sel_atomic_c : std_ulogic_vector(1 downto 0) := "01"; -- atomic operations success/failure evaluation
--constant cp_sel_reserv_c : std_ulogic_vector(1 downto 0) := "10"; -- reserved
--constant cp_sel_reserv_c : std_ulogic_vector(1 downto 0) := "11"; -- reserved
-- muldiv cp --
constant cp_op_mul_c : std_ulogic_vector(2 downto 0) := "000"; -- mul
constant cp_op_mulh_c : std_ulogic_vector(2 downto 0) := "001"; -- mulh
388,36 → 400,41
 
-- ALU Function Codes ---------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
constant alu_cmd_addsub_c : std_ulogic_vector(2 downto 0) := "000"; -- r <= A +/- B
constant alu_cmd_slt_c : std_ulogic_vector(2 downto 0) := "001"; -- r <= A < B
constant alu_cmd_cp_c : std_ulogic_vector(2 downto 0) := "010"; -- r <= CP result (iterative)
constant alu_cmd_shift_c : std_ulogic_vector(2 downto 0) := "011"; -- r <= A <</>> B (iterative)
constant alu_cmd_movb_c : std_ulogic_vector(2 downto 0) := "100"; -- r <= B
constant alu_cmd_xor_c : std_ulogic_vector(2 downto 0) := "101"; -- r <= A xor B
constant alu_cmd_or_c : std_ulogic_vector(2 downto 0) := "110"; -- r <= A or B
constant alu_cmd_and_c : std_ulogic_vector(2 downto 0) := "111"; -- r <= A and B
-- arithmetic core --
constant alu_arith_cmd_addsub_c : std_ulogic := '0'; -- r.arith <= A +/- B
constant alu_arith_cmd_slt_c : std_ulogic := '1'; -- r.arith <= A < B
-- logic core --
constant alu_logic_cmd_movb_c : std_ulogic_vector(1 downto 0) := "00"; -- r.logic <= B
constant alu_logic_cmd_xor_c : std_ulogic_vector(1 downto 0) := "01"; -- r.logic <= A xor B
constant alu_logic_cmd_or_c : std_ulogic_vector(1 downto 0) := "10"; -- r.logic <= A or B
constant alu_logic_cmd_and_c : std_ulogic_vector(1 downto 0) := "11"; -- r.logic <= A and B
-- function select (actual alu result) --
constant alu_func_cmd_arith_c : std_ulogic_vector(1 downto 0) := "00"; -- r <= r.arith
constant alu_func_cmd_logic_c : std_ulogic_vector(1 downto 0) := "01"; -- r <= r.logic
constant alu_func_cmd_shift_c : std_ulogic_vector(1 downto 0) := "10"; -- r <= A <</>> B (iterative)
constant alu_func_cmd_copro_c : std_ulogic_vector(1 downto 0) := "11"; -- r <= CP result (iterative)
 
-- Trap ID Codes --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- risc-v compliant --
constant trap_ima_c : std_ulogic_vector(5 downto 0) := "000000"; -- 0.0: instruction misaligned
constant trap_iba_c : std_ulogic_vector(5 downto 0) := "000001"; -- 0.1: instruction access fault
constant trap_iil_c : std_ulogic_vector(5 downto 0) := "000010"; -- 0.2: illegal instruction
constant trap_brk_c : std_ulogic_vector(5 downto 0) := "000011"; -- 0.3: breakpoint
constant trap_lma_c : std_ulogic_vector(5 downto 0) := "000100"; -- 0.4: load address misaligned
constant trap_lbe_c : std_ulogic_vector(5 downto 0) := "000101"; -- 0.5: load access fault
constant trap_sma_c : std_ulogic_vector(5 downto 0) := "000110"; -- 0.6: store address misaligned
constant trap_sbe_c : std_ulogic_vector(5 downto 0) := "000111"; -- 0.7: store access fault
constant trap_menv_c : std_ulogic_vector(5 downto 0) := "001011"; -- 0.11: environment call from m-mode
--
constant trap_msi_c : std_ulogic_vector(5 downto 0) := "100011"; -- 1.3: machine software interrupt
constant trap_mti_c : std_ulogic_vector(5 downto 0) := "100111"; -- 1.7: machine timer interrupt
constant trap_mei_c : std_ulogic_vector(5 downto 0) := "101011"; -- 1.11: machine external interrupt
-- custom --
constant trap_firq0_c : std_ulogic_vector(5 downto 0) := "110000"; -- 1.16: fast interrupt 0
constant trap_firq1_c : std_ulogic_vector(5 downto 0) := "110001"; -- 1.17: fast interrupt 1
constant trap_firq2_c : std_ulogic_vector(5 downto 0) := "110010"; -- 1.18: fast interrupt 2
constant trap_firq3_c : std_ulogic_vector(5 downto 0) := "110011"; -- 1.19: fast interrupt 3
-- RISC-V compliant exceptions --
constant trap_ima_c : std_ulogic_vector(5 downto 0) := "0" & "00000"; -- 0.0: instruction misaligned
constant trap_iba_c : std_ulogic_vector(5 downto 0) := "0" & "00001"; -- 0.1: instruction access fault
constant trap_iil_c : std_ulogic_vector(5 downto 0) := "0" & "00010"; -- 0.2: illegal instruction
constant trap_brk_c : std_ulogic_vector(5 downto 0) := "0" & "00011"; -- 0.3: breakpoint
constant trap_lma_c : std_ulogic_vector(5 downto 0) := "0" & "00100"; -- 0.4: load address misaligned
constant trap_lbe_c : std_ulogic_vector(5 downto 0) := "0" & "00101"; -- 0.5: load access fault
constant trap_sma_c : std_ulogic_vector(5 downto 0) := "0" & "00110"; -- 0.6: store address misaligned
constant trap_sbe_c : std_ulogic_vector(5 downto 0) := "0" & "00111"; -- 0.7: store access fault
constant trap_menv_c : std_ulogic_vector(5 downto 0) := "0" & "01011"; -- 0.11: environment call from m-mode
-- RISC-V compliant interrupts --
constant trap_msi_c : std_ulogic_vector(5 downto 0) := "1" & "00011"; -- 1.3: machine software interrupt
constant trap_mti_c : std_ulogic_vector(5 downto 0) := "1" & "00111"; -- 1.7: machine timer interrupt
constant trap_mei_c : std_ulogic_vector(5 downto 0) := "1" & "01011"; -- 1.11: machine external interrupt
-- NEORV32-specific (custom) interrupts --
constant trap_firq0_c : std_ulogic_vector(5 downto 0) := "1" & "10000"; -- 1.16: fast interrupt 0
constant trap_firq1_c : std_ulogic_vector(5 downto 0) := "1" & "10001"; -- 1.17: fast interrupt 1
constant trap_firq2_c : std_ulogic_vector(5 downto 0) := "1" & "10010"; -- 1.18: fast interrupt 2
constant trap_firq3_c : std_ulogic_vector(5 downto 0) := "1" & "10011"; -- 1.19: fast interrupt 3
 
-- CPU Control Exception System -----------------------------------------------------------
-- -------------------------------------------------------------------------------------------
449,7 → 466,7
constant priv_mode_m_c : std_ulogic_vector(1 downto 0) := "11"; -- machine mode
constant priv_mode_u_c : std_ulogic_vector(1 downto 0) := "00"; -- user mode
 
-- Clock Generator -------------------------------------------------------------------------
-- Clock Generator ------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
constant clk_div2_c : natural := 0;
constant clk_div4_c : natural := 1;
470,12 → 487,13
USER_CODE : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom user code
HW_THREAD_ID : std_ulogic_vector(31 downto 0) := (others => '0'); -- hardware thread id (hartid)
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension?
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension?
CPU_EXTENSION_RISCV_U : boolean := false; -- implement user mode extension?
CPU_EXTENSION_RISCV_Zicsr : boolean := true; -- implement CSR system?
CPU_EXTENSION_RISCV_Zifencei : boolean := true; -- implement instruction stream sync.?
CPU_EXTENSION_RISCV_Zifencei : boolean := false; -- implement instruction stream sync.?
-- Extension Options --
FAST_MUL_EN : boolean := false; -- use DSPs for M extension's multiplier
FAST_SHIFT_EN : boolean := false; -- use barrel shifter for shift operations
517,6 → 535,7
wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable
wb_stb_o : out std_ulogic; -- strobe
wb_cyc_o : out std_ulogic; -- valid cycle
wb_lock_o : out std_ulogic; -- locked/exclusive bus access
wb_ack_i : in std_ulogic := '0'; -- transfer acknowledge
wb_err_i : in std_ulogic := '0'; -- transfer error
-- Advanced memory control signals (available if MEM_EXT_USE = true) --
553,6 → 572,7
HW_THREAD_ID : std_ulogic_vector(31 downto 0) := (others => '0'); -- hardware thread id
CPU_BOOT_ADDR : std_ulogic_vector(31 downto 0) := (others => '0'); -- cpu boot address
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension?
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension?
583,6 → 603,7
i_bus_err_i : in std_ulogic := '0'; -- bus transfer error
i_bus_fence_o : out std_ulogic; -- executed FENCEI operation
i_bus_priv_o : out std_ulogic_vector(1 downto 0); -- privilege level
i_bus_lock_o : out std_ulogic; -- locked/exclusive access
-- data bus interface --
d_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
d_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data
595,6 → 616,7
d_bus_err_i : in std_ulogic := '0'; -- bus transfer error
d_bus_fence_o : out std_ulogic; -- executed FENCE operation
d_bus_priv_o : out std_ulogic_vector(1 downto 0); -- privilege level
d_bus_lock_o : out std_ulogic; -- locked/exclusive access
-- system time input from MTIME --
time_i : in std_ulogic_vector(63 downto 0) := (others => '0'); -- current system time
-- interrupts (risc-v compliant) --
614,6 → 636,7
HW_THREAD_ID : std_ulogic_vector(31 downto 0):= x"00000000"; -- hardware thread id
CPU_BOOT_ADDR : std_ulogic_vector(31 downto 0):= x"00000000"; -- cpu boot address
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension?
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension?
643,7 → 666,6
imm_o : out std_ulogic_vector(data_width_c-1 downto 0); -- immediate
fetch_pc_o : out std_ulogic_vector(data_width_c-1 downto 0); -- PC for instruction fetch
curr_pc_o : out std_ulogic_vector(data_width_c-1 downto 0); -- current PC (corresponding to current instruction)
next_pc_o : out std_ulogic_vector(data_width_c-1 downto 0); -- next PC (corresponding to current instruction)
csr_rdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- CSR read data
-- interrupts (risc-v compliant) --
msw_irq_i : in std_ulogic; -- machine software interrupt
681,7 → 703,6
mem_i : in std_ulogic_vector(data_width_c-1 downto 0); -- memory read data
alu_i : in std_ulogic_vector(data_width_c-1 downto 0); -- ALU result
csr_i : in std_ulogic_vector(data_width_c-1 downto 0); -- CSR read data
pc_i : in std_ulogic_vector(data_width_c-1 downto 0); -- current pc
-- data output --
rs1_o : out std_ulogic_vector(data_width_c-1 downto 0); -- operand 1
rs2_o : out std_ulogic_vector(data_width_c-1 downto 0) -- operand 2
796,6 → 817,7
i_bus_ack_i : in std_ulogic; -- bus transfer acknowledge
i_bus_err_i : in std_ulogic; -- bus transfer error
i_bus_fence_o : out std_ulogic; -- fence operation
i_bus_lock_o : out std_ulogic; -- locked/exclusive access
-- data bus --
d_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
d_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
806,7 → 828,8
d_bus_cancel_o : out std_ulogic; -- cancel current bus transaction
d_bus_ack_i : in std_ulogic; -- bus transfer acknowledge
d_bus_err_i : in std_ulogic; -- bus transfer error
d_bus_fence_o : out std_ulogic -- fence operation
d_bus_fence_o : out std_ulogic; -- fence operation
d_bus_lock_o : out std_ulogic -- locked/exclusive access
);
end component;
 
829,6 → 852,7
ca_bus_we_i : in std_ulogic; -- write enable
ca_bus_re_i : in std_ulogic; -- read enable
ca_bus_cancel_i : in std_ulogic; -- cancel current bus transaction
ca_bus_lock_i : in std_ulogic; -- locked/exclusive access
ca_bus_ack_o : out std_ulogic; -- bus transfer acknowledge
ca_bus_err_o : out std_ulogic; -- bus transfer error
-- controller interface b --
839,6 → 863,7
cb_bus_we_i : in std_ulogic; -- write enable
cb_bus_re_i : in std_ulogic; -- read enable
cb_bus_cancel_i : in std_ulogic; -- cancel current bus transaction
cb_bus_lock_i : in std_ulogic; -- locked/exclusive access
cb_bus_ack_o : out std_ulogic; -- bus transfer acknowledge
cb_bus_err_o : out std_ulogic; -- bus transfer error
-- peripheral bus --
850,6 → 875,7
p_bus_we_o : out std_ulogic; -- write enable
p_bus_re_o : out std_ulogic; -- read enable
p_bus_cancel_o : out std_ulogic; -- cancel current bus transaction
p_bus_lock_o : out std_ulogic; -- locked/exclusive access
p_bus_ack_i : in std_ulogic; -- bus transfer acknowledge
p_bus_err_i : in std_ulogic -- bus transfer error
);
1105,31 → 1131,33
);
port (
-- global control --
clk_i : in std_ulogic; -- global clock line
rstn_i : in std_ulogic; -- global reset line, low-active
clk_i : in std_ulogic; -- global clock line
rstn_i : in std_ulogic; -- global reset line, low-active
-- host access --
src_i : in std_ulogic; -- access type (0: data, 1:instruction)
addr_i : in std_ulogic_vector(31 downto 0); -- address
rden_i : in std_ulogic; -- read enable
wren_i : in std_ulogic; -- write enable
ben_i : in std_ulogic_vector(03 downto 0); -- byte write enable
data_i : in std_ulogic_vector(31 downto 0); -- data in
data_o : out std_ulogic_vector(31 downto 0); -- data out
cancel_i : in std_ulogic; -- cancel current bus transaction
ack_o : out std_ulogic; -- transfer acknowledge
err_o : out std_ulogic; -- transfer error
priv_i : in std_ulogic_vector(1 downto 0); -- current CPU privilege level
src_i : in std_ulogic; -- access type (0: data, 1:instruction)
addr_i : in std_ulogic_vector(31 downto 0); -- address
rden_i : in std_ulogic; -- read enable
wren_i : in std_ulogic; -- write enable
ben_i : in std_ulogic_vector(03 downto 0); -- byte write enable
data_i : in std_ulogic_vector(31 downto 0); -- data in
data_o : out std_ulogic_vector(31 downto 0); -- data out
cancel_i : in std_ulogic; -- cancel current bus transaction
lock_i : in std_ulogic; -- locked/exclusive bus access
ack_o : out std_ulogic; -- transfer acknowledge
err_o : out std_ulogic; -- transfer error
priv_i : in std_ulogic_vector(1 downto 0); -- current CPU privilege level
-- wishbone interface --
wb_tag_o : out std_ulogic_vector(2 downto 0); -- tag
wb_adr_o : out std_ulogic_vector(31 downto 0); -- address
wb_dat_i : in std_ulogic_vector(31 downto 0); -- read data
wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data
wb_we_o : out std_ulogic; -- read/write
wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable
wb_stb_o : out std_ulogic; -- strobe
wb_cyc_o : out std_ulogic; -- valid cycle
wb_ack_i : in std_ulogic; -- transfer acknowledge
wb_err_i : in std_ulogic -- transfer error
wb_tag_o : out std_ulogic_vector(2 downto 0); -- tag
wb_adr_o : out std_ulogic_vector(31 downto 0); -- address
wb_dat_i : in std_ulogic_vector(31 downto 0); -- read data
wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data
wb_we_o : out std_ulogic; -- read/write
wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable
wb_stb_o : out std_ulogic; -- strobe
wb_cyc_o : out std_ulogic; -- valid cycle
wb_lock_o : out std_ulogic; -- locked/exclusive bus access
wb_ack_i : in std_ulogic; -- transfer acknowledge
wb_err_i : in std_ulogic -- transfer error
);
end component;
 
/rtl/core/neorv32_top.vhd
53,15 → 53,16
USER_CODE : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom user code
HW_THREAD_ID : std_ulogic_vector(31 downto 0) := (others => '0'); -- hardware thread id (hartid)
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension?
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension?
CPU_EXTENSION_RISCV_U : boolean := false; -- implement user mode extension?
CPU_EXTENSION_RISCV_Zicsr : boolean := true; -- implement CSR system?
CPU_EXTENSION_RISCV_Zifencei : boolean := true; -- implement instruction stream sync.?
CPU_EXTENSION_RISCV_Zifencei : boolean := false; -- implement instruction stream sync.?
-- Extension Options --
FAST_MUL_EN : boolean := false; -- use DSPs for M extension's multiplier
FAST_SHIFT_EN : boolean := false; -- use barrel shifter for shift operations
FAST_SHIFT_EN : boolean := false; -- use barrel shifter for shift operations
-- Physical Memory Protection (PMP) --
PMP_USE : boolean := false; -- implement PMP?
PMP_NUM_REGIONS : natural := 4; -- number of regions (max 8)
100,6 → 101,7
wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable
wb_stb_o : out std_ulogic; -- strobe
wb_cyc_o : out std_ulogic; -- valid cycle
wb_lock_o : out std_ulogic; -- locked/exclusive bus access
wb_ack_i : in std_ulogic := '0'; -- transfer acknowledge
wb_err_i : in std_ulogic := '0'; -- transfer error
-- Advanced memory control signals (available if MEM_EXT_USE = true) --
172,6 → 174,7
fence : std_ulogic; -- fence(i) instruction executed
priv : std_ulogic_vector(1 downto 0); -- current privilege level
src : std_ulogic; -- access source
lock : std_ulogic; -- locked/exclusive (=atomic) access
end record;
signal cpu_i, cpu_d, p_bus : bus_interface_t;
 
248,11 → 251,6
-- memory system - layout warning --
assert not (ispace_base_c /= x"00000000") report "NEORV32 PROCESSOR CONFIG WARNING! Non-default base address for instruction address space. Make sure this is sync with the software framework." severity warning;
assert not (dspace_base_c /= x"80000000") report "NEORV32 PROCESSOR CONFIG WARNING! Non-default base address for data address space. Make sure this is sync with the software framework." severity warning;
-- (external) memory latency notifier (warning) --
assert not (MEM_EXT_USE = true) report "NEORV32 PROCESSOR CONFIG NOTE: Implementing external memory interface with max latency = " & integer'image(bus_timeout_c) & " cycles." severity warning;
-- external memory iterface protocol notifier (warning) --
assert not ((MEM_EXT_USE = true) and (wb_pipe_mode_c = false)) report "NEORV32 PROCESSOR CONFIG NOTE: Implementing external memory interface using STANDARD Wishbone protocol." severity warning;
assert not ((MEM_EXT_USE = true) and (wb_pipe_mode_c = true)) report "NEORV32 PROCESSOR CONFIG NOTE: Implementing external memory interface using PIEPLINED Wishbone protocol." severity warning;
 
 
-- Reset Generator ------------------------------------------------------------------------
321,6 → 319,7
HW_THREAD_ID => HW_THREAD_ID, -- hardware thread id
CPU_BOOT_ADDR => cpu_boot_addr_c, -- cpu boot address
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A => CPU_EXTENSION_RISCV_A, -- implement atomic extension?
CPU_EXTENSION_RISCV_C => CPU_EXTENSION_RISCV_C, -- implement compressed extension?
CPU_EXTENSION_RISCV_E => CPU_EXTENSION_RISCV_E, -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M => CPU_EXTENSION_RISCV_M, -- implement muld/div extension?
351,6 → 350,7
i_bus_err_i => cpu_i.err, -- bus transfer error
i_bus_fence_o => cpu_i.fence, -- executed FENCEI operation
i_bus_priv_o => cpu_i.priv, -- privilege level
i_bus_lock_o => cpu_i.lock, -- locked/exclusive access
-- data bus interface --
d_bus_addr_o => cpu_d.addr, -- bus access address
d_bus_rdata_i => cpu_d.rdata, -- bus read data
363,6 → 363,7
d_bus_err_i => cpu_d.err, -- bus transfer error
d_bus_fence_o => cpu_d.fence, -- executed FENCE operation
d_bus_priv_o => cpu_d.priv, -- privilege level
d_bus_lock_o => cpu_d.lock, -- locked/exclusive access
-- system time input from MTIME --
time_i => mtime_time, -- current system time
-- interrupts (risc-v compliant) --
407,6 → 408,7
ca_bus_we_i => cpu_d.we, -- write enable
ca_bus_re_i => cpu_d.re, -- read enable
ca_bus_cancel_i => cpu_d.cancel, -- cancel current bus transaction
ca_bus_lock_i => cpu_d.lock, -- locked/exclusive access
ca_bus_ack_o => cpu_d.ack, -- bus transfer acknowledge
ca_bus_err_o => cpu_d.err, -- bus transfer error
-- controller interface b --
417,6 → 419,7
cb_bus_we_i => cpu_i.we, -- write enable
cb_bus_re_i => cpu_i.re, -- read enable
cb_bus_cancel_i => cpu_i.cancel, -- cancel current bus transaction
cb_bus_lock_i => cpu_i.lock, -- locked/exclusive access
cb_bus_ack_o => cpu_i.ack, -- bus transfer acknowledge
cb_bus_err_o => cpu_i.err, -- bus transfer error
-- peripheral bus --
428,6 → 431,7
p_bus_we_o => p_bus.we, -- write enable
p_bus_re_o => p_bus.re, -- read enable
p_bus_cancel_o => p_bus.cancel, -- cancel current bus transaction
p_bus_lock_o => p_bus.lock, -- locked/exclusive access
p_bus_ack_i => p_bus.ack, -- bus transfer acknowledge
p_bus_err_i => p_bus.err -- bus transfer error
);
546,31 → 550,33
)
port map (
-- global control --
clk_i => clk_i, -- global clock line
rstn_i => sys_rstn, -- global reset line, low-active
clk_i => clk_i, -- global clock line
rstn_i => sys_rstn, -- global reset line, low-active
-- host access --
src_i => p_bus.src, -- access type (0: data, 1:instruction)
addr_i => p_bus.addr, -- address
rden_i => p_bus.re, -- read enable
wren_i => p_bus.we, -- write enable
ben_i => p_bus.ben, -- byte write enable
data_i => p_bus.wdata, -- data in
data_o => wishbone_rdata, -- data out
cancel_i => p_bus.cancel, -- cancel current transaction
ack_o => wishbone_ack, -- transfer acknowledge
err_o => wishbone_err, -- transfer error
priv_i => p_bus.priv, -- current CPU privilege level
src_i => p_bus.src, -- access type (0: data, 1:instruction)
addr_i => p_bus.addr, -- address
rden_i => p_bus.re, -- read enable
wren_i => p_bus.we, -- write enable
ben_i => p_bus.ben, -- byte write enable
data_i => p_bus.wdata, -- data in
data_o => wishbone_rdata, -- data out
cancel_i => p_bus.cancel, -- cancel current transaction
lock_i => p_bus.lock, -- locked/exclusive bus access
ack_o => wishbone_ack, -- transfer acknowledge
err_o => wishbone_err, -- transfer error
priv_i => p_bus.priv, -- current CPU privilege level
-- wishbone interface --
wb_tag_o => wb_tag_o, -- tag
wb_adr_o => wb_adr_o, -- address
wb_dat_i => wb_dat_i, -- read data
wb_dat_o => wb_dat_o, -- write data
wb_we_o => wb_we_o, -- read/write
wb_sel_o => wb_sel_o, -- byte enable
wb_stb_o => wb_stb_o, -- strobe
wb_cyc_o => wb_cyc_o, -- valid cycle
wb_ack_i => wb_ack_i, -- transfer acknowledge
wb_err_i => wb_err_i -- transfer error
wb_tag_o => wb_tag_o, -- tag
wb_adr_o => wb_adr_o, -- address
wb_dat_i => wb_dat_i, -- read data
wb_dat_o => wb_dat_o, -- write data
wb_we_o => wb_we_o, -- read/write
wb_sel_o => wb_sel_o, -- byte enable
wb_stb_o => wb_stb_o, -- strobe
wb_cyc_o => wb_cyc_o, -- valid cycle
wb_lock_o => wb_lock_o, -- locked/exclusive bus access
wb_ack_i => wb_ack_i, -- transfer acknowledge
wb_err_i => wb_err_i -- transfer error
);
end generate;
 
580,13 → 586,14
wishbone_ack <= '0';
wishbone_err <= '0';
--
wb_adr_o <= (others => '0');
wb_dat_o <= (others => '0');
wb_we_o <= '0';
wb_sel_o <= (others => '0');
wb_stb_o <= '0';
wb_cyc_o <= '0';
wb_tag_o <= (others => '0');
wb_adr_o <= (others => '0');
wb_dat_o <= (others => '0');
wb_we_o <= '0';
wb_sel_o <= (others => '0');
wb_stb_o <= '0';
wb_cyc_o <= '0';
wb_lock_o <= '0';
wb_tag_o <= (others => '0');
end generate;
 
 
/rtl/core/neorv32_wishbone.vhd
2,12 → 2,17
-- # << NEORV32 - External Bus Interface (WISHBONE) >> #
-- # ********************************************************************************************* #
-- # The interface provides registers for all outgoing signals. If the host cancels a running #
-- # transfer, the Wishbone arbiter still waits some time for the bus system to ACK to transfer. #
-- # transfer, the Wishbone arbiter still waits some time for the bus system to ACK the transfer #
-- # before the arbiter forces termination. #
-- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
-- # All bus accesses from the CPU, which do not target the internal IO region, the internal boot- #
-- # loader or the internal instruction or data memories (if implemented), are delegated via this #
-- # Wishbone gateway to the external bus interface. #
-- # Even when all processor-internal memories and IO devices are disabled, the EXTERNAL address #
-- # space ENDS at address 0xffff0000 (begin of internal BOOTROM address space). #
-- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
-- # All bus accesses from the CPU, which do not target the internal IO region / the internal #
-- # bootlloader / the internal instruction or data memories (if implemented), are delegated via #
-- # this Wishbone gateway to the external bus interface. Accessed peripherals can have a response #
-- # latency of up to neorv32_package.vhd:bus_timeout_c - 2 cycles. #
-- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
-- # This interface supports classic/standard Wishbone transactions (WB_PIPELINED_MODE = false) #
-- # and also pipelined transactions (WB_PIPELINED_MODE = true). #
-- # ********************************************************************************************* #
51,7 → 56,7
 
entity neorv32_wishbone is
generic (
WB_PIPELINED_MODE : boolean := false; -- false: classic/standard wishbone mode, true: pipelined wishbone mode
WB_PIPELINED_MODE : boolean := false; -- false: classic/standard wishbone mode, true: pipelined wishbone mode
-- Internal instruction memory --
MEM_INT_IMEM_USE : boolean := true; -- implement processor-internal instruction memory
MEM_INT_IMEM_SIZE : natural := 8*1024; -- size of processor-internal instruction memory in bytes
61,31 → 66,33
);
port (
-- global control --
clk_i : in std_ulogic; -- global clock line
rstn_i : in std_ulogic; -- global reset line, low-active
clk_i : in std_ulogic; -- global clock line
rstn_i : in std_ulogic; -- global reset line, low-active
-- host access --
src_i : in std_ulogic; -- access type (0: data, 1:instruction)
addr_i : in std_ulogic_vector(31 downto 0); -- address
rden_i : in std_ulogic; -- read enable
wren_i : in std_ulogic; -- write enable
ben_i : in std_ulogic_vector(03 downto 0); -- byte write enable
data_i : in std_ulogic_vector(31 downto 0); -- data in
data_o : out std_ulogic_vector(31 downto 0); -- data out
cancel_i : in std_ulogic; -- cancel current bus transaction
ack_o : out std_ulogic; -- transfer acknowledge
err_o : out std_ulogic; -- transfer error
priv_i : in std_ulogic_vector(1 downto 0); -- current CPU privilege level
src_i : in std_ulogic; -- access type (0: data, 1:instruction)
addr_i : in std_ulogic_vector(31 downto 0); -- address
rden_i : in std_ulogic; -- read enable
wren_i : in std_ulogic; -- write enable
ben_i : in std_ulogic_vector(03 downto 0); -- byte write enable
data_i : in std_ulogic_vector(31 downto 0); -- data in
data_o : out std_ulogic_vector(31 downto 0); -- data out
cancel_i : in std_ulogic; -- cancel current bus transaction
lock_i : in std_ulogic; -- locked/exclusive bus access
ack_o : out std_ulogic; -- transfer acknowledge
err_o : out std_ulogic; -- transfer error
priv_i : in std_ulogic_vector(1 downto 0); -- current CPU privilege level
-- wishbone interface --
wb_tag_o : out std_ulogic_vector(2 downto 0); -- tag
wb_adr_o : out std_ulogic_vector(31 downto 0); -- address
wb_dat_i : in std_ulogic_vector(31 downto 0); -- read data
wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data
wb_we_o : out std_ulogic; -- read/write
wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable
wb_stb_o : out std_ulogic; -- strobe
wb_cyc_o : out std_ulogic; -- valid cycle
wb_ack_i : in std_ulogic; -- transfer acknowledge
wb_err_i : in std_ulogic -- transfer error
wb_tag_o : out std_ulogic_vector(2 downto 0); -- tag
wb_adr_o : out std_ulogic_vector(31 downto 0); -- address
wb_dat_i : in std_ulogic_vector(31 downto 0); -- read data
wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data
wb_we_o : out std_ulogic; -- read/write
wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable
wb_stb_o : out std_ulogic; -- strobe
wb_cyc_o : out std_ulogic; -- valid cycle
wb_lock_o : out std_ulogic; -- locked/exclusive bus access
wb_ack_i : in std_ulogic; -- transfer acknowledge
wb_err_i : in std_ulogic -- transfer error
);
end neorv32_wishbone;
 
92,31 → 99,31
architecture neorv32_wishbone_rtl of neorv32_wishbone is
 
-- constants --
constant wb_timeout_c : natural := bus_timeout_c/2;
constant xbus_timeout_c : natural := bus_timeout_c/4;
 
-- access control --
signal int_imem_acc, int_imem_acc_real : std_ulogic;
signal int_dmem_acc, int_dmem_acc_real : std_ulogic;
signal int_boot_acc : std_ulogic;
signal wb_access : std_ulogic;
signal int_imem_acc : std_ulogic;
signal int_dmem_acc : std_ulogic;
signal int_boot_acc : std_ulogic;
signal xbus_access : std_ulogic;
 
-- bus arbiter
type ctrl_state_t is (IDLE, BUSY, CANCELED, RESYNC);
type ctrl_t is record
state : ctrl_state_t;
state_prev : ctrl_state_t;
we : std_ulogic;
rd_req : std_ulogic;
wr_req : std_ulogic;
adr : std_ulogic_vector(31 downto 0);
wdat : std_ulogic_vector(31 downto 0);
rdat : std_ulogic_vector(31 downto 0);
sel : std_ulogic_vector(3 downto 0);
ack : std_ulogic;
err : std_ulogic;
timeout : std_ulogic_vector(index_size_f(wb_timeout_c)-1 downto 0);
src : std_ulogic;
priv : std_ulogic_vector(1 downto 0);
state : ctrl_state_t;
we : std_ulogic;
rd_req : std_ulogic;
wr_req : std_ulogic;
adr : std_ulogic_vector(31 downto 0);
wdat : std_ulogic_vector(31 downto 0);
rdat : std_ulogic_vector(31 downto 0);
sel : std_ulogic_vector(3 downto 0);
ack : std_ulogic;
err : std_ulogic;
timeout : std_ulogic_vector(index_size_f(xbus_timeout_c)-1 downto 0);
src : std_ulogic;
lock : std_ulogic;
priv : std_ulogic_vector(1 downto 0);
end record;
signal ctrl : ctrl_t;
signal stb_int : std_ulogic;
126,24 → 133,22
 
-- Sanity Checks --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
assert not (bus_timeout_c <= 15) report "NEORV32 PROCESSOR CONFIG ERROR: Bus timeout (bus_timeout_c) should be >16 for interfacing external modules." severity error;
-- max bus timeout latency lower than recommended --
assert not (bus_timeout_c <= 32) report "NEORV32 PROCESSOR CONFIG ERROR: Bus timeout (neorv32_package.vhd:bus_timeout_c) should be >32 when using external bus interface." severity error;
-- external memory iterface protocol + max timeout latency notifier (warning) --
assert not (wb_pipe_mode_c = false) report "NEORV32 PROCESSOR CONFIG NOTE: Implementing external memory interface using STANDARD Wishbone protocol with max latency = " & integer'image(bus_timeout_c) & " cycles." severity warning;
assert not (wb_pipe_mode_c = true) report "NEORV32 PROCESSOR CONFIG NOTE: Implementing external memory interface using PIEPLINED Wishbone protocol with max latency = " & integer'image(bus_timeout_c) & " cycles." severity warning;
 
 
-- Access Control -------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- access to internal IMEM or DMEM? --
int_imem_acc <= '1' when (addr_i(31 downto index_size_f(MEM_INT_IMEM_SIZE)) = imem_base_c(31 downto index_size_f(MEM_INT_IMEM_SIZE))) else '0';
int_dmem_acc <= '1' when (addr_i(31 downto index_size_f(MEM_INT_DMEM_SIZE)) = dmem_base_c(31 downto index_size_f(MEM_INT_DMEM_SIZE))) else '0';
int_imem_acc_real <= int_imem_acc when (MEM_INT_IMEM_USE = true) else '0';
int_dmem_acc_real <= int_dmem_acc when (MEM_INT_DMEM_USE = true) else '0';
 
-- access to internal BOOTROM or IO devices? --
int_boot_acc <= '1' when (addr_i >= boot_rom_base_c) else '0'; -- this also covers access to the IO space
--int_boot_acc <= '1' when (addr_i(31 downto index_size_f(2*boot_rom_max_size_c)) = boot_rom_base_c(31 downto index_size_f(2*boot_rom_max_size_c))) else '0'; -- this also covers access to the IO space
--int_io_acc <= '1' when (addr_i >= io_base_c) else '0';
 
-- access to processor-internal IMEM or DMEM? --
int_imem_acc <= '1' when (addr_i(31 downto index_size_f(MEM_INT_IMEM_SIZE)) = imem_base_c(31 downto index_size_f(MEM_INT_IMEM_SIZE))) and (MEM_INT_IMEM_USE = true) else '0';
int_dmem_acc <= '1' when (addr_i(31 downto index_size_f(MEM_INT_DMEM_SIZE)) = dmem_base_c(31 downto index_size_f(MEM_INT_DMEM_SIZE))) and (MEM_INT_DMEM_USE = true) else '0';
-- access to processor-internal BOOTROM or IO devices? --
int_boot_acc <= '1' when (addr_i(31 downto 16) = boot_rom_base_c(31 downto 16)) else '0'; -- hacky!
-- actual external bus access? --
wb_access <= (not int_imem_acc_real) and (not int_dmem_acc_real) and (not int_boot_acc);
xbus_access <= (not int_imem_acc) and (not int_dmem_acc) and (not int_boot_acc);
 
-- Bus Arbiter -----------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
150,27 → 155,26
bus_arbiter: process(rstn_i, clk_i)
begin
if (rstn_i = '0') then
ctrl.state <= IDLE;
ctrl.state_prev <= IDLE;
ctrl.we <= '0';
ctrl.rd_req <= '0';
ctrl.wr_req <= '0';
ctrl.adr <= (others => '0');
ctrl.wdat <= (others => '0');
ctrl.rdat <= (others => '0');
ctrl.sel <= (others => '0');
ctrl.timeout <= (others => '0');
ctrl.ack <= '0';
ctrl.err <= '0';
ctrl.src <= '0';
ctrl.priv <= "00";
ctrl.state <= IDLE;
ctrl.we <= '0';
ctrl.rd_req <= '0';
ctrl.wr_req <= '0';
ctrl.adr <= (others => '0');
ctrl.wdat <= (others => '0');
ctrl.rdat <= (others => '0');
ctrl.sel <= (others => '0');
ctrl.timeout <= (others => '0');
ctrl.ack <= '0';
ctrl.err <= '0';
ctrl.src <= '0';
ctrl.lock <= '0';
ctrl.priv <= "00";
elsif rising_edge(clk_i) then
-- defaults --
ctrl.state_prev <= ctrl.state;
ctrl.rdat <= (others => '0');
ctrl.ack <= '0';
ctrl.err <= '0';
ctrl.timeout <= std_ulogic_vector(to_unsigned(wb_timeout_c, index_size_f(wb_timeout_c)));
ctrl.rdat <= (others => '0');
ctrl.ack <= '0';
ctrl.err <= '0';
ctrl.timeout <= std_ulogic_vector(to_unsigned(xbus_timeout_c, index_size_f(xbus_timeout_c)));
 
-- state machine --
case ctrl.state is
185,9 → 189,10
ctrl.wdat <= data_i;
ctrl.sel <= ben_i;
ctrl.src <= src_i;
ctrl.lock <= lock_i;
ctrl.priv <= priv_i;
-- valid read/write access --
if ((wb_access and (wren_i or ctrl.wr_req or rden_i or ctrl.rd_req)) = '1') then
-- valid new or buffered read/write request --
if ((xbus_access and (wren_i or ctrl.wr_req or rden_i or ctrl.rd_req)) = '1') then
ctrl.state <= BUSY;
end if;
 
230,24 → 235,25
end process bus_arbiter;
 
-- host access --
data_o <= ctrl.rdat;
ack_o <= ctrl.ack;
err_o <= ctrl.err;
data_o <= ctrl.rdat;
ack_o <= ctrl.ack;
err_o <= ctrl.err;
 
-- wishbone interface --
wb_tag_o(0) <= '1' when (ctrl.priv = priv_mode_m_c) else '0'; -- privileged access when in machine mode
wb_tag_o(1) <= '0'; -- 0=secure, 1=non-secure
wb_tag_o(2) <= ctrl.src; -- 0=data access, 1=instruction access
wb_tag_o(1) <= '0'; -- 0 = secure, 1 = non-secure
wb_tag_o(2) <= ctrl.src; -- 0 = data access, 1 = instruction access
 
wb_adr_o <= ctrl.adr;
wb_dat_o <= ctrl.wdat;
wb_we_o <= ctrl.we;
wb_sel_o <= ctrl.sel;
wb_stb_o <= stb_int when (WB_PIPELINED_MODE = true) else cyc_int;
wb_cyc_o <= cyc_int;
wb_adr_o <= ctrl.adr;
wb_dat_o <= ctrl.wdat;
wb_we_o <= ctrl.we;
wb_sel_o <= ctrl.sel;
wb_lock_o <= ctrl.lock;
wb_stb_o <= stb_int when (WB_PIPELINED_MODE = true) else cyc_int;
wb_cyc_o <= cyc_int;
 
stb_int <= '1' when ((ctrl.state = BUSY) and (ctrl.state_prev = IDLE)) else '0';
cyc_int <= '0' when ((ctrl.state = IDLE) or (ctrl.state = RESYNC)) else '1';
stb_int <= '1' when (ctrl.state = BUSY) else '0';
cyc_int <= '0' when (ctrl.state = IDLE) or (ctrl.state = RESYNC) else '1';
 
 
end neorv32_wishbone_rtl;
/rtl/top_templates/neorv32_cpu_stdlogic.vhd
45,12 → 45,13
HW_THREAD_ID : std_logic_vector(31 downto 0):= (others => '0'); -- hardware thread id
CPU_BOOT_ADDR : std_logic_vector(31 downto 0):= (others => '0'); -- cpu boot address
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension?
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension?
CPU_EXTENSION_RISCV_U : boolean := false; -- implement user mode extension?
CPU_EXTENSION_RISCV_Zicsr : boolean := true; -- implement CSR system?
CPU_EXTENSION_RISCV_Zifencei : boolean := true; -- implement instruction stream sync.?
CPU_EXTENSION_RISCV_Zifencei : boolean := false; -- implement instruction stream sync.?
-- Extension Options --
FAST_MUL_EN : boolean := false; -- use DSPs for M extension's multiplier
FAST_SHIFT_EN : boolean := false; -- use barrel shifter for shift operations
75,6 → 76,7
i_bus_err_i : in std_logic := '0'; -- bus transfer error
i_bus_fence_o : out std_logic; -- executed FENCEI operation
i_bus_priv_o : out std_logic_vector(1 downto 0); -- privilege level
i_bus_lock_o : out std_logic; -- locked/exclusive access
-- data bus interface --
d_bus_addr_o : out std_logic_vector(data_width_c-1 downto 0); -- bus access address
d_bus_rdata_i : in std_logic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data
87,6 → 89,7
d_bus_err_i : in std_logic := '0'; -- bus transfer error
d_bus_fence_o : out std_logic; -- executed FENCE operation
d_bus_priv_o : out std_logic_vector(1 downto 0); -- privilege level
d_bus_lock_o : out std_logic; -- locked/exclusive access
-- system time input from MTIME --
time_i : in std_logic_vector(63 downto 0) := (others => '0'); -- current system time
-- interrupts (risc-v compliant) --
117,6 → 120,7
signal i_bus_err_i_int, d_bus_err_i_int : std_ulogic;
signal i_bus_fence_o_int, d_bus_fence_o_int : std_ulogic;
signal i_bus_priv_o_int, d_bus_priv_o_int : std_ulogic_vector(1 downto 0);
signal i_bus_lock_o_int, d_bus_lock_o_int : std_ulogic;
--
signal time_i_int : std_ulogic_vector(63 downto 0);
--
134,6 → 138,7
HW_THREAD_ID => HW_THREAD_ID_INT, -- hardware thread id
CPU_BOOT_ADDR => CPU_BOOT_ADDR_INT, -- cpu boot address
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A => CPU_EXTENSION_RISCV_A, -- implement atomic extension?
CPU_EXTENSION_RISCV_C => CPU_EXTENSION_RISCV_C, -- implement compressed extension?
CPU_EXTENSION_RISCV_E => CPU_EXTENSION_RISCV_E, -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M => CPU_EXTENSION_RISCV_M, -- implement muld/div extension?
164,6 → 169,7
i_bus_err_i => i_bus_err_i_int, -- bus transfer error
i_bus_fence_o => i_bus_fence_o_int, -- executed FENCEI operation
i_bus_priv_o => i_bus_priv_o_int, -- privilege level
i_bus_lock_o => i_bus_lock_o_int, -- locked/exclusive access
-- data bus interface --
d_bus_addr_o => d_bus_addr_o_int, -- bus access address
d_bus_rdata_i => d_bus_rdata_i_int, -- bus read data
176,6 → 182,7
d_bus_err_i => d_bus_err_i_int, -- bus transfer error
d_bus_fence_o => d_bus_fence_o_int, -- executed FENCEI operation
d_bus_priv_o => d_bus_priv_o_int, -- privilege level
d_bus_lock_o => d_bus_lock_o_int, -- locked/exclusive access
-- system time input from MTIME --
time_i => time_i_int, -- current system time
-- interrupts (risc-v compliant) --
201,6 → 208,7
i_bus_err_i_int <= std_ulogic(i_bus_err_i);
i_bus_fence_o <= std_logic(i_bus_fence_o_int);
i_bus_priv_o <= std_logic_vector(i_bus_priv_o_int);
i_bus_lock_o <= std_logic(i_bus_lock_o_int);
 
d_bus_addr_o <= std_logic_vector(d_bus_addr_o_int);
d_bus_rdata_i_int <= std_ulogic_vector(d_bus_rdata_i);
213,6 → 221,7
d_bus_err_i_int <= std_ulogic(d_bus_err_i);
d_bus_fence_o <= std_logic(d_bus_fence_o_int);
d_bus_priv_o <= std_logic_vector(d_bus_priv_o_int);
d_bus_lock_o <= std_logic(d_bus_lock_o_int);
time_i_int <= std_ulogic_vector(time_i);
/rtl/top_templates/neorv32_test_setup.vhd
74,10 → 74,11
USER_CODE => x"00000000", -- custom user code
HW_THREAD_ID => x"00000000", -- hardware thread id (hartid)
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A => true, -- implement atomic extension?
CPU_EXTENSION_RISCV_C => true, -- implement compressed extension?
CPU_EXTENSION_RISCV_E => false, -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M => false, -- implement muld/div extension?
CPU_EXTENSION_RISCV_U => false, -- implement user mode extension?
CPU_EXTENSION_RISCV_M => true, -- implement muld/div extension?
CPU_EXTENSION_RISCV_U => true, -- implement user mode extension?
CPU_EXTENSION_RISCV_Zicsr => true, -- implement CSR system?
CPU_EXTENSION_RISCV_Zifencei => true, -- implement instruction stream sync.?
-- Extension Options --
121,6 → 122,7
wb_sel_o => open, -- byte enable
wb_stb_o => open, -- strobe
wb_cyc_o => open, -- valid cycle
wb_lock_o => open, -- locked/exclusive bus access
wb_ack_i => '0', -- transfer acknowledge
wb_err_i => '0', -- transfer error
-- Advanced memory control signals --
/rtl/top_templates/neorv32_top_axi4lite.vhd
49,12 → 49,13
USER_CODE : std_logic_vector(31 downto 0) := x"00000000"; -- custom user code
HW_THREAD_ID : std_logic_vector(31 downto 0) := (others => '0'); -- hardware thread id (hartid)
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension?
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension?
CPU_EXTENSION_RISCV_U : boolean := false; -- implement user mode extension?
CPU_EXTENSION_RISCV_Zicsr : boolean := true; -- implement CSR system?
CPU_EXTENSION_RISCV_Zifencei : boolean := true; -- implement instruction stream sync.?
CPU_EXTENSION_RISCV_Zifencei : boolean := false; -- implement instruction stream sync.?
-- Extension Options --
FAST_MUL_EN : boolean := false; -- use DSPs for M extension's multiplier
FAST_SHIFT_EN : boolean := false; -- use barrel shifter for shift operations
190,7 → 191,8
 
-- Sanity Checks --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
assert not (wb_pipe_mode_c = true) report "NEORV32 PROCESSOR CONFIG ERROR: AXI4-Lite bridge requires STANDARD Wishbone mode (package.wb_pipe_mode_c = false)!" severity error;
assert not (wb_pipe_mode_c = true) report "NEORV32 PROCESSOR CONFIG ERROR: AXI4-Lite bridge requires STANDARD/CLASSIC Wishbone mode (package.wb_pipe_mode_c = false)." severity error;
assert not (CPU_EXTENSION_RISCV_A = true) report "NEORV32 PROCESSOR CONFIG WARNING: AXI4-Lite provides NO support for atomic memory operations." severity warning;
 
 
-- The Core Of The Problem ----------------------------------------------------------------
203,6 → 205,7
USER_CODE => USER_CODE_INT, -- custom user code
HW_THREAD_ID => HW_THREAD_ID_INT, -- hardware thread id (hartid)
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A => CPU_EXTENSION_RISCV_A, -- implement atomic extension?
CPU_EXTENSION_RISCV_C => CPU_EXTENSION_RISCV_C, -- implement compressed extension?
CPU_EXTENSION_RISCV_E => CPU_EXTENSION_RISCV_E, -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M => CPU_EXTENSION_RISCV_M, -- implement muld/div extension?
250,6 → 253,7
wb_sel_o => wb_core.sel, -- byte enable
wb_stb_o => wb_core.stb, -- strobe
wb_cyc_o => wb_core.cyc, -- valid cycle
wb_lock_o => open, -- locked/exclusive bus access
wb_ack_i => wb_core.ack, -- transfer acknowledge
wb_err_i => wb_core.err, -- transfer error
-- Advanced memory control signals --
/rtl/top_templates/neorv32_top_stdlogic.vhd
47,12 → 47,13
USER_CODE : std_logic_vector(31 downto 0) := x"00000000"; -- custom user code
HW_THREAD_ID : std_logic_vector(31 downto 0) := (others => '0'); -- hardware thread id (hartid)
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension?
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension?
CPU_EXTENSION_RISCV_U : boolean := false; -- implement user mode extension?
CPU_EXTENSION_RISCV_Zicsr : boolean := true; -- implement CSR system?
CPU_EXTENSION_RISCV_Zifencei : boolean := true; -- implement instruction stream sync.?
CPU_EXTENSION_RISCV_Zifencei : boolean := false; -- implement instruction stream sync.?
-- Extension Options --
FAST_MUL_EN : boolean := false; -- use DSPs for M extension's multiplier
FAST_SHIFT_EN : boolean := false; -- use barrel shifter for shift operations
94,6 → 95,7
wb_sel_o : out std_logic_vector(03 downto 0); -- byte enable
wb_stb_o : out std_logic; -- strobe
wb_cyc_o : out std_logic; -- valid cycle
wb_lock_o : out std_logic; -- locked/exclusive bus access
wb_ack_i : in std_logic := '0'; -- transfer acknowledge
wb_err_i : in std_logic := '0'; -- transfer error
-- Advanced memory control signals (available if MEM_EXT_USE = true) --
139,6 → 141,7
signal wb_sel_o_int : std_ulogic_vector(03 downto 0);
signal wb_stb_o_int : std_ulogic;
signal wb_cyc_o_int : std_ulogic;
signal wb_lock_o_int : std_ulogic;
signal wb_ack_i_int : std_ulogic;
signal wb_err_i_int : std_ulogic;
--
174,6 → 177,7
USER_CODE => USER_CODE_INT, -- custom user code
HW_THREAD_ID => HW_THREAD_ID_INT, -- hardware thread id (hartid)
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A => CPU_EXTENSION_RISCV_A, -- implement atomic extension?
CPU_EXTENSION_RISCV_C => CPU_EXTENSION_RISCV_C, -- implement compressed extension?
CPU_EXTENSION_RISCV_E => CPU_EXTENSION_RISCV_E, -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M => CPU_EXTENSION_RISCV_M, -- implement muld/div extension?
221,6 → 225,7
wb_sel_o => wb_sel_o_int, -- byte enable
wb_stb_o => wb_stb_o_int, -- strobe
wb_cyc_o => wb_cyc_o_int, -- valid cycle
wb_lock_o => wb_lock_o_int, -- locked/exclusive bus access
wb_ack_i => wb_ack_i_int, -- transfer acknowledge
wb_err_i => wb_err_i_int, -- transfer error
-- Advanced memory control signals --
260,6 → 265,7
wb_sel_o <= std_logic_vector(wb_sel_o_int);
wb_stb_o <= std_logic(wb_stb_o_int);
wb_cyc_o <= std_logic(wb_cyc_o_int);
wb_lock_o <= std_logic(wb_lock_o_int);
wb_ack_i_int <= std_ulogic(wb_ack_i);
wb_err_i_int <= std_ulogic(wb_err_i);
 
/sim/vivado/neorv32_tb_behav.wcfg
12,15 → 12,15
</db_ref>
</db_ref_list>
<zoom_setting>
<ZoomStartTime time="5295000fs"></ZoomStartTime>
<ZoomEndTime time="5412501fs"></ZoomEndTime>
<Cursor1Time time="5715000fs"></Cursor1Time>
<ZoomStartTime time="1325333fs"></ZoomStartTime>
<ZoomEndTime time="1342434fs"></ZoomEndTime>
<Cursor1Time time="1349733fs"></Cursor1Time>
</zoom_setting>
<column_width_setting>
<NameColumnWidth column_width="203"></NameColumnWidth>
<ValueColumnWidth column_width="111"></ValueColumnWidth>
<ValueColumnWidth column_width="103"></ValueColumnWidth>
</column_width_setting>
<WVObjectSize size="108" />
<WVObjectSize size="111" />
<wvobject type="divider" fp_name="divider273">
<obj_property name="label">CPU: Control.FETCH</obj_property>
<obj_property name="DisplayName">label</obj_property>
60,7 → 60,6
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine" type="array">
<obj_property name="ElementShortName">fetch_engine</obj_property>
<obj_property name="ObjectShortName">fetch_engine</obj_property>
<obj_property name="isExpanded"></obj_property>
</wvobject>
<wvobject type="divider" fp_name="divider273">
<obj_property name="label">CPU: Control.IPB</obj_property>
69,7 → 68,6
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/ipb" type="array">
<obj_property name="ElementShortName">ipb</obj_property>
<obj_property name="ObjectShortName">ipb</obj_property>
<obj_property name="isExpanded"></obj_property>
</wvobject>
<wvobject type="divider" fp_name="divider273">
<obj_property name="label">CPU: Control.ISSUE</obj_property>
78,7 → 76,6
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/issue_engine" type="array">
<obj_property name="ElementShortName">issue_engine</obj_property>
<obj_property name="ObjectShortName">issue_engine</obj_property>
<obj_property name="isExpanded"></obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/ci_instr16" type="array">
<obj_property name="ElementShortName">ci_instr16[15:0]</obj_property>
117,8 → 114,8
<obj_property name="ObjectShortName">be_store_i</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/ctrl_o" type="array">
<obj_property name="ElementShortName">ctrl_o[59:0]</obj_property>
<obj_property name="ObjectShortName">ctrl_o[59:0]</obj_property>
<obj_property name="ElementShortName">ctrl_o[62:0]</obj_property>
<obj_property name="ObjectShortName">ctrl_o[62:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/ci_instr32" type="array">
<obj_property name="ElementShortName">ci_instr32[31:0]</obj_property>
165,12 → 162,12
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.i_reg" type="array">
<obj_property name="ElementShortName">.i_reg[31:0]</obj_property>
<obj_property name="ObjectShortName">.i_reg[31:0]</obj_property>
<obj_property name="CustomSignalColor">#FFFFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.i_reg_nxt" type="array">
<obj_property name="ElementShortName">.i_reg_nxt[31:0]</obj_property>
<obj_property name="ObjectShortName">.i_reg_nxt[31:0]</obj_property>
<obj_property name="CustomSignalColor">#FFFFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.i_reg_last" type="array">
<obj_property name="ElementShortName">.i_reg_last[31:0]</obj_property>
207,12 → 204,12
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.pc" type="array">
<obj_property name="ElementShortName">.pc[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc[31:0]</obj_property>
<obj_property name="CustomSignalColor">#FFFFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.pc_nxt" type="array">
<obj_property name="ElementShortName">.pc_nxt[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc_nxt[31:0]</obj_property>
<obj_property name="CustomSignalColor">#FFFFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.next_pc" type="array">
<obj_property name="ElementShortName">.next_pc[31:0]</obj_property>
244,6 → 241,15
</wvobject>
</wvobject>
<wvobject type="divider" fp_name="divider139">
<obj_property name="label">CPU: Control.ATOMICS</obj_property>
<obj_property name="DisplayName">label</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/atomic_ctrl" type="array">
<obj_property name="ElementShortName">atomic_ctrl</obj_property>
<obj_property name="ObjectShortName">atomic_ctrl</obj_property>
<obj_property name="isExpanded"></obj_property>
</wvobject>
<wvobject type="divider" fp_name="divider139">
<obj_property name="label">CPU: Control.TRAP</obj_property>
<obj_property name="DisplayName">label</obj_property>
</wvobject>
316,6 → 322,7
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_alu_inst/cp_ctrl" type="array">
<obj_property name="ElementShortName">cp_ctrl</obj_property>
<obj_property name="ObjectShortName">cp_ctrl</obj_property>
<obj_property name="isExpanded"></obj_property>
</wvobject>
<wvobject type="divider" fp_name="divider367">
<obj_property name="label">CPU: BUS_UNIT</obj_property>
546,7 → 553,6
<wvobject fp_name="/neorv32_tb/wb_cpu" type="array">
<obj_property name="ElementShortName">wb_cpu</obj_property>
<obj_property name="ObjectShortName">wb_cpu</obj_property>
<obj_property name="isExpanded"></obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/wb_mem_a" type="array">
<obj_property name="ElementShortName">wb_mem_a</obj_property>
556,4 → 562,8
<obj_property name="ElementShortName">wb_mem_b</obj_property>
<obj_property name="ObjectShortName">wb_mem_b</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/wb_mem_c" type="array">
<obj_property name="ElementShortName">wb_mem_c</obj_property>
<obj_property name="ObjectShortName">wb_mem_c</obj_property>
</wvobject>
</wave_config>
/sim/neorv32_tb.vhd
61,31 → 61,35
-- User Configuration ---------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- general --
constant boot_external_c : boolean := false; -- false: boot from proc-internal IMEM, true: boot from (initialized) simulated ext. mem A
constant ext_imem_c : boolean := false; -- false: use and boot from proc-internal IMEM, true: use and boot from external (initialized) simulated IMEM (ext. mem A)
constant ext_dmem_c : boolean := false; -- false: use proc-internal DMEM, true: use external simulated DMEM (ext. mem B)
constant imem_size_c : natural := 16*1024; -- size in bytes of processor-internal IMEM / external mem A
constant dmem_size_c : natural := 8*1024; -- size in bytes of processor-internal DMEM / external mem B
constant f_clock_c : natural := 100000000; -- main clock in Hz
-- UART --
constant baud_rate_c : natural := 19200; -- standard UART baudrate
constant baud_rate_c : natural := 19200; -- simulation UART output baudrate
-- simulated external Wishbone memory A (can be used as external IMEM) --
constant ext_mem_a_base_addr_c : std_ulogic_vector(31 downto 0) := x"00000000"; -- wishbone memory base address (IMEM base)
constant ext_mem_a_base_addr_c : std_ulogic_vector(31 downto 0) := x"00000000"; -- wishbone memory base address (external IMEM base)
constant ext_mem_a_size_c : natural := imem_size_c; -- wishbone memory size in bytes
constant ext_mem_a_latency_c : natural := 8; -- latency in clock cycles (min 1, max 255), plus 1 cycle initiali delay
-- simulated external Wishbone memory B (can be used as external IO) --
constant ext_mem_b_base_addr_c : std_ulogic_vector(31 downto 0) := x"F0000000"; -- wishbone memory base address (default begin of EXTERNAL IO area)
constant ext_mem_b_size_c : natural := 64; -- wishbone memory size in bytes
constant ext_mem_b_latency_c : natural := 3; -- latency in clock cycles (min 1, max 255), plus 1 cycle initiali delay
-- simulated external Wishbone memory B (can be used as external DMEM) --
constant ext_mem_b_base_addr_c : std_ulogic_vector(31 downto 0) := x"80000000"; -- wishbone memory base address (external DMEM base)
constant ext_mem_b_size_c : natural := dmem_size_c; -- wishbone memory size in bytes
constant ext_mem_b_latency_c : natural := 8; -- latency in clock cycles (min 1, max 255), plus 1 cycle initiali delay
-- simulated external Wishbone memory C (can be used as external IO) --
constant ext_mem_c_base_addr_c : std_ulogic_vector(31 downto 0) := x"F0000000"; -- wishbone memory base address (default begin of EXTERNAL IO area)
constant ext_mem_c_size_c : natural := 64; -- wishbone memory size in bytes
constant ext_mem_c_latency_c : natural := 3; -- latency in clock cycles (min 1, max 255), plus 1 cycle initiali delay
-- -------------------------------------------------------------------------------------------
 
-- internals - hands off! --
constant boot_imem_c : boolean := not boot_external_c;
constant int_imem_c : boolean := not ext_imem_c;
constant int_dmem_c : boolean := not ext_dmem_c;
constant baud_val_c : real := real(f_clock_c) / real(baud_rate_c);
constant t_clock_c : time := (1 sec) / f_clock_c;
 
-- text.io --
file file_uart_tx_out : text open write_mode is "neorv32.testbench_uart.out";
 
-- internal configuration --
constant baud_val_c : real := real(f_clock_c) / real(baud_rate_c);
constant t_clock_c : time := (1 sec) / f_clock_c;
 
-- generators --
signal clk_gen, rst_gen : std_ulogic := '0';
 
118,12 → 122,14
ack : std_ulogic; -- transfer acknowledge
err : std_ulogic; -- transfer error
tag : std_ulogic_vector(2 downto 0); -- tag
lock : std_ulogic; -- locked/exclusive bus access
end record;
signal wb_cpu, wb_mem_a, wb_mem_b : wishbone_t;
signal wb_cpu, wb_mem_a, wb_mem_b, wb_mem_c : wishbone_t;
 
-- Wishbone memories --
type ext_mem_a_ram_t is array (0 to ext_mem_a_size_c/4-1) of std_ulogic_vector(31 downto 0);
type ext_mem_b_ram_t is array (0 to ext_mem_b_size_c/4-1) of std_ulogic_vector(31 downto 0);
type ext_mem_c_ram_t is array (0 to ext_mem_c_size_c/4-1) of std_ulogic_vector(31 downto 0);
type ext_mem_read_latency_t is array (0 to 255) of std_ulogic_vector(31 downto 0);
 
-- init function --
139,8 → 145,9
end function init_wbmem;
 
-- external memory components --
signal ext_ram_a : ext_mem_a_ram_t := init_wbmem(application_init_image); -- initialized, used to simulate external instruction boot memory
signal ext_ram_b : ext_mem_b_ram_t; -- uninitialized, used to simulate external IO
signal ext_ram_a : ext_mem_a_ram_t := init_wbmem(application_init_image); -- initialized, used to simulate external IMEM
signal ext_ram_b : ext_mem_b_ram_t := (others => (others => '0')); -- zero, used to simulate external DMEM
signal ext_ram_c : ext_mem_c_ram_t; -- uninitialized, used to simulate external IO
 
type ext_mem_t is record
rdata : ext_mem_read_latency_t;
147,7 → 154,7
acc_en : std_ulogic;
ack : std_ulogic_vector(ext_mem_a_latency_c-1 downto 0);
end record;
signal ext_mem_a, ext_mem_b : ext_mem_t;
signal ext_mem_a, ext_mem_b, ext_mem_c : ext_mem_t;
 
begin
 
167,6 → 174,7
USER_CODE => x"12345678", -- custom user code
HW_THREAD_ID => x"00000000", -- hardware thread id (hartid)
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_A => true, -- implement atomic extension?
CPU_EXTENSION_RISCV_C => true, -- implement compressed extension?
CPU_EXTENSION_RISCV_E => false, -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M => true, -- implement muld/div extension?
181,12 → 189,12
PMP_NUM_REGIONS => 4, -- number of regions (max 16)
PMP_GRANULARITY => 14, -- minimal region granularity (1=8B, 2=16B, 3=32B, ...) default is 64k
-- Internal Instruction memory --
MEM_INT_IMEM_USE => boot_imem_c, -- implement processor-internal instruction memory
MEM_INT_IMEM_USE => int_imem_c , -- implement processor-internal instruction memory
MEM_INT_IMEM_SIZE => imem_size_c, -- size of processor-internal instruction memory in bytes
MEM_INT_IMEM_ROM => false, -- implement processor-internal instruction memory as ROM
-- Internal Data memory --
MEM_INT_DMEM_USE => true, -- implement processor-internal data memory
MEM_INT_DMEM_SIZE => 8*1024, -- size of processor-internal data memory in bytes
MEM_INT_DMEM_USE => int_dmem_c, -- implement processor-internal data memory
MEM_INT_DMEM_SIZE => dmem_size_c, -- size of processor-internal data memory in bytes
-- External memory interface --
MEM_EXT_USE => true, -- implement external memory bus interface?
-- Processor peripherals --
197,7 → 205,7
IO_TWI_USE => true, -- implement two-wire interface (TWI)?
IO_PWM_USE => true, -- implement pulse-width modulation unit (PWM)?
IO_WDT_USE => true, -- implement watch dog timer (WDT)?
IO_TRNG_USE => false, -- DEFAULT TRNG CONFIG CANNOT BE SIMULATED!
IO_TRNG_USE => false, -- trng cannot be simulated
IO_CFU0_USE => true, -- implement custom functions unit 0 (CFU0)?
IO_CFU1_USE => true -- implement custom functions unit 1 (CFU1)?
)
214,6 → 222,7
wb_sel_o => wb_cpu.sel, -- byte enable
wb_stb_o => wb_cpu.stb, -- strobe
wb_cyc_o => wb_cpu.cyc, -- valid cycle
wb_lock_o => wb_cpu.lock, -- locked/exclusive bus access
wb_ack_i => wb_cpu.ack, -- transfer acknowledge
wb_err_i => wb_cpu.err, -- transfer error
-- Advanced memory control signals --
302,29 → 311,41
-- -------------------------------------------------------------------------------------------
-- CPU broadcast signals --
wb_mem_a.addr <= wb_cpu.addr;
wb_mem_a.wdata <= wb_cpu.wdata;
wb_mem_a.we <= wb_cpu.we;
wb_mem_a.sel <= wb_cpu.sel;
wb_mem_a.tag <= wb_cpu.tag;
wb_mem_a.cyc <= wb_cpu.cyc;
wb_mem_a.lock <= wb_cpu.lock;
 
wb_mem_b.addr <= wb_cpu.addr;
wb_mem_a.wdata <= wb_cpu.wdata;
wb_mem_b.wdata <= wb_cpu.wdata;
wb_mem_a.we <= wb_cpu.we;
wb_mem_b.we <= wb_cpu.we;
wb_mem_a.sel <= wb_cpu.sel;
wb_mem_b.sel <= wb_cpu.sel;
wb_mem_a.tag <= wb_cpu.tag;
wb_mem_b.tag <= wb_cpu.tag;
wb_mem_a.cyc <= wb_cpu.cyc;
wb_mem_b.cyc <= wb_cpu.cyc;
wb_mem_b.lock <= wb_cpu.lock;
 
wb_mem_c.addr <= wb_cpu.addr;
wb_mem_c.wdata <= wb_cpu.wdata;
wb_mem_c.we <= wb_cpu.we;
wb_mem_c.sel <= wb_cpu.sel;
wb_mem_c.tag <= wb_cpu.tag;
wb_mem_c.cyc <= wb_cpu.cyc;
wb_mem_c.lock <= wb_cpu.lock;
 
-- CPU read-back signals (no mux here since peripherals have "output gates") --
wb_cpu.rdata <= wb_mem_a.rdata or wb_mem_b.rdata;
wb_cpu.ack <= wb_mem_a.ack or wb_mem_b.ack;
wb_cpu.err <= wb_mem_a.err or wb_mem_b.err;
wb_cpu.rdata <= wb_mem_a.rdata or wb_mem_b.rdata or wb_mem_c.rdata;
wb_cpu.ack <= wb_mem_a.ack or wb_mem_b.ack or wb_mem_c.ack;
wb_cpu.err <= wb_mem_a.err or wb_mem_b.err or wb_mem_c.err;
 
-- peripheral select via STROBE signal --
wb_mem_a.stb <= wb_cpu.stb when (wb_cpu.addr >= ext_mem_a_base_addr_c) and (wb_cpu.addr < std_ulogic_vector(unsigned(ext_mem_a_base_addr_c) + ext_mem_a_size_c)) else '0';
wb_mem_b.stb <= wb_cpu.stb when (wb_cpu.addr >= ext_mem_b_base_addr_c) and (wb_cpu.addr < std_ulogic_vector(unsigned(ext_mem_b_base_addr_c) + ext_mem_b_size_c)) else '0';
wb_mem_c.stb <= wb_cpu.stb when (wb_cpu.addr >= ext_mem_c_base_addr_c) and (wb_cpu.addr < std_ulogic_vector(unsigned(ext_mem_c_base_addr_c) + ext_mem_c_size_c)) else '0';
 
 
-- Wishbone Memory A (simulated external memory) ------------------------------------------
-- Wishbone Memory A (simulated external IMEM) --------------------------------------------
-- -------------------------------------------------------------------------------------------
ext_mem_a_access: process(clk_gen)
begin
364,7 → 385,7
end process ext_mem_a_access;
 
 
-- Wishbone Memory B (simulated external memory) ------------------------------------------
-- Wishbone Memory B (simulated external DMEM) --------------------------------------------
-- -------------------------------------------------------------------------------------------
ext_mem_b_access: process(clk_gen)
begin
404,4 → 425,46
end process ext_mem_b_access;
 
 
-- Wishbone Memory C (simulated external IO) ----------------------------------------------
-- -------------------------------------------------------------------------------------------
ext_mem_c_access: process(clk_gen)
begin
if rising_edge(clk_gen) then
-- control --
ext_mem_c.ack(0) <= wb_mem_c.cyc and wb_mem_c.stb; -- wishbone acknowledge
 
-- write access --
if ((wb_mem_c.cyc and wb_mem_c.stb and wb_mem_c.we) = '1') then -- valid write access
for i in 0 to 3 loop
if (wb_mem_c.sel(i) = '1') then
ext_ram_c(to_integer(unsigned(wb_mem_c.addr(index_size_f(ext_mem_c_size_c/4)+1 downto 2))))(7+i*8 downto 0+i*8) <= wb_mem_c.wdata(7+i*8 downto 0+i*8);
end if;
end loop; -- i
end if;
 
-- read access --
ext_mem_c.rdata(0) <= ext_ram_c(to_integer(unsigned(wb_mem_c.addr(index_size_f(ext_mem_c_size_c/4)+1 downto 2)))); -- word aligned
-- virtual read and ack latency --
if (ext_mem_c_latency_c > 1) then
for i in 1 to ext_mem_c_latency_c-1 loop
ext_mem_c.rdata(i) <= ext_mem_c.rdata(i-1);
ext_mem_c.ack(i) <= ext_mem_c.ack(i-1) and wb_mem_c.cyc;
end loop;
end if;
 
-- error to simulate interrupted LOCKED/EXCLUSIVE bus access --
wb_mem_c.err <= wb_mem_c.cyc and wb_mem_c.stb and wb_mem_c.lock and wb_mem_c.addr(2); -- locked access to odd word-addresses will fail
 
-- bus output register --
if (ext_mem_c.ack(ext_mem_c_latency_c-1) = '1') and (wb_mem_c.cyc = '1') then
wb_mem_c.rdata <= ext_mem_c.rdata(ext_mem_c_latency_c-1);
wb_mem_c.ack <= '1';
else
wb_mem_c.rdata <= (others => '0');
wb_mem_c.ack <= '0';
end if;
end if;
end process ext_mem_c_access;
 
 
end neorv32_tb_rtl;
/sw/bootloader/bootloader.c
69,6 → 69,8
#define AUTOBOOT_TIMEOUT 8
/** Set to 0 to disable bootloader status LED */
#define STATUS_LED_EN (1)
/** SPI_DIRECT_BOOT_EN: Define/uncomment to enable SPI direct boot (disables the entire user console!) */
//#define SPI_DIRECT_BOOT_EN
/** Bootloader status LED at GPIO output port */
#define STATUS_LED (0)
/** SPI flash boot image base address (warning! address might wrap-around!) */
181,11 → 183,27
**************************************************************************/
int main(void) {
 
#ifdef __riscv_compressed
#warning In order to allow the bootloader to run on any CPU configuration it should be compiled using the base ISA (rv32i/e) only.
#endif
 
// global variable for executable size; 0 means there is no exe available
exe_available = 0;
 
// ------------------------------------------------
// Processor hardware initialization
// Minimal CPU hardware initialization
// - all IO devices are reset and disabled by the crt0 code
// ------------------------------------------------
 
// confiure trap handler (bare-metal, no neorv32 rte available)
neorv32_cpu_csr_write(CSR_MTVEC, (uint32_t)(&bootloader_trap_handler));
 
 
// ------------------------------------------------
// Minimal processor hardware initialization
// - all IO devices are reset and disabled by the crt0 code
// ------------------------------------------------
 
// get clock speed (in Hz)
uint32_t clock_speed = SYSINFO_CLK;
 
197,6 → 215,11
neorv32_spi_setup(CLK_PRSC_128, 0, 0, 0);
}
 
if (STATUS_LED_EN == 1) {
// activate status LED, clear all others
neorv32_gpio_port_set(1 << STATUS_LED);
}
 
// init UART (no interrupts)
neorv32_uart_setup(BAUD_RATE, 0, 0);
 
203,21 → 226,30
// Configure machine system timer interrupt for ~2Hz
neorv32_mtime_set_timecmp(neorv32_mtime_get_time() + (clock_speed/4));
 
// confiure trap handler (bare-metal, no neorv32 rte available)
neorv32_cpu_csr_write(CSR_MTVEC, (uint32_t)(&bootloader_trap_handler));
 
neorv32_cpu_csr_write(CSR_MIE, 1 << CPU_MIE_MTIE); // activate MTIME IRQ source
neorv32_cpu_eint(); // enable global interrupts
 
if (STATUS_LED_EN == 1) {
// activate status LED, clear all others
neorv32_gpio_port_set(1 << STATUS_LED);
}
 
// global variable to executable size; 0 means there is no exe available
exe_available = 0;
// ------------------------------------------------
// Fast boot mode: Direct SPI boot
// Bootloader will directly boot and execute image from SPI memory.
// No user UART console is available in this mode!
// ------------------------------------------------
#ifdef SPI_DIRECT_BOOT_EN
#warning Compiling bootloader in 'SPI direct boot mode'. Bootloader will directly boot from SPI memory. No user UART console will be available.
 
neorv32_uart_print("\nNEORV32 bootloader\nAccessing SPI flash at ");
print_hex_word((uint32_t)SPI_FLASH_BOOT_ADR);
neorv32_uart_print("\n");
 
get_exe(EXE_STREAM_FLASH);
neorv32_uart_print("\n");
start_app();
 
return 0;
#endif
 
 
// ------------------------------------------------
// Show bootloader intro and system info
// ------------------------------------------------
352,9 → 384,9
return;
}
 
// no need to shut down or reset the used peripherals
// no need to shut down/reset the used peripherals
// no need to disable interrupt sources
// -> this will be done by application's crt0
// -> crt0 will do a clean CPU/processor reset/setup
 
// deactivate global IRQs
neorv32_cpu_dint();
364,12 → 396,6
// wait for UART to finish transmitting
while ((UART_CT & (1<<UART_CT_TX_BUSY)) != 0);
 
// reset performance counters (to benchmark actual application)
asm volatile ("csrw mcycle, zero"); // also clears 'cycle'
asm volatile ("csrw mcycleh, zero"); // also clears 'cycleh'
asm volatile ("csrw minstret, zero"); // also clears 'instret'
asm volatile ("csrw minstreth, zero"); // also clears 'instreth'
 
// start app at instruction space base address
register uint32_t app_base = SYSINFO_ISPACE_BASE;
asm volatile ("jalr zero, %0" : : "r" (app_base));
668,7 → 694,7
 
data.uint32 = wdata;
 
uint32_t i;
int i;
for (i=0; i<4; i++) {
spi_flash_write_byte(addr + i, data.uint8[3-i]);
}
761,7 → 787,8
 
address.uint32 = addr;
 
neorv32_spi_trans(address.uint8[2]);
neorv32_spi_trans(address.uint8[1]);
neorv32_spi_trans(address.uint8[0]);
int i;
for (i=2; i>=0; i--) {
neorv32_spi_trans(address.uint8[i]);
}
}
/sw/common/crt0.S
104,7 → 104,7
 
 
// *********************************************************
// Setup pointers using linker script symbol
// Setup pointers using linker script symbols
// *********************************************************
__crt0_pointer_init:
.option push
117,7 → 117,7
 
 
// *********************************************************
// Init trap handler base address
// Initialize dummy trap handler base address
// *********************************************************
__crt0_neorv32_trap_init:
la x11, __crt0_dummy_trap_handler
174,13 → 174,20
 
 
// *********************************************************
// Call main function (with argc = argv = 0)
// Call main function
// *********************************************************
__crt0_main_entry:
 
// setup arguments for calling main
addi x10, zero, 0 // argc = 0
addi x11, zero, 0 // argv = 0
 
// clear cycle and instruction counters
csrw mcycle, zero
csrw mcycleh, zero
csrw minstret, zero
csrw minstreth, zero
 
jal ra, main
 
 
189,8 → 196,10
// *********************************************************
__crt0_this_is_the_end:
csrrci zero, mstatus, 8 // mstatus: disable global IRQs (MIE)
nop
wfi
j . // in case WFI is not available
__crt0_this_is_the_end_my_friend:
j __crt0_this_is_the_end_my_friend // in case WFI is not available
 
 
// *********************************************************
/sw/example/cpu_test/main.c
79,6 → 79,17
 
 
/**********************************************************************//**
* "Simulated external IO" - exclusive access will always succeed
**************************************************************************/
# define ATOMIC_SUCCESS (*(IO_REG32 (EXT_MEM_BASE + 0)))
 
/**********************************************************************//**
* "Simulated external IO" - exclusive access will always fail
**************************************************************************/
# define ATOMIC_FAILURE (*(IO_REG32 (EXT_MEM_BASE + 4)))
 
 
/**********************************************************************//**
* This program uses mostly synthetic case to trigger all implemented exceptions.
* Each exception is captured and evaluated for correct detection.
*
1214,6 → 1225,72
 
 
// ----------------------------------------------------------
// Test atomic LR/SC operation - should succeed
// ----------------------------------------------------------
neorv32_cpu_csr_write(CSR_MCAUSE, 0);
neorv32_uart_printf("[%i] Atomic access (LR+SC) test (succeeding access): ", cnt_test);
 
if ((UART_CT & (1 << UART_CT_SIM_MODE)) != 0) { // check if this is a simulation
 
// skip if A-mode is implemented
if ((neorv32_cpu_csr_read(CSR_MISA) & (1<<CPU_MISA_A_EXT)) != 0) {
 
cnt_test++;
 
ATOMIC_SUCCESS = 0x11223344;
 
// atomic compare-and-swap
if ((neorv32_cpu_atomic_cas((uint32_t)(&ATOMIC_SUCCESS), 0x11223344, 0xAABBCCDD) == 0) &&
(ATOMIC_SUCCESS == 0xAABBCCDD) && (neorv32_cpu_csr_read(CSR_MCAUSE) == 0)) {
test_ok();
}
else {
test_fail();
}
}
else {
neorv32_uart_printf("skipped (A extension not implemented)\n");
}
}
else {
neorv32_uart_printf("skipped (on real hardware)\n");
}
 
 
// ----------------------------------------------------------
// Test atomic LR/SC operation - should fail
// ----------------------------------------------------------
neorv32_cpu_csr_write(CSR_MCAUSE, 0);
neorv32_uart_printf("[%i] Atomic access (LR+SC) test (failing access): ", cnt_test);
 
if ((UART_CT & (1 << UART_CT_SIM_MODE)) != 0) { // check if this is a simulation
 
// skip if A-mode is implemented
if ((neorv32_cpu_csr_read(CSR_MISA) & (1<<CPU_MISA_A_EXT)) != 0) {
 
cnt_test++;
 
ATOMIC_FAILURE = 0x55667788;
 
// atomic compare-and-swap
if ((neorv32_cpu_atomic_cas((uint32_t)(&ATOMIC_FAILURE), 0x55667788, 0xEEFFDDBB) != 0) && (ATOMIC_FAILURE == 0x55667788)) {
test_ok();
}
else {
test_fail();
}
}
else {
neorv32_uart_printf("skipped (A extension not implemented)\n");
}
}
else {
neorv32_uart_printf("skipped (on real hardware)\n");
}
 
 
 
// ----------------------------------------------------------
// Final test reports
// ----------------------------------------------------------
neorv32_uart_printf("\nExecuted instructions: %u\n", (uint32_t)neorv32_cpu_csr_read(CSR_INSTRET));
/sw/example/demo_gpio_irq/main.c
0,0 → 1,155
// #################################################################################################
// # << NEORV32 - GPIO pin-change interrupt demo >> #
// # ********************************************************************************************* #
// # BSD 3-Clause License #
// # #
// # Copyright (c) 2020, Stephan Nolting. All rights reserved. #
// # #
// # Redistribution and use in source and binary forms, with or without modification, are #
// # permitted provided that the following conditions are met: #
// # #
// # 1. Redistributions of source code must retain the above copyright notice, this list of #
// # conditions and the following disclaimer. #
// # #
// # 2. Redistributions in binary form must reproduce the above copyright notice, this list of #
// # conditions and the following disclaimer in the documentation and/or other materials #
// # provided with the distribution. #
// # #
// # 3. Neither the name of the copyright holder nor the names of its contributors may be used to #
// # endorse or promote products derived from this software without specific prior written #
// # permission. #
// # #
// # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS #
// # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF #
// # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE #
// # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, #
// # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
// # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED #
// # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING #
// # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED #
// # OF THE POSSIBILITY OF SUCH DAMAGE. #
// # ********************************************************************************************* #
// # The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting #
// #################################################################################################
 
 
/**********************************************************************//**
* @file demo_gpio_irq/main.c
* @author Stephan Nolting
* @brief Simple GPIO input pin-change interrupt example.
**************************************************************************/
 
#include <neorv32.h>
 
 
/**********************************************************************//**
* @name User configuration
**************************************************************************/
/**@{*/
/** UART BAUD rate */
#define BAUD_RATE 19200
/**@}*/
 
 
/**********************************************************************//**
* GPIO pin-change interrupt handler (has to be a NORMAL function!)
**************************************************************************/
void gpio_pin_change_irq_handler(void);
 
 
/**********************************************************************//**
* Simple demo program to show the GPIO pin-change interrupt feature. Whenever a gpio.input(7:0) pin changes
* its state (low-to-high or high-to-low) a message is send via UART and a counter on gpio.out(7:0) is incremented.
*
* @note This program requires the GPIO controller to be synthesized (the UART is optional).
* @note This program assumes high-active buttons connected to gpio.in(7:0).
* @note This program assumes high-active LEDS connected to gpio.out(7:0).
*
* @return Irrelevant.
**************************************************************************/
int main() {
 
// setup run-time environment for interrupts and exceptions
neorv32_rte_setup();
 
// init UART at default baud rate, no rx interrupt, no tx interrupt
neorv32_uart_setup(BAUD_RATE, 0, 0);
 
 
// check if GPIO unit is implemented at all
if (neorv32_gpio_available() == 0) {
neorv32_uart_print("ERROR! GPIO unit not synthesized!\n");
return 0;
}
 
// say hello
neorv32_uart_print("GPIO pin-change interrupt demo program.\n");
 
 
// clear all outputs
neorv32_gpio_port_set(0);
 
 
// wait for user to hit the start button
neorv32_uart_print("Push button at GPIO.in(0) to start.\n");
 
while(1) {
if (neorv32_gpio_pin_get(0)) {
break;
}
}
 
neorv32_uart_print("Started!\n");
 
 
// The pin-change interrupt of the GPIO module is connected to the
// CPU's fast interrupt input channel 1 (= FIRQ1).
 
// install interrupt handler for GPIO pin-change interrupt
int install_err = 0;
install_err += neorv32_rte_exception_install(RTE_TRAP_FIRQ_1, gpio_pin_change_irq_handler);
 
if (install_err) {
neorv32_uart_printf("RTE install error!\n");
return 0;
}
 
// activate fast interrupt channel 1 (which is GPIO_PIN_CHANGE)
install_err += neorv32_cpu_irq_enable(CPU_MIE_FIRQ1E);
 
// activate GPIO pin-change irq only for input pins 0 to 7
neorv32_gpio_pin_change_config(0x000000ff);
 
// enable global interrupts
neorv32_cpu_eint();
 
 
neorv32_uart_printf("Press any button to trigger the GPIO pin-change interrupt.\n");
neorv32_uart_printf("This will trigger an UART message and increment a counter on GPIO.out(7:0).\n");
 
// go to endless sleep mode
while(1) {
neorv32_cpu_sleep();
}
 
return 0;
}
 
 
/**********************************************************************//**
* Interrupt handler for the GPIO pin-change interrupt.
* @warning This has to be a normal function without any attributes when using the NEORV32 RTE (run-time environment)!
**************************************************************************/
void gpio_pin_change_irq_handler(void) {
 
// if ANY of the input pins, which have an enabled IRQ-mask via neorv32_gpio_pin_change_config(), toggles it's state
// (low-to-high or high-to-low) this handler gets called
 
uint32_t cnt = GPIO_OUTPUT; // get current state of GPIO.out port
cnt++; // increment counter
cnt = cnt & 0xff; // mask, only keep lowest 8 bits
GPIO_OUTPUT = cnt; // set new state of GPIO.out port
 
neorv32_uart_printf("GPIO pin-change IRQ triggered!\n");
}
 
/sw/example/demo_gpio_irq/makefile
0,0 → 1,338
#################################################################################################
# << NEORV32 - Application Makefile >> #
# ********************************************************************************************* #
# Make sure to add the riscv GCC compiler's bin folder to your PATH environment variable. #
# ********************************************************************************************* #
# BSD 3-Clause License #
# #
# Copyright (c) 2020, Stephan Nolting. All rights reserved. #
# #
# Redistribution and use in source and binary forms, with or without modification, are #
# permitted provided that the following conditions are met: #
# #
# 1. Redistributions of source code must retain the above copyright notice, this list of #
# conditions and the following disclaimer. #
# #
# 2. Redistributions in binary form must reproduce the above copyright notice, this list of #
# conditions and the following disclaimer in the documentation and/or other materials #
# provided with the distribution. #
# #
# 3. Neither the name of the copyright holder nor the names of its contributors may be used to #
# endorse or promote products derived from this software without specific prior written #
# permission. #
# #
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS #
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF #
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE #
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, #
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED #
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING #
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED #
# OF THE POSSIBILITY OF SUCH DAMAGE. #
# ********************************************************************************************* #
# The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting #
#################################################################################################
 
 
# *****************************************************************************
# USER CONFIGURATION
# *****************************************************************************
# User's application sources (*.c, *.cpp, *.s, *.S); add additional files here
APP_SRC ?= $(wildcard ./*.c) $(wildcard ./*.s) $(wildcard ./*.cpp) $(wildcard ./*.S)
 
# User's application include folders (don't forget the '-I' before each entry)
APP_INC ?= -I .
# User's application include folders - for assembly files only (don't forget the '-I' before each entry)
ASM_INC ?= -I .
 
# Optimization
EFFORT ?= -Os
 
# Compiler toolchain
RISCV_TOOLCHAIN ?= riscv32-unknown-elf
 
# CPU architecture and ABI
MARCH ?= -march=rv32i
MABI ?= -mabi=ilp32
 
# User flags for additional configuration (will be added to compiler flags)
USER_FLAGS ?=
 
# Serial port for executable upload via bootloer
COM_PORT ?= /dev/ttyUSB0
 
# Relative or absolute path to the NEORV32 home folder
NEORV32_HOME ?= ../../..
# *****************************************************************************
 
 
 
# -----------------------------------------------------------------------------
# NEORV32 framework
# -----------------------------------------------------------------------------
# Path to NEORV32 linker script and startup file
NEORV32_COM_PATH = $(NEORV32_HOME)/sw/common
# Path to main NEORV32 library include files
NEORV32_INC_PATH = $(NEORV32_HOME)/sw/lib/include
# Path to main NEORV32 library source files
NEORV32_SRC_PATH = $(NEORV32_HOME)/sw/lib/source
# Path to NEORV32 executable generator
NEORV32_EXG_PATH = $(NEORV32_HOME)/sw/image_gen
# Path to NEORV32 core rtl folder
NEORV32_RTL_PATH = $(NEORV32_HOME)/rtl/core
# Marker file to check for NEORV32 home folder
NEORV32_HOME_MARKER = $(NEORV32_INC_PATH)/neorv32.h
 
# Core libraries (peripheral and CPU drivers)
CORE_SRC = $(wildcard $(NEORV32_SRC_PATH)/*.c)
# Application start-up code
CORE_SRC += $(NEORV32_COM_PATH)/crt0.S
 
# Linker script
LD_SCRIPT = $(NEORV32_COM_PATH)/neorv32.ld
 
# Main output files
APP_EXE = neorv32_exe.bin
APP_ASM = main.asm
APP_IMG = neorv32_application_image.vhd
BOOT_IMG = neorv32_bootloader_image.vhd
 
 
# -----------------------------------------------------------------------------
# Sources and objects
# -----------------------------------------------------------------------------
# Define all sources
SRC = $(APP_SRC)
SRC += $(CORE_SRC)
 
# Define all object files
OBJ = $(SRC:%=%.o)
 
 
# -----------------------------------------------------------------------------
# Tools and flags
# -----------------------------------------------------------------------------
# Compiler tools
CC = $(RISCV_TOOLCHAIN)-gcc
OBJDUMP = $(RISCV_TOOLCHAIN)-objdump
OBJCOPY = $(RISCV_TOOLCHAIN)-objcopy
SIZE = $(RISCV_TOOLCHAIN)-size
 
# Host native compiler
CC_X86 = gcc -Wall -O -g
 
# NEORV32 executable image generator
IMAGE_GEN = $(NEORV32_EXG_PATH)/image_gen
 
# Compiler & linker flags
CC_OPTS = $(MARCH) $(MABI) $(EFFORT) -Wall -ffunction-sections -fdata-sections -nostartfiles
CC_OPTS += -Wl,--gc-sections -lm -lc -lgcc -lc
# This accelerates instruction fetch after branches when C extension is enabled (irrelevant when C extension is disabled)
CC_OPTS += -falign-functions=4 -falign-labels=4 -falign-loops=4 -falign-jumps=4
CC_OPTS += $(USER_FLAGS)
 
 
# -----------------------------------------------------------------------------
# Application output definitions
# -----------------------------------------------------------------------------
.PHONY: check info help elf_info clean clean_all bootloader
.DEFAULT_GOAL := help
 
# 'compile' is still here for compatibility
exe: $(APP_ASM) $(APP_EXE)
compile: $(APP_ASM) $(APP_EXE)
install: $(APP_ASM) $(APP_IMG)
all: $(APP_ASM) $(APP_EXE) $(APP_IMG)
 
# Check if making bootloader
# Use different base address and legth for instruction memory/"rom" (BOOTMEM instead of IMEM)
# Also define "make_bootloader" for crt0.S
target bootloader: CC_OPTS += -Wl,--defsym=make_bootloader=1 -Dmake_bootloader
 
 
# -----------------------------------------------------------------------------
# Image generator targets
# -----------------------------------------------------------------------------
# install/compile tools
$(IMAGE_GEN): $(NEORV32_EXG_PATH)/image_gen.cpp
@echo Compiling $(IMAGE_GEN)
@$(CC_X86) $< -o $(IMAGE_GEN)
 
 
# -----------------------------------------------------------------------------
# General targets: Assemble, compile, link, dump
# -----------------------------------------------------------------------------
# Compile app *.s sources (assembly)
%.s.o: %.s
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(ASM_INC) $< -o $@
 
# Compile app *.S sources (assembly + C pre-processor)
%.S.o: %.S
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(ASM_INC) $< -o $@
 
# Compile app *.c sources
%.c.o: %.c
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(APP_INC) $< -o $@
 
# Compile app *.cpp sources
%.cpp.o: %.cpp
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(APP_INC) $< -o $@
 
# Link object files and show memory utilization
main.elf: $(OBJ)
@$(CC) $(CC_OPTS) -T $(LD_SCRIPT) $(OBJ) -o $@
@echo "Memory utilization:"
@$(SIZE) main.elf
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
@$(OBJCOPY) -I elf32-little $< -j .text -O binary text.bin
@$(OBJCOPY) -I elf32-little $< -j .rodata -O binary rodata.bin
@$(OBJCOPY) -I elf32-little $< -j .data -O binary data.bin
@cat text.bin rodata.bin data.bin > $@
@rm -f text.bin rodata.bin data.bin
 
 
# -----------------------------------------------------------------------------
# Application targets: Generate binary executable, install (as VHDL file)
# -----------------------------------------------------------------------------
# Generate NEORV32 executable image for upload via bootloader
$(APP_EXE): main.bin $(IMAGE_GEN)
@set -e
@$(IMAGE_GEN) -app_bin $< $@ $(shell basename $(CURDIR))
@echo "Executable ($(APP_EXE)) size in bytes:"
@wc -c < $(APP_EXE)
 
# Generate NEORV32 executable VHDL boot image
$(APP_IMG): main.bin $(IMAGE_GEN)
@set -e
@$(IMAGE_GEN) -app_img $< $@ $(shell basename $(CURDIR))
@echo "Installing application image to $(NEORV32_RTL_PATH)/$(APP_IMG)"
@cp $(APP_IMG) $(NEORV32_RTL_PATH)/.
 
 
# -----------------------------------------------------------------------------
# Bootloader targets
# -----------------------------------------------------------------------------
# Create and install bootloader VHDL init image
$(BOOT_IMG): main.bin $(IMAGE_GEN)
@set -e
@$(IMAGE_GEN) -bld_img $< $(BOOT_IMG) $(shell basename $(CURDIR))
@echo "Installing bootloader image to $(NEORV32_RTL_PATH)/$(BOOT_IMG)"
@cp $(BOOT_IMG) $(NEORV32_RTL_PATH)/.
 
# Just an alias that
bootloader: $(BOOT_IMG)
 
 
# -----------------------------------------------------------------------------
# Check toolchain
# -----------------------------------------------------------------------------
check: $(IMAGE_GEN)
@echo "---------------- Check: NEORV32_HOME folder ----------------"
ifneq ($(shell [ -e $(NEORV32_HOME_MARKER) ] && echo 1 || echo 0 ), 1)
$(error NEORV32_HOME folder not found!)
endif
@echo "NEORV32_HOME: $(NEORV32_HOME)"
@echo "---------------- Check: $(CC) ----------------"
@$(CC) -v
@echo "---------------- Check: $(OBJDUMP) ----------------"
@$(OBJDUMP) -V
@echo "---------------- Check: $(OBJCOPY) ----------------"
@$(OBJCOPY) -V
@echo "---------------- Check: $(SIZE) ----------------"
@$(SIZE) -V
@echo "---------------- Check: NEORV32 image_gen ----------------"
@$(IMAGE_GEN) -help
@echo "---------------- Check: Native GCC ----------------"
@$(CC_X86) -v
@echo
@echo "Toolchain check OK"
 
 
# -----------------------------------------------------------------------------
# Upload executable via serial port to bootloader
# -----------------------------------------------------------------------------
upload: $(APP_EXE)
@sh $(NEORV32_EXG_PATH)/uart_upload.sh $(COM_PORT) $(APP_EXE)
 
 
# -----------------------------------------------------------------------------
# Show configuration
# -----------------------------------------------------------------------------
info:
@echo "---------------- Info: Project ----------------"
@echo "Project folder: $(shell basename $(CURDIR))"
@echo "Source files: $(APP_SRC)"
@echo "Include folder(s): $(APP_INC)"
@echo "ASM include folder(s): $(ASM_INC)"
@echo "---------------- Info: NEORV32 ----------------"
@echo "NEORV32 home folder (NEORV32_HOME): $(NEORV32_HOME)"
@echo "IMAGE_GEN: $(IMAGE_GEN)"
@echo "Core source files:"
@echo "$(CORE_SRC)"
@echo "Core include folder:"
@echo "$(NEORV32_INC_PATH)"
@echo "---------------- Info: Objects ----------------"
@echo "Project object files:"
@echo "$(OBJ)"
@echo "---------------- Info: RISC-V CPU ----------------"
@echo "MARCH: $(MARCH)"
@echo "MABI: $(MABI)"
@echo "---------------- Info: Toolchain ----------------"
@echo "Toolchain: $(RISCV_TOLLCHAIN)"
@echo "CC: $(CC)"
@echo "OBJDUMP: $(OBJDUMP)"
@echo "OBJCOPY: $(OBJCOPY)"
@echo "SIZE: $(SIZE)"
@echo "---------------- Info: Compiler Libraries ----------------"
@echo "LIBGCC:"
@$(CC) -print-libgcc-file-name
@echo "SEARCH-DIRS:"
@$(CC) -print-search-dirs
@echo "---------------- Info: Flags ----------------"
@echo "USER_FLAGS: $(USER_FLAGS)"
@echo "CC_OPTS: $(CC_OPTS)"
@echo "---------------- Info: Host Native GCC Flags ----------------"
@echo "CC_X86: $(CC_X86)"
 
 
# -----------------------------------------------------------------------------
# Show final ELF details (just for debugging)
# -----------------------------------------------------------------------------
elf_info: main.elf
@$(OBJDUMP) -x main.elf
 
 
# -----------------------------------------------------------------------------
# Help
# -----------------------------------------------------------------------------
help:
@echo "<<< NEORV32 Application Makefile >>>"
@echo "Make sure to add the bin folder of RISC-V GCC to your PATH variable."
@echo "Targets:"
@echo " help - show this text"
@echo " check - check toolchain"
@echo " info - show makefile/toolchain configuration"
@echo " exe - compile and generate <neorv32_exe.bin> executable for upload via bootloader"
@echo " install - compile, generate and install VHDL IMEM boot image (for application)"
@echo " all - compile and generate <neorv32_exe.bin> executable for upload via bootloader and generate and install VHDL IMEM boot image (for application)"
@echo " clean - clean up project"
@echo " clean_all - clean up project, core libraries and image generator"
@echo " bootloader - compile, generate and install VHDL BOOTROM boot image (for bootloader only!)"
@echo " upload - upload <neorv32_exe.bin> executable via serial port <COM_PORT> to bootloader"
 
 
# -----------------------------------------------------------------------------
# Clean up
# -----------------------------------------------------------------------------
clean:
@rm -f *.elf *.o *.bin *.out *.asm *.vhd
 
clean_all: clean
@rm -f $(OBJ) $(IMAGE_GEN)
/sw/lib/include/neorv32.h
143,8 → 143,11
* CPU <b>misa</b> CSR (r/-): Machine instruction set extensions (RISC-V spec.)
**************************************************************************/
enum NEORV32_CPU_MISA_enum {
CPU_MISA_A_EXT = 0, /**< CPU misa CSR (0): A: Atomic instructions CPU extension available (r/-)*/
CPU_MISA_B_EXT = 1, /**< CPU misa CSR (1): B: Bit manipulation CPU extension available (r/-)*/
CPU_MISA_C_EXT = 2, /**< CPU misa CSR (2): C: Compressed instructions CPU extension available (r/-)*/
CPU_MISA_E_EXT = 4, /**< CPU misa CSR (3): E: Embedded CPU extension available (r/-) */
CPU_MISA_E_EXT = 4, /**< CPU misa CSR (4): E: Embedded CPU extension available (r/-) */
CPU_MISA_F_EXT = 4, /**< CPU misa CSR (5): F: Floating point (single-precision) extension available (r/-) */
CPU_MISA_I_EXT = 8, /**< CPU misa CSR (8): I: Base integer ISA CPU extension available (r/-) */
CPU_MISA_M_EXT = 12, /**< CPU misa CSR (12): M: Multiplier/divider CPU extension available (r/-)*/
CPU_MISA_U_EXT = 20, /**< CPU misa CSR (20): U: User mode CPU extension available (r/-)*/
/sw/lib/include/neorv32_cpu.h
52,6 → 52,7
uint64_t neorv32_cpu_get_systime(void);
void neorv32_cpu_delay_ms(uint32_t time_ms);
void __attribute__((naked)) neorv32_cpu_goto_user_mode(void);
int neorv32_cpu_atomic_cas(uint32_t addr, uint32_t expected, uint32_t desired);
 
 
/**********************************************************************//**
/sw/lib/source/neorv32_cpu.c
217,23 → 217,26
 
 
/**********************************************************************//**
* Simple delay function (not very precise) using busy wait.
* Simple delay function using busy wait.
*
* @warning This function requires the cycle CSR(s). Hence, the Zicsr extension is mandatory.
*
* @param[in] time_ms Time in ms to wait.
**************************************************************************/
void neorv32_cpu_delay_ms(uint32_t time_ms) {
 
uint32_t clock_speed = SYSINFO_CLK >> 10; // fake divide by 1000
clock_speed = clock_speed >> 5; // divide by loop execution time (~30 cycles)
uint32_t cnt = clock_speed * time_ms;
uint64_t time_resume = neorv32_cpu_get_cycle();
 
// one iteration = ~30 cycles
while (cnt) {
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
cnt--;
uint32_t clock = SYSINFO_CLK; // clock ticks per second
clock = clock / 1000; // clock ticks per ms
 
uint64_t wait_cycles = ((uint64_t)clock) * ((uint64_t)time_ms);
time_resume += wait_cycles;
 
while(1) {
if (neorv32_cpu_get_cycle() >= time_resume) {
break;
}
}
}
 
241,16 → 244,54
/**********************************************************************//**
* Switch from privilege mode MACHINE to privilege mode USER.
*
* @note This function requires the U extension to be implemented.
* @note Maybe you should do a fence.i after this.
* @warning This function requires the U extension to be implemented.
**************************************************************************/
void __attribute__((naked)) neorv32_cpu_goto_user_mode(void) {
 
// make sure to use NO registers in here! -> naked
 
asm volatile ("csrw mepc, ra \n\t" // move return address to mepc so we can return using "mret". also, we can use ra as general purpose register in here
asm volatile ("csrw mepc, ra \n\t" // move return address to mepc so we can return using "mret". also, we can now use ra as general purpose register in here
"li ra, %[input_imm] \n\t" // bit mask to clear the two MPP bits
"csrrc zero, mstatus, ra \n\t" // clear MPP bits -> MPP=u-mode
"mret \n\t" // return and switch to user mode
: : [input_imm] "i" ((1<<CPU_MSTATUS_MPP_H) | (1<<CPU_MSTATUS_MPP_L)));
}
 
 
/**********************************************************************//**
* Atomic compare-and-swap operation (for implemeneting semaphores and mutexes).
*
* @warning This function requires the A (atomic) CPU extension.
*
* @param[in] addr Address of memory location.
* @param[in] expected Expected value (for comparison).
* @param[in] desired Desired value (new value).
* @return Returns 0 on success, 1 on failure.
**************************************************************************/
int __attribute__ ((noinline)) neorv32_cpu_atomic_cas(uint32_t addr, uint32_t expected, uint32_t desired) {
#ifdef __riscv_atomic
 
register uint32_t addr_reg = addr;
register uint32_t des_reg = desired;
register uint32_t tmp_reg;
 
// load original value + reservation (lock)
asm volatile ("lr.w %[result], (%[input])" : [result] "=r" (tmp_reg) : [input] "r" (addr_reg));
 
if (tmp_reg != expected) {
asm volatile ("lw x0, 0(%[input])" : : [input] "r" (addr_reg)); // clear reservation lock
return 1;
}
 
// store-conditional
asm volatile ("sc.w %[result], %[input_i], (%[input_j])" : [result] "=r" (tmp_reg) : [input_i] "r" (des_reg), [input_j] "r" (addr_reg));
 
if (tmp_reg) {
return 1;
}
 
return 0;
#else
return 1; // A extension not implemented -Y always fail
#endif
}
/sw/lib/source/neorv32_rte.c
397,38 → 397,38
__neorv32_rte_print_true_false(SYSINFO_FEATURES & (1 << SYSINFO_FEATURES_MEM_EXT));
 
// peripherals
neorv32_uart_printf("\n-- Processor Peripherals --\n");
neorv32_uart_printf("\n-- Available Processor Peripherals --\n");
 
tmp = SYSINFO_FEATURES;
 
neorv32_uart_printf("GPIO: ");
neorv32_uart_printf("GPIO - ");
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_GPIO));
 
neorv32_uart_printf("MTIME: ");
neorv32_uart_printf("MTIME - ");
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_MTIME));
 
neorv32_uart_printf("UART: ");
neorv32_uart_printf("UART - ");
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_UART));
 
neorv32_uart_printf("SPI: ");
neorv32_uart_printf("SPI - ");
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_SPI));
 
neorv32_uart_printf("TWI: ");
neorv32_uart_printf("TWI - ");
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_TWI));
 
neorv32_uart_printf("PWM: ");
neorv32_uart_printf("PWM - ");
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_PWM));
 
neorv32_uart_printf("WDT: ");
neorv32_uart_printf("WDT - ");
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_WDT));
 
neorv32_uart_printf("TRNG: ");
neorv32_uart_printf("TRNG - ");
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_TRNG));
 
neorv32_uart_printf("CFU0: ");
neorv32_uart_printf("CFU0 - ");
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_CFU0));
 
neorv32_uart_printf("CFU1: ");
neorv32_uart_printf("CFU1 - ");
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_CFU1));
}
 
506,9 → 506,8
**************************************************************************/
void neorv32_rte_print_credits(void) {
 
neorv32_uart_print("\nThe NEORV32 Processor Project, by Stephan Nolting\n"
"https://github.com/stnolting/neorv32\n"
"made in Hannover, Germany EU\n\n");
neorv32_uart_print("The NEORV32 Processor Project by Stephan Nolting\n"
"https://github.com/stnolting/neorv32\n\n");
}
 
 
/CHANGELOG.md
14,8 → 14,13
 
| Date (*dd.mm.yyyy*) | Version | Comment |
|:----------:|:-------:|:--------|
| 03.12.2020 | 1.4.8.1 | Optimized CPU program counter (PC) update logic and "next PC" computation (shortend critical path); updated bootloader (configuration option for direct-boot-from-SPI-flash only) and *customization* text in neorv32.pdf |
| 01.12.2020 | [**:rocket:1.4.8.0**](https://github.com/stnolting/neorv32/releases/tag/v1.4.8.0) | :warning: fixed bug in CPU-internal co-processor interface; optimized multiplier unit (~1 faster); added CPU `A` (atomic) extension support (only `lr.w` and `sc.w` instructions yet); added `lock` signal to CPU and processor's external bus interface |
| 28.11.2020 | 1.4.7.6 | Split ALU core operations: shortened critical path - replaced ALU output 8:1 mux by a 4:1 mux |
| 26.11.2020 | 1.4.7.5 | Minor rtl clean-up; CSR access instructions are one cycle faster now (3 cycles now); system/environemnt instructions (`ecall` `ebreak` `mret` `wfi`) need one additional cycle (4 cycles now) |
| 25.11.2020 | 1.4.7.4 | :warning: fixed bug in `FENCE.I` instruction that corrupted instruction fetch when executing code from processor-external memory; default testbench (`sim/neorv32_tb.vhd`) now features external IMEM, external DMEM and external IO connected via external bus interface; simulation now allows CPU to execute code using external memories only (no internal IMEM/DMEM); optimized CPU's instruction fetch interface (no more unnecessary transfer cancel requests) |
| 20.11.2020 | 1.4.7.2 | :warning: fixed bug in CPU bus unit that caused a memory exception after reset in some cases; added second simulated external (Wishbone) memory to testbench (one memory for simulating an external IMEM, one memory for simulating external memory-mapped IO); external bus interface (`wishbone`) now makes sure that a canceled bus transfer is really understood by the accessed peripheral |
| 20.11.2020 | 1.4.7.1 | Removed legacy (and unused) "update_enable signal" from IMEM |
| 20.11.2020 | 1.4.7.1 | Removed deprecated "update_enable signal" from IMEM |
| 11.11.2020 | [**:rocket:1.4.7.0**](https://github.com/stnolting/neorv32/releases/tag/v1.4.7.0) | Further optimized pipeline front-end: Jumps and branches are one cycle faster (+5% coremark performance); updated synthesis results; updated performance results; added `hello_world` example program |
| 07.11.2020 | 1.4.6.7 | Updated bootloader (size optimization) and changed processor version output; added project logo; minor data sheet edits |
| 03.11.2020 | 1.4.6.6 | Removed SPI module's *buggy* "LSB-first mode", SPI module now always sends data MSB-first; removed SPI.CTRL `SPI_CT_DIR` bit; modfied bit order in SPI CTRL register; updated SPI SW library |
/README.md
30,7 → 30,8
* RISC-V-[compliant](#Status) 32-bit `rv32i` [**NEORV32 CPU**](#NEORV32-CPU-Features), compliant to
* Subset of the *Unprivileged ISA Specification* [(Version 2.2)](https://github.com/stnolting/neorv32/blob/master/docs/riscv-privileged.pdf)
* Subset of the *Privileged Architecture Specification* [(Version 1.12-draft)](https://github.com/stnolting/neorv32/blob/master/docs/riscv-spec.pdf)
* Optional CPU extensions
* Optional RISC-V CPU extensions
* `A` - atomic memory access instructions
* `C` - compressed instructions (16-bit)
* `E` - embedded CPU (reduced register file)
* `M` - integer multiplication and division hardware
38,10 → 39,10
* `Zicsr` - control and status register access instructions (+ exception/irq system)
* `Zifencei` - instruction stream synchronization
* `PMP` - physical memory protection
* Full-scale RISC-V microcontroller system (**SoC**) [**NEORV32 Processor**](#NEORV32-Processor-Features) with optional submodules
* optional embedded memories (instruction/data/bootloader, RAM/ROM)
* Full-scale RISC-V microcontroller system / **SoC** [**NEORV32 Processor**](#NEORV32-Processor-Features) with optional submodules
* optional embedded memories (instructions/data/bootloader, RAM/ROM)
* timers (watch dog, RISC-V-compliant machine timer)
* serial interfaces (SPI, TWI, UART)
* serial interfaces (SPI, TWI, UART) and general purpose IO
* external bus interface (Wishbone / [AXI4](#AXI4-Connectivity))
* [more ...](#NEORV32-Processor-Features)
* Software framework
64,7 → 65,7
 
### Design Principles
 
* From zero to `main()`: Completely open source and documented.
* From zero to *hello_world*: Completely open source and documented.
* Plain VHDL without technology-specific parts like attributes, macros or primitives.
* Easy to use – working out of the box.
* Clean synchronous design, no wacky combinatorial interfaces.
86,22 → 87,22
| [RISC-V compliance test](https://github.com/stnolting/neorv32_riscv_compliance) | [![Build Status](https://travis-ci.com/stnolting/neorv32_riscv_compliance.svg?branch=master)](https://travis-ci.com/stnolting/neorv32_riscv_compliance) | |
 
 
### To-Do / Wish List / [Help Wanted](#Contribute)
### To-Do / Wish List / Help Wanted
 
* Use LaTeX for data sheet
* Further size and performance optimization *(work in progress)*
* A cache for the external memory/bus interface *(work in progress)*
* Burst mode for the external memory/bus interface
* RISC-V `B` extension ([bitmanipulation](https://github.com/riscv/riscv-bitmanip))
* Synthesis results (+ wrappers?) for more/specific platforms
* More support for FreeRTOS
* Further size and performance optimization
* Synthesis results (+ wrappers?) for more/specific platforms
* Maybe port additional RTOSs (like [Zephyr](https://github.com/zephyrproject-rtos/zephyr) or [RIOT](https://www.riot-os.org))
* Implement further RISC-V (or custom?) CPU extensions (like floating-point operations ('F'))
* Implement further RISC-V (or custom?) CPU extensions (like floating-point extension `F`)
* ...
* [Ideas?](#Contribute)
 
#### Work-in-progress
 
* A cache for the external memory/bus interface (also providing burst mode?)
* RISC-V `B` extension ([bitmanipulation](https://github.com/riscv/riscv-bitmanip))
 
 
## Features
 
The full-blown data sheet of the NEORV32 Processor and CPU is available as pdf file:
131,9 → 132,7
 
### NEORV32 CPU Features
 
![neorv32 Overview](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_cpu.png)
 
The CPU is [compliant](https://github.com/stnolting/neorv32_riscv_compliance) to the
The NEORV32 CPU is [compliant](https://github.com/stnolting/neorv32_riscv_compliance) to the
[official RISC-V specifications (2.2)](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/riscv-spec.pdf) including a subset of the
[RISC-V privileged architecture specifications (1.12-draft)](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/riscv-spec.pdf).
 
172,6 → 171,10
* By default, the multiplier and divider cores use an iterative bit-serial processing scheme
* Multiplications can be mapped to DSPs via the `FAST_MUL_EN` generic to increase performance
 
**Atomic memory access** (`A` extension):
* Supported instruction: `LR.W` `SC.W`
* By default, the multiplier and divider cores use an iterative bit-serial processing scheme
 
**Privileged architecture / CSR access** (`Zicsr` extension):
* Privilege levels: `M-mode` (Machine mode)
* CSR access instructions: `CSRRW` `CSRRS` `CSRRC` `CSRRWI` `CSRRSI` `CSRRCI`
207,6 → 210,7
 
* `misa` CSR is read-only - no dynamic enabling/disabling of synthesized CPU extensions during runtime; for compatibility: write accesses (in m-mode) are ignored and do not cause an exception
* The physical memory protection (**PMP**) only supports `NAPOT` mode, a minimal granularity of 8 bytes and only up to 8 regions
* The `A` extension only implements `lr.w` and `sc.w` instructions yet. However, these instructions are sufficient to emulate all further AMO operations
 
 
### NEORV32-Specific CPU Extensions
227,39 → 231,41
information is derived from the Timing Analyzer / Slow 1200mV 0C Model. If not otherwise specified, the default configuration
of the CPU's generics is assumed (for example no PMP). No constraints were used at all.
 
Results generated for hardware version `1.4.7.0`.
Results generated for hardware version `1.4.8.0`.
 
| CPU Configuration | LEs | FFs | Memory bits | DSPs | f_max |
|:---------------------------------------|:----------:|:--------:|:-----------:|:----:|:--------:|
| `rv32i` | 932 | 413 | 2048 | 0 | ~120 MHz |
| `rv32i` + `u` + `Zicsr` + `Zifencei` | 1800 | 815 | 2048 | 0 | ~118 MHz |
| `rv32im` + `u` + `Zicsr` + `Zifencei` | 2368 | 1058 | 2048 | 0 | ~117 MHz |
| `rv32imc` + `u` + `Zicsr` + `Zifencei` | 2604 | 1073 | 2048 | 0 | ~113 MHz |
| `rv32emc` + `u` + `Zicsr` + `Zifencei` | 2613 | 1073 | 1024 | 0 | ~113 MHz |
| CPU Configuration | LEs | FFs | Memory bits | DSPs | f_max |
|:----------------------------------------|:----------:|:--------:|:-----------:|:----:|:--------:|
| `rv32i` | 945 | 417 | 2048 | 0 | ~122 MHz |
| `rv32i` + `u` + `Zicsr` + `Zifencei` | 1944 | 901 | 2048 | 0 | ~119 MHz |
| `rv32im` + `u` + `Zicsr` + `Zifencei` | 2551 | 1147 | 2048 | 0 | ~117 MHz |
| `rv32imc` + `u` + `Zicsr` + `Zifencei` | 2800 | 1162 | 2048 | 0 | ~113 MHz |
| `rv32imac` + `u` + `Zicsr` + `Zifencei` | 1796 | 1165 | 2048 | 0 | ~113 MHz |
 
Setups with enabled "embedded CPU extension" `E` show the same LUT and FF utilization and identical f_max. However, the size of the register file is cut in half.
 
 
### NEORV32 Processor-Internal Peripherals and Memories
 
Results generated for hardware version `1.4.7.0`.
Results generated for hardware version `1.4.8.0`.
 
| Module | Description | LEs | FFs | Memory bits | DSPs |
|:----------|:-----------------------------------------------------|----:|----:|------------:|-----:|
| BOOT ROM | Bootloader ROM (default 4kB) | 3 | 1 | 32 768 | 0 |
| BUSSWITCH | Mux for CPU I & D interfaces | 63 | 8 | 0 | 0 |
| BUSSWITCH | Mux for CPU I & D interfaces | 82 | 8 | 0 | 0 |
| CFU0 | Custom functions unit 0 | - | - | - | - |
| CFU1 | Custom functions unit 1 | - | - | - | - |
| DMEM | Processor-internal data memory (default 8kB) | 12 | 2 | 65 536 | 0 |
| DMEM | Processor-internal data memory (default 8kB) | 6 | 2 | 65 536 | 0 |
| GPIO | General purpose input/output ports | 66 | 65 | 0 | 0 |
| IMEM | Processor-internal instruction memory (default 16kb) | 7 | 2 | 131 072 | 0 |
| MTIME | Machine system timer | 272 | 166 | 0 | 0 |
| PWM | Pulse-width modulation controller | 72 | 69 | 0 | 0 |
| SPI | Serial peripheral interface | 142 | 124 | 0 | 0 |
| SYSINFO | System configuration information memory | 11 | 9 | 0 | 0 |
| IMEM | Processor-internal instruction memory (default 16kb) | 6 | 2 | 131 072 | 0 |
| MTIME | Machine system timer | 282 | 166 | 0 | 0 |
| PWM | Pulse-width modulation controller | 71 | 69 | 0 | 0 |
| SPI | Serial peripheral interface | 129 | 124 | 0 | 0 |
| SYSINFO | System configuration information memory | 9 | 9 | 0 | 0 |
| TRNG | True random number generator | 132 | 105 | 0 | 0 |
| TWI | Two-wire interface | 77 | 44 | 0 | 0 |
| UART | Universal asynchronous receiver/transmitter | 173 | 132 | 0 | 0 |
| WDT | Watchdog timer | 58 | 45 | 0 | 0 |
| WISHBONE | External memory interface | 106 | 104 | 0 | 0 |
| UART | Universal asynchronous receiver/transmitter | 175 | 132 | 0 | 0 |
| WDT | Watchdog timer | 59 | 45 | 0 | 0 |
| WISHBONE | External memory interface | 129 | 104 | 0 | 0 |
 
 
### NEORV32 Processor - Exemplary FPGA Setups
546,7 → 552,7
0. Check out the project's [code of conduct](https://github.com/stnolting/neorv32/tree/master/CODE_OF_CONDUCT.md)
1. [Fork](https://github.com/stnolting/neorv32/fork) this repository and clone the fork
2. Create a feature branch in your fork: `git checkout -b awesome_new_feature_branch`
3. Create a new remote for the upstream repo: `git remote add https://github.com/stnolting/neorv32`
3. Create a new remote for the upstream repo: `git remote add upstream https://github.com/stnolting/neorv32`
3. Commit your modifications: `git commit -m "Awesome new feature!"`
4. Push to the branch: `git push origin awesome_new_feature_branch`
5. Create a new [pull request](https://github.com/stnolting/neorv32/pulls)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.