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) |