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

Subversion Repositories neorv32

Compare Revisions

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

Rev 35 → Rev 36

/.ci/hw_check.sh
17,4 → 17,4
cat neorv32.uart.sim_mode.text.out
 
# Check if reference can be found in output
grep -qf $homedir/check_reference.out neorv32.uart.sim_mode.text.out && echo "Test successfully completed!"
grep -qf $homedir/check_reference.out neorv32.uart.sim_mode.text.out && echo "Hardware test completed successfully!"
/.ci/sw_check.sh
33,4 → 33,4
# Verification reference string
touch $homedir/check_reference.out
chmod 777 $homedir/check_reference.out
echo "TEST OK!" > $homedir/check_reference.out
echo "CPU TEST COMPLETED SUCCESSFULLY!" > $homedir/check_reference.out
/docs/figures/neorv32_processor.png Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
/docs/NEORV32.pdf Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
/rtl/core/neorv32_application_image.vhd
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 <blink_led/main.bin>
-- Auto-generated memory init file (for APPLICATION) from source file <cpu_test/main.bin>
 
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 669) of std_ulogic_vector(31 downto 0);
type application_init_image_t is array (0 to 3656) of std_ulogic_vector(31 downto 0);
constant application_init_image : application_init_image_t := (
00000000 => x"00000093",
00000001 => x"00000113",
35,648 → 35,3635
00000024 => x"00000e93",
00000025 => x"00000f13",
00000026 => x"00000f93",
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"08058593",
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"9a858593",
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"05c000ef",
00000066 => x"30047073",
00000067 => x"10500073",
00000068 => x"0000006f",
00000069 => x"ff810113",
00000070 => x"00812023",
00000071 => x"00912223",
00000072 => x"34202473",
00000073 => x"02044663",
00000074 => x"34102473",
00000075 => x"00041483",
00000076 => x"0034f493",
00000077 => x"00240413",
00000078 => x"34141073",
00000079 => x"00300413",
00000080 => x"00941863",
00000081 => x"34102473",
00000082 => x"00240413",
00000083 => x"34141073",
00000084 => x"00012483",
00000085 => x"00412403",
00000086 => x"00810113",
00000087 => x"30200073",
00000088 => x"00005537",
00000089 => x"ff010113",
00000090 => x"00000613",
00000091 => x"00000593",
00000092 => x"b0050513",
00000093 => x"00112623",
00000094 => x"00812423",
00000095 => x"478000ef",
00000096 => x"568000ef",
00000097 => x"02050a63",
00000098 => x"410000ef",
00000099 => x"78800513",
00000100 => x"500000ef",
00000101 => x"00000513",
00000102 => x"560000ef",
00000103 => x"00000413",
00000104 => x"0ff47513",
00000105 => x"554000ef",
00000106 => x"0c800513",
00000107 => x"554000ef",
00000108 => x"00140413",
00000109 => x"fedff06f",
00000110 => x"76400513",
00000111 => x"4d4000ef",
00000112 => x"00c12083",
00000113 => x"00812403",
00000114 => x"00000513",
00000115 => x"01010113",
00000116 => x"00008067",
00000117 => x"00000000",
00000118 => x"00000000",
00000119 => x"00000000",
00000120 => x"fc010113",
00000121 => x"02112e23",
00000122 => x"02512c23",
00000123 => x"02612a23",
00000124 => x"02712823",
00000125 => x"02a12623",
00000126 => x"02b12423",
00000127 => x"02c12223",
00000128 => x"02d12023",
00000129 => x"00e12e23",
00000130 => x"00f12c23",
00000131 => x"01012a23",
00000132 => x"01112823",
00000133 => x"01c12623",
00000134 => x"01d12423",
00000135 => x"01e12223",
00000136 => x"01f12023",
00000137 => x"34102773",
00000138 => x"34071073",
00000139 => x"342027f3",
00000140 => x"0807c663",
00000141 => x"00071683",
00000142 => x"00300593",
00000143 => x"0036f693",
00000144 => x"00270613",
00000145 => x"00b69463",
00000146 => x"00470613",
00000147 => x"34161073",
00000148 => x"00b00713",
00000149 => x"04f77a63",
00000150 => x"3e800793",
00000151 => x"000780e7",
00000152 => x"03c12083",
00000153 => x"03812283",
00000154 => x"03412303",
00000155 => x"03012383",
00000156 => x"02c12503",
00000157 => x"02812583",
00000158 => x"02412603",
00000159 => x"02012683",
00000160 => x"01c12703",
00000161 => x"01812783",
00000162 => x"01412803",
00000163 => x"01012883",
00000164 => x"00c12e03",
00000165 => x"00812e83",
00000166 => x"00412f03",
00000167 => x"00012f83",
00000168 => x"04010113",
00000169 => x"30200073",
00000170 => x"00279793",
00000171 => x"7a400713",
00000172 => x"00e787b3",
00000173 => x"0007a783",
00000174 => x"00078067",
00000175 => x"80000737",
00000176 => x"ffd74713",
00000177 => x"00e787b3",
00000178 => x"01000713",
00000179 => x"f8f766e3",
00000180 => x"00279793",
00000181 => x"7d400713",
00000182 => x"00e787b3",
00000183 => x"0007a783",
00000184 => x"00078067",
00000185 => x"800007b7",
00000186 => x"0007a783",
00000187 => x"f71ff06f",
00000188 => x"800007b7",
00000189 => x"0047a783",
00000190 => x"f65ff06f",
00000191 => x"800007b7",
00000192 => x"0087a783",
00000193 => x"f59ff06f",
00000194 => x"800007b7",
00000195 => x"00c7a783",
00000196 => x"f4dff06f",
00000197 => x"8101a783",
00000198 => x"f45ff06f",
00000199 => x"8141a783",
00000200 => x"f3dff06f",
00000201 => x"8181a783",
00000202 => x"f35ff06f",
00000203 => x"81c1a783",
00000204 => x"f2dff06f",
00000205 => x"8201a783",
00000206 => x"f25ff06f",
00000207 => x"8241a783",
00000208 => x"f1dff06f",
00000209 => x"8281a783",
00000210 => x"f15ff06f",
00000211 => x"82c1a783",
00000212 => x"f0dff06f",
00000213 => x"8301a783",
00000214 => x"f05ff06f",
00000215 => x"8341a783",
00000216 => x"efdff06f",
00000217 => x"8381a783",
00000218 => x"ef5ff06f",
00000219 => x"83c1a783",
00000220 => x"eedff06f",
00000221 => x"00000000",
00000222 => x"fe010113",
00000223 => x"01212823",
00000224 => x"00050913",
00000225 => x"00001537",
00000226 => x"00912a23",
00000227 => x"81850513",
00000228 => x"000014b7",
00000229 => x"00812c23",
00000230 => x"01312623",
00000231 => x"00112e23",
00000232 => x"01c00413",
00000233 => x"2ec000ef",
00000234 => x"a6448493",
00000235 => x"ffc00993",
00000236 => x"008957b3",
00000237 => x"00f7f793",
00000238 => x"00f487b3",
00000239 => x"0007c503",
00000240 => x"ffc40413",
00000241 => x"2bc000ef",
00000242 => x"ff3414e3",
00000243 => x"01c12083",
00000244 => x"01812403",
00000245 => x"01412483",
00000246 => x"01012903",
00000247 => x"00c12983",
00000248 => x"02010113",
00000249 => x"00008067",
00000250 => x"00001537",
00000251 => x"ff010113",
00000252 => x"81c50513",
00000253 => x"00112623",
00000254 => x"00812423",
00000255 => x"294000ef",
00000256 => x"34202473",
00000257 => x"00b00793",
00000258 => x"0487f463",
00000259 => x"800007b7",
00000260 => x"ffd7c793",
00000261 => x"00f407b3",
00000262 => x"01000713",
00000263 => x"00f77e63",
00000264 => x"00001537",
00000265 => x"99050513",
00000266 => x"268000ef",
00000267 => x"00040513",
00000268 => x"f49ff0ef",
00000269 => x"0400006f",
00000270 => x"00001737",
00000271 => x"00279793",
00000272 => x"9bc70713",
00000273 => x"00e787b3",
00000274 => x"0007a783",
00000275 => x"00078067",
00000276 => x"00001737",
00000277 => x"00241793",
00000278 => x"a0070713",
00000279 => x"00e787b3",
00000280 => x"0007a783",
00000281 => x"00078067",
00000282 => x"00001537",
00000283 => x"82450513",
00000284 => x"220000ef",
00000285 => x"00001537",
00000286 => x"9a850513",
00000287 => x"214000ef",
00000288 => x"34002573",
00000289 => x"ef5ff0ef",
00000290 => x"00001537",
00000291 => x"9b050513",
00000292 => x"200000ef",
00000293 => x"34302573",
00000294 => x"ee1ff0ef",
00000295 => x"00812403",
00000296 => x"00c12083",
00000297 => x"00001537",
00000298 => x"a5c50513",
00000299 => x"01010113",
00000300 => x"1e00006f",
00000301 => x"00001537",
00000302 => x"84450513",
00000303 => x"fb5ff06f",
00000304 => x"00001537",
00000305 => x"86050513",
00000306 => x"fa9ff06f",
00000307 => x"00001537",
00000308 => x"87450513",
00000309 => x"f9dff06f",
00000310 => x"00001537",
00000311 => x"88050513",
00000312 => x"f91ff06f",
00000313 => x"00001537",
00000314 => x"89850513",
00000315 => x"f85ff06f",
00000316 => x"00001537",
00000317 => x"8ac50513",
00000318 => x"f79ff06f",
00000319 => x"00001537",
00000320 => x"8c850513",
00000321 => x"f6dff06f",
00000322 => x"00001537",
00000323 => x"8dc50513",
00000324 => x"f61ff06f",
00000325 => x"00001537",
00000326 => x"8f050513",
00000327 => x"f55ff06f",
00000328 => x"00001537",
00000329 => x"90c50513",
00000330 => x"f49ff06f",
00000331 => x"00001537",
00000332 => x"92450513",
00000333 => x"f3dff06f",
00000334 => x"00001537",
00000335 => x"94050513",
00000336 => x"f31ff06f",
00000337 => x"00001537",
00000338 => x"95450513",
00000339 => x"f25ff06f",
00000340 => x"00001537",
00000341 => x"96850513",
00000342 => x"f19ff06f",
00000343 => x"00001537",
00000344 => x"97c50513",
00000345 => x"f0dff06f",
00000346 => x"00f00793",
00000347 => x"02a7e263",
00000348 => x"800007b7",
00000349 => x"00078793",
00000350 => x"00251513",
00000351 => x"00a78533",
00000352 => x"3e800793",
00000353 => x"00f52023",
00000354 => x"00000513",
00000355 => x"00008067",
00000356 => x"00100513",
00000357 => x"00008067",
00000358 => x"ff010113",
00000359 => x"00112623",
00000360 => x"00812423",
00000361 => x"00912223",
00000362 => x"301027f3",
00000363 => x"00079863",
00000364 => x"00001537",
00000365 => x"a3050513",
00000366 => x"0d8000ef",
00000367 => x"1e000793",
00000368 => x"30579073",
00000369 => x"00000413",
00000370 => x"01000493",
00000371 => x"00040513",
00000372 => x"00140413",
00000373 => x"0ff47413",
00000374 => x"f91ff0ef",
00000375 => x"fe9418e3",
00000376 => x"00c12083",
00000377 => x"00812403",
00000378 => x"00412483",
00000379 => x"01010113",
00000380 => x"00008067",
00000381 => x"fa002023",
00000382 => x"fe002683",
00000383 => x"00151513",
00000384 => x"00000713",
00000385 => x"04a6f263",
00000386 => x"000016b7",
00000387 => x"00000793",
00000388 => x"ffe68693",
00000389 => x"04e6e463",
00000390 => x"00167613",
00000391 => x"0015f593",
00000392 => x"01879793",
00000393 => x"01e61613",
00000394 => x"00c7e7b3",
00000395 => x"01d59593",
00000396 => x"00b7e7b3",
00000397 => x"00e7e7b3",
00000398 => x"10000737",
00000399 => x"00e7e7b3",
00000400 => x"faf02023",
00000401 => x"00008067",
00000402 => x"00170793",
00000403 => x"01079713",
00000404 => x"40a686b3",
00000405 => x"01075713",
00000406 => x"fadff06f",
00000407 => x"ffe78513",
00000408 => x"0fd57513",
00000409 => x"00051a63",
00000410 => x"00375713",
00000411 => x"00178793",
00000412 => x"0ff7f793",
00000413 => x"fa1ff06f",
00000414 => x"00175713",
00000415 => x"ff1ff06f",
00000416 => x"fa002783",
00000417 => x"fe07cee3",
00000418 => x"faa02223",
00000419 => x"00008067",
00000420 => x"ff010113",
00000421 => x"00812423",
00000422 => x"01212023",
00000423 => x"00112623",
00000424 => x"00912223",
00000425 => x"00050413",
00000426 => x"00a00913",
00000427 => x"00044483",
00000428 => x"00140413",
00000429 => x"00049e63",
00000430 => x"00c12083",
00000431 => x"00812403",
00000432 => x"00412483",
00000433 => x"00012903",
00000434 => x"01010113",
00000435 => x"00008067",
00000436 => x"01249663",
00000437 => x"00d00513",
00000438 => x"fa9ff0ef",
00000439 => x"00048513",
00000440 => x"fa1ff0ef",
00000441 => x"fc9ff06f",
00000442 => x"fe802503",
00000443 => x"01055513",
00000444 => x"00157513",
00000445 => x"00008067",
00000446 => x"f8a02223",
00000447 => x"00008067",
00000448 => x"00050593",
00000449 => x"fe002503",
00000450 => x"ff010113",
00000451 => x"00112623",
00000452 => x"00f55513",
00000453 => x"02c000ef",
00000454 => x"00051863",
00000455 => x"00c12083",
00000456 => x"01010113",
00000457 => x"00008067",
00000458 => x"00000013",
00000459 => x"00000013",
00000460 => x"00000013",
00000461 => x"00000013",
00000462 => x"fff50513",
00000463 => x"fddff06f",
00000464 => x"00050613",
00000465 => x"00000513",
00000466 => x"0015f693",
00000467 => x"00068463",
00000468 => x"00c50533",
00000469 => x"0015d593",
00000470 => x"00161613",
00000471 => x"fe0596e3",
00000472 => x"00008067",
00000473 => x"6f727245",
00000474 => x"4e202172",
00000475 => x"5047206f",
00000476 => x"75204f49",
00000477 => x"2074696e",
00000478 => x"746e7973",
00000479 => x"69736568",
00000480 => x"2164657a",
00000481 => x"0000000a",
00000482 => x"6e696c42",
00000483 => x"676e696b",
00000484 => x"44454c20",
00000485 => x"6d656420",
00000486 => x"7270206f",
00000487 => x"6172676f",
00000488 => x"00000a6d",
00000489 => x"000002e4",
00000490 => x"000002f0",
00000491 => x"000002fc",
00000492 => x"00000308",
00000493 => x"00000314",
00000494 => x"0000031c",
00000495 => x"00000324",
00000496 => x"0000032c",
00000497 => x"00000258",
00000498 => x"00000258",
00000499 => x"00000258",
00000500 => x"00000334",
00000501 => x"0000033c",
00000502 => x"00000258",
00000503 => x"00000258",
00000504 => x"00000258",
00000505 => x"00000344",
00000506 => x"00000258",
00000507 => x"00000258",
00000508 => x"00000258",
00000509 => x"0000034c",
00000510 => x"00000258",
00000511 => x"00000258",
00000512 => x"00000258",
00000513 => x"00000258",
00000514 => x"00000354",
00000515 => x"0000035c",
00000516 => x"00000364",
00000517 => x"0000036c",
00000518 => x"00007830",
00000519 => x"4554523c",
00000520 => x"0000203e",
00000521 => x"74736e49",
00000522 => x"74637572",
00000523 => x"206e6f69",
00000524 => x"72646461",
00000525 => x"20737365",
00000526 => x"6173696d",
00000527 => x"6e67696c",
00000528 => x"00006465",
00000529 => x"74736e49",
00000530 => x"74637572",
00000531 => x"206e6f69",
00000532 => x"65636361",
00000533 => x"66207373",
00000534 => x"746c7561",
00000535 => x"00000000",
00000536 => x"656c6c49",
00000537 => x"206c6167",
00000538 => x"74736e69",
00000539 => x"74637572",
00000540 => x"006e6f69",
00000541 => x"61657242",
00000542 => x"696f706b",
00000543 => x"0000746e",
00000544 => x"64616f4c",
00000545 => x"64646120",
00000546 => x"73736572",
00000547 => x"73696d20",
00000548 => x"67696c61",
00000549 => x"0064656e",
00000550 => x"64616f4c",
00000551 => x"63636120",
00000552 => x"20737365",
00000553 => x"6c756166",
00000554 => x"00000074",
00000555 => x"726f7453",
00000556 => x"64612065",
00000557 => x"73657264",
00000558 => x"696d2073",
00000559 => x"696c6173",
00000560 => x"64656e67",
00000561 => x"00000000",
00000562 => x"726f7453",
00000563 => x"63612065",
00000564 => x"73736563",
00000565 => x"75616620",
00000566 => x"0000746c",
00000567 => x"69766e45",
00000568 => x"6d6e6f72",
00000569 => x"20746e65",
00000570 => x"6c6c6163",
00000571 => x"00000000",
00000572 => x"6863614d",
00000573 => x"20656e69",
00000574 => x"74666f73",
00000575 => x"65726177",
00000576 => x"746e6920",
00000577 => x"75727265",
00000578 => x"00007470",
00000579 => x"6863614d",
00000580 => x"20656e69",
00000581 => x"656d6974",
00000582 => x"6e692072",
00000583 => x"72726574",
00000584 => x"00747075",
00000585 => x"6863614d",
00000586 => x"20656e69",
00000587 => x"65747865",
00000588 => x"6c616e72",
00000589 => x"746e6920",
00000590 => x"75727265",
00000591 => x"00007470",
00000592 => x"74736146",
00000593 => x"746e6920",
00000594 => x"75727265",
00000595 => x"30207470",
00000596 => x"00000000",
00000597 => x"74736146",
00000598 => x"746e6920",
00000599 => x"75727265",
00000600 => x"31207470",
00000601 => x"00000000",
00000602 => x"74736146",
00000603 => x"746e6920",
00000604 => x"75727265",
00000605 => x"32207470",
00000606 => x"00000000",
00000607 => x"74736146",
00000608 => x"746e6920",
00000609 => x"75727265",
00000610 => x"33207470",
00000611 => x"00000000",
00000612 => x"6e6b6e55",
00000613 => x"206e776f",
00000614 => x"70617274",
00000615 => x"75616320",
00000616 => x"203a6573",
00000617 => x"00000000",
00000618 => x"50204020",
00000619 => x"00003d43",
00000620 => x"544d202c",
00000621 => x"3d4c4156",
00000622 => x"00000000",
00000623 => x"00000514",
00000624 => x"00000420",
00000625 => x"00000420",
00000626 => x"00000420",
00000627 => x"00000520",
00000628 => x"00000420",
00000629 => x"00000420",
00000630 => x"00000420",
00000631 => x"0000052c",
00000632 => x"00000420",
00000633 => x"00000420",
00000634 => x"00000420",
00000635 => x"00000420",
00000636 => x"00000538",
00000637 => x"00000544",
00000638 => x"00000550",
00000639 => x"0000055c",
00000640 => x"00000468",
00000641 => x"000004b4",
00000642 => x"000004c0",
00000643 => x"000004cc",
00000644 => x"000004d8",
00000645 => x"000004e4",
00000646 => x"000004f0",
00000647 => x"000004fc",
00000648 => x"00000420",
00000649 => x"00000420",
00000650 => x"00000420",
00000651 => x"00000508",
00000652 => x"4554523c",
00000653 => x"4157203e",
00000654 => x"4e494e52",
00000655 => x"43202147",
00000656 => x"43205550",
00000657 => x"73205253",
00000658 => x"65747379",
00000659 => x"6f6e206d",
00000660 => x"76612074",
00000661 => x"616c6961",
00000662 => x"21656c62",
00000663 => x"522f3c20",
00000664 => x"003e4554",
00000665 => x"33323130",
00000666 => x"37363534",
00000667 => x"42413938",
00000668 => x"46454443",
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",
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 1022) of std_ulogic_vector(31 downto 0);
type bootloader_init_image_t is array (0 to 1018) of std_ulogic_vector(31 downto 0);
constant bootloader_init_image : bootloader_init_image_t := (
00000000 => x"00000093",
00000001 => x"00000113",
44,7 → 44,7
00000033 => x"00158593",
00000034 => x"ff5ff06f",
00000035 => x"00001597",
00000036 => x"f6c58593",
00000036 => x"f5c58593",
00000037 => x"80010617",
00000038 => x"f6c60613",
00000039 => x"80010697",
94,942 → 94,938
00000083 => x"01712623",
00000084 => x"01812423",
00000085 => x"9ff78793",
00000086 => x"00000713",
00000087 => x"00000693",
00000088 => x"00000613",
00000089 => x"00000593",
00000090 => x"00200513",
00000091 => x"0087f463",
00000092 => x"00400513",
00000093 => x"3b5000ef",
00000094 => x"00005537",
00000095 => x"00000613",
00000096 => x"00000593",
00000097 => x"b0050513",
00000098 => x"291000ef",
00000099 => x"249000ef",
00000100 => x"00245793",
00000101 => x"00a78533",
00000102 => x"00f537b3",
00000103 => x"00b785b3",
00000104 => x"261000ef",
00000105 => x"ffff07b7",
00000106 => x"49478793",
00000107 => x"30579073",
00000108 => x"08000793",
00000109 => x"30479073",
00000110 => x"30046073",
00000111 => x"00100513",
00000112 => x"429000ef",
00000113 => x"ffff1537",
00000114 => x"800007b7",
00000115 => x"f1450513",
00000116 => x"0007a023",
00000117 => x"2fd000ef",
00000118 => x"159000ef",
00000119 => x"ffff1537",
00000120 => x"f4c50513",
00000121 => x"2ed000ef",
00000122 => x"fe002503",
00000123 => x"238000ef",
00000124 => x"ffff1537",
00000125 => x"f5450513",
00000126 => x"2d9000ef",
00000127 => x"fe402503",
00000128 => x"224000ef",
00000129 => x"ffff1537",
00000130 => x"f6050513",
00000131 => x"2c5000ef",
00000132 => x"30102573",
00000133 => x"210000ef",
00000134 => x"ffff1537",
00000135 => x"f6850513",
00000136 => x"2b1000ef",
00000137 => x"fe802503",
00000138 => x"ffff14b7",
00000139 => x"00341413",
00000140 => x"1f4000ef",
00000141 => x"ffff1537",
00000142 => x"f7050513",
00000143 => x"295000ef",
00000144 => x"ff802503",
00000145 => x"1e0000ef",
00000146 => x"f7848513",
00000147 => x"285000ef",
00000148 => x"ff002503",
00000149 => x"1d0000ef",
00000150 => x"ffff1537",
00000151 => x"f8450513",
00000152 => x"271000ef",
00000153 => x"ffc02503",
00000154 => x"1bc000ef",
00000155 => x"f7848513",
00000156 => x"261000ef",
00000157 => x"ff402503",
00000158 => x"1ac000ef",
00000159 => x"ffff1537",
00000160 => x"f8c50513",
00000161 => x"24d000ef",
00000162 => x"14d000ef",
00000163 => x"00a404b3",
00000164 => x"0084b433",
00000165 => x"00b40433",
00000166 => x"fa402783",
00000167 => x"0207d263",
00000168 => x"ffff1537",
00000169 => x"fb450513",
00000170 => x"229000ef",
00000171 => x"219000ef",
00000172 => x"02300793",
00000173 => x"02f51263",
00000174 => x"00000513",
00000175 => x"0180006f",
00000176 => x"115000ef",
00000177 => x"fc85eae3",
00000178 => x"00b41463",
00000179 => x"fc9566e3",
00000180 => x"00100513",
00000181 => x"5b4000ef",
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"fc090513",
00000192 => x"1d1000ef",
00000193 => x"1b1000ef",
00000194 => x"00050413",
00000195 => x"199000ef",
00000196 => x"ecc98513",
00000197 => x"1bd000ef",
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"66c000ef",
00000211 => x"fb1ff06f",
00000212 => x"06c00793",
00000213 => x"00f41863",
00000214 => x"00100513",
00000215 => x"3f0000ef",
00000216 => x"f9dff06f",
00000217 => x"06500793",
00000218 => x"00f41663",
00000219 => x"02c000ef",
00000220 => x"f8dff06f",
00000221 => x"03f00793",
00000222 => x"fc8c0513",
00000223 => x"00f40463",
00000224 => x"fdc48513",
00000225 => x"14d000ef",
00000226 => x"f75ff06f",
00000227 => x"ffff1537",
00000228 => x"df050513",
00000229 => x"13d0006f",
00000230 => x"800007b7",
00000231 => x"0007a783",
00000232 => x"00079863",
00000233 => x"ffff1537",
00000234 => x"e5450513",
00000235 => x"1250006f",
00000236 => x"ff010113",
00000237 => x"00112623",
00000238 => x"30047073",
00000239 => x"ffff1537",
00000240 => x"e7050513",
00000241 => x"10d000ef",
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"e8050513",
00000256 => x"00112623",
00000257 => x"0cd000ef",
00000258 => x"03040513",
00000259 => x"0ff57513",
00000260 => x"095000ef",
00000261 => x"30047073",
00000262 => x"00100513",
00000263 => x"1cd000ef",
00000264 => x"0000006f",
00000265 => x"fe010113",
00000266 => x"01212823",
00000267 => x"00050913",
00000268 => x"ffff1537",
00000269 => x"00912a23",
00000270 => x"e9850513",
00000271 => x"ffff14b7",
00000272 => x"00812c23",
00000273 => x"01312623",
00000274 => x"00112e23",
00000275 => x"01c00413",
00000276 => x"081000ef",
00000277 => x"fe848493",
00000278 => x"ffc00993",
00000279 => x"008957b3",
00000280 => x"00f7f793",
00000281 => x"00f487b3",
00000282 => x"0007c503",
00000283 => x"ffc40413",
00000284 => x"035000ef",
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"0dd000ef",
00000317 => x"6e0000ef",
00000318 => x"fe002783",
00000319 => x"0027d793",
00000320 => x"00a78533",
00000321 => x"00f537b3",
00000322 => x"00b785b3",
00000323 => x"6f4000ef",
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"e8c50513",
00000348 => x"760000ef",
00000349 => x"00040513",
00000350 => x"eadff0ef",
00000351 => x"ffff1537",
00000352 => x"e9450513",
00000353 => x"74c000ef",
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"7cc000ef",
00000363 => x"00500513",
00000364 => x"009000ef",
00000365 => x"00000513",
00000366 => x"001000ef",
00000367 => x"00050413",
00000368 => x"00000513",
00000369 => x"7d0000ef",
00000370 => x"00c12083",
00000371 => x"0ff47513",
00000372 => x"00812403",
00000373 => x"01010113",
00000374 => x"00008067",
00000375 => x"ff010113",
00000376 => x"00000513",
00000377 => x"00112623",
00000378 => x"00812423",
00000379 => x"788000ef",
00000380 => x"09e00513",
00000381 => x"7c4000ef",
00000382 => x"00000513",
00000383 => x"7bc000ef",
00000384 => x"00050413",
00000385 => x"00000513",
00000386 => x"78c000ef",
00000387 => x"00c12083",
00000388 => x"0ff47513",
00000389 => x"00812403",
00000390 => x"01010113",
00000391 => x"00008067",
00000392 => x"ff010113",
00000393 => x"00000513",
00000394 => x"00112623",
00000395 => x"748000ef",
00000396 => x"00600513",
00000397 => x"784000ef",
00000398 => x"00c12083",
00000399 => x"00000513",
00000400 => x"01010113",
00000401 => x"7500006f",
00000402 => x"ff010113",
00000403 => x"00812423",
00000404 => x"00050413",
00000405 => x"01055513",
00000406 => x"0ff57513",
00000407 => x"00112623",
00000408 => x"758000ef",
00000409 => x"00845513",
00000410 => x"0ff57513",
00000411 => x"74c000ef",
00000412 => x"0ff47513",
00000413 => x"00812403",
00000414 => x"00c12083",
00000415 => x"01010113",
00000416 => x"7380006f",
00000417 => x"ff010113",
00000418 => x"00812423",
00000419 => x"00050413",
00000420 => x"00000513",
00000421 => x"00112623",
00000422 => x"6dc000ef",
00000423 => x"00300513",
00000424 => x"718000ef",
00000425 => x"00040513",
00000426 => x"fa1ff0ef",
00000427 => x"00000513",
00000428 => x"708000ef",
00000429 => x"00050413",
00000430 => x"00000513",
00000431 => x"6d8000ef",
00000432 => x"00c12083",
00000433 => x"0ff47513",
00000434 => x"00812403",
00000435 => x"01010113",
00000436 => x"00008067",
00000437 => x"fd010113",
00000438 => x"02812423",
00000439 => x"02912223",
00000440 => x"03212023",
00000441 => x"01312e23",
00000442 => x"01412c23",
00000443 => x"02112623",
00000444 => x"00050913",
00000445 => x"00058993",
00000446 => x"00c10493",
00000447 => x"00000413",
00000448 => x"00400a13",
00000449 => x"02091e63",
00000450 => x"5ac000ef",
00000451 => x"00a481a3",
00000452 => x"00140413",
00000453 => x"fff48493",
00000454 => x"ff4416e3",
00000455 => x"02c12083",
00000456 => x"02812403",
00000457 => x"00c12503",
00000458 => x"02412483",
00000459 => x"02012903",
00000460 => x"01c12983",
00000461 => x"01812a03",
00000462 => x"03010113",
00000463 => x"00008067",
00000464 => x"00898533",
00000465 => x"f41ff0ef",
00000466 => x"fc5ff06f",
00000467 => x"fe802783",
00000468 => x"fd010113",
00000469 => x"02812423",
00000470 => x"02112623",
00000471 => x"02912223",
00000472 => x"03212023",
00000473 => x"01312e23",
00000474 => x"01412c23",
00000475 => x"01512a23",
00000476 => x"01612823",
00000477 => x"01712623",
00000478 => x"0087f793",
00000479 => x"00050413",
00000480 => x"00078a63",
00000481 => x"fe802783",
00000482 => x"00400513",
00000483 => x"0047f793",
00000484 => x"04079663",
00000485 => x"02041863",
00000486 => x"ffff1537",
00000487 => x"e9c50513",
00000488 => x"530000ef",
00000489 => x"008005b7",
00000490 => x"00040513",
00000491 => x"f29ff0ef",
00000492 => x"4788d7b7",
00000493 => x"afe78793",
00000494 => x"02f50463",
00000495 => x"00000513",
00000496 => x"01c0006f",
00000497 => x"ffff1537",
00000498 => x"ebc50513",
00000499 => x"504000ef",
00000500 => x"e0dff0ef",
00000501 => x"fc0518e3",
00000502 => x"00300513",
00000503 => x"c11ff0ef",
00000504 => x"008009b7",
00000505 => x"00498593",
00000506 => x"00040513",
00000507 => x"ee9ff0ef",
00000508 => x"00050a13",
00000509 => x"00898593",
00000510 => x"00040513",
00000511 => x"ed9ff0ef",
00000512 => x"ff002b83",
00000513 => x"00050a93",
00000514 => x"ffca7b13",
00000515 => x"00000913",
00000516 => x"00000493",
00000517 => x"00c98993",
00000518 => x"013905b3",
00000519 => x"052b1863",
00000520 => x"015484b3",
00000521 => x"00200513",
00000522 => x"fa049ae3",
00000523 => x"ffff1537",
00000524 => x"ec850513",
00000525 => x"49c000ef",
00000526 => x"02c12083",
00000527 => x"02812403",
00000528 => x"800007b7",
00000529 => x"0147a023",
00000530 => x"02412483",
00000531 => x"02012903",
00000532 => x"01c12983",
00000533 => x"01812a03",
00000534 => x"01412a83",
00000535 => x"01012b03",
00000536 => x"00c12b83",
00000537 => x"03010113",
00000538 => x"00008067",
00000539 => x"00040513",
00000540 => x"e65ff0ef",
00000541 => x"012b87b3",
00000542 => x"00a484b3",
00000543 => x"00a7a023",
00000544 => x"00490913",
00000545 => x"f95ff06f",
00000546 => x"ff010113",
00000547 => x"00112623",
00000548 => x"ebdff0ef",
00000549 => x"ffff1537",
00000550 => x"ecc50513",
00000551 => x"434000ef",
00000552 => x"af9ff0ef",
00000553 => x"0000006f",
00000554 => x"ff010113",
00000555 => x"00112623",
00000556 => x"00812423",
00000557 => x"00912223",
00000558 => x"00058413",
00000559 => x"00050493",
00000560 => x"d61ff0ef",
00000561 => x"00000513",
00000562 => x"4ac000ef",
00000563 => x"00200513",
00000564 => x"4e8000ef",
00000565 => x"00048513",
00000566 => x"d71ff0ef",
00000567 => x"00040513",
00000568 => x"4d8000ef",
00000569 => x"00000513",
00000570 => x"4ac000ef",
00000571 => x"cadff0ef",
00000572 => x"00157513",
00000573 => x"fe051ce3",
00000574 => x"00c12083",
00000575 => x"00812403",
00000576 => x"00412483",
00000577 => x"01010113",
00000578 => x"00008067",
00000579 => x"fe010113",
00000580 => x"00812c23",
00000581 => x"00912a23",
00000582 => x"01212823",
00000583 => x"00112e23",
00000584 => x"00b12623",
00000585 => x"00300413",
00000586 => x"00350493",
00000587 => x"fff00913",
00000588 => x"00c10793",
00000589 => x"008787b3",
00000590 => x"0007c583",
00000591 => x"40848533",
00000592 => x"fff40413",
00000593 => x"f65ff0ef",
00000594 => x"ff2414e3",
00000595 => x"01c12083",
00000596 => x"01812403",
00000597 => x"01412483",
00000598 => x"01012903",
00000599 => x"02010113",
00000600 => x"00008067",
00000601 => x"ff010113",
00000602 => x"00112623",
00000603 => x"00812423",
00000604 => x"00050413",
00000605 => x"cadff0ef",
00000606 => x"00000513",
00000607 => x"3f8000ef",
00000608 => x"0d800513",
00000609 => x"434000ef",
00000610 => x"00040513",
00000611 => x"cbdff0ef",
00000612 => x"00000513",
00000613 => x"400000ef",
00000614 => x"c01ff0ef",
00000615 => x"00157513",
00000616 => x"fe051ce3",
00000617 => x"00c12083",
00000618 => x"00812403",
00000619 => x"01010113",
00000620 => x"00008067",
00000621 => x"fe010113",
00000622 => x"800007b7",
00000623 => x"00812c23",
00000624 => x"0007a403",
00000625 => x"00112e23",
00000626 => x"00912a23",
00000627 => x"01212823",
00000628 => x"01312623",
00000629 => x"01412423",
00000630 => x"01512223",
00000631 => x"02041863",
00000632 => x"ffff1537",
00000633 => x"e5450513",
00000634 => x"01812403",
00000635 => x"01c12083",
00000636 => x"01412483",
00000637 => x"01012903",
00000638 => x"00c12983",
00000639 => x"00812a03",
00000640 => x"00412a83",
00000641 => x"02010113",
00000642 => x"2c80006f",
00000643 => x"ffff1537",
00000644 => x"ed050513",
00000645 => x"2bc000ef",
00000646 => x"00040513",
00000647 => x"a09ff0ef",
00000648 => x"ffff1537",
00000649 => x"edc50513",
00000650 => x"2a8000ef",
00000651 => x"00800537",
00000652 => x"9f5ff0ef",
00000653 => x"ffff1537",
00000654 => x"ef850513",
00000655 => x"294000ef",
00000656 => x"274000ef",
00000657 => x"00050493",
00000658 => x"25c000ef",
00000659 => x"07900793",
00000660 => x"0af49e63",
00000661 => x"b89ff0ef",
00000662 => x"00051663",
00000663 => x"00300513",
00000664 => x"98dff0ef",
00000665 => x"ffff1537",
00000666 => x"f0450513",
00000667 => x"01045493",
00000668 => x"260000ef",
00000669 => x"00148493",
00000670 => x"00800937",
00000671 => x"fff00993",
00000672 => x"00010a37",
00000673 => x"fff48493",
00000674 => x"07349063",
00000675 => x"4788d5b7",
00000676 => x"afe58593",
00000677 => x"00800537",
00000678 => x"e75ff0ef",
00000679 => x"00800537",
00000680 => x"00040593",
00000681 => x"00450513",
00000682 => x"e65ff0ef",
00000683 => x"ff002a03",
00000684 => x"008009b7",
00000685 => x"ffc47413",
00000686 => x"00000493",
00000687 => x"00000913",
00000688 => x"00c98a93",
00000689 => x"01548533",
00000690 => x"009a07b3",
00000691 => x"02849663",
00000692 => x"00898513",
00000693 => x"412005b3",
00000694 => x"e35ff0ef",
00000695 => x"ffff1537",
00000696 => x"ec850513",
00000697 => x"f05ff06f",
00000698 => x"00090513",
00000699 => x"e79ff0ef",
00000700 => x"01490933",
00000701 => x"f91ff06f",
00000702 => x"0007a583",
00000703 => x"00448493",
00000704 => x"00b90933",
00000705 => x"e09ff0ef",
00000706 => x"fbdff06f",
00000707 => x"01c12083",
00000708 => x"01812403",
00000709 => x"01412483",
00000710 => x"01012903",
00000711 => x"00c12983",
00000712 => x"00812a03",
00000713 => x"00412a83",
00000714 => x"02010113",
00000715 => x"00008067",
00000716 => x"fe010113",
00000717 => x"00912a23",
00000718 => x"01312623",
00000719 => x"01412423",
00000720 => x"00112e23",
00000721 => x"00812c23",
00000722 => x"01212823",
00000723 => x"00000493",
00000724 => x"00300a13",
00000725 => x"00400993",
00000726 => x"f13027f3",
00000727 => x"40900733",
00000728 => x"00371713",
00000729 => x"01870713",
00000730 => x"00e7d7b3",
00000731 => x"0ff7f793",
00000732 => x"0047d513",
00000733 => x"40a00933",
00000734 => x"00491913",
00000735 => x"03078793",
00000736 => x"0ff97913",
00000737 => x"0ff7f413",
00000738 => x"00050663",
00000739 => x"03050513",
00000740 => x"114000ef",
00000741 => x"01240533",
00000742 => x"0ff57513",
00000743 => x"108000ef",
00000744 => x"01448663",
00000745 => x"02e00513",
00000746 => x"0fc000ef",
00000747 => x"00148493",
00000748 => x"fb3494e3",
00000749 => x"01c12083",
00000750 => x"01812403",
00000751 => x"01412483",
00000752 => x"01012903",
00000753 => x"00c12983",
00000754 => x"00812a03",
00000755 => x"02010113",
00000756 => x"00008067",
00000757 => x"ff010113",
00000758 => x"f9402783",
00000759 => x"f9002703",
00000760 => x"f9402683",
00000761 => x"fed79ae3",
00000762 => x"00e12023",
00000763 => x"00f12223",
00000764 => x"00012503",
00000765 => x"00412583",
00000766 => x"01010113",
00000767 => x"00008067",
00000768 => x"f9800693",
00000769 => x"fff00613",
00000770 => x"00c6a023",
00000771 => x"00a6a023",
00000772 => x"00b6a223",
00000773 => x"00008067",
00000774 => x"fa002023",
00000775 => x"fe002683",
00000776 => x"00151513",
00000777 => x"00000713",
00000778 => x"04a6f263",
00000779 => x"000016b7",
00000780 => x"00000793",
00000781 => x"ffe68693",
00000782 => x"04e6e463",
00000783 => x"00167613",
00000784 => x"0015f593",
00000785 => x"01879793",
00000786 => x"01e61613",
00000787 => x"00c7e7b3",
00000788 => x"01d59593",
00000789 => x"00b7e7b3",
00000790 => x"00e7e7b3",
00000791 => x"10000737",
00000792 => x"00e7e7b3",
00000793 => x"faf02023",
00000794 => x"00008067",
00000795 => x"00170793",
00000796 => x"01079713",
00000797 => x"40a686b3",
00000798 => x"01075713",
00000799 => x"fadff06f",
00000800 => x"ffe78513",
00000801 => x"0fd57513",
00000802 => x"00051a63",
00000803 => x"00375713",
00000804 => x"00178793",
00000805 => x"0ff7f793",
00000806 => x"fa1ff06f",
00000807 => x"00175713",
00000808 => x"ff1ff06f",
00000809 => x"fa002783",
00000810 => x"fe07cee3",
00000811 => x"faa02223",
00000812 => x"00008067",
00000813 => x"fa402503",
00000814 => x"fe055ee3",
00000815 => x"0ff57513",
00000816 => x"00008067",
00000817 => x"fa402503",
00000818 => x"0ff57513",
00000819 => x"00008067",
00000820 => x"ff010113",
00000821 => x"00812423",
00000822 => x"01212023",
00000823 => x"00112623",
00000824 => x"00912223",
00000825 => x"00050413",
00000826 => x"00a00913",
00000827 => x"00044483",
00000828 => x"00140413",
00000829 => x"00049e63",
00000830 => x"00c12083",
00000831 => x"00812403",
00000832 => x"00412483",
00000833 => x"00012903",
00000834 => x"01010113",
00000835 => x"00008067",
00000836 => x"01249663",
00000837 => x"00d00513",
00000838 => x"f8dff0ef",
00000839 => x"00048513",
00000840 => x"f85ff0ef",
00000841 => x"fc9ff06f",
00000842 => x"00757513",
00000843 => x"00177793",
00000844 => x"01079793",
00000845 => x"0036f693",
00000846 => x"00a51513",
00000847 => x"00f56533",
00000848 => x"00167613",
00000849 => x"00e69793",
00000850 => x"0015f593",
00000851 => x"00f567b3",
00000852 => x"00d61613",
00000853 => x"00c7e7b3",
00000854 => x"00959593",
00000855 => x"fa800813",
00000856 => x"00b7e7b3",
00000857 => x"00082023",
00000858 => x"1007e793",
00000859 => x"00f82023",
00000860 => x"00008067",
00000861 => x"fa800713",
00000862 => x"00072683",
00000863 => x"00757793",
00000864 => x"00100513",
00000865 => x"00f51533",
00000866 => x"00d56533",
00000867 => x"00a72023",
00000868 => x"00008067",
00000869 => x"fa800713",
00000870 => x"00072683",
00000871 => x"00757513",
00000872 => x"00100793",
00000873 => x"00a797b3",
00000874 => x"fff7c793",
00000875 => x"00d7f7b3",
00000876 => x"00f72023",
00000877 => x"00008067",
00000878 => x"faa02623",
00000879 => x"fa802783",
00000880 => x"fe07cee3",
00000881 => x"fac02503",
00000882 => x"00008067",
00000883 => x"f8400713",
00000884 => x"00072683",
00000885 => x"00100793",
00000886 => x"00a797b3",
00000887 => x"00d7c7b3",
00000888 => x"00f72023",
00000889 => x"00008067",
00000890 => x"f8a02223",
00000891 => x"00008067",
00000892 => x"69617641",
00000893 => x"6c62616c",
00000894 => x"4d432065",
00000895 => x"0a3a7344",
00000896 => x"203a6820",
00000897 => x"706c6548",
00000898 => x"3a72200a",
00000899 => x"73655220",
00000900 => x"74726174",
00000901 => x"3a75200a",
00000902 => x"6c705520",
00000903 => x"0a64616f",
00000904 => x"203a7320",
00000905 => x"726f7453",
00000906 => x"6f742065",
00000907 => x"616c6620",
00000908 => x"200a6873",
00000909 => x"4c203a6c",
00000910 => x"2064616f",
00000911 => x"6d6f7266",
00000912 => x"616c6620",
00000913 => x"200a6873",
00000914 => x"45203a65",
00000915 => x"75636578",
00000916 => x"00006574",
00000917 => x"65206f4e",
00000918 => x"75636578",
00000919 => x"6c626174",
00000920 => x"76612065",
00000921 => x"616c6961",
00000922 => x"2e656c62",
00000086 => x"00000693",
00000087 => x"00000613",
00000088 => x"00000593",
00000089 => x"00200513",
00000090 => x"0087f463",
00000091 => x"00400513",
00000092 => x"3b5000ef",
00000093 => x"00005537",
00000094 => x"00000613",
00000095 => x"00000593",
00000096 => x"b0050513",
00000097 => x"291000ef",
00000098 => x"249000ef",
00000099 => x"00245793",
00000100 => x"00a78533",
00000101 => x"00f537b3",
00000102 => x"00b785b3",
00000103 => x"261000ef",
00000104 => x"ffff07b7",
00000105 => x"49078793",
00000106 => x"30579073",
00000107 => x"08000793",
00000108 => x"30479073",
00000109 => x"30046073",
00000110 => x"00100513",
00000111 => x"41d000ef",
00000112 => x"ffff1537",
00000113 => x"800007b7",
00000114 => x"f0450513",
00000115 => x"0007a023",
00000116 => x"2fd000ef",
00000117 => x"159000ef",
00000118 => x"ffff1537",
00000119 => x"f3c50513",
00000120 => x"2ed000ef",
00000121 => x"fe002503",
00000122 => x"238000ef",
00000123 => x"ffff1537",
00000124 => x"f4450513",
00000125 => x"2d9000ef",
00000126 => x"fe402503",
00000127 => x"224000ef",
00000128 => x"ffff1537",
00000129 => x"f5050513",
00000130 => x"2c5000ef",
00000131 => x"30102573",
00000132 => x"210000ef",
00000133 => x"ffff1537",
00000134 => x"f5850513",
00000135 => x"2b1000ef",
00000136 => x"fe802503",
00000137 => x"ffff14b7",
00000138 => x"00341413",
00000139 => x"1f4000ef",
00000140 => x"ffff1537",
00000141 => x"f6050513",
00000142 => x"295000ef",
00000143 => x"ff802503",
00000144 => x"1e0000ef",
00000145 => x"f6848513",
00000146 => x"285000ef",
00000147 => x"ff002503",
00000148 => x"1d0000ef",
00000149 => x"ffff1537",
00000150 => x"f7450513",
00000151 => x"271000ef",
00000152 => x"ffc02503",
00000153 => x"1bc000ef",
00000154 => x"f6848513",
00000155 => x"261000ef",
00000156 => x"ff402503",
00000157 => x"1ac000ef",
00000158 => x"ffff1537",
00000159 => x"f7c50513",
00000160 => x"24d000ef",
00000161 => x"14d000ef",
00000162 => x"00a404b3",
00000163 => x"0084b433",
00000164 => x"00b40433",
00000165 => x"fa402783",
00000166 => x"0207d263",
00000167 => x"ffff1537",
00000168 => x"fa450513",
00000169 => x"229000ef",
00000170 => x"219000ef",
00000171 => x"02300793",
00000172 => x"02f51263",
00000173 => x"00000513",
00000174 => x"0180006f",
00000175 => x"115000ef",
00000176 => x"fc85eae3",
00000177 => x"00b41463",
00000178 => x"fc9566e3",
00000179 => x"00100513",
00000180 => x"5b4000ef",
00000181 => x"0b4000ef",
00000182 => x"ffff1937",
00000183 => x"ffff19b7",
00000184 => x"02300a13",
00000185 => x"07200a93",
00000186 => x"06800b13",
00000187 => x"07500b93",
00000188 => x"ffff14b7",
00000189 => x"ffff1c37",
00000190 => x"fb090513",
00000191 => x"1d1000ef",
00000192 => x"1b1000ef",
00000193 => x"00050413",
00000194 => x"199000ef",
00000195 => x"ebc98513",
00000196 => x"1bd000ef",
00000197 => x"fb4400e3",
00000198 => x"01541863",
00000199 => x"ffff02b7",
00000200 => x"00028067",
00000201 => x"fd5ff06f",
00000202 => x"01641663",
00000203 => x"05c000ef",
00000204 => x"fc9ff06f",
00000205 => x"00000513",
00000206 => x"03740063",
00000207 => x"07300793",
00000208 => x"00f41663",
00000209 => x"66c000ef",
00000210 => x"fb1ff06f",
00000211 => x"06c00793",
00000212 => x"00f41863",
00000213 => x"00100513",
00000214 => x"3f0000ef",
00000215 => x"f9dff06f",
00000216 => x"06500793",
00000217 => x"00f41663",
00000218 => x"02c000ef",
00000219 => x"f8dff06f",
00000220 => x"03f00793",
00000221 => x"fb8c0513",
00000222 => x"00f40463",
00000223 => x"fcc48513",
00000224 => x"14d000ef",
00000225 => x"f75ff06f",
00000226 => x"ffff1537",
00000227 => x"de050513",
00000228 => x"13d0006f",
00000229 => x"800007b7",
00000230 => x"0007a783",
00000231 => x"00079863",
00000232 => x"ffff1537",
00000233 => x"e4450513",
00000234 => x"1250006f",
00000235 => x"ff010113",
00000236 => x"00112623",
00000237 => x"30047073",
00000238 => x"ffff1537",
00000239 => x"e6050513",
00000240 => x"10d000ef",
00000241 => x"fa002783",
00000242 => x"fe07cee3",
00000243 => x"b0001073",
00000244 => x"b8001073",
00000245 => x"b0201073",
00000246 => x"b8201073",
00000247 => x"ff002783",
00000248 => x"00078067",
00000249 => x"0000006f",
00000250 => x"ff010113",
00000251 => x"00812423",
00000252 => x"00050413",
00000253 => x"ffff1537",
00000254 => x"e7050513",
00000255 => x"00112623",
00000256 => x"0cd000ef",
00000257 => x"03040513",
00000258 => x"0ff57513",
00000259 => x"095000ef",
00000260 => x"30047073",
00000261 => x"00100513",
00000262 => x"1c1000ef",
00000263 => x"0000006f",
00000264 => x"fe010113",
00000265 => x"01212823",
00000266 => x"00050913",
00000267 => x"ffff1537",
00000268 => x"00912a23",
00000269 => x"e8850513",
00000270 => x"ffff14b7",
00000271 => x"00812c23",
00000272 => x"01312623",
00000273 => x"00112e23",
00000274 => x"01c00413",
00000275 => x"081000ef",
00000276 => x"fd848493",
00000277 => x"ffc00993",
00000278 => x"008957b3",
00000279 => x"00f7f793",
00000280 => x"00f487b3",
00000281 => x"0007c503",
00000282 => x"ffc40413",
00000283 => x"035000ef",
00000284 => x"ff3414e3",
00000285 => x"01c12083",
00000286 => x"01812403",
00000287 => x"01412483",
00000288 => x"01012903",
00000289 => x"00c12983",
00000290 => x"02010113",
00000291 => x"00008067",
00000292 => x"fb010113",
00000293 => x"04112623",
00000294 => x"04512423",
00000295 => x"04612223",
00000296 => x"04712023",
00000297 => x"02812e23",
00000298 => x"02a12c23",
00000299 => x"02b12a23",
00000300 => x"02c12823",
00000301 => x"02d12623",
00000302 => x"02e12423",
00000303 => x"02f12223",
00000304 => x"03012023",
00000305 => x"01112e23",
00000306 => x"01c12c23",
00000307 => x"01d12a23",
00000308 => x"01e12823",
00000309 => x"01f12623",
00000310 => x"34202473",
00000311 => x"800007b7",
00000312 => x"00778793",
00000313 => x"06f41a63",
00000314 => x"00000513",
00000315 => x"0d1000ef",
00000316 => x"6e0000ef",
00000317 => x"fe002783",
00000318 => x"0027d793",
00000319 => x"00a78533",
00000320 => x"00f537b3",
00000321 => x"00b785b3",
00000322 => x"6f4000ef",
00000323 => x"03c12403",
00000324 => x"04c12083",
00000325 => x"04812283",
00000326 => x"04412303",
00000327 => x"04012383",
00000328 => x"03812503",
00000329 => x"03412583",
00000330 => x"03012603",
00000331 => x"02c12683",
00000332 => x"02812703",
00000333 => x"02412783",
00000334 => x"02012803",
00000335 => x"01c12883",
00000336 => x"01812e03",
00000337 => x"01412e83",
00000338 => x"01012f03",
00000339 => x"00c12f83",
00000340 => x"05010113",
00000341 => x"30200073",
00000342 => x"00700793",
00000343 => x"00100513",
00000344 => x"02f40863",
00000345 => x"ffff1537",
00000346 => x"e7c50513",
00000347 => x"760000ef",
00000348 => x"00040513",
00000349 => x"eadff0ef",
00000350 => x"ffff1537",
00000351 => x"e8450513",
00000352 => x"74c000ef",
00000353 => x"34102573",
00000354 => x"e99ff0ef",
00000355 => x"00500513",
00000356 => x"e59ff0ef",
00000357 => x"ff010113",
00000358 => x"00000513",
00000359 => x"00112623",
00000360 => x"00812423",
00000361 => x"7c0000ef",
00000362 => x"00500513",
00000363 => x"7fc000ef",
00000364 => x"00000513",
00000365 => x"7f4000ef",
00000366 => x"00050413",
00000367 => x"00000513",
00000368 => x"7c4000ef",
00000369 => x"00c12083",
00000370 => x"0ff47513",
00000371 => x"00812403",
00000372 => x"01010113",
00000373 => x"00008067",
00000374 => x"ff010113",
00000375 => x"00000513",
00000376 => x"00112623",
00000377 => x"00812423",
00000378 => x"77c000ef",
00000379 => x"09e00513",
00000380 => x"7b8000ef",
00000381 => x"00000513",
00000382 => x"7b0000ef",
00000383 => x"00050413",
00000384 => x"00000513",
00000385 => x"780000ef",
00000386 => x"00c12083",
00000387 => x"0ff47513",
00000388 => x"00812403",
00000389 => x"01010113",
00000390 => x"00008067",
00000391 => x"ff010113",
00000392 => x"00000513",
00000393 => x"00112623",
00000394 => x"73c000ef",
00000395 => x"00600513",
00000396 => x"778000ef",
00000397 => x"00c12083",
00000398 => x"00000513",
00000399 => x"01010113",
00000400 => x"7440006f",
00000401 => x"ff010113",
00000402 => x"00812423",
00000403 => x"00050413",
00000404 => x"01055513",
00000405 => x"0ff57513",
00000406 => x"00112623",
00000407 => x"74c000ef",
00000408 => x"00845513",
00000409 => x"0ff57513",
00000410 => x"740000ef",
00000411 => x"0ff47513",
00000412 => x"00812403",
00000413 => x"00c12083",
00000414 => x"01010113",
00000415 => x"72c0006f",
00000416 => x"ff010113",
00000417 => x"00812423",
00000418 => x"00050413",
00000419 => x"00000513",
00000420 => x"00112623",
00000421 => x"6d0000ef",
00000422 => x"00300513",
00000423 => x"70c000ef",
00000424 => x"00040513",
00000425 => x"fa1ff0ef",
00000426 => x"00000513",
00000427 => x"6fc000ef",
00000428 => x"00050413",
00000429 => x"00000513",
00000430 => x"6cc000ef",
00000431 => x"00c12083",
00000432 => x"0ff47513",
00000433 => x"00812403",
00000434 => x"01010113",
00000435 => x"00008067",
00000436 => x"fd010113",
00000437 => x"02812423",
00000438 => x"02912223",
00000439 => x"03212023",
00000440 => x"01312e23",
00000441 => x"01412c23",
00000442 => x"02112623",
00000443 => x"00050913",
00000444 => x"00058993",
00000445 => x"00c10493",
00000446 => x"00000413",
00000447 => x"00400a13",
00000448 => x"02091e63",
00000449 => x"5ac000ef",
00000450 => x"00a481a3",
00000451 => x"00140413",
00000452 => x"fff48493",
00000453 => x"ff4416e3",
00000454 => x"02c12083",
00000455 => x"02812403",
00000456 => x"00c12503",
00000457 => x"02412483",
00000458 => x"02012903",
00000459 => x"01c12983",
00000460 => x"01812a03",
00000461 => x"03010113",
00000462 => x"00008067",
00000463 => x"00898533",
00000464 => x"f41ff0ef",
00000465 => x"fc5ff06f",
00000466 => x"fe802783",
00000467 => x"fd010113",
00000468 => x"02812423",
00000469 => x"02112623",
00000470 => x"02912223",
00000471 => x"03212023",
00000472 => x"01312e23",
00000473 => x"01412c23",
00000474 => x"01512a23",
00000475 => x"01612823",
00000476 => x"01712623",
00000477 => x"0087f793",
00000478 => x"00050413",
00000479 => x"00078a63",
00000480 => x"fe802783",
00000481 => x"00400513",
00000482 => x"0047f793",
00000483 => x"04079663",
00000484 => x"02041863",
00000485 => x"ffff1537",
00000486 => x"e8c50513",
00000487 => x"530000ef",
00000488 => x"008005b7",
00000489 => x"00040513",
00000490 => x"f29ff0ef",
00000491 => x"4788d7b7",
00000492 => x"afe78793",
00000493 => x"02f50463",
00000494 => x"00000513",
00000495 => x"01c0006f",
00000496 => x"ffff1537",
00000497 => x"eac50513",
00000498 => x"504000ef",
00000499 => x"e0dff0ef",
00000500 => x"fc0518e3",
00000501 => x"00300513",
00000502 => x"c11ff0ef",
00000503 => x"008009b7",
00000504 => x"00498593",
00000505 => x"00040513",
00000506 => x"ee9ff0ef",
00000507 => x"00050a13",
00000508 => x"00898593",
00000509 => x"00040513",
00000510 => x"ed9ff0ef",
00000511 => x"ff002b83",
00000512 => x"00050a93",
00000513 => x"ffca7b13",
00000514 => x"00000913",
00000515 => x"00000493",
00000516 => x"00c98993",
00000517 => x"013905b3",
00000518 => x"052b1863",
00000519 => x"015484b3",
00000520 => x"00200513",
00000521 => x"fa049ae3",
00000522 => x"ffff1537",
00000523 => x"eb850513",
00000524 => x"49c000ef",
00000525 => x"02c12083",
00000526 => x"02812403",
00000527 => x"800007b7",
00000528 => x"0147a023",
00000529 => x"02412483",
00000530 => x"02012903",
00000531 => x"01c12983",
00000532 => x"01812a03",
00000533 => x"01412a83",
00000534 => x"01012b03",
00000535 => x"00c12b83",
00000536 => x"03010113",
00000537 => x"00008067",
00000538 => x"00040513",
00000539 => x"e65ff0ef",
00000540 => x"012b87b3",
00000541 => x"00a484b3",
00000542 => x"00a7a023",
00000543 => x"00490913",
00000544 => x"f95ff06f",
00000545 => x"ff010113",
00000546 => x"00112623",
00000547 => x"ebdff0ef",
00000548 => x"ffff1537",
00000549 => x"ebc50513",
00000550 => x"434000ef",
00000551 => x"af9ff0ef",
00000552 => x"0000006f",
00000553 => x"ff010113",
00000554 => x"00112623",
00000555 => x"00812423",
00000556 => x"00912223",
00000557 => x"00058413",
00000558 => x"00050493",
00000559 => x"d61ff0ef",
00000560 => x"00000513",
00000561 => x"4a0000ef",
00000562 => x"00200513",
00000563 => x"4dc000ef",
00000564 => x"00048513",
00000565 => x"d71ff0ef",
00000566 => x"00040513",
00000567 => x"4cc000ef",
00000568 => x"00000513",
00000569 => x"4a0000ef",
00000570 => x"cadff0ef",
00000571 => x"00157513",
00000572 => x"fe051ce3",
00000573 => x"00c12083",
00000574 => x"00812403",
00000575 => x"00412483",
00000576 => x"01010113",
00000577 => x"00008067",
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"f65ff0ef",
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"cadff0ef",
00000605 => x"00000513",
00000606 => x"3ec000ef",
00000607 => x"0d800513",
00000608 => x"428000ef",
00000609 => x"00040513",
00000610 => x"cbdff0ef",
00000611 => x"00000513",
00000612 => x"3f4000ef",
00000613 => x"c01ff0ef",
00000614 => x"00157513",
00000615 => x"fe051ce3",
00000616 => x"00c12083",
00000617 => x"00812403",
00000618 => x"01010113",
00000619 => x"00008067",
00000620 => x"fe010113",
00000621 => x"800007b7",
00000622 => x"00812c23",
00000623 => x"0007a403",
00000624 => x"00112e23",
00000625 => x"00912a23",
00000626 => x"01212823",
00000627 => x"01312623",
00000628 => x"01412423",
00000629 => x"01512223",
00000630 => x"02041863",
00000631 => x"ffff1537",
00000632 => x"e4450513",
00000633 => x"01812403",
00000634 => x"01c12083",
00000635 => x"01412483",
00000636 => x"01012903",
00000637 => x"00c12983",
00000638 => x"00812a03",
00000639 => x"00412a83",
00000640 => x"02010113",
00000641 => x"2c80006f",
00000642 => x"ffff1537",
00000643 => x"ec050513",
00000644 => x"2bc000ef",
00000645 => x"00040513",
00000646 => x"a09ff0ef",
00000647 => x"ffff1537",
00000648 => x"ecc50513",
00000649 => x"2a8000ef",
00000650 => x"00800537",
00000651 => x"9f5ff0ef",
00000652 => x"ffff1537",
00000653 => x"ee850513",
00000654 => x"294000ef",
00000655 => x"274000ef",
00000656 => x"00050493",
00000657 => x"25c000ef",
00000658 => x"07900793",
00000659 => x"0af49e63",
00000660 => x"b89ff0ef",
00000661 => x"00051663",
00000662 => x"00300513",
00000663 => x"98dff0ef",
00000664 => x"ffff1537",
00000665 => x"ef450513",
00000666 => x"01045493",
00000667 => x"260000ef",
00000668 => x"00148493",
00000669 => x"00800937",
00000670 => x"fff00993",
00000671 => x"00010a37",
00000672 => x"fff48493",
00000673 => x"07349063",
00000674 => x"4788d5b7",
00000675 => x"afe58593",
00000676 => x"00800537",
00000677 => x"e75ff0ef",
00000678 => x"00800537",
00000679 => x"00040593",
00000680 => x"00450513",
00000681 => x"e65ff0ef",
00000682 => x"ff002a03",
00000683 => x"008009b7",
00000684 => x"ffc47413",
00000685 => x"00000493",
00000686 => x"00000913",
00000687 => x"00c98a93",
00000688 => x"01548533",
00000689 => x"009a07b3",
00000690 => x"02849663",
00000691 => x"00898513",
00000692 => x"412005b3",
00000693 => x"e35ff0ef",
00000694 => x"ffff1537",
00000695 => x"eb850513",
00000696 => x"f05ff06f",
00000697 => x"00090513",
00000698 => x"e79ff0ef",
00000699 => x"01490933",
00000700 => x"f91ff06f",
00000701 => x"0007a583",
00000702 => x"00448493",
00000703 => x"00b90933",
00000704 => x"e09ff0ef",
00000705 => x"fbdff06f",
00000706 => x"01c12083",
00000707 => x"01812403",
00000708 => x"01412483",
00000709 => x"01012903",
00000710 => x"00c12983",
00000711 => x"00812a03",
00000712 => x"00412a83",
00000713 => x"02010113",
00000714 => x"00008067",
00000715 => x"fe010113",
00000716 => x"00912a23",
00000717 => x"01312623",
00000718 => x"01412423",
00000719 => x"00112e23",
00000720 => x"00812c23",
00000721 => x"01212823",
00000722 => x"00000493",
00000723 => x"00300a13",
00000724 => x"00400993",
00000725 => x"f13027f3",
00000726 => x"40900733",
00000727 => x"00371713",
00000728 => x"01870713",
00000729 => x"00e7d7b3",
00000730 => x"0ff7f793",
00000731 => x"0047d513",
00000732 => x"40a00933",
00000733 => x"00491913",
00000734 => x"03078793",
00000735 => x"0ff97913",
00000736 => x"0ff7f413",
00000737 => x"00050663",
00000738 => x"03050513",
00000739 => x"114000ef",
00000740 => x"01240533",
00000741 => x"0ff57513",
00000742 => x"108000ef",
00000743 => x"01448663",
00000744 => x"02e00513",
00000745 => x"0fc000ef",
00000746 => x"00148493",
00000747 => x"fb3494e3",
00000748 => x"01c12083",
00000749 => x"01812403",
00000750 => x"01412483",
00000751 => x"01012903",
00000752 => x"00c12983",
00000753 => x"00812a03",
00000754 => x"02010113",
00000755 => x"00008067",
00000756 => x"ff010113",
00000757 => x"f9402783",
00000758 => x"f9002703",
00000759 => x"f9402683",
00000760 => x"fed79ae3",
00000761 => x"00e12023",
00000762 => x"00f12223",
00000763 => x"00012503",
00000764 => x"00412583",
00000765 => x"01010113",
00000766 => x"00008067",
00000767 => x"f9800693",
00000768 => x"fff00613",
00000769 => x"00c6a023",
00000770 => x"00a6a023",
00000771 => x"00b6a223",
00000772 => x"00008067",
00000773 => x"fa002023",
00000774 => x"fe002683",
00000775 => x"00151513",
00000776 => x"00000713",
00000777 => x"04a6f263",
00000778 => x"000016b7",
00000779 => x"00000793",
00000780 => x"ffe68693",
00000781 => x"04e6e463",
00000782 => x"00167613",
00000783 => x"0015f593",
00000784 => x"01879793",
00000785 => x"01e61613",
00000786 => x"00c7e7b3",
00000787 => x"01d59593",
00000788 => x"00b7e7b3",
00000789 => x"00e7e7b3",
00000790 => x"10000737",
00000791 => x"00e7e7b3",
00000792 => x"faf02023",
00000793 => x"00008067",
00000794 => x"00170793",
00000795 => x"01079713",
00000796 => x"40a686b3",
00000797 => x"01075713",
00000798 => x"fadff06f",
00000799 => x"ffe78513",
00000800 => x"0fd57513",
00000801 => x"00051a63",
00000802 => x"00375713",
00000803 => x"00178793",
00000804 => x"0ff7f793",
00000805 => x"fa1ff06f",
00000806 => x"00175713",
00000807 => x"ff1ff06f",
00000808 => x"fa002783",
00000809 => x"fe07cee3",
00000810 => x"faa02223",
00000811 => x"00008067",
00000812 => x"fa402503",
00000813 => x"fe055ee3",
00000814 => x"0ff57513",
00000815 => x"00008067",
00000816 => x"fa402503",
00000817 => x"0ff57513",
00000818 => x"00008067",
00000819 => x"ff010113",
00000820 => x"00812423",
00000821 => x"01212023",
00000822 => x"00112623",
00000823 => x"00912223",
00000824 => x"00050413",
00000825 => x"00a00913",
00000826 => x"00044483",
00000827 => x"00140413",
00000828 => x"00049e63",
00000829 => x"00c12083",
00000830 => x"00812403",
00000831 => x"00412483",
00000832 => x"00012903",
00000833 => x"01010113",
00000834 => x"00008067",
00000835 => x"01249663",
00000836 => x"00d00513",
00000837 => x"f8dff0ef",
00000838 => x"00048513",
00000839 => x"f85ff0ef",
00000840 => x"fc9ff06f",
00000841 => x"00757513",
00000842 => x"0016f793",
00000843 => x"00367613",
00000844 => x"00a51513",
00000845 => x"00f79793",
00000846 => x"0015f593",
00000847 => x"00f567b3",
00000848 => x"00d61613",
00000849 => x"00c7e7b3",
00000850 => x"00959593",
00000851 => x"fa800713",
00000852 => x"00b7e7b3",
00000853 => x"00072023",
00000854 => x"1007e793",
00000855 => x"00f72023",
00000856 => x"00008067",
00000857 => x"fa800713",
00000858 => x"00072683",
00000859 => x"00757793",
00000860 => x"00100513",
00000861 => x"00f51533",
00000862 => x"00d56533",
00000863 => x"00a72023",
00000864 => x"00008067",
00000865 => x"fa800713",
00000866 => x"00072683",
00000867 => x"00757513",
00000868 => x"00100793",
00000869 => x"00a797b3",
00000870 => x"fff7c793",
00000871 => x"00d7f7b3",
00000872 => x"00f72023",
00000873 => x"00008067",
00000874 => x"faa02623",
00000875 => x"fa802783",
00000876 => x"fe07cee3",
00000877 => x"fac02503",
00000878 => x"00008067",
00000879 => x"f8400713",
00000880 => x"00072683",
00000881 => x"00100793",
00000882 => x"00a797b3",
00000883 => x"00d7c7b3",
00000884 => x"00f72023",
00000885 => x"00008067",
00000886 => x"f8a02223",
00000887 => x"00008067",
00000888 => x"69617641",
00000889 => x"6c62616c",
00000890 => x"4d432065",
00000891 => x"0a3a7344",
00000892 => x"203a6820",
00000893 => x"706c6548",
00000894 => x"3a72200a",
00000895 => x"73655220",
00000896 => x"74726174",
00000897 => x"3a75200a",
00000898 => x"6c705520",
00000899 => x"0a64616f",
00000900 => x"203a7320",
00000901 => x"726f7453",
00000902 => x"6f742065",
00000903 => x"616c6620",
00000904 => x"200a6873",
00000905 => x"4c203a6c",
00000906 => x"2064616f",
00000907 => x"6d6f7266",
00000908 => x"616c6620",
00000909 => x"200a6873",
00000910 => x"45203a65",
00000911 => x"75636578",
00000912 => x"00006574",
00000913 => x"65206f4e",
00000914 => x"75636578",
00000915 => x"6c626174",
00000916 => x"76612065",
00000917 => x"616c6961",
00000918 => x"2e656c62",
00000919 => x"00000000",
00000920 => x"746f6f42",
00000921 => x"2e676e69",
00000922 => x"0a0a2e2e",
00000923 => x"00000000",
00000924 => x"746f6f42",
00000925 => x"2e676e69",
00000926 => x"0a0a2e2e",
00000927 => x"00000000",
00000928 => x"52450a07",
00000929 => x"5f524f52",
00000930 => x"00000000",
00000931 => x"58450a0a",
00000932 => x"00282043",
00000933 => x"20402029",
00000934 => x"00007830",
00000935 => x"69617741",
00000936 => x"676e6974",
00000937 => x"6f656e20",
00000938 => x"32337672",
00000939 => x"6578655f",
00000940 => x"6e69622e",
00000941 => x"202e2e2e",
00000942 => x"00000000",
00000943 => x"64616f4c",
00000944 => x"2e676e69",
00000945 => x"00202e2e",
00000946 => x"00004b4f",
00000947 => x"0000000a",
00000948 => x"74697257",
00000949 => x"78302065",
00000950 => x"00000000",
00000951 => x"74796220",
00000952 => x"74207365",
00000953 => x"5053206f",
00000954 => x"6c662049",
00000955 => x"20687361",
00000956 => x"78302040",
00000957 => x"00000000",
00000958 => x"7928203f",
00000959 => x"20296e2f",
00000960 => x"00000000",
00000961 => x"616c460a",
00000962 => x"6e696873",
00000963 => x"2e2e2e67",
00000964 => x"00000020",
00000965 => x"0a0a0a0a",
00000966 => x"4e203c3c",
00000967 => x"56524f45",
00000968 => x"42203233",
00000969 => x"6c746f6f",
00000970 => x"6564616f",
00000971 => x"3e3e2072",
00000972 => x"4c420a0a",
00000973 => x"203a5644",
00000974 => x"2074634f",
00000975 => x"32203232",
00000976 => x"0a303230",
00000977 => x"3a565748",
00000978 => x"00002020",
00000979 => x"4b4c430a",
00000980 => x"0020203a",
00000981 => x"0a7a4820",
00000982 => x"52455355",
00000983 => x"0000203a",
00000984 => x"53494d0a",
00000985 => x"00203a41",
00000986 => x"4f52500a",
00000987 => x"00203a43",
00000988 => x"454d490a",
00000989 => x"00203a4d",
00000990 => x"74796220",
00000991 => x"40207365",
00000992 => x"00000020",
00000993 => x"454d440a",
00000994 => x"00203a4d",
00000995 => x"75410a0a",
00000996 => x"6f626f74",
00000997 => x"6920746f",
00000998 => x"7338206e",
00000999 => x"7250202e",
00001000 => x"20737365",
00001001 => x"2079656b",
00001002 => x"61206f74",
00001003 => x"74726f62",
00001004 => x"00000a2e",
00001005 => x"726f6241",
00001006 => x"2e646574",
00001007 => x"00000a0a",
00001008 => x"444d430a",
00001009 => x"00203e3a",
00001010 => x"53207962",
00001011 => x"68706574",
00001012 => x"4e206e61",
00001013 => x"69746c6f",
00001014 => x"0000676e",
00001015 => x"61766e49",
00001016 => x"2064696c",
00001017 => x"00444d43",
00001018 => x"33323130",
00001019 => x"37363534",
00001020 => x"42413938",
00001021 => x"46454443",
00000924 => x"52450a07",
00000925 => x"5f524f52",
00000926 => x"00000000",
00000927 => x"58450a0a",
00000928 => x"00282043",
00000929 => x"20402029",
00000930 => x"00007830",
00000931 => x"69617741",
00000932 => x"676e6974",
00000933 => x"6f656e20",
00000934 => x"32337672",
00000935 => x"6578655f",
00000936 => x"6e69622e",
00000937 => x"202e2e2e",
00000938 => x"00000000",
00000939 => x"64616f4c",
00000940 => x"2e676e69",
00000941 => x"00202e2e",
00000942 => x"00004b4f",
00000943 => x"0000000a",
00000944 => x"74697257",
00000945 => x"78302065",
00000946 => x"00000000",
00000947 => x"74796220",
00000948 => x"74207365",
00000949 => x"5053206f",
00000950 => x"6c662049",
00000951 => x"20687361",
00000952 => x"78302040",
00000953 => x"00000000",
00000954 => x"7928203f",
00000955 => x"20296e2f",
00000956 => x"00000000",
00000957 => x"616c460a",
00000958 => x"6e696873",
00000959 => x"2e2e2e67",
00000960 => x"00000020",
00000961 => x"0a0a0a0a",
00000962 => x"4e203c3c",
00000963 => x"56524f45",
00000964 => x"42203233",
00000965 => x"6c746f6f",
00000966 => x"6564616f",
00000967 => x"3e3e2072",
00000968 => x"4c420a0a",
00000969 => x"203a5644",
00000970 => x"20766f4e",
00000971 => x"32203320",
00000972 => x"0a303230",
00000973 => x"3a565748",
00000974 => x"00002020",
00000975 => x"4b4c430a",
00000976 => x"0020203a",
00000977 => x"0a7a4820",
00000978 => x"52455355",
00000979 => x"0000203a",
00000980 => x"53494d0a",
00000981 => x"00203a41",
00000982 => x"4f52500a",
00000983 => x"00203a43",
00000984 => x"454d490a",
00000985 => x"00203a4d",
00000986 => x"74796220",
00000987 => x"40207365",
00000988 => x"00000020",
00000989 => x"454d440a",
00000990 => x"00203a4d",
00000991 => x"75410a0a",
00000992 => x"6f626f74",
00000993 => x"6920746f",
00000994 => x"7338206e",
00000995 => x"7250202e",
00000996 => x"20737365",
00000997 => x"2079656b",
00000998 => x"61206f74",
00000999 => x"74726f62",
00001000 => x"00000a2e",
00001001 => x"726f6241",
00001002 => x"2e646574",
00001003 => x"00000a0a",
00001004 => x"444d430a",
00001005 => x"00203e3a",
00001006 => x"53207962",
00001007 => x"68706574",
00001008 => x"4e206e61",
00001009 => x"69746c6f",
00001010 => x"0000676e",
00001011 => x"61766e49",
00001012 => x"2064696c",
00001013 => x"00444d43",
00001014 => x"33323130",
00001015 => x"37363534",
00001016 => x"42413938",
00001017 => x"46454443",
others => x"00000000"
);
 
/rtl/core/neorv32_busswitch.vhd
72,6 → 72,7
cb_bus_ack_o : out std_ulogic; -- bus transfer acknowledge
cb_bus_err_o : out std_ulogic; -- bus transfer error
-- peripheral bus --
p_bus_src_o : out std_ulogic; -- access source: 0 = A, 1 = B
p_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
p_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
p_bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
188,6 → 189,8
arbiter.bus_sel <= '0';
arbiter.we_trig <= '0';
arbiter.re_trig <= '0';
--
p_bus_src_o <= '0';
 
-- state machine --
case arbiter.state is
194,6 → 197,7
 
when IDLE => -- Controller a has full bus access
-- ------------------------------------------------------------
p_bus_src_o <= '0'; -- access from port A
if (ca_req_current = '1') then -- current request?
arbiter.bus_sel <= '0';
arbiter.state_nxt <= BUSY;
210,6 → 214,7
 
when BUSY => -- transaction in progress
-- ------------------------------------------------------------
p_bus_src_o <= '0'; -- access from port A
arbiter.bus_sel <= '0';
if (ca_bus_cancel_i = '1') or -- controller cancels access
(p_bus_err_i = '1') or -- peripheral cancels access
219,6 → 224,7
 
when RETIRE => -- retire pending access
-- ------------------------------------------------------------
p_bus_src_o <= '0'; -- access from port A
arbiter.bus_sel <= '0';
if (PORT_CA_READ_ONLY = false) then
arbiter.we_trig <= ca_wr_req_buf;
228,6 → 234,7
 
when BUSY_SWITCHED => -- switched transaction in progress
-- ------------------------------------------------------------
p_bus_src_o <= '1'; -- access from port B
arbiter.bus_sel <= '1';
if (cb_bus_cancel_i = '1') or -- controller cancels access
(p_bus_err_i = '1') or -- peripheral cancels access
237,6 → 244,7
 
when RETIRE_SWITCHED => -- retire pending switched access
-- ------------------------------------------------------------
p_bus_src_o <= '1'; -- access from port B
arbiter.bus_sel <= '1';
if (PORT_CB_READ_ONLY = false) then
arbiter.we_trig <= cb_wr_req_buf;
250,14 → 258,14
 
-- Peripheral Bus Switch ------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
p_bus_addr_o <= ca_bus_addr_i when (arbiter.bus_sel = '0') else cb_bus_addr_i;
p_bus_wdata_o <= cb_bus_wdata_i when (PORT_CA_READ_ONLY = true) else ca_bus_wdata_i when (PORT_CB_READ_ONLY = true) else
ca_bus_wdata_i when (arbiter.bus_sel = '0') else cb_bus_wdata_i;
p_bus_ben_o <= cb_bus_ben_i when (PORT_CA_READ_ONLY = true) else ca_bus_ben_i when (PORT_CB_READ_ONLY = true) else
ca_bus_ben_i when (arbiter.bus_sel = '0') else cb_bus_ben_i;
p_bus_we <= ca_bus_we_i when (arbiter.bus_sel = '0') else cb_bus_we_i;
p_bus_re <= ca_bus_re_i when (arbiter.bus_sel = '0') else cb_bus_re_i;
p_bus_cancel_o <= ca_bus_cancel_i when (arbiter.bus_sel = '0') else cb_bus_cancel_i;
p_bus_addr_o <= ca_bus_addr_i when (arbiter.bus_sel = '0') else cb_bus_addr_i;
p_bus_wdata_o <= cb_bus_wdata_i when (PORT_CA_READ_ONLY = true) else ca_bus_wdata_i when (PORT_CB_READ_ONLY = true) else
ca_bus_wdata_i when (arbiter.bus_sel = '0') else cb_bus_wdata_i;
p_bus_ben_o <= cb_bus_ben_i when (PORT_CA_READ_ONLY = true) else ca_bus_ben_i when (PORT_CB_READ_ONLY = true) else
ca_bus_ben_i when (arbiter.bus_sel = '0') else cb_bus_ben_i;
p_bus_we <= ca_bus_we_i when (arbiter.bus_sel = '0') else cb_bus_we_i;
p_bus_re <= ca_bus_re_i when (arbiter.bus_sel = '0') else cb_bus_re_i;
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);
 
/rtl/core/neorv32_cpu.vhd
2,13 → 2,13
-- # << NEORV32 - CPU Top Entity >> #
-- # ********************************************************************************************* #
-- # NEORV32 CPU: #
-- # * neorv32_cpu.vhd : CPU top entity #
-- # * neorv32_cpu_alu.vhd : Arithmetic/logic unit #
-- # * neorv32_cpu_bus.vhd : Instruction and data bus interface unit #
-- # * neorv32_cpu_cp_muldiv.vhd : MULDIV co-processor #
-- # * neorv32_cpu_ctrl.vhd : CPU control and CSR system #
-- # * neorv32_cpu_decompressor.vhd : Compressed instructions decoder #
-- # * neorv32_cpu_regfile.vhd : Data register file #
-- # * neorv32_cpu.vhd - CPU top entity #
-- # * neorv32_cpu_alu.vhd - Arithmetic/logic unit #
-- # * neorv32_cpu_bus.vhd - Instruction and data bus interface unit #
-- # * neorv32_cpu_cp_muldiv.vhd - MULDIV co-processor #
-- # * neorv32_cpu_ctrl.vhd - CPU control and CSR system #
-- # * neorv32_cpu_decompressor.vhd - Compressed instructions decoder #
-- # * neorv32_cpu_regfile.vhd - Data register file #
-- # #
-- # Check out the processor's data sheet for more information: docs/NEORV32.pdf #
-- # ********************************************************************************************* #
117,7 → 117,9
signal imm : std_ulogic_vector(data_width_c-1 downto 0); -- immediate
signal instr : std_ulogic_vector(data_width_c-1 downto 0); -- new instruction
signal rs1, rs2 : std_ulogic_vector(data_width_c-1 downto 0); -- source registers
signal alu_opb : std_ulogic_vector(data_width_c-1 downto 0); -- ALU operand b
signal alu_res : std_ulogic_vector(data_width_c-1 downto 0); -- alu result
signal alu_add : std_ulogic_vector(data_width_c-1 downto 0); -- alu address result
signal rdata : std_ulogic_vector(data_width_c-1 downto 0); -- memory read data
signal alu_wait : std_ulogic; -- alu is busy due to iterative unit
signal bus_i_wait : std_ulogic; -- wait for current bus instruction fetch
135,14 → 137,13
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 : std_ulogic_vector(data_width_c-1 downto 0);
signal cp0_valid, cp1_valid : std_ulogic;
signal cp0_start, cp1_start : std_ulogic;
signal cp0_data, cp1_data, cp2_data, cp3_data : std_ulogic_vector(data_width_c-1 downto 0);
signal cp0_valid, cp1_valid, cp2_valid, cp3_valid : std_ulogic;
signal cp0_start, cp1_start, cp2_start, cp3_start : std_ulogic;
 
-- pmp interface --
signal pmp_addr : pmp_addr_if_t;
signal pmp_ctrl : pmp_ctrl_if_t;
signal priv_mode : std_ulogic_vector(1 downto 0); -- current CPU privilege level
 
begin
 
149,7 → 150,7
-- Sanity Checks --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- CSR system --
assert not (CPU_EXTENSION_RISCV_Zicsr = false) report "NEORV32 CPU CONFIG WARNING! No exception/interrupt/machine features available when CPU_EXTENSION_RISCV_Zicsr = false." severity warning;
assert not (CPU_EXTENSION_RISCV_Zicsr = false) report "NEORV32 CPU CONFIG WARNING! No exception/interrupt/trap/machine features available when CPU_EXTENSION_RISCV_Zicsr = false." severity warning;
-- U-extension requires Zicsr extension --
assert not ((CPU_EXTENSION_RISCV_Zicsr = false) and (CPU_EXTENSION_RISCV_U = true)) report "NEORV32 CPU CONFIG ERROR! User mode requires CPU_EXTENSION_RISCV_Zicsr extension." severity error;
-- PMP requires Zicsr extension --
157,7 → 158,7
-- PMP regions --
assert not ((PMP_NUM_REGIONS > pmp_max_r_c) and (PMP_USE = true)) report "NEORV32 CPU CONFIG ERROR! Number of PMP regions out of valid range." severity error;
-- PMP granulartiy --
assert not (((PMP_GRANULARITY < 1) or (PMP_GRANULARITY > 32)) and (PMP_USE = true)) report "NEORV32 CPU CONFIG ERROR! Invalid PMP granulartiy (0 < G < 33)." severity error;
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;
 
 
-- Control Unit ---------------------------------------------------------------------------
191,7 → 192,8
-- data input --
instr_i => instr, -- instruction
cmp_i => alu_cmp, -- comparator status
alu_res_i => alu_res, -- ALU processing result
alu_add_i => alu_add, -- ALU address result
rs1_i => rs1, -- rf source 1
-- data output --
imm_o => imm, -- immediate
fetch_pc_o => fetch_pc, -- PC for instruction fetch
209,7 → 211,6
-- physical memory protection --
pmp_addr_o => pmp_addr, -- addresses
pmp_ctrl_o => pmp_ctrl, -- configs
priv_mode_o => priv_mode, -- current CPU privilege level
-- bus access exceptions --
mar_i => mar, -- memory address register
ma_instr_i => ma_instr, -- misaligned instruction address
262,6 → 263,8
-- data output --
cmp_o => alu_cmp, -- comparator status
res_o => alu_res, -- ALU result
add_o => alu_add, -- address computation result
opb_o => alu_opb, -- ALU operand B
-- co-processor interface --
cp0_start_o => cp0_start, -- trigger co-processor 0
cp0_data_i => cp0_data, -- co-processor 0 result
269,6 → 272,12
cp1_start_o => cp1_start, -- trigger co-processor 1
cp1_data_i => cp1_data, -- co-processor 1 result
cp1_valid_i => cp1_valid, -- co-processor 1 result valid
cp2_start_o => cp2_start, -- trigger co-processor 2
cp2_data_i => cp2_data, -- co-processor 2 result
cp2_valid_i => cp2_valid, -- co-processor 2 result valid
cp3_start_o => cp3_start, -- trigger co-processor 3
cp3_data_i => cp3_data, -- co-processor 3 result
cp3_valid_i => cp3_valid, -- co-processor 3 result valid
-- status --
wait_o => alu_wait -- busy due to iterative processing units
);
287,8 → 296,8
clk_i => clk_i, -- global clock, rising edge
rstn_i => rstn_i, -- global reset, low-active, async
ctrl_i => ctrl, -- main control bus
start_i => cp0_start, -- trigger operation
-- data input --
start_i => cp0_start, -- trigger operation
rs1_i => rs1, -- rf source 1
rs2_i => rs2, -- rf source 2
-- result and status --
304,12 → 313,30
end generate;
 
 
-- Co-Processor 1: Not Implemented Yet ----------------------------------------------------
-- Co-Processor 1: Not implemented yet ----------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- control: ctrl cp1_start
-- inputs: rs1 rs2 alu_cmp alu_opb
cp1_data <= (others => '0');
cp1_valid <= '0';
 
 
-- Co-Processor 2: Not implemented yet ----------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- control: ctrl cp2_start
-- inputs: rs1 rs2 alu_cmp alu_opb
cp2_data <= (others => '0');
cp2_valid <= '0';
 
 
-- Co-Processor 3: Not implemented yet ----------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- control: ctrl cp3_start
-- inputs: rs1 rs2 alu_cmp alu_opb
cp3_data <= (others => '0');
cp3_valid <= '0';
 
 
-- Bus Interface Unit ---------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
neorv32_cpu_bus_inst: neorv32_cpu_bus
323,7 → 350,6
port map (
-- global control --
clk_i => clk_i, -- global clock, rising edge
rstn_i => rstn_i, -- global reset, low-active, async
ctrl_i => ctrl, -- main control bus
-- cpu instruction fetch interface --
fetch_pc_i => fetch_pc, -- PC for instruction fetch
346,7 → 372,6
-- physical memory protection --
pmp_addr_i => pmp_addr, -- addresses
pmp_ctrl_i => pmp_ctrl, -- configs
priv_mode_i => priv_mode, -- current CPU privilege level
-- instruction bus --
i_bus_addr_o => i_bus_addr_o, -- bus access address
i_bus_rdata_i => i_bus_rdata_i, -- bus read data
372,8 → 397,8
);
 
-- current privilege level --
i_bus_priv_o <= priv_mode;
d_bus_priv_o <= priv_mode;
i_bus_priv_o <= ctrl(ctrl_priv_lvl_msb_c downto ctrl_priv_lvl_lsb_c);
d_bus_priv_o <= ctrl(ctrl_priv_lvl_msb_c downto ctrl_priv_lvl_lsb_c);
 
 
end neorv32_cpu_rtl;
/rtl/core/neorv32_cpu_alu.vhd
2,7 → 2,6
-- # << NEORV32 - Arithmetical/Logical Unit >> #
-- # ********************************************************************************************* #
-- # Main data and address ALU. Includes comparator unit and co-processor interface/arbiter. #
-- # The shifter sub-unit uses an iterative approach. #
-- # ********************************************************************************************* #
-- # BSD 3-Clause License #
-- # #
60,6 → 59,8
-- data output --
cmp_o : out std_ulogic_vector(1 downto 0); -- comparator status
res_o : out std_ulogic_vector(data_width_c-1 downto 0); -- ALU result
add_o : out std_ulogic_vector(data_width_c-1 downto 0); -- address computation result
opb_o : out std_ulogic_vector(data_width_c-1 downto 0); -- ALU operand B
-- co-processor interface --
cp0_start_o : out std_ulogic; -- trigger co-processor 0
cp0_data_i : in std_ulogic_vector(data_width_c-1 downto 0); -- co-processor 0 result
67,6 → 68,12
cp1_start_o : out std_ulogic; -- trigger co-processor 1
cp1_data_i : in std_ulogic_vector(data_width_c-1 downto 0); -- co-processor 1 result
cp1_valid_i : in std_ulogic; -- co-processor 1 result valid
cp2_start_o : out std_ulogic; -- trigger co-processor 2
cp2_data_i : in std_ulogic_vector(data_width_c-1 downto 0); -- co-processor 2 result
cp2_valid_i : in std_ulogic; -- co-processor 2 result valid
cp3_start_o : out std_ulogic; -- trigger co-processor 3
cp3_data_i : in std_ulogic_vector(data_width_c-1 downto 0); -- co-processor 3 result
cp3_valid_i : in std_ulogic; -- co-processor 3 result valid
-- status --
wait_o : out std_ulogic -- busy due to iterative processing units
);
78,14 → 85,13
signal opa, opb : std_ulogic_vector(data_width_c-1 downto 0);
 
-- results --
signal addsub_res : std_ulogic_vector(data_width_c-1 downto 0);
signal addsub_res : std_ulogic_vector(data_width_c downto 0);
signal cp_res : std_ulogic_vector(data_width_c-1 downto 0);
 
-- comparator --
signal cmp_opx : std_ulogic_vector(data_width_c downto 0);
signal cmp_opy : std_ulogic_vector(data_width_c downto 0);
signal cmp_sub : std_ulogic_vector(data_width_c downto 0);
signal cmp_less : std_ulogic;
signal cmp_opx : std_ulogic_vector(data_width_c downto 0);
signal cmp_opy : std_ulogic_vector(data_width_c downto 0);
signal cmp_sub : std_ulogic_vector(data_width_c downto 0);
 
-- shifter --
type shifter_t is record
116,8 → 122,10
 
-- Operand Mux ----------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
opa <= pc2_i when (ctrl_i(ctrl_alu_opa_mux_c) = '1') else rs1_i; -- operand a (first ALU input operand)
opa <= pc2_i when (ctrl_i(ctrl_alu_opa_mux_c) = '1') else rs1_i; -- operand a (first ALU input operand), only required for arithmetic ops
opb <= imm_i when (ctrl_i(ctrl_alu_opb_mux_c) = '1') else rs2_i; -- operand b (second ALU input operand)
--
opb_o <= opb;
 
 
-- Comparator Unit ------------------------------------------------------------------------
147,24 → 155,22
if (ctrl_i(ctrl_alu_addsub_c) = '1') then -- subtraction
op_y_v := not op_b_v;
cin_v(0) := '1';
else-- addition
else -- addition
op_y_v := op_b_v;
cin_v(0) := '0';
end if;
 
-- adder core --
res_v := std_ulogic_vector(unsigned(op_a_v) + unsigned(op_y_v) + unsigned(cin_v(0 downto 0)));
 
-- output --
cmp_less <= res_v(32);
addsub_res <= res_v(31 downto 0);
addsub_res <= res_v(31 downto 0);
-- adder core (result + carry/borrow) --
addsub_res <= std_ulogic_vector(unsigned(op_a_v) + unsigned(op_y_v) + unsigned(cin_v(0 downto 0)));
end process binary_arithmetic_core;
 
-- direct output of address result --
add_o <= addsub_res(data_width_c-1 downto 0);
 
 
-- Shifter Unit ---------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
shifter_unit: process(rstn_i, clk_i)
shifter_unit: process(clk_i)
variable bs_input_v : std_ulogic_vector(data_width_c-1 downto 0);
variable bs_level_4_v : std_ulogic_vector(data_width_c-1 downto 0);
variable bs_level_3_v : std_ulogic_vector(data_width_c-1 downto 0);
172,15 → 178,7
variable bs_level_1_v : std_ulogic_vector(data_width_c-1 downto 0);
variable bs_level_0_v : std_ulogic_vector(data_width_c-1 downto 0);
begin
if (rstn_i = '0') then
shifter.sreg <= (others => '0');
shifter.cnt <= (others => '0');
shifter.cmd_ff <= '0';
if (FAST_SHIFT_EN = true) then
shifter.bs_d_in <= (others => '0');
shifter.bs_a_in <= (others => '0');
end if;
elsif rising_edge(clk_i) then
if rising_edge(clk_i) then
shifter.cmd_ff <= shifter.cmd;
 
-- --------------------------------------------------------------------------------
189,7 → 187,7
if (FAST_SHIFT_EN = false) then
 
if (shifter.start = '1') then -- trigger new shift
shifter.sreg <= opa; -- shift operand
shifter.sreg <= rs1_i; -- shift operand (can only be rs1; opa would also contain pc)
shifter.cnt <= opb(index_size_f(data_width_c)-1 downto 0); -- shift amount
elsif (shifter.run = '1') then -- running shift
-- coarse shift: multiples of 4 --
221,7 → 219,7
 
-- operands and cycle control --
if (shifter.start = '1') then -- trigger new shift
shifter.bs_d_in <= opa; -- shift data
shifter.bs_d_in <= rs1_i; -- shift operand (can only be rs1; opa would also contain pc)
shifter.bs_a_in <= opb(index_size_f(data_width_c)-1 downto 0); -- shift amount
shifter.cnt <= (others => '0');
end if;
298,7 → 296,7
cp_ctrl.cmd_ff <= cp_ctrl.cmd;
if (cp_ctrl.start = '1') then
cp_ctrl.busy <= '1';
elsif ((cp0_valid_i or cp1_valid_i) = '1') then -- cp computation done?
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
311,29 → 309,31
-- 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.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) = cp_sel_muldiv_c) else '0'; -- MULDIV CP
cp1_start_o <= '0'; -- not yet implemented
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 result --
cp_res <= cp0_data_i or cp1_data_i; -- only the **actaully selected** co-processor should output data != 0
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
 
 
-- ALU Function Select --------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
alu_function_mux: process(ctrl_i, opa, opb, addsub_res, cp_res, cmp_less, shifter.sreg)
alu_function_mux: process(ctrl_i, rs1_i, opb, addsub_res, cp_res, shifter.sreg)
begin
case ctrl_i(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) is
when alu_cmd_xor_c => res_o <= opa xor opb;
when alu_cmd_or_c => res_o <= opa or opb;
when alu_cmd_and_c => res_o <= opa and opb;
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;
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) <= cmp_less;
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
end case;
end process alu_function_mux;
/rtl/core/neorv32_cpu_bus.vhd
52,7 → 52,6
port (
-- global control --
clk_i : in std_ulogic; -- global clock, rising edge
rstn_i : in std_ulogic; -- global reset, low-active, async
ctrl_i : in std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus
-- cpu instruction fetch interface --
fetch_pc_i : in std_ulogic_vector(data_width_c-1 downto 0); -- PC for instruction fetch
75,7 → 74,6
-- physical memory protection --
pmp_addr_i : in pmp_addr_if_t; -- addresses
pmp_ctrl_i : in pmp_ctrl_if_t; -- configs
priv_mode_i : in std_ulogic_vector(1 downto 0); -- current CPU privilege level
-- instruction bus --
i_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
i_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
105,8 → 103,8
 
-- PMP modes --
constant pmp_off_mode_c : std_ulogic_vector(1 downto 0) := "00"; -- null region (disabled)
constant pmp_tor_mode_c : std_ulogic_vector(1 downto 0) := "01"; -- top of range
constant pmp_na4_mode_c : std_ulogic_vector(1 downto 0) := "10"; -- naturally aligned four-byte region
--constant pmp_tor_mode_c : std_ulogic_vector(1 downto 0) := "01"; -- top of range
--constant pmp_na4_mode_c : std_ulogic_vector(1 downto 0) := "10"; -- naturally aligned four-byte region
constant pmp_napot_mode_c : std_ulogic_vector(1 downto 0) := "11"; -- naturally aligned power-of-two region (>= 8 bytes)
 
-- PMP configuration register bits --
163,7 → 161,7
 
-- Data Interface: Access Address ---------------------------------------------------------
-- -------------------------------------------------------------------------------------------
mem_adr_reg: process(rstn_i, clk_i)
mem_adr_reg: process(clk_i)
begin
if rising_edge(clk_i) then
if (ctrl_i(ctrl_bus_mar_we_c) = '1') then
201,7 → 199,7
begin
if rising_edge(clk_i) then
if (ctrl_i(ctrl_bus_mdo_we_c) = '1') then
mdo <= wdata_i;
mdo <= wdata_i; -- memory data out register (MDO)
end if;
end if;
end process mem_do_reg;
215,8 → 213,12
d_bus_wdata(15 downto 08) <= mdo(07 downto 00);
d_bus_wdata(23 downto 16) <= mdo(07 downto 00);
d_bus_wdata(31 downto 24) <= mdo(07 downto 00);
d_bus_ben <= (others => '0');
d_bus_ben(to_integer(unsigned(mar(1 downto 0)))) <= '1';
case mar(1 downto 0) is
when "00" => d_bus_ben <= "0001";
when "01" => d_bus_ben <= "0010";
when "10" => d_bus_ben <= "0100";
when others => d_bus_ben <= "1000";
end case;
when "01" => -- half-word
d_bus_wdata(31 downto 16) <= mdo(15 downto 00);
d_bus_wdata(15 downto 00) <= mdo(15 downto 00);
237,9 → 239,8
mem_out_buf: process(clk_i)
begin
if rising_edge(clk_i) then
-- memory data in register (MDI) --
if (ctrl_i(ctrl_bus_mdi_we_c) = '1') then
mdi <= d_bus_rdata;
mdi <= d_bus_rdata; -- memory data in register (MDI)
end if;
end if;
end process mem_out_buf;
246,33 → 247,24
 
-- input data alignment and sign extension --
read_align: process(mdi, mar, ctrl_i)
variable signed_v : std_ulogic;
variable byte_in_v : std_ulogic_vector(07 downto 0);
variable hword_in_v : std_ulogic_vector(15 downto 0);
begin
signed_v := not ctrl_i(ctrl_bus_unsigned_c);
case ctrl_i(ctrl_bus_size_msb_c downto ctrl_bus_size_lsb_c) is -- data size
-- sub-word input --
case mar(1 downto 0) is
when "00" => byte_in_v := mdi(07 downto 00); hword_in_v := mdi(15 downto 00); -- byte 0 / half-word 0
when "01" => byte_in_v := mdi(15 downto 08); hword_in_v := mdi(15 downto 00); -- byte 1 / half-word 0
when "10" => byte_in_v := mdi(23 downto 16); hword_in_v := mdi(31 downto 16); -- byte 2 / half-word 1
when others => byte_in_v := mdi(31 downto 24); hword_in_v := mdi(31 downto 16); -- byte 3 / half-word 1
end case;
-- actual data size --
case ctrl_i(ctrl_bus_size_msb_c downto ctrl_bus_size_lsb_c) is
when "00" => -- byte
case mar(1 downto 0) is
when "00" =>
rdata_o(31 downto 08) <= (others => (signed_v and mdi(07)));
rdata_o(07 downto 00) <= mdi(07 downto 00); -- byte 0
when "01" =>
rdata_o(31 downto 08) <= (others => (signed_v and mdi(15)));
rdata_o(07 downto 00) <= mdi(15 downto 08); -- byte 1
when "10" =>
rdata_o(31 downto 08) <= (others => (signed_v and mdi(23)));
rdata_o(07 downto 00) <= mdi(23 downto 16); -- byte 2
when others =>
rdata_o(31 downto 08) <= (others => (signed_v and mdi(31)));
rdata_o(07 downto 00) <= mdi(31 downto 24); -- byte 3
end case;
rdata_o(31 downto 08) <= (others => ((not ctrl_i(ctrl_bus_unsigned_c)) and byte_in_v(7))); -- sign extension
rdata_o(07 downto 00) <= byte_in_v;
when "01" => -- half-word
if (mar(1) = '0') then
rdata_o(31 downto 16) <= (others => (signed_v and mdi(15)));
rdata_o(15 downto 00) <= mdi(15 downto 00); -- low half-word
else
rdata_o(31 downto 16) <= (others => (signed_v and mdi(31)));
rdata_o(15 downto 00) <= mdi(31 downto 16); -- high half-word
end if;
rdata_o(31 downto 16) <= (others => ((not ctrl_i(ctrl_bus_unsigned_c)) and hword_in_v(15))); -- sign extension
rdata_o(15 downto 00) <= hword_in_v; -- high half-word
when others => -- word
rdata_o <= mdi; -- full word
end case;
297,17 → 289,9
 
-- Instruction Fetch Arbiter --------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
ifetch_arbiter: process(rstn_i, clk_i)
ifetch_arbiter: process(clk_i)
begin
if (rstn_i = '0') then
i_arbiter.rd_req <= '0';
i_arbiter.wr_req <= '0';
i_arbiter.err_align <= '0';
i_arbiter.err_bus <= '0';
i_arbiter.timeout <= (others => '0');
elsif rising_edge(clk_i) then
i_arbiter.wr_req <= '0'; -- instruction fetch is read-only
 
if rising_edge(clk_i) then
-- instruction fetch request --
if (i_arbiter.rd_req = '0') then -- idle
i_arbiter.rd_req <= ctrl_i(ctrl_bus_if_c);
318,10 → 302,6
i_arbiter.timeout <= std_ulogic_vector(unsigned(i_arbiter.timeout) - 1);
i_arbiter.err_align <= (i_arbiter.err_align or i_misaligned) and (not ctrl_i(ctrl_bus_ierr_ack_c));
i_arbiter.err_bus <= (i_arbiter.err_bus or (not or_all_f(i_arbiter.timeout)) or i_bus_err_i) and (not ctrl_i(ctrl_bus_ierr_ack_c));
--if (i_arbiter.err_align = '1') or (i_arbiter.err_bus = '1') then -- any error?
-- if (ctrl_i(ctrl_bus_ierr_ack_c) = '1') then -- wait for controller to acknowledge error
-- i_arbiter.rd_req <= '0';
-- end if;
if (i_bus_ack_i = '1') or (ctrl_i(ctrl_bus_ierr_ack_c) = '1') then -- wait for normal termination / CPU abort
i_arbiter.rd_req <= '0';
end if;
329,6 → 309,8
end if;
end process ifetch_arbiter;
 
i_arbiter.wr_req <= '0'; -- instruction fetch is read-only
 
-- cancel bus access --
i_bus_cancel_o <= i_arbiter.rd_req and ctrl_i(ctrl_bus_ierr_ack_c);
 
351,16 → 333,9
 
-- Data Access Arbiter --------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
data_access_arbiter: process(rstn_i, clk_i)
data_access_arbiter: process(clk_i)
begin
if (rstn_i = '0') then
d_arbiter.rd_req <= '0';
d_arbiter.wr_req <= '0';
d_arbiter.err_align <= '0';
d_arbiter.err_bus <= '0';
d_arbiter.timeout <= (others => '0');
elsif rising_edge(clk_i) then
 
if 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);
372,11 → 347,6
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_arbiter.err_align = '1') or (d_arbiter.err_bus = '1') then -- any error?
-- if (ctrl_i(ctrl_bus_derr_ack_c) = '1') then -- wait for controller to acknowledge error
-- d_arbiter.wr_req <= '0';
-- d_arbiter.rd_req <= '0';
-- end if;
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';
456,11 → 426,11
 
 
-- check access type and regions's permissions --
pmp_check_permission: process(pmp, pmp_ctrl_i, priv_mode_i)
pmp_check_permission: process(pmp, pmp_ctrl_i, ctrl_i)
begin
for r in 0 to PMP_NUM_REGIONS-1 loop -- iterate over all regions
if ((priv_mode_i = priv_mode_u_c) or (pmp_ctrl_i(r)(pmp_cfg_l_c) = '1')) and -- user privilege level or locked pmp entry -> enforce permissions also for machine mode
(pmp_ctrl_i(r)(pmp_cfg_ah_c downto pmp_cfg_al_c) /= pmp_off_mode_c) then -- active entry
if ((ctrl_i(ctrl_priv_lvl_msb_c downto ctrl_priv_lvl_lsb_c) = priv_mode_u_c) or (pmp_ctrl_i(r)(pmp_cfg_l_c) = '1')) and -- user privilege level or locked pmp entry -> enforce permissions also for machine mode
(pmp_ctrl_i(r)(pmp_cfg_ah_c downto pmp_cfg_al_c) /= pmp_off_mode_c) then -- active entry
pmp.if_fault(r) <= pmp.i_match(r) and (not pmp_ctrl_i(r)(pmp_cfg_x_c)); -- fetch access match no execute permission
pmp.ld_fault(r) <= pmp.d_match(r) and (not pmp_ctrl_i(r)(pmp_cfg_r_c)); -- load access match no read permission
pmp.st_fault(r) <= pmp.d_match(r) and (not pmp_ctrl_i(r)(pmp_cfg_w_c)); -- store access match no write permission
/rtl/core/neorv32_cpu_control.vhd
73,7 → 73,8
-- data input --
instr_i : in std_ulogic_vector(data_width_c-1 downto 0); -- instruction
cmp_i : in std_ulogic_vector(1 downto 0); -- comparator status
alu_res_i : in std_ulogic_vector(data_width_c-1 downto 0); -- ALU processing result
alu_add_i : in std_ulogic_vector(data_width_c-1 downto 0); -- ALU address result
rs1_i : in std_ulogic_vector(data_width_c-1 downto 0); -- rf source 1
-- data output --
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
91,7 → 92,6
-- physical memory protection --
pmp_addr_o : out pmp_addr_if_t; -- addresses
pmp_ctrl_o : out pmp_ctrl_if_t; -- configs
priv_mode_o : out std_ulogic_vector(1 downto 0); -- current CPU privilege level
-- bus access exceptions --
mar_i : in std_ulogic_vector(data_width_c-1 downto 0); -- memory address register
ma_instr_i : in std_ulogic; -- misaligned instruction address
269,6 → 269,7
signal minstret_msb : std_ulogic;
 
-- illegal instruction check --
signal illegal_opcode_lsbs : std_ulogic; -- if opcode != rv32
signal illegal_instruction : std_ulogic;
signal illegal_register : std_ulogic; -- only for E-extension
signal illegal_compressed : std_ulogic; -- only fir C-extension
359,12 → 360,9
 
-- Instruction Prefetch Buffer (FIFO) -----------------------------------------------------
-- -------------------------------------------------------------------------------------------
instr_prefetch_buffer_ctrl: process(rstn_i, clk_i)
instr_prefetch_buffer: process(clk_i)
begin
if (rstn_i = '0') then
ipb.w_pnt <= (others => '0');
ipb.r_pnt <= (others => '0');
elsif rising_edge(clk_i) then
if rising_edge(clk_i) then
-- write port --
if (ipb.clear = '1') then
ipb.w_pnt <= (others => '0');
371,7 → 369,10
elsif (ipb.we = '1') then
ipb.w_pnt <= std_ulogic_vector(unsigned(ipb.w_pnt) + 1);
end if;
-- read ports --
if (ipb.we = '1') then -- write port
ipb.data(to_integer(unsigned(ipb.w_pnt(ipb.w_pnt'left-1 downto 0)))) <= ipb.wdata;
end if;
-- read port --
if (ipb.clear = '1') then
ipb.r_pnt <= (others => '0');
elsif (ipb.re = '1') then
378,17 → 379,8
ipb.r_pnt <= std_ulogic_vector(unsigned(ipb.r_pnt) + 1);
end if;
end if;
end process instr_prefetch_buffer_ctrl;
end process instr_prefetch_buffer;
 
instr_prefetch_buffer_data: process(clk_i)
begin
if rising_edge(clk_i) then
if (ipb.we = '1') then -- write port
ipb.data(to_integer(unsigned(ipb.w_pnt(ipb.w_pnt'left-1 downto 0)))) <= ipb.wdata;
end if;
end if;
end process instr_prefetch_buffer_data;
 
-- async read --
ipb.rdata <= ipb.data(to_integer(unsigned(ipb.r_pnt(ipb.r_pnt'left-1 downto 0))));
 
450,6 → 442,7
 
-- instruction buffer interface defaults --
i_buf.we <= '0';
-- i_buf = <illegal_compressed_instruction> & <bus_error & alignment_error> & <is_compressed_instrucion> & <32-bit_instruction_word>
i_buf.wdata <= '0' & ipb.rdata(33 downto 32) & '0' & ipb.rdata(31 downto 0);
 
-- state machine --
461,15 → 454,14
 
if (issue_engine.align = '0') or (CPU_EXTENSION_RISCV_C = false) then -- begin check in LOW instruction half-word
if (i_buf.free = '1') then
i_buf.we <= '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';
i_buf.wdata <= '0' & ipb.rdata(33 downto 32) & '0' & ipb.rdata(31 downto 0);
i_buf.we <= '1';
else -- compressed
ipb.re <= '1';
i_buf.wdata <= ci_illegal & ipb.rdata(33 downto 32) & '1' & ci_instr32;
i_buf.we <= '1';
issue_engine.align_nxt <= '1';
end if;
end if;
476,15 → 468,14
 
else -- begin check in HIGH instruction half-word
if (i_buf.free = '1') then
i_buf.we <= '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';
i_buf.wdata <= '0' & issue_engine.buf(17 downto 16) & '0' & (ipb.rdata(15 downto 0) & issue_engine.buf(15 downto 0));
i_buf.we <= '1';
else -- compressed
--ipb.re <= '1';
-- do not read from ipb here!
i_buf.wdata <= ci_illegal & ipb.rdata(33 downto 32) & '1' & ci_instr32;
i_buf.we <= '1';
issue_engine.align_nxt <= '0';
end if;
end if;
533,11 → 524,9
 
-- Instruction Buffer ---------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
instruction_buffer_ctrl: process(rstn_i, clk_i)
instruction_buffer: process(clk_i)
begin
if (rstn_i = '0') then
i_buf.status <= '0';
elsif rising_edge(clk_i) then
if rising_edge(clk_i) then
if (i_buf.clear = '1') then
i_buf.status <= '0';
elsif (i_buf.we = '1') then
545,17 → 534,11
elsif (i_buf.re = '1') then
i_buf.status <= '0';
end if;
end if;
end process instruction_buffer_ctrl;
 
instruction_buffer_data: process(clk_i)
begin
if rising_edge(clk_i) then
if (i_buf.we = '1') then
i_buf.rdata <= i_buf.wdata;
end if;
end if;
end process instruction_buffer_data;
end process instruction_buffer;
 
-- status --
i_buf.free <= not i_buf.status;
598,9 → 581,6
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_syscsr_c => -- CSR-immediate (uimm5)
imm_o(31 downto 05) <= (others => '0');
imm_o(04 downto 00) <= execute_engine.i_reg(19 downto 15);
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);
680,16 → 660,24
 
-- CPU Control Bus Output -----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
ctrl_output: process(ctrl, fetch_engine, trap_ctrl, bus_fast_ir, execute_engine)
ctrl_output: process(ctrl, fetch_engine, trap_ctrl, bus_fast_ir, execute_engine, csr.privilege)
begin
-- signals from execute engine --
ctrl_o <= ctrl;
-- current privilege level --
ctrl_o(ctrl_priv_lvl_msb_c downto ctrl_priv_lvl_lsb_c) <= csr.privilege;
-- register addresses --
ctrl_o(ctrl_rf_rs1_adr4_c downto ctrl_rf_rs1_adr0_c) <= execute_engine.i_reg(instr_rs1_msb_c downto instr_rs1_lsb_c);
ctrl_o(ctrl_rf_rs2_adr4_c downto ctrl_rf_rs2_adr0_c) <= execute_engine.i_reg(instr_rs2_msb_c downto instr_rs2_lsb_c);
ctrl_o(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c) <= execute_engine.i_reg(instr_rd_msb_c downto instr_rd_lsb_c);
-- fast bus access requests --
ctrl_o(ctrl_bus_if_c) <= ctrl(ctrl_bus_if_c) or bus_fast_ir;
ctrl_o(ctrl_bus_if_c) <= bus_fast_ir;
-- bus error control --
ctrl_o(ctrl_bus_ierr_ack_c) <= fetch_engine.bus_err_ack;
ctrl_o(ctrl_bus_derr_ack_c) <= trap_ctrl.env_start_ack;
-- co-processor operation --
ctrl_o(ctrl_cp_cmd2_c downto ctrl_cp_cmd0_c) <= execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c);
-- 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);
end process ctrl_output;
 
 
696,9 → 684,10
-- Execute Engine FSM Comb ----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
execute_engine_fsm_comb: process(execute_engine, fetch_engine, i_buf, trap_ctrl, csr, ctrl, csr_acc_valid,
alu_res_i, alu_wait_i, bus_d_wait_i, ma_load_i, be_load_i, ma_store_i, be_store_i)
alu_add_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);
begin
-- arbiter defaults --
execute_engine.state_nxt <= execute_engine.state;
731,11 → 720,11
csr.re_nxt <= '0';
 
-- control defaults --
ctrl_nxt <= (others => '0'); -- all off at first
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)
ctrl_nxt(ctrl_alu_unsigned_c) <= execute_engine.i_reg(instr_funct3_lsb_c+0); -- unsigned ALU operation? (SLTIU, SLTU)
else -- branches
ctrl_nxt(ctrl_alu_unsigned_c) <= execute_engine.i_reg(instr_funct3_lsb_c+1); -- unsigned branches (BLTU, BGEU)
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)
ctrl_nxt(ctrl_alu_shift_dir_c) <= execute_engine.i_reg(instr_funct3_msb_c); -- shift direction (left/right)
742,9 → 731,6
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_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c) <= ctrl(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c); -- keep rd addr
ctrl_nxt(ctrl_rf_rs1_adr4_c downto ctrl_rf_rs1_adr0_c) <= ctrl(ctrl_rf_rs1_adr4_c downto ctrl_rf_rs1_adr0_c); -- keep rs1 addr
ctrl_nxt(ctrl_rf_rs2_adr4_c downto ctrl_rf_rs2_adr0_c) <= ctrl(ctrl_rf_rs2_adr4_c downto ctrl_rf_rs2_adr0_c); -- keep rs2 addr
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
 
-- is immediate ALU operation? --
761,31 → 747,24
-- ------------------------------------------------------------
-- set reg_file's r0 to zero --
if (rf_r0_is_reg_c = true) then -- is r0 implemented as physical register, which has to be set to zero?
ctrl_nxt(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c) <= (others => '0'); -- rd addr = r0
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "11"; -- RF input = CSR output (hacky! results zero since there is no valid CSR_read request)
ctrl_nxt(ctrl_rf_r0_we_c) <= '1'; -- allow write access to r0
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back
ctrl_nxt(ctrl_rf_r0_we_c) <= '1'; -- force RF write access and force rd=r0
end if;
--
execute_engine.state_nxt <= DISPATCH;
 
when DISPATCH => -- Get new command from instruction buffer (I_BUF)
when DISPATCH => -- Get new command from instruction buffer (i_buf)
-- ------------------------------------------------------------
ctrl_nxt(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c) <= i_buf.rdata(instr_rd_msb_c downto instr_rd_lsb_c); -- rd addr
ctrl_nxt(ctrl_rf_rs1_adr4_c downto ctrl_rf_rs1_adr0_c) <= i_buf.rdata(instr_rs1_msb_c downto instr_rs1_lsb_c); -- rs1 addr
ctrl_nxt(ctrl_rf_rs2_adr4_c downto ctrl_rf_rs2_adr0_c) <= i_buf.rdata(instr_rs2_msb_c downto instr_rs2_lsb_c); -- rs2 addr
--
if (i_buf.avail = '1') then -- instruction available?
i_buf.re <= '1';
--
execute_engine.is_ci_nxt <= i_buf.rdata(32); -- flag to indicate this is a de-compressed instruction beeing executed
execute_engine.i_reg_nxt <= i_buf.rdata(31 downto 0);
execute_engine.is_ci_nxt <= i_buf.rdata(32); -- flag to indicate this is a de-compressed instruction beeing executed
execute_engine.i_reg_nxt <= i_buf.rdata(31 downto 0);
trap_ctrl.instr_ma <= i_buf.rdata(33); -- misaligned instruction fetch address
trap_ctrl.instr_be <= i_buf.rdata(34); -- bus access fault during instrucion fetch
illegal_compressed <= i_buf.rdata(35); -- invalid decompressed instruction
--
execute_engine.if_rst_nxt <= '0';
--
trap_ctrl.instr_ma <= i_buf.rdata(33); -- misaligned instruction fetch address
trap_ctrl.instr_be <= i_buf.rdata(34); -- bus access fault during instrucion fetch
illegal_compressed <= i_buf.rdata(35); -- invalid decompressed instruction
--
if (execute_engine.if_rst = '0') then -- if there was NO non-linear PC modification
execute_engine.pc_nxt <= execute_engine.next_pc;
end if;
814,7 → 793,8
-- ------------------------------------------------------------
execute_engine.last_pc_nxt <= execute_engine.pc; -- store address of current instruction for commit
--
case execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c) is
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
-- ------------------------------------------------------------
901,7 → 881,8
 
when opcode_fence_c => -- fence operations
-- ------------------------------------------------------------
-- for simplicity: internally, fence and fence.i perform the same operations (flush and reload of instruction prefetch buffer)
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; -- "refetch" next instruction
915,13 → 896,9
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 <= SYS_WAIT;
 
when opcode_syscsr_c => -- system/csr access
-- ------------------------------------------------------------
ctrl_nxt(ctrl_rf_rs2_adr4_c downto ctrl_rf_rs2_adr0_c) <= ctrl(ctrl_rf_rs1_adr4_c downto ctrl_rf_rs1_adr0_c); -- copy rs1_addr to rs2_addr (for CSR mod)
--
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
933,7 → 910,7
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 (CPU sleep)
when funct12_wfi_c => -- WFI
execute_engine.sleep_nxt <= '1'; -- good night
when others => -- undefined
NULL;
952,8 → 929,6
 
when CSR_ACCESS => -- write CSR data to RF, write ALU.res to CSR
-- ------------------------------------------------------------
ctrl_nxt(ctrl_alu_opb_mux_c) <= execute_engine.i_reg(instr_funct3_msb_c); -- OPB = rs2 (which is rs1 here) / immediate
ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_cmd_movb_c; -- actual ALU operation = MOVB
-- 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)
986,7 → 961,7
when BRANCH => -- update PC for taken branches and jumps
-- ------------------------------------------------------------
if (execute_engine.is_jump = '1') or (execute_engine.branch_taken = '1') then
execute_engine.pc_nxt <= alu_res_i; -- branch/jump destination
execute_engine.pc_nxt <= alu_add_i; -- branch/jump destination
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;
1016,7 → 991,7
execute_engine.state_nxt <= SYS_WAIT;
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
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back (keep writing back all the time)
end if;
execute_engine.state_nxt <= DISPATCH;
end if;
1111,16 → 1086,25
-- Illegal Instruction Check --------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
illegal_instruction_check: process(execute_engine, csr_acc_valid)
variable opcode_v : std_ulogic_vector(6 downto 0);
begin
-- illegal instructions are checked in the EXECUTE stage
-- the execute engine will only commit valid instructions
-- the execute engine should not commit any illegal instruction
if (execute_engine.state = EXECUTE) then
-- defaults --
illegal_instruction <= '0';
illegal_register <= '0';
 
-- check opcode for rv32 --
if (execute_engine.i_reg(instr_opcode_lsb_c+1 downto instr_opcode_lsb_c) = "11") then
illegal_opcode_lsbs <= '0';
else
illegal_opcode_lsbs <= '1';
end if;
 
-- check instructions --
case execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c) is
opcode_v := execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c+2) & "11";
case opcode_v is
 
-- OPCODE check sufficient: LUI, UIPC, JAL --
when opcode_lui_c | opcode_auipc_c | opcode_jal_c =>
1266,13 → 1250,12
illegal_instruction <= '1';
end if;
 
when others => -- compressed instruction or undefined instruction
if (execute_engine.i_reg(1 downto 0) = "11") then -- undefined/unimplemented opcode
illegal_instruction <= '1';
end if;
when others => -- undefined instruction -> illegal!
illegal_instruction <= '1';
 
end case;
else
illegal_opcode_lsbs <= '0';
illegal_instruction <= '0';
illegal_register <= '0';
end if;
1279,7 → 1262,7
end process illegal_instruction_check;
 
-- any illegal condition? --
trap_ctrl.instr_il <= illegal_instruction or illegal_register or illegal_compressed;
trap_ctrl.instr_il <= illegal_instruction or illegal_opcode_lsbs or illegal_register or illegal_compressed;
 
 
-- ****************************************************************************************************************************
1451,13 → 1434,21
 
-- Control and Status Registers Write Data ------------------------------------------------
-- -------------------------------------------------------------------------------------------
csr_write_data: process(execute_engine.i_reg, csr.rdata, alu_res_i)
csr_write_data: process(execute_engine.i_reg, csr.rdata, rs1_i)
variable csr_operand_v : std_ulogic_vector(data_width_c-1 downto 0);
begin
-- CSR operand source --
if (execute_engine.i_reg(instr_funct3_msb_c) = '1') then -- immediate
csr_operand_v := (others => '0');
csr_operand_v(4 downto 0) := execute_engine.i_reg(19 downto 15);
else -- register
csr_operand_v := rs1_i;
end if;
-- "mini ALU" for CSR update operations --
case execute_engine.i_reg(instr_funct3_lsb_c+1 downto instr_funct3_lsb_c) is
when "10" => csr.wdata <= csr.rdata or alu_res_i; -- CSRRS(I)
when "11" => csr.wdata <= csr.rdata and (not alu_res_i); -- CSRRC(I)
when others => csr.wdata <= alu_res_i; -- CSRRW(I)
when "10" => csr.wdata <= csr.rdata or csr_operand_v; -- CSRRS(I)
when "11" => csr.wdata <= csr.rdata and (not csr_operand_v); -- CSRRC(I)
when others => csr.wdata <= csr_operand_v; -- CSRRW(I)
end case;
end process csr_write_data;
 
1478,7 → 1469,7
csr.mie_mtie <= '0';
csr.mie_firqe <= (others => '0');
csr.mtvec <= (others => '0');
csr.mscratch <= (others => '0');
csr.mscratch <= x"19880704"; -- :)
csr.mepc <= (others => '0');
csr.mcause <= (others => '0');
csr.mtval <= (others => '0');
1492,21 → 1483,26
mcycle_msb <= '0';
minstret_msb <= '0';
elsif rising_edge(clk_i) then
 
-- write access? --
csr.we <= csr.we_nxt;
if (CPU_EXTENSION_RISCV_Zicsr = true) then
 
-- --------------------------------------------------------------------------------
-- CSRs that can be written by application software only
-- --------------------------------------------------------------------------------
if (CPU_EXTENSION_RISCV_Zicsr = true) and (csr.we = '1') then -- manual update
 
-- machine CSRs --
if (execute_engine.i_reg(31 downto 28) = csr_mie_c(11 downto 8)) then
 
-- machine trap setup --
if (execute_engine.i_reg(27 downto 24) = csr_mie_c(7 downto 4)) then
if (execute_engine.i_reg(23 downto 20) = csr_mie_c(3 downto 0)) then -- R/W: mie - machine interrupt-enable register
-- --------------------------------------------------------------------------------
-- CSR access by application software
-- --------------------------------------------------------------------------------
if (csr.we = '1') then -- manual update
case execute_engine.i_reg(instr_csr_id_msb_c downto instr_csr_id_lsb_c) is
-- machine trap setup --
-- --------------------------------------------------------------------
when csr_mstatus_c => -- R/W: mstatus - machine status register
csr.mstatus_mie <= csr.wdata(03);
csr.mstatus_mpie <= csr.wdata(07);
if (CPU_EXTENSION_RISCV_U = true) then -- user mode implemented
csr.mstatus_mpp(0) <= csr.wdata(11) or csr.wdata(12);
csr.mstatus_mpp(1) <= csr.wdata(11) or csr.wdata(12);
end if;
when csr_mie_c => -- R/W: mie - machine interrupt-enable register
csr.mie_msie <= csr.wdata(03); -- machine SW IRQ enable
csr.mie_mtie <= csr.wdata(07); -- machine TIMER IRQ enable
csr.mie_meie <= csr.wdata(11); -- machine EXT IRQ enable
1515,172 → 1511,145
csr.mie_firqe(1) <= csr.wdata(17); -- fast interrupt channel 1
csr.mie_firqe(2) <= csr.wdata(18); -- fast interrupt channel 2
csr.mie_firqe(3) <= csr.wdata(19); -- fast interrupt channel 3
end if;
if (execute_engine.i_reg(23 downto 20) = csr_mtvec_c(3 downto 0)) then -- R/W: mtvec - machine trap-handler base address (for ALL exceptions)
when csr_mtvec_c => -- R/W: mtvec - machine trap-handler base address (for ALL exceptions)
csr.mtvec <= csr.wdata(data_width_c-1 downto 2) & "00"; -- mtvec.MODE=0
end if;
end if;
 
-- machine trap handling --
if (execute_engine.i_reg(27 downto 20) = csr_mscratch_c(7 downto 0)) then -- R/W: mscratch - machine scratch register
csr.mscratch <= csr.wdata;
end if;
-- machine trap handling --
-- --------------------------------------------------------------------
when csr_mscratch_c => -- R/W: mscratch - machine scratch register
csr.mscratch <= csr.wdata;
when csr_mepc_c => -- R/W: mepc - machine exception program counter
csr.mepc <= csr.wdata(data_width_c-1 downto 1) & '0';
when csr_mcause_c => -- R/W: mcause - machine trap cause
csr.mcause <= (others => '0');
csr.mcause(csr.mcause'left) <= csr.wdata(31); -- 1: interrupt, 0: exception
csr.mcause(4 downto 0) <= csr.wdata(4 downto 0); -- identifier
when csr_mtval_c => -- R/W: mtval - machine bad address or instruction
csr.mtval <= csr.wdata;
 
-- machine physical memory protection (pmp) --
if (PMP_USE = true) then
-- pmpcfg --
if (execute_engine.i_reg(27 downto 24) = csr_pmpcfg0_c(7 downto 4)) then
if (PMP_NUM_REGIONS >= 1) then
if (execute_engine.i_reg(23 downto 20) = csr_pmpcfg0_c(3 downto 0)) then -- pmpcfg0
for j in 0 to 3 loop -- bytes in pmpcfg CSR
if ((j+1) <= PMP_NUM_REGIONS) then
if (csr.pmpcfg(0+j)(7) = '0') then -- unlocked pmpcfg access
csr.pmpcfg(0+j)(0) <= csr.wdata(j*8+0); -- R (rights.read)
csr.pmpcfg(0+j)(1) <= csr.wdata(j*8+1); -- W (rights.write)
csr.pmpcfg(0+j)(2) <= csr.wdata(j*8+2); -- X (rights.execute)
csr.pmpcfg(0+j)(3) <= csr.wdata(j*8+3) and csr.wdata(j*8+4); -- A_L
csr.pmpcfg(0+j)(4) <= csr.wdata(j*8+3) and csr.wdata(j*8+4); -- A_H - NAPOT/OFF only
csr.pmpcfg(0+j)(5) <= '0'; -- reserved
csr.pmpcfg(0+j)(6) <= '0'; -- reserved
csr.pmpcfg(0+j)(7) <= csr.wdata(j*8+7); -- L (locked / rights also enforced in m-mode)
end if;
-- physical memory protection - configuration --
-- --------------------------------------------------------------------
when csr_pmpcfg0_c => -- R/W: pmpcfg0 - PMP configuration register 0
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 1) then
for j in 0 to 3 loop -- bytes in pmpcfg CSR
if ((j+1) <= PMP_NUM_REGIONS) then
if (csr.pmpcfg(0+j)(7) = '0') then -- unlocked pmpcfg access
csr.pmpcfg(0+j)(0) <= csr.wdata(j*8+0); -- R (rights.read)
csr.pmpcfg(0+j)(1) <= csr.wdata(j*8+1); -- W (rights.write)
csr.pmpcfg(0+j)(2) <= csr.wdata(j*8+2); -- X (rights.execute)
csr.pmpcfg(0+j)(3) <= csr.wdata(j*8+3) and csr.wdata(j*8+4); -- A_L
csr.pmpcfg(0+j)(4) <= csr.wdata(j*8+3) and csr.wdata(j*8+4); -- A_H - NAPOT/OFF only
csr.pmpcfg(0+j)(5) <= '0'; -- reserved
csr.pmpcfg(0+j)(6) <= '0'; -- reserved
csr.pmpcfg(0+j)(7) <= csr.wdata(j*8+7); -- L (locked / rights also enforced in m-mode)
end if;
end loop; -- j (bytes in CSR)
end if;
end if;
end loop; -- j (bytes in CSR)
end if;
if (PMP_NUM_REGIONS >= 5) then
if (execute_engine.i_reg(23 downto 20) = csr_pmpcfg1_c(3 downto 0)) then -- pmpcfg1
for j in 0 to 3 loop -- bytes in pmpcfg CSR
if ((j+1+4) <= PMP_NUM_REGIONS) then
if (csr.pmpcfg(4+j)(7) = '0') then -- unlocked pmpcfg access
csr.pmpcfg(4+j)(0) <= csr.wdata(j*8+0); -- R (rights.read)
csr.pmpcfg(4+j)(1) <= csr.wdata(j*8+1); -- W (rights.write)
csr.pmpcfg(4+j)(2) <= csr.wdata(j*8+2); -- X (rights.execute)
csr.pmpcfg(4+j)(3) <= csr.wdata(j*8+3) and csr.wdata(j*8+4); -- A_L
csr.pmpcfg(4+j)(4) <= csr.wdata(j*8+3) and csr.wdata(j*8+4); -- A_H - NAPOT/OFF only
csr.pmpcfg(4+j)(5) <= '0'; -- reserved
csr.pmpcfg(4+j)(6) <= '0'; -- reserved
csr.pmpcfg(4+j)(7) <= csr.wdata(j*8+7); -- L (locked / rights also enforced in m-mode)
end if;
when csr_pmpcfg1_c => -- R/W: pmpcfg1 - PMP configuration register 1
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 5) then
for j in 0 to 3 loop -- bytes in pmpcfg CSR
if ((j+1+4) <= PMP_NUM_REGIONS) then
if (csr.pmpcfg(4+j)(7) = '0') then -- unlocked pmpcfg access
csr.pmpcfg(4+j)(0) <= csr.wdata(j*8+0); -- R (rights.read)
csr.pmpcfg(4+j)(1) <= csr.wdata(j*8+1); -- W (rights.write)
csr.pmpcfg(4+j)(2) <= csr.wdata(j*8+2); -- X (rights.execute)
csr.pmpcfg(4+j)(3) <= csr.wdata(j*8+3) and csr.wdata(j*8+4); -- A_L
csr.pmpcfg(4+j)(4) <= csr.wdata(j*8+3) and csr.wdata(j*8+4); -- A_H - NAPOT/OFF only
csr.pmpcfg(4+j)(5) <= '0'; -- reserved
csr.pmpcfg(4+j)(6) <= '0'; -- reserved
csr.pmpcfg(4+j)(7) <= csr.wdata(j*8+7); -- L (locked / rights also enforced in m-mode)
end if;
end loop; -- j (bytes in CSR)
end if;
end if;
end loop; -- j (bytes in CSR)
end if;
end if;
-- pmpaddr --
if (execute_engine.i_reg(27 downto 24) = csr_pmpaddr0_c(7 downto 4)) then
for i in 0 to PMP_NUM_REGIONS-1 loop
if (execute_engine.i_reg(23 downto 20) = std_ulogic_vector(to_unsigned(i, 4))) and (csr.pmpcfg(i)(7) = '0') then -- unlocked pmpaddr access
csr.pmpaddr(i) <= csr.wdata(31 downto 1) & '0'; -- min granularity is 8 bytes -> bit zero cannot be configured
end if;
end loop; -- i (CSRs)
end if;
end if; -- implement PMP at all?
end if;
 
end if;
-- physical memory protection - addresses --
-- --------------------------------------------------------------------
when csr_pmpaddr0_c | csr_pmpaddr1_c | csr_pmpaddr2_c | csr_pmpaddr3_c |
csr_pmpaddr4_c | csr_pmpaddr5_c | csr_pmpaddr6_c | csr_pmpaddr7_c => -- R/W: pmpaddr0..7 - PMP address register 0..7
if (PMP_USE = true) then
for i in 0 to PMP_NUM_REGIONS-1 loop
if (execute_engine.i_reg(23 downto 20) = std_ulogic_vector(to_unsigned(i, 4))) and (csr.pmpcfg(i)(7) = '0') then -- unlocked pmpaddr access
csr.pmpaddr(i) <= csr.wdata(31 downto 1) & '0'; -- min granularity is 8 bytes -> bit zero cannot be configured
end if;
end loop; -- i (CSRs)
end if;
 
-- --------------------------------------------------------------------------------
-- CSRs that can be written by application and hardware (application access)
-- --------------------------------------------------------------------------------
if (CPU_EXTENSION_RISCV_Zicsr = true) and (csr.we = '1') then -- manual update
-- undefined --
-- --------------------------------------------------------------------
when others =>
NULL;
 
-- machine CSRs --
if (execute_engine.i_reg(31 downto 28) = csr_mstatus_c(11 downto 8)) then
end case;
 
-- machine trap setup --
if (execute_engine.i_reg(27 downto 20) = csr_mstatus_c(7 downto 0)) then -- R/W: mstatus - machine status register
csr.mstatus_mie <= csr.wdata(03);
csr.mstatus_mpie <= csr.wdata(07);
--
if (CPU_EXTENSION_RISCV_U = true) then -- user mode implemented
csr.mstatus_mpp(0) <= csr.wdata(11) or csr.wdata(12);
csr.mstatus_mpp(1) <= csr.wdata(11) or csr.wdata(12);
-- --------------------------------------------------------------------------------
-- CSR access by hardware
-- --------------------------------------------------------------------------------
else
 
-- mepc & mtval: machine exception PC & machine trap value register --
-- --------------------------------------------------------------------
if (trap_ctrl.env_start_ack = '1') then -- trap handler starting?
if (trap_ctrl.cause(trap_ctrl.cause'left) = '1') then -- for INTERRUPTS
csr.mepc <= execute_engine.pc(data_width_c-1 downto 1) & '0'; -- this is the CURRENT pc = interrupted instruction
csr.mtval <= (others => '0'); -- mtval is zero for interrupts
else -- for EXCEPTIONS (according to their priority)
csr.mepc <= execute_engine.last_pc(data_width_c-1 downto 1) & '0'; -- this is the LAST pc = last executed instruction
if (trap_ctrl.cause(4 downto 0) = trap_iba_c(4 downto 0)) or -- instruction access error OR
(trap_ctrl.cause(4 downto 0) = trap_ima_c(4 downto 0)) or -- misaligned instruction address OR
(trap_ctrl.cause(4 downto 0) = trap_brk_c(4 downto 0)) or -- breakpoint OR
(trap_ctrl.cause(4 downto 0) = trap_menv_c(4 downto 0)) then -- environment call
csr.mtval <= execute_engine.pc(data_width_c-1 downto 1) & '0'; -- address of faulting instruction
elsif (trap_ctrl.cause(4 downto 0) = trap_iil_c(4 downto 0)) then -- illegal instruction
csr.mtval <= execute_engine.i_reg_last; -- faulting instruction itself
else -- load/store misalignments/access errors
csr.mtval <= mar_i; -- faulting data access address
end if;
end if;
end if;
 
-- machine trap handling --
if (execute_engine.i_reg(27 downto 24) = csr_mepc_c(7 downto 4)) then
if (execute_engine.i_reg(23 downto 20) = csr_mepc_c(3 downto 0)) then -- R/W: mepc - machine exception program counter
csr.mepc <= csr.wdata(data_width_c-1 downto 1) & '0';
-- mstatus: context switch --
-- --------------------------------------------------------------------
if (trap_ctrl.env_start_ack = '1') then -- ENTER: trap handler starting?
-- trap ID code --
csr.mcause <= (others => '0');
csr.mcause(csr.mcause'left) <= trap_ctrl.cause(trap_ctrl.cause'left); -- 1: interrupt, 0: exception
csr.mcause(4 downto 0) <= trap_ctrl.cause(4 downto 0); -- identifier
--
csr.mstatus_mie <= '0'; -- disable interrupts
csr.mstatus_mpie <= csr.mstatus_mie; -- buffer previous mie state
if (CPU_EXTENSION_RISCV_U = true) then -- implement user mode
csr.privilege <= priv_mode_m_c; -- execute trap in machine mode
csr.mstatus_mpp <= csr.privilege; -- buffer previous privilege mode
end if;
if (execute_engine.i_reg(23 downto 20) = csr_mcause_c(3 downto 0)) then -- R/W: mcause - machine trap cause
csr.mcause <= (others => '0');
csr.mcause(csr.mcause'left) <= csr.wdata(31); -- 1: interrupt, 0: exception
csr.mcause(4 downto 0) <= csr.wdata(4 downto 0); -- identifier
elsif (trap_ctrl.env_end = '1') then -- EXIT: return from exception
csr.mstatus_mie <= csr.mstatus_mpie; -- restore global IRQ enable flag
csr.mstatus_mpie <= '1';
if (CPU_EXTENSION_RISCV_U = true) then -- implement user mode
csr.privilege <= csr.mstatus_mpp; -- go back to previous privilege mode
csr.mstatus_mpp <= priv_mode_u_c;
end if;
if (execute_engine.i_reg(23 downto 20) = csr_mtval_c(3 downto 0)) then -- R/W: mtval - machine bad address or instruction
csr.mtval <= csr.wdata;
end if;
end if;
 
end if;
 
-- --------------------------------------------------------------------------------
-- CSRs that can be written by application and hardware (hardware access)
-- --------------------------------------------------------------------------------
else -- hardware update
 
-- mepc & mtval: machine exception PC & machine trap value register --
if (trap_ctrl.env_start_ack = '1') then -- trap handler starting?
if (trap_ctrl.cause(trap_ctrl.cause'left) = '1') then -- for INTERRUPTS (is mcause(31))
csr.mepc <= execute_engine.pc(data_width_c-1 downto 1) & '0'; -- this is the CURRENT pc = interrupted instruction
csr.mtval <= (others => '0'); -- mtval is zero for interrupts
else -- for EXCEPTIONS (according to their priority)
csr.mepc <= execute_engine.last_pc(data_width_c-1 downto 1) & '0'; -- this is the LAST pc = last executed instruction
if (trap_ctrl.cause(4 downto 0) = trap_iba_c(4 downto 0)) or -- instruction access error OR
(trap_ctrl.cause(4 downto 0) = trap_ima_c(4 downto 0)) or -- misaligned instruction address OR
(trap_ctrl.cause(4 downto 0) = trap_brk_c(4 downto 0)) or -- breakpoint OR
(trap_ctrl.cause(4 downto 0) = trap_menv_c(4 downto 0)) then -- environment call
csr.mtval <= execute_engine.pc(data_width_c-1 downto 1) & '0'; -- address of faulting instruction
elsif (trap_ctrl.cause(4 downto 0) = trap_iil_c(4 downto 0)) then -- illegal instruction
csr.mtval <= execute_engine.i_reg_last; -- faulting instruction itself
else -- load/store misalignments/access errors
csr.mtval <= mar_i; -- faulting data access address
end if;
-- user mode NOT implemented --
if (CPU_EXTENSION_RISCV_U = false) then
csr.privilege <= priv_mode_m_c;
csr.mstatus_mpp <= priv_mode_m_c;
end if;
end if;
 
-- mstatus: context switch --
if (trap_ctrl.env_start_ack = '1') then -- ENTER: trap handler starting?
-- trap ID code --
csr.mcause <= (others => '0');
csr.mcause(csr.mcause'left) <= trap_ctrl.cause(trap_ctrl.cause'left); -- 1: interrupt, 0: exception
csr.mcause(4 downto 0) <= trap_ctrl.cause(4 downto 0); -- identifier
--
csr.mstatus_mie <= '0'; -- disable interrupts
csr.mstatus_mpie <= csr.mstatus_mie; -- buffer previous mie state
if (CPU_EXTENSION_RISCV_U = true) then -- implement user mode
csr.privilege <= priv_mode_m_c; -- execute trap in machine mode
csr.mstatus_mpp <= csr.privilege; -- buffer previous privilege mode
end if;
elsif (trap_ctrl.env_end = '1') then -- EXIT: return from exception
csr.mstatus_mie <= csr.mstatus_mpie; -- restore global IRQ enable flag
csr.mstatus_mpie <= '1';
if (CPU_EXTENSION_RISCV_U = true) then -- implement user mode
csr.privilege <= csr.mstatus_mpp; -- go back to previous privilege mode
csr.mstatus_mpp <= priv_mode_u_c;
end if;
end if;
-- user mode NOT implemented --
if (CPU_EXTENSION_RISCV_U = false) then
csr.privilege <= priv_mode_m_c;
csr.mstatus_mpp <= priv_mode_m_c;
end if;
end if;
end if; -- hardware csr access
 
-- --------------------------------------------------------------------------------
-- Counter CSRs
-- --------------------------------------------------------------------------------
if (CPU_EXTENSION_RISCV_Zicsr = true) then
 
-- mcycle (cycle) --
mcycle_msb <= csr.mcycle(csr.mcycle'left);
if (csr.we = '1') and (execute_engine.i_reg(instr_csr_id_msb_c downto instr_csr_id_lsb_c) = csr_mcycle_c) then -- write access
csr.mcycle(31 downto 0) <= csr.wdata;
csr.mcycle(32) <= '0';
csr.mcycle <= '0' & csr.wdata;
mcycle_msb <= '0';
elsif (execute_engine.sleep = '0') then -- automatic update (if CPU is not in sleep mode)
csr.mcycle <= std_ulogic_vector(unsigned(csr.mcycle) + 1);
mcycle_msb <= csr.mcycle(csr.mcycle'left);
end if;
 
-- mcycleh (cycleh) --
1691,12 → 1660,12
end if;
 
-- minstret (instret) --
minstret_msb <= csr.minstret(csr.minstret'left);
if (csr.we = '1') and (execute_engine.i_reg(instr_csr_id_msb_c downto instr_csr_id_lsb_c) = csr_minstret_c) then -- write access
csr.minstret(31 downto 0) <= csr.wdata;
csr.minstret(32) <= '0';
elsif (execute_engine.state_prev /= EXECUTE) and (execute_engine.state = EXECUTE) then -- automatic update
csr.minstret <= '0' & csr.wdata;
minstret_msb <= '0';
elsif (execute_engine.state_prev /= EXECUTE) and (execute_engine.state = EXECUTE) then -- automatic update (if CPU commits an instruction)
csr.minstret <= std_ulogic_vector(unsigned(csr.minstret) + 1);
minstret_msb <= csr.minstret(csr.minstret'left);
end if;
 
-- minstreth (instreth) --
1705,14 → 1674,12
elsif ((minstret_msb xor csr.minstret(csr.minstret'left)) = '1') then -- automatic update
csr.minstreth <= std_ulogic_vector(unsigned(csr.minstreth) + 1);
end if;
 
end if;
end if;
end process csr_write_access;
 
-- CPU's current privilege level --
priv_mode_o <= csr.privilege;
 
-- PMP output --
-- PMP configuration output to bus unit --
pmp_output: process(csr)
begin
pmp_addr_o <= (others => (others => '0'));
1743,6 → 1710,8
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(02) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_C); -- C CPU extension
csr.rdata(04) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- E CPU extension
csr.rdata(08) <= not bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- I CPU extension (if not E)
/rtl/core/neorv32_cpu_cp_muldiv.vhd
4,6 → 4,7
-- # Multiplier and Divider unit. Implements the RISC-V RV32-M CPU extension. #
-- # Multiplier core (signed/unsigned) uses serial algorithm. -> 32+4 cycles latency #
-- # Divider core (unsigned) uses serial algorithm. -> 32+6 cycles latency #
-- # Multiplications can be mapped to DSP block when FAST_MUL_EN = true. #
-- # ********************************************************************************************* #
-- # BSD 3-Clause License #
-- # #
52,8 → 53,8
clk_i : in std_ulogic; -- global clock, rising edge
rstn_i : in std_ulogic; -- global reset, low-active, async
ctrl_i : in std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus
start_i : in std_ulogic; -- trigger operation
-- data input --
start_i : in std_ulogic; -- trigger operation
rs1_i : in std_ulogic_vector(data_width_c-1 downto 0); -- rf source 1
rs2_i : in std_ulogic_vector(data_width_c-1 downto 0); -- rf source 2
-- result and status --
106,7 → 107,6
begin
if (rstn_i = '0') then
state <= IDLE;
cp_op <= (others => '0');
opx <= (others => '0');
opy <= (others => '0');
cnt <= (others => '0');
125,7 → 125,6
opx <= rs1_i;
opy <= rs2_i;
if (start_i = '1') then
cp_op <= ctrl_i(ctrl_cp_cmd2_c downto ctrl_cp_cmd0_c);
state <= DECODE;
end if;
 
189,6 → 188,9
end if;
end process coprocessor_ctrl;
 
-- co-processor command --
cp_op <= ctrl_i(ctrl_ir_funct3_2_c downto ctrl_ir_funct3_0_c);
 
-- operation --
operation <= '1' when (cp_op = cp_op_div_c) or (cp_op = cp_op_divu_c) or (cp_op = cp_op_rem_c) or (cp_op = cp_op_remu_c) else '0';
 
199,11 → 201,12
opy_is_signed <= '1' when (cp_op = cp_op_mulh_c) or (cp_op = cp_op_div_c) or (cp_op = cp_op_rem_c) else '0';
 
 
-- Multiplier Core (signed) ---------------------------------------------------------------
-- Multiplier Core (signed/unsigned) ------------------------------------------------------
-- -------------------------------------------------------------------------------------------
multiplier_core: process(clk_i)
begin
if rising_edge(clk_i) then
-- ---------------------------------------------------------
if (FAST_MUL_EN = false) then -- use small iterative computation
if (start = '1') then -- start new multiplication
mul_product(63 downto 32) <= (others => '0');
212,6 → 215,7
mul_product(63 downto 31) <= mul_do_add(32 downto 0);
mul_product(30 downto 00) <= mul_product(31 downto 1);
end if;
-- ---------------------------------------------------------
else -- use direct approach using (several!) DSP blocks
if (start = '1') then
mul_op_x <= signed((opx(opx'left) and opx_is_signed) & opx);
/rtl/core/neorv32_cpu_decompressor.vhd
116,10 → 116,10
 
when "000" => -- Illegal_instruction, C.ADDI4SPN
-- ----------------------------------------------------------------------------------------------------------
if (ci_instr16_i(12 downto 2) = "00000000000") then -- "official" illegal instruction
if (ci_instr16_i(12 downto 2) = "00000000000") then -- "official illegal instruction"
ci_illegal_o <= '1';
 
else -- C.ADDI4SPN
else
-- C.ADDI4SPN
ci_instr32_o(instr_opcode_msb_c downto instr_opcode_lsb_c) <= opcode_alui_c;
ci_instr32_o(instr_rs1_msb_c downto instr_rs1_lsb_c) <= "00010"; -- stack pointer
ci_instr32_o(instr_rd_msb_c downto instr_rd_lsb_c) <= "01" & ci_instr16_i(ci_rd_3_msb_c downto ci_rd_3_lsb_c);
/rtl/core/neorv32_cpu_regfile.vhd
1,10 → 1,11
-- #################################################################################################
-- # << NEORV32 - CPU Register File >> #
-- # << NEORV32 - CPU Data Register File >> #
-- # ********************************************************************************************* #
-- # General purpose data registers. 32 entries for normal mode, 16 entries for embedded mode when #
-- # RISC-V "E" extension is enabled. Register zero (r0/x0) is a normal physical registers, that #
-- # has to be initialized to zero by the CPU control system. For normal operations, x0 cannot be #
-- # written. #
-- # 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. #
-- # ********************************************************************************************* #
-- # BSD 3-Clause License #
-- # #
71,22 → 72,10
signal reg_file : reg_file_t;
signal reg_file_emb : reg_file_emb_t;
signal rf_write_data : std_ulogic_vector(data_width_c-1 downto 0); -- actual write-back data
signal valid_wr : std_ulogic; -- writing not to r0
signal rd_is_r0 : std_ulogic; -- writing to r0?
signal rf_we : std_ulogic;
signal dst_addr : std_ulogic_vector(4 downto 0); -- destination address
 
 
-- attributes - these are *NOT mandatory*; just for footprint / timing optimization --
-- -------------------------------------------------------------------------------- --
 
-- lattice radiant --
attribute syn_ramstyle : string;
attribute syn_ramstyle of reg_file : signal is "no_rw_check";
attribute syn_ramstyle of reg_file_emb : signal is "no_rw_check";
 
-- intel quartus prime --
attribute ramstyle : string;
attribute ramstyle of reg_file : signal is "no_rw_check";
attribute ramstyle of reg_file_emb : signal is "no_rw_check";
 
begin
 
-- Input mux ------------------------------------------------------------------------------
101,11 → 90,17
end case;
end process input_mux;
 
-- only write if destination is not x0; except we are forcing a r0 write access --
valid_wr <= or_all_f(ctrl_i(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c)) or ctrl_i(ctrl_rf_r0_we_c) when (CPU_EXTENSION_RISCV_E = false) else
or_all_f(ctrl_i(ctrl_rf_rd_adr3_c downto ctrl_rf_rd_adr0_c)) or ctrl_i(ctrl_rf_r0_we_c);
-- 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)
112,21 → 107,19
begin
if rising_edge(clk_i) then -- sync read and write
if (CPU_EXTENSION_RISCV_E = false) then -- normal register file with 32 entries
-- write --
if (ctrl_i(ctrl_rf_wb_en_c) = '1') and ((valid_wr = '1') or (rf_r0_is_reg_c = false)) then -- valid write-back
reg_file(to_integer(unsigned(ctrl_i(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c)))) <= rf_write_data;
if (rf_we = '1') then
reg_file(to_integer(unsigned(dst_addr(4 downto 0)))) <= rf_write_data;
else -- read
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;
-- read --
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))));
else -- embedded register file with 16 entries
-- write --
if (ctrl_i(ctrl_rf_wb_en_c) = '1') and ((valid_wr = '1') or (rf_r0_is_reg_c = false)) then -- valid write-back
reg_file_emb(to_integer(unsigned(ctrl_i(ctrl_rf_rd_adr3_c downto ctrl_rf_rd_adr0_c)))) <= rf_write_data;
if (rf_we = '1') then
reg_file_emb(to_integer(unsigned(dst_addr(3 downto 0)))) <= rf_write_data;
else -- read
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;
-- read --
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;
end if;
end process rf_access;
/rtl/core/neorv32_package.vhd
38,22 → 38,22
 
package neorv32_package is
 
-- Architecture Configuration -------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
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 a valid 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
 
-- Architecture Constants -----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
constant data_width_c : natural := 32; -- data width - do not change!
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01040600"; -- no touchy!
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01040606"; -- no touchy!
constant pmp_max_r_c : natural := 8; -- max PMP regions - FIXED!
constant archid_c : natural := 19; -- official NEORV32 architecture ID - hands off!
 
-- Architecture Configuration -------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
constant ispace_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"00000000"; -- default instruction memory address space base address
constant dspace_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"80000000"; -- default data memory address space base address
constant bus_timeout_c : natural := 127; -- cycles after which a valid bus access will timeout and triggers an access exception
constant wb_pipe_mode_c : boolean := false; -- false: classic/standard wishbone mode, true: pipelined wishbone mode (better timing)
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
 
-- Helper Functions -----------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
function index_size_f(input : natural) return natural;
66,6 → 66,7
function xnor_all_f(a : std_ulogic_vector) return std_ulogic;
function to_hexchar_f(input : std_ulogic_vector(3 downto 0)) return character;
function bit_rev_f(input : std_ulogic_vector) return std_ulogic_vector;
function is_power_of_two_f(input : natural) return boolean;
 
-- Internal Types -------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
160,57 → 161,73
-- 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_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
constant ctrl_rf_rs1_adr3_c : natural := 5; -- source register 1 address bit 3
constant ctrl_rf_rs1_adr4_c : natural := 6; -- source register 1 address bit 4
constant ctrl_rf_rs2_adr0_c : natural := 7; -- source register 2 address bit 0
constant ctrl_rf_rs2_adr1_c : natural := 8; -- source register 2 address bit 1
constant ctrl_rf_rs2_adr2_c : natural := 9; -- source register 2 address bit 2
constant ctrl_rf_rs2_adr3_c : natural := 10; -- source register 2 address bit 3
constant ctrl_rf_rs2_adr4_c : natural := 11; -- source register 2 address bit 4
constant ctrl_rf_rd_adr0_c : natural := 12; -- destiantion register address bit 0
constant ctrl_rf_rd_adr1_c : natural := 13; -- destiantion register address bit 1
constant ctrl_rf_rd_adr2_c : natural := 14; -- destiantion register address bit 2
constant ctrl_rf_rd_adr3_c : natural := 15; -- destiantion register address bit 3
constant ctrl_rf_rd_adr4_c : natural := 16; -- destiantion register address bit 4
constant ctrl_rf_wb_en_c : natural := 17; -- write back enable
constant ctrl_rf_r0_we_c : natural := 18; -- allow write access to r0 (zero)
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_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
constant ctrl_rf_rs1_adr3_c : natural := 5; -- source register 1 address bit 3
constant ctrl_rf_rs1_adr4_c : natural := 6; -- source register 1 address bit 4
constant ctrl_rf_rs2_adr0_c : natural := 7; -- source register 2 address bit 0
constant ctrl_rf_rs2_adr1_c : natural := 8; -- source register 2 address bit 1
constant ctrl_rf_rs2_adr2_c : natural := 9; -- source register 2 address bit 2
constant ctrl_rf_rs2_adr3_c : natural := 10; -- source register 2 address bit 3
constant ctrl_rf_rs2_adr4_c : natural := 11; -- source register 2 address bit 4
constant ctrl_rf_rd_adr0_c : natural := 12; -- destiantion register address bit 0
constant ctrl_rf_rd_adr1_c : natural := 13; -- destiantion register address bit 1
constant ctrl_rf_rd_adr2_c : natural := 14; -- destiantion register address bit 2
constant ctrl_rf_rd_adr3_c : natural := 15; -- destiantion register address bit 3
constant ctrl_rf_rd_adr4_c : natural := 16; -- destiantion register address bit 4
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_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
-- 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 := 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
-- 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_cmd0_c : natural := 43; -- cp command bit 0
constant ctrl_cp_cmd1_c : natural := 44; -- cp command bit 1
constant ctrl_cp_cmd2_c : natural := 45; -- cp command bit 2
constant ctrl_cp_id_lsb_c : natural := 41; -- cp select ID lsb
constant ctrl_cp_id_msb_c : natural := 42; -- 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
-- 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
-- control bus size --
constant ctrl_width_c : natural := 46; -- control bus size
constant ctrl_width_c : natural := 60; -- control bus size
 
-- ALU Comparator Bus ---------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
308,63 → 325,66
 
-- RISC-V CSR Addresses -------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
constant csr_mstatus_c : std_ulogic_vector(11 downto 0) := x"300"; -- mstatus
constant csr_misa_c : std_ulogic_vector(11 downto 0) := x"301"; -- misa
constant csr_mie_c : std_ulogic_vector(11 downto 0) := x"304"; -- mie
constant csr_mtvec_c : std_ulogic_vector(11 downto 0) := x"305"; -- mtvec
constant csr_mstatus_c : std_ulogic_vector(11 downto 0) := x"300"; -- mstatus
constant csr_misa_c : std_ulogic_vector(11 downto 0) := x"301"; -- misa
constant csr_mie_c : std_ulogic_vector(11 downto 0) := x"304"; -- mie
constant csr_mtvec_c : std_ulogic_vector(11 downto 0) := x"305"; -- mtvec
--
constant csr_mscratch_c : std_ulogic_vector(11 downto 0) := x"340"; -- mscratch
constant csr_mepc_c : std_ulogic_vector(11 downto 0) := x"341"; -- mepc
constant csr_mcause_c : std_ulogic_vector(11 downto 0) := x"342"; -- mcause
constant csr_mtval_c : std_ulogic_vector(11 downto 0) := x"343"; -- mtval
constant csr_mip_c : std_ulogic_vector(11 downto 0) := x"344"; -- mip
constant csr_mscratch_c : std_ulogic_vector(11 downto 0) := x"340"; -- mscratch
constant csr_mepc_c : std_ulogic_vector(11 downto 0) := x"341"; -- mepc
constant csr_mcause_c : std_ulogic_vector(11 downto 0) := x"342"; -- mcause
constant csr_mtval_c : std_ulogic_vector(11 downto 0) := x"343"; -- mtval
constant csr_mip_c : std_ulogic_vector(11 downto 0) := x"344"; -- mip
--
constant csr_pmpcfg0_c : std_ulogic_vector(11 downto 0) := x"3a0"; -- pmpcfg0
constant csr_pmpcfg1_c : std_ulogic_vector(11 downto 0) := x"3a1"; -- pmpcfg1
constant csr_pmpcfg0_c : std_ulogic_vector(11 downto 0) := x"3a0"; -- pmpcfg0
constant csr_pmpcfg1_c : std_ulogic_vector(11 downto 0) := x"3a1"; -- pmpcfg1
--
constant csr_pmpaddr0_c : std_ulogic_vector(11 downto 0) := x"3b0"; -- pmpaddr0
constant csr_pmpaddr1_c : std_ulogic_vector(11 downto 0) := x"3b1"; -- pmpaddr1
constant csr_pmpaddr2_c : std_ulogic_vector(11 downto 0) := x"3b2"; -- pmpaddr2
constant csr_pmpaddr3_c : std_ulogic_vector(11 downto 0) := x"3b3"; -- pmpaddr3
constant csr_pmpaddr4_c : std_ulogic_vector(11 downto 0) := x"3b4"; -- pmpaddr4
constant csr_pmpaddr5_c : std_ulogic_vector(11 downto 0) := x"3b5"; -- pmpaddr5
constant csr_pmpaddr6_c : std_ulogic_vector(11 downto 0) := x"3b6"; -- pmpaddr6
constant csr_pmpaddr7_c : std_ulogic_vector(11 downto 0) := x"3b7"; -- pmpaddr7
constant csr_pmpaddr0_c : std_ulogic_vector(11 downto 0) := x"3b0"; -- pmpaddr0
constant csr_pmpaddr1_c : std_ulogic_vector(11 downto 0) := x"3b1"; -- pmpaddr1
constant csr_pmpaddr2_c : std_ulogic_vector(11 downto 0) := x"3b2"; -- pmpaddr2
constant csr_pmpaddr3_c : std_ulogic_vector(11 downto 0) := x"3b3"; -- pmpaddr3
constant csr_pmpaddr4_c : std_ulogic_vector(11 downto 0) := x"3b4"; -- pmpaddr4
constant csr_pmpaddr5_c : std_ulogic_vector(11 downto 0) := x"3b5"; -- pmpaddr5
constant csr_pmpaddr6_c : std_ulogic_vector(11 downto 0) := x"3b6"; -- pmpaddr6
constant csr_pmpaddr7_c : std_ulogic_vector(11 downto 0) := x"3b7"; -- pmpaddr7
--
constant csr_mcycle_c : std_ulogic_vector(11 downto 0) := x"b00"; -- mcycle
constant csr_minstret_c : std_ulogic_vector(11 downto 0) := x"b02"; -- minstret
constant csr_mcycle_c : std_ulogic_vector(11 downto 0) := x"b00"; -- mcycle
constant csr_minstret_c : std_ulogic_vector(11 downto 0) := x"b02"; -- minstret
--
constant csr_mcycleh_c : std_ulogic_vector(11 downto 0) := x"b80"; -- mcycleh
constant csr_minstreth_c : std_ulogic_vector(11 downto 0) := x"b82"; -- minstreth
constant csr_mcycleh_c : std_ulogic_vector(11 downto 0) := x"b80"; -- mcycleh
constant csr_minstreth_c : std_ulogic_vector(11 downto 0) := x"b82"; -- minstreth
--
constant csr_cycle_c : std_ulogic_vector(11 downto 0) := x"c00"; -- cycle
constant csr_time_c : std_ulogic_vector(11 downto 0) := x"c01"; -- time
constant csr_instret_c : std_ulogic_vector(11 downto 0) := x"c02"; -- instret
constant csr_cycle_c : std_ulogic_vector(11 downto 0) := x"c00"; -- cycle
constant csr_time_c : std_ulogic_vector(11 downto 0) := x"c01"; -- time
constant csr_instret_c : std_ulogic_vector(11 downto 0) := x"c02"; -- instret
--
constant csr_cycleh_c : std_ulogic_vector(11 downto 0) := x"c80"; -- cycleh
constant csr_timeh_c : std_ulogic_vector(11 downto 0) := x"c81"; -- timeh
constant csr_instreth_c : std_ulogic_vector(11 downto 0) := x"c82"; -- instreth
constant csr_cycleh_c : std_ulogic_vector(11 downto 0) := x"c80"; -- cycleh
constant csr_timeh_c : std_ulogic_vector(11 downto 0) := x"c81"; -- timeh
constant csr_instreth_c : std_ulogic_vector(11 downto 0) := x"c82"; -- instreth
--
constant csr_mvendorid_c : std_ulogic_vector(11 downto 0) := x"f11"; -- mvendorid
constant csr_marchid_c : std_ulogic_vector(11 downto 0) := x"f12"; -- marchid
constant csr_mimpid_c : std_ulogic_vector(11 downto 0) := x"f13"; -- mimpid
constant csr_mhartid_c : std_ulogic_vector(11 downto 0) := x"f14"; -- mhartid
constant csr_mvendorid_c : std_ulogic_vector(11 downto 0) := x"f11"; -- mvendorid
constant csr_marchid_c : std_ulogic_vector(11 downto 0) := x"f12"; -- marchid
constant csr_mimpid_c : std_ulogic_vector(11 downto 0) := x"f13"; -- mimpid
constant csr_mhartid_c : std_ulogic_vector(11 downto 0) := x"f14"; -- mhartid
--
constant csr_mzext_c : std_ulogic_vector(11 downto 0) := x"fc0"; -- mzext
constant csr_mzext_c : std_ulogic_vector(11 downto 0) := x"fc0"; -- mzext (custom)
 
-- Co-Processor Operations ----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- cp ids --
constant cp_sel_muldiv_c : std_ulogic_vector(1 downto 0) := "00"; -- MULDIV CP
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
-- 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
constant cp_op_mulhsu_c : std_ulogic_vector(2 downto 0) := "010"; -- mulhsu
constant cp_op_mulhu_c : std_ulogic_vector(2 downto 0) := "011"; -- mulhu
constant cp_op_div_c : std_ulogic_vector(2 downto 0) := "100"; -- div
constant cp_op_divu_c : std_ulogic_vector(2 downto 0) := "101"; -- divu
constant cp_op_rem_c : std_ulogic_vector(2 downto 0) := "110"; -- rem
constant cp_op_remu_c : std_ulogic_vector(2 downto 0) := "111"; -- remu
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
constant cp_op_mulhsu_c : std_ulogic_vector(2 downto 0) := "010"; -- mulhsu
constant cp_op_mulhu_c : std_ulogic_vector(2 downto 0) := "011"; -- mulhu
constant cp_op_div_c : std_ulogic_vector(2 downto 0) := "100"; -- div
constant cp_op_divu_c : std_ulogic_vector(2 downto 0) := "101"; -- divu
constant cp_op_rem_c : std_ulogic_vector(2 downto 0) := "110"; -- rem
constant cp_op_remu_c : std_ulogic_vector(2 downto 0) := "111"; -- remu
 
-- ALU Function Codes ---------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
448,6 → 468,7
CLOCK_FREQUENCY : natural := 0; -- clock frequency of clk_i in Hz
BOOTLOADER_USE : boolean := true; -- implement processor-internal bootloader?
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_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
488,6 → 509,7
clk_i : in std_ulogic := '0'; -- global clock, rising edge
rstn_i : in std_ulogic := '0'; -- global reset, low-active, async
-- Wishbone bus interface --
wb_tag_o : out std_ulogic_vector(02 downto 0); -- tag
wb_adr_o : out std_ulogic_vector(31 downto 0); -- address
wb_dat_i : in std_ulogic_vector(31 downto 0) := (others => '0'); -- read data
wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data
498,7 → 520,6
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) --
priv_o : out std_ulogic_vector(1 downto 0); -- current CPU privilege level
fence_o : out std_ulogic; -- indicates an executed FENCE operation
fencei_o : out std_ulogic; -- indicates an executed FENCEI operation
-- GPIO --
529,8 → 550,8
component neorv32_cpu
generic (
-- General --
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
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_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
616,7 → 637,8
-- data input --
instr_i : in std_ulogic_vector(data_width_c-1 downto 0); -- instruction
cmp_i : in std_ulogic_vector(1 downto 0); -- comparator status
alu_res_i : in std_ulogic_vector(data_width_c-1 downto 0); -- ALU processing result
alu_add_i : in std_ulogic_vector(data_width_c-1 downto 0); -- ALU address result
rs1_i : in std_ulogic_vector(data_width_c-1 downto 0); -- rf source 1
-- data output --
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
634,7 → 656,6
-- physical memory protection --
pmp_addr_o : out pmp_addr_if_t; -- addresses
pmp_ctrl_o : out pmp_ctrl_if_t; -- configs
priv_mode_o : out std_ulogic_vector(1 downto 0); -- current CPU privilege level
-- bus access exceptions --
mar_i : in std_ulogic_vector(data_width_c-1 downto 0); -- memory address register
ma_instr_i : in std_ulogic; -- misaligned instruction address
687,6 → 708,8
-- data output --
cmp_o : out std_ulogic_vector(1 downto 0); -- comparator status
res_o : out std_ulogic_vector(data_width_c-1 downto 0); -- ALU result
add_o : out std_ulogic_vector(data_width_c-1 downto 0); -- address computation result
opb_o : out std_ulogic_vector(data_width_c-1 downto 0); -- ALU operand B
-- co-processor interface --
cp0_start_o : out std_ulogic; -- trigger co-processor 0
cp0_data_i : in std_ulogic_vector(data_width_c-1 downto 0); -- co-processor 0 result
694,6 → 717,12
cp1_start_o : out std_ulogic; -- trigger co-processor 1
cp1_data_i : in std_ulogic_vector(data_width_c-1 downto 0); -- co-processor 1 result
cp1_valid_i : in std_ulogic; -- co-processor 1 result valid
cp2_start_o : out std_ulogic; -- trigger co-processor 2
cp2_data_i : in std_ulogic_vector(data_width_c-1 downto 0); -- co-processor 2 result
cp2_valid_i : in std_ulogic; -- co-processor 2 result valid
cp3_start_o : out std_ulogic; -- trigger co-processor 3
cp3_data_i : in std_ulogic_vector(data_width_c-1 downto 0); -- co-processor 3 result
cp3_valid_i : in std_ulogic; -- co-processor 3 result valid
-- status --
wait_o : out std_ulogic -- busy due to iterative processing units
);
710,8 → 739,8
clk_i : in std_ulogic; -- global clock, rising edge
rstn_i : in std_ulogic; -- global reset, low-active, async
ctrl_i : in std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus
start_i : in std_ulogic; -- trigger operation
-- data input --
start_i : in std_ulogic; -- trigger operation
rs1_i : in std_ulogic_vector(data_width_c-1 downto 0); -- rf source 1
rs2_i : in std_ulogic_vector(data_width_c-1 downto 0); -- rf source 2
-- result and status --
733,7 → 762,6
port (
-- global control --
clk_i : in std_ulogic; -- global clock, rising edge
rstn_i : in std_ulogic; -- global reset, low-active, async
ctrl_i : in std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus
-- cpu instruction fetch interface --
fetch_pc_i : in std_ulogic_vector(data_width_c-1 downto 0); -- PC for instruction fetch
756,7 → 784,6
-- physical memory protection --
pmp_addr_i : in pmp_addr_if_t; -- addresses
pmp_ctrl_i : in pmp_ctrl_if_t; -- configs
priv_mode_i : in std_ulogic_vector(1 downto 0); -- current CPU privilege level
-- instruction bus --
i_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
i_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
814,6 → 841,7
cb_bus_ack_o : out std_ulogic; -- bus transfer acknowledge
cb_bus_err_o : out std_ulogic; -- bus transfer error
-- peripheral bus --
p_bus_src_o : out std_ulogic; -- access source: 0 = A, 1 = B
p_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
p_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
p_bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
1080,6 → 1108,7
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
1089,7 → 1118,9
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
-- 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
1326,4 → 1357,15
return output_v;
end function bit_rev_f;
 
-- Function: Test if input number is a power of two ---------------------------------------
-- -------------------------------------------------------------------------------------------
function is_power_of_two_f(input : natural) return boolean is
begin
if ((input / 2) /= 0) and ((input mod 2) = 0) then
return true;
else
return false;
end if;
end function is_power_of_two_f;
 
end neorv32_package;
/rtl/core/neorv32_spi.vhd
1,8 → 1,9
-- #################################################################################################
-- # << NEORV32 - Serial Peripheral Interface Controller (SPI) >> #
-- # ********************************************************************************************* #
-- # Frame format: 8/16/24/32-bit RTX, MSB or LSB first, 2 clock modes, 8 clock speeds, #
-- # 8 dedicated CS lines (low-active). Interrupt: SPI_transfer_done #
-- # Frame format: 8/16/24/32-bit receive/transmit data, always MSB first, 2 clock modes, #
-- # 8 clock speeds (derived from system clock), 8 dedicated chip-select lines (low-active). #
-- # Interrupt: SPI_transfer_done #
-- # ********************************************************************************************* #
-- # BSD 3-Clause License #
-- # #
86,12 → 87,10
constant ctrl_spi_prsc0_c : natural := 10; -- r/w: spi prescaler select bit 0
constant ctrl_spi_prsc1_c : natural := 11; -- r/w: spi prescaler select bit 1
constant ctrl_spi_prsc2_c : natural := 12; -- r/w: spi prescaler select bit 2
constant ctrl_spi_dir_c : natural := 13; -- r/w: shift direction (0: MSB first, 1: LSB first)
constant ctrl_spi_size0_c : natural := 14; -- r/w: data size (00: 8-bit, 01: 16-bit)
constant ctrl_spi_size1_c : natural := 15; -- r/w: data size (10: 24-bit, 11: 32-bit)
constant ctrl_spi_size0_c : natural := 13; -- r/w: data size (00: 8-bit, 01: 16-bit)
constant ctrl_spi_size1_c : natural := 14; -- r/w: data size (10: 24-bit, 11: 32-bit)
constant ctrl_spi_irq_en_c : natural := 15; -- r/w: spi transmission done interrupt enable
--
constant ctrl_spi_irq_en_c : natural := 16; -- r/w: spi transmission done interrupt enable
--
constant ctrl_spi_busy_c : natural := 31; -- r/-: spi transceiver is busy
 
-- access control --
101,22 → 100,24
signal rden : std_ulogic; -- read enable
 
-- accessible regs --
signal ctrl : std_ulogic_vector(16 downto 0);
signal tx_data : std_ulogic_vector(31 downto 0);
signal ctrl : std_ulogic_vector(15 downto 0);
signal tx_data_reg : std_ulogic_vector(31 downto 0);
signal rx_data : std_ulogic_vector(31 downto 0);
 
-- clock generator --
signal spi_clk : std_ulogic;
 
-- spi transceiver --
signal spi_start : std_ulogic;
signal spi_busy : std_ulogic;
signal spi_state0 : std_ulogic;
signal spi_state1 : std_ulogic;
signal spi_rtx_sreg : std_ulogic_vector(31 downto 0);
signal spi_rx_data : std_ulogic_vector(31 downto 0);
signal spi_bitcnt : std_ulogic_vector(05 downto 0);
signal spi_sdi_ff0 : std_ulogic;
signal spi_sdi_ff1 : std_ulogic;
signal spi_start : std_ulogic;
signal spi_busy : std_ulogic;
signal spi_state0 : std_ulogic;
signal spi_state1 : std_ulogic;
signal spi_rtx_sreg : std_ulogic_vector(31 downto 0);
signal spi_rx_data : std_ulogic_vector(31 downto 0);
signal spi_bitcnt : std_ulogic_vector(05 downto 0);
signal spi_bitcnt_max : std_ulogic_vector(05 downto 0);
signal spi_sdi_ff0 : std_ulogic;
signal spi_sdi_ff1 : std_ulogic;
 
begin
 
134,17 → 135,15
begin
if rising_edge(clk_i) then
ack_o <= acc_en and (rden_i or wren_i);
-- write access --
spi_start <= '0';
-- write access --
if (wren = '1') then
-- control regsiter --
if (addr = spi_ctrl_addr_c) then
if (addr = spi_ctrl_addr_c) then -- control
ctrl <= data_i(ctrl'left downto 0);
end if;
-- data regsiter --
if (addr = spi_rtx_addr_c) then
tx_data <= data_i;
spi_start <= '1';
if (addr = spi_rtx_addr_c) then -- tx data
tx_data_reg <= data_i;
spi_start <= '1';
end if;
end if;
-- read access --
165,29 → 164,20
data_o(ctrl_spi_prsc0_c) <= ctrl(ctrl_spi_prsc0_c);
data_o(ctrl_spi_prsc1_c) <= ctrl(ctrl_spi_prsc1_c);
data_o(ctrl_spi_prsc2_c) <= ctrl(ctrl_spi_prsc2_c);
data_o(ctrl_spi_dir_c) <= ctrl(ctrl_spi_dir_c);
data_o(ctrl_spi_size0_c) <= ctrl(ctrl_spi_size0_c);
data_o(ctrl_spi_size1_c) <= ctrl(ctrl_spi_size1_c);
--
data_o(ctrl_spi_irq_en_c) <= ctrl(ctrl_spi_irq_en_c);
--
data_o(ctrl_spi_busy_c) <= spi_busy;
else -- spi_rtx_addr_c
data_o <= spi_rx_data;
data_o <= rx_data;
end if;
end if;
end if;
end process rw_access;
 
-- direct CS (output is low-active) --
spi_csn_o(0) <= '0' when (ctrl(ctrl_spi_cs0_c) = '1') else '1';
spi_csn_o(1) <= '0' when (ctrl(ctrl_spi_cs1_c) = '1') else '1';
spi_csn_o(2) <= '0' when (ctrl(ctrl_spi_cs2_c) = '1') else '1';
spi_csn_o(3) <= '0' when (ctrl(ctrl_spi_cs3_c) = '1') else '1';
spi_csn_o(4) <= '0' when (ctrl(ctrl_spi_cs4_c) = '1') else '1';
spi_csn_o(5) <= '0' when (ctrl(ctrl_spi_cs5_c) = '1') else '1';
spi_csn_o(6) <= '0' when (ctrl(ctrl_spi_cs6_c) = '1') else '1';
spi_csn_o(7) <= '0' when (ctrl(ctrl_spi_cs7_c) = '1') else '1';
-- direct chip-select (CS) (output is low-active) --
spi_csn_o(7 downto 0) <= not ctrl(ctrl_spi_cs7_c downto ctrl_spi_cs0_c);
 
 
-- Clock Selection ------------------------------------------------------------------------
211,61 → 201,50
-- serial engine --
spi_irq_o <= '0';
if (spi_state0 = '0') or (ctrl(ctrl_spi_en_c) = '0') then -- idle or disabled
case ctrl(ctrl_spi_size1_c downto ctrl_spi_size0_c) is
when "00" => spi_bitcnt <= "001000"; -- 8-bit mode
when "01" => spi_bitcnt <= "010000"; -- 16-bit mode
when "10" => spi_bitcnt <= "011000"; -- 24-bit mode
when others => spi_bitcnt <= "100000"; -- 32-bit mode
end case;
-- --------------------------------------------------------------
spi_bitcnt <= (others => '0');
spi_state1 <= '0';
spi_sdo_o <= '0';
spi_sck_o <= '0';
spi_sdo_o <= '0';
spi_sck_o <= '0';
if (ctrl(ctrl_spi_en_c) = '0') then -- disabled
spi_busy <= '0';
elsif (spi_start = '1') then -- start new transmission
case ctrl(ctrl_spi_size1_c downto ctrl_spi_size0_c) is
when "00" => spi_rtx_sreg <= tx_data(07 downto 0) & x"000000"; -- 8-bit mode
when "01" => spi_rtx_sreg <= tx_data(15 downto 0) & x"0000"; -- 16-bit mode
when "10" => spi_rtx_sreg <= tx_data(23 downto 0) & x"00"; -- 24-bit mode
when others => spi_rtx_sreg <= tx_data(31 downto 0); -- 32-bit mode
end case;
spi_busy <= '1';
spi_rtx_sreg <= tx_data_reg;
spi_busy <= '1';
end if;
spi_state0 <= spi_busy and spi_clk; -- start with next new clock pulse
 
else -- transmission in progress
-- --------------------------------------------------------------
if (spi_state1 = '0') then -- first half of transmission
-- --------------------------------------------------------------
spi_sck_o <= ctrl(ctrl_spi_cpha_c);
 
spi_sck_o <= ctrl(ctrl_spi_cpha_c);
if (ctrl(ctrl_spi_dir_c) = '0') then
spi_sdo_o <= spi_rtx_sreg(31); -- MSB first
else
spi_sdo_o <= spi_rtx_sreg(0); -- LSB first
end if;
case ctrl(ctrl_spi_size1_c downto ctrl_spi_size0_c) is
when "00" => spi_sdo_o <= spi_rtx_sreg(07); -- 8-bit mode
when "01" => spi_sdo_o <= spi_rtx_sreg(15); -- 16-bit mode
when "10" => spi_sdo_o <= spi_rtx_sreg(23); -- 24-bit mode
when others => spi_sdo_o <= spi_rtx_sreg(31); -- 32-bit mode
end case;
 
if (spi_clk = '1') then
spi_state1 <= '1';
if (ctrl(ctrl_spi_cpha_c) = '0') then
if (ctrl(ctrl_spi_dir_c) = '0') then
spi_rtx_sreg <= spi_rtx_sreg(30 downto 0) & spi_sdi_ff1; -- MSB first
else
spi_rtx_sreg <= spi_sdi_ff1 & spi_rtx_sreg(31 downto 1); -- LSB first
end if;
spi_rtx_sreg <= spi_rtx_sreg(30 downto 0) & spi_sdi_ff1;
end if;
spi_bitcnt <= std_ulogic_vector(unsigned(spi_bitcnt) - 1);
spi_bitcnt <= std_ulogic_vector(unsigned(spi_bitcnt) + 1);
end if;
 
else -- second half of transmission
-- --------------------------------------------------------------
spi_sck_o <= not ctrl(ctrl_spi_cpha_c);
 
spi_sck_o <= not ctrl(ctrl_spi_cpha_c);
if (spi_clk = '1') then
spi_state1 <= '0';
if (ctrl(ctrl_spi_cpha_c) = '1') then
if (ctrl(ctrl_spi_dir_c) = '0') then
spi_rtx_sreg <= spi_rtx_sreg(30 downto 0) & spi_sdi_ff1; -- MSB first
else
spi_rtx_sreg <= spi_sdi_ff1 & spi_rtx_sreg(31 downto 1); -- LSB first
end if;
spi_rtx_sreg <= spi_rtx_sreg(30 downto 0) & spi_sdi_ff1;
end if;
if (spi_bitcnt = "000000") then
if (spi_bitcnt = spi_bitcnt_max) then
spi_state0 <= '0';
spi_busy <= '0';
spi_irq_o <= ctrl(ctrl_spi_irq_en_c);
276,16 → 255,31
end if;
end process spi_rtx_unit;
 
-- SPI receiver output --
spi_rx_output: process(ctrl, spi_rtx_sreg)
 
-- RTX Data size ------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
data_size: process(ctrl)
begin
case ctrl(ctrl_spi_size1_c downto ctrl_spi_size0_c) is
when "00" => spi_rx_data <= x"000000" & spi_rtx_sreg(7 downto 0); -- 8-bit mode
when "01" => spi_rx_data <= x"0000" & spi_rtx_sreg(15 downto 0); -- 16-bit mode
when "10" => spi_rx_data <= x"00" & spi_rtx_sreg(23 downto 0); -- 24-bit mode
when others => spi_rx_data <= spi_rtx_sreg(31 downto 0); -- 32-bit mode
when "00" => spi_bitcnt_max <= "001000"; -- 8-bit mode
when "01" => spi_bitcnt_max <= "010000"; -- 16-bit mode
when "10" => spi_bitcnt_max <= "011000"; -- 24-bit mode
when others => spi_bitcnt_max <= "100000"; -- 32-bit mode
end case;
end process spi_rx_output;
end process data_size;
 
 
-- RX-Data Masking ------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
rx_mapping: process(ctrl, spi_rtx_sreg)
begin
case ctrl(ctrl_spi_size1_c downto ctrl_spi_size0_c) is
when "00" => rx_data <= x"000000" & spi_rtx_sreg(07 downto 0); -- 8-bit mode
when "01" => rx_data <= x"0000" & spi_rtx_sreg(15 downto 0); -- 16-bit mode
when "10" => rx_data <= x"00" & spi_rtx_sreg(23 downto 0); -- 24-bit mode
when others => rx_data <= spi_rtx_sreg(31 downto 0); -- 32-bit mode
end case;
end process rx_mapping;
 
 
end neorv32_spi_rtl;
/rtl/core/neorv32_top.vhd
51,6 → 51,7
CLOCK_FREQUENCY : natural := 0; -- clock frequency of clk_i in Hz
BOOTLOADER_USE : boolean := true; -- implement processor-internal bootloader?
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_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
91,6 → 92,7
clk_i : in std_ulogic := '0'; -- global clock, rising edge
rstn_i : in std_ulogic := '0'; -- global reset, low-active, async
-- Wishbone bus interface (available if MEM_EXT_USE = true) --
wb_tag_o : out std_ulogic_vector(02 downto 0); -- tag
wb_adr_o : out std_ulogic_vector(31 downto 0); -- address
wb_dat_i : in std_ulogic_vector(31 downto 0) := (others => '0'); -- read data
wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data
101,7 → 103,6
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) --
priv_o : out std_ulogic_vector(1 downto 0); -- current CPU privilege level
fence_o : out std_ulogic; -- indicates an executed FENCE operation
fencei_o : out std_ulogic; -- indicates an executed FENCEI operation
-- GPIO (available if IO_GPIO_USE = true) --
170,6 → 171,7
err : std_ulogic; -- bus transfer error
fence : std_ulogic; -- fence(i) instruction executed
priv : std_ulogic_vector(1 downto 0); -- current privilege level
src : std_ulogic; -- access source
end record;
signal cpu_i, cpu_d, p_bus : bus_interface_t;
 
227,6 → 229,8
 
-- Sanity Checks --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- clock --
assert not (CLOCK_FREQUENCY = 0) report "NEORV32 PROCESSOR CONFIG ERROR! Core clock frequency (CLOCK_FREQUENCY) not specified." severity error;
-- internal bootloader ROM --
assert not ((BOOTLOADER_USE = true) and (boot_rom_size_c > boot_rom_max_size_c)) report "NEORV32 PROCESSOR CONFIG ERROR! Boot ROM size out of range." severity error;
assert not ((BOOTLOADER_USE = true) and (MEM_INT_IMEM_ROM = true)) report "NEORV32 PROCESSOR CONFIG WARNING! IMEM is configured as read-only. Bootloader will not be able to load new executables." severity warning;
233,17 → 237,18
-- memory system - data/instruction fetch --
assert not ((MEM_EXT_USE = false) and (MEM_INT_DMEM_USE = false)) report "NEORV32 PROCESSOR CONFIG ERROR! Core cannot fetch data without external memory interface and internal data memory." severity error;
assert not ((MEM_EXT_USE = false) and (MEM_INT_IMEM_USE = false) and (BOOTLOADER_USE = false)) report "NEORV32 PROCESSOR CONFIG ERROR! Core cannot fetch instructions without external memory interface, internal data memory and bootloader." severity error;
-- memory system - size --
assert not ((MEM_INT_DMEM_USE = true) and (is_power_of_two_f(MEM_INT_IMEM_SIZE) = false)) report "NEORV32 PROCESSOR CONFIG WARNING! MEM_INT_IMEM_SIZE should be a power of 2 to allow optimal hardware mapping." severity warning;
assert not ((MEM_INT_IMEM_USE = true) and (is_power_of_two_f(MEM_INT_DMEM_SIZE) = false)) report "NEORV32 PROCESSOR CONFIG WARNING! MEM_INT_DMEM_SIZE should be a power of 2 to allow optimal hardware mapping." severity warning;
-- memory system - alignment --
assert not (ispace_base_c(1 downto 0) /= "00") report "NEORV32 PROCESSOR CONFIG ERROR! Instruction memory space base address must be 4-byte-aligned." severity error;
assert not (dspace_base_c(1 downto 0) /= "00") report "NEORV32 PROCESSOR CONFIG ERROR! Data memory space base address must be 4-byte-aligned." severity error;
assert not ((ispace_base_c(index_size_f(MEM_INT_IMEM_SIZE)-1 downto 0) /= imem_align_check_c) and (MEM_INT_IMEM_USE = true)) report "NEORV32 PROCESSOR CONFIG ERROR! Instruction memory space base address has to be aligned to IMEM size." severity error;
assert not ((dspace_base_c(index_size_f(MEM_INT_DMEM_SIZE)-1 downto 0) /= dmem_align_check_c) and (MEM_INT_DMEM_USE = true)) report "NEORV32 PROCESSOR CONFIG ERROR! Data memory space base address has to be aligned to DMEM size." severity error;
-- clock --
assert not (CLOCK_FREQUENCY = 0) report "NEORV32 PROCESSOR CONFIG ERROR! Core clock frequency (CLOCK_FREQUENCY) not specified." severity error;
-- memory layout warning --
-- 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;
-- memory latency notifier (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;
313,7 → 318,7
neorv32_cpu_inst: neorv32_cpu
generic map (
-- General --
HW_THREAD_ID => (others => '0'), -- hardware thread id
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_C => CPU_EXTENSION_RISCV_C, -- implement compressed extension?
368,8 → 373,11
firq_i => fast_irq
);
 
-- misc --
cpu_i.src <= '1';
cpu_d.src <= '0';
 
-- advanced memory control --
priv_o <= cpu_i.priv; -- is the same as "cpu_d.priv"
fence_o <= cpu_d.fence; -- indicates an executed FENCE operation
fencei_o <= cpu_i.fence; -- indicates an executed FENCEI operation
 
412,6 → 420,7
cb_bus_ack_o => cpu_i.ack, -- bus transfer acknowledge
cb_bus_err_o => cpu_i.err, -- bus transfer error
-- peripheral bus --
p_bus_src_o => p_bus.src, -- access source: 0 = A (data), 1 = B (instructions)
p_bus_addr_o => p_bus.addr, -- bus access address
p_bus_rdata_i => p_bus.rdata, -- bus read data
p_bus_wdata_o => p_bus.wdata, -- bus write data
434,7 → 443,10
-- processor bus: CPU data bus error input --
p_bus.err <= wishbone_err;
 
-- current CPU privilege level --
p_bus.priv <= cpu_i.priv; -- cpu_i.priv == cpu_d.priv
 
 
-- Processor-Internal Instruction Memory (IMEM) -------------------------------------------
-- -------------------------------------------------------------------------------------------
neorv32_int_imem_inst_true:
538,6 → 550,7
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
547,7 → 560,9
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
-- 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
572,6 → 587,7
wb_sel_o <= (others => '0');
wb_stb_o <= '0';
wb_cyc_o <= '0';
wb_tag_o <= (others => '0');
end generate;
 
 
/rtl/core/neorv32_wishbone.vhd
64,6 → 64,7
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
73,7 → 74,9
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
-- 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
112,11 → 115,13
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);
end record;
signal ctrl : ctrl_t;
signal ctrl : ctrl_t;
signal stb_int : std_ulogic;
signal cyc_int : std_ulogic;
 
signal stb_int, cyc_int : std_ulogic;
 
begin
 
-- Sanity Checks --------------------------------------------------------------------------
157,6 → 162,8
ctrl.timeout <= (others => '0');
ctrl.ack <= '0';
ctrl.err <= '0';
ctrl.src <= '0';
ctrl.priv <= "00";
elsif rising_edge(clk_i) then
-- defaults --
ctrl.state_prev <= ctrl.state;
177,6 → 184,8
ctrl.adr <= addr_i;
ctrl.wdat <= data_i;
ctrl.sel <= ben_i;
ctrl.src <= src_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
ctrl.state <= BUSY;
214,7 → 223,6
end if;
end process bus_arbiter;
 
 
-- host access --
data_o <= ctrl.rdat;
ack_o <= ctrl.ack;
221,6 → 229,10
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_adr_o <= ctrl.adr;
wb_dat_o <= ctrl.wdat;
wb_we_o <= ctrl.we;
/rtl/top_templates/neorv32_test_setup.vhd
72,6 → 72,7
CLOCK_FREQUENCY => 100000000, -- clock frequency of clk_i in Hz
BOOTLOADER_USE => true, -- implement processor-internal bootloader?
USER_CODE => x"00000000", -- custom user code
HW_THREAD_ID => x"00000000", -- hardware thread id (hartid)
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_C => true, -- implement compressed extension?
CPU_EXTENSION_RISCV_E => false, -- implement embedded RF extension?
112,6 → 113,7
clk_i => clk_i, -- global clock, rising edge
rstn_i => rstn_i, -- global reset, low-active, async
-- Wishbone bus interface --
wb_tag_o => open, -- tag
wb_adr_o => open, -- address
wb_dat_i => (others => '0'), -- read data
wb_dat_o => open, -- write data
122,7 → 124,6
wb_ack_i => '0', -- transfer acknowledge
wb_err_i => '0', -- transfer error
-- Advanced memory control signals --
priv_o => open, -- current CPU privilege level
fence_o => open, -- indicates an executed FENCE operation
fencei_o => open, -- indicates an executed FENCEI operation
-- GPIO --
/rtl/top_templates/neorv32_top_axi4lite.vhd
46,7 → 46,8
-- General --
CLOCK_FREQUENCY : natural := 0; -- clock frequency of clk_i in Hz
BOOTLOADER_USE : boolean := true; -- implement processor-internal bootloader?
USER_CODE : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom user code
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_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
136,7 → 137,8
architecture neorv32_top_axi4lite_rtl of neorv32_top_axi4lite is
 
-- type conversion --
constant USER_CODE_INT : std_ulogic_vector(31 downto 0) := std_ulogic_vector(USER_CODE);
constant USER_CODE_INT : std_ulogic_vector(31 downto 0) := std_ulogic_vector(USER_CODE);
constant HW_THREAD_ID_INT : std_ulogic_vector(31 downto 0) := std_ulogic_vector(HW_THREAD_ID);
--
signal clk_i_int : std_ulogic;
signal rstn_i_int : std_ulogic;
144,8 → 146,6
signal gpio_o_int : std_ulogic_vector(31 downto 0);
signal gpio_i_int : std_ulogic_vector(31 downto 0);
--
signal priv_level : std_ulogic_vector(1 downto 0);
--
signal uart_txd_o_int : std_ulogic;
signal uart_rxd_i_int : std_ulogic;
--
171,6 → 171,7
cyc : std_ulogic; -- valid cycle
ack : std_ulogic; -- transfer acknowledge
err : std_ulogic; -- transfer error
tag : std_ulogic_vector(2 downto 0); -- tag
end record;
signal wb_core : wb_bus_t;
 
200,6 → 201,7
CLOCK_FREQUENCY => CLOCK_FREQUENCY, -- clock frequency of clk_i in Hz
BOOTLOADER_USE => BOOTLOADER_USE, -- implement processor-internal bootloader?
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_C => CPU_EXTENSION_RISCV_C, -- implement compressed extension?
CPU_EXTENSION_RISCV_E => CPU_EXTENSION_RISCV_E, -- implement embedded RF extension?
240,6 → 242,7
clk_i => clk_i_int, -- global clock, rising edge
rstn_i => rstn_i_int, -- global reset, low-active, async
-- Wishbone bus interface --
wb_tag_o => wb_core.tag, -- tag
wb_adr_o => wb_core.adr, -- address
wb_dat_i => wb_core.di, -- read data
wb_dat_o => wb_core.do, -- write data
250,7 → 253,6
wb_ack_i => wb_core.ack, -- transfer acknowledge
wb_err_i => wb_core.err, -- transfer error
-- Advanced memory control signals --
priv_o => priv_level, -- current CPU privilege level
fence_o => open, -- indicates an executed FENCE operation
fencei_o => open, -- indicates an executed FENCEI operation
-- GPIO --
340,7 → 342,10
-- AXI4-Lite Read Address Channel --
m_axi_araddr <= std_logic_vector(wb_core.adr);
m_axi_arvalid <= std_logic((wb_core.cyc and (not wb_core.we)) and (not ctrl.radr_received));
m_axi_arprot <= "000"; -- recommended by Xilinx -- "001" when (priv_level = priv_mode_m_c) else "000"; -- always: data-access, secure; privileged only when CPU is in machine mode
--m_axi_arprot <= "000"; -- recommended by Xilinx
m_axi_arprot(0) <= wb_core.tag(0); -- 0:unprivileged access, 1:privileged access
m_axi_arprot(1) <= wb_core.tag(1); -- 0:secure access, 1:non-secure access
m_axi_arprot(2) <= wb_core.tag(2); -- 0:data access, 1:instruction access
 
-- AXI4-Lite Read Data Channel --
m_axi_rready <= std_logic(wb_core.cyc and (not wb_core.we));
352,7 → 357,10
-- AXI4-Lite Write Address Channel --
m_axi_awaddr <= std_logic_vector(wb_core.adr);
m_axi_awvalid <= std_logic((wb_core.cyc and wb_core.we) and (not ctrl.wadr_received));
m_axi_awprot <= "000"; -- recommended by Xilinx -- "001" when (priv_level = priv_mode_m_c) else "000"; -- always: data-access, secure; privileged only when CPU is in machine mode
--m_axi_awprot <= "000"; -- recommended by Xilinx
m_axi_awprot(0) <= wb_core.tag(0); -- 0:unprivileged access, 1:privileged access
m_axi_awprot(1) <= wb_core.tag(1); -- 0:secure access, 1:non-secure access
m_axi_awprot(2) <= wb_core.tag(2); -- 0:data access, 1:instruction access
 
-- AXI4-Lite Write Data Channel --
m_axi_wdata <= std_logic_vector(wb_core.do);
/rtl/top_templates/neorv32_top_stdlogic.vhd
45,6 → 45,7
CLOCK_FREQUENCY : natural := 0; -- clock frequency of clk_i in Hz
BOOTLOADER_USE : boolean := true; -- implement processor-internal bootloader?
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_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
85,6 → 86,7
clk_i : in std_logic := '0'; -- global clock, rising edge
rstn_i : in std_logic := '0'; -- global reset, low-active, async
-- Wishbone bus interface (available if MEM_EXT_USE = true) --
wb_tag_o : out std_logic_vector(2 downto 0); -- tag
wb_adr_o : out std_logic_vector(31 downto 0); -- address
wb_dat_i : in std_logic_vector(31 downto 0) := (others => '0'); -- read data
wb_dat_o : out std_logic_vector(31 downto 0); -- write data
95,7 → 97,6
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) --
priv_o : out std_logic_vector(1 downto 0); -- current CPU privilege level
fence_o : out std_logic; -- indicates an executed FENCE operation
fencei_o : out std_logic; -- indicates an executed FENCEI operation
-- GPIO (available if IO_GPIO_USE = true) --
124,11 → 125,13
architecture neorv32_top_stdlogic_rtl of neorv32_top_stdlogic is
 
-- type conversion --
constant USER_CODE_INT : std_ulogic_vector(31 downto 0) := std_ulogic_vector(USER_CODE);
constant USER_CODE_INT : std_ulogic_vector(31 downto 0) := std_ulogic_vector(USER_CODE);
constant HW_THREAD_ID_INT : std_ulogic_vector(31 downto 0) := std_ulogic_vector(HW_THREAD_ID);
--
signal clk_i_int : std_ulogic;
signal rstn_i_int : std_ulogic;
--
signal wb_tag_o_int : std_ulogic_vector(2 downto 0);
signal wb_adr_o_int : std_ulogic_vector(31 downto 0);
signal wb_dat_i_int : std_ulogic_vector(31 downto 0);
signal wb_dat_o_int : std_ulogic_vector(31 downto 0);
139,7 → 142,6
signal wb_ack_i_int : std_ulogic;
signal wb_err_i_int : std_ulogic;
--
signal priv_o_int : std_ulogic_vector(1 downto 0);
signal fence_o_int : std_ulogic;
signal fencei_o_int : std_ulogic;
--
170,6 → 172,7
CLOCK_FREQUENCY => CLOCK_FREQUENCY, -- clock frequency of clk_i in Hz
BOOTLOADER_USE => BOOTLOADER_USE, -- implement processor-internal bootloader?
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_C => CPU_EXTENSION_RISCV_C, -- implement compressed extension?
CPU_EXTENSION_RISCV_E => CPU_EXTENSION_RISCV_E, -- implement embedded RF extension?
210,6 → 213,7
clk_i => clk_i_int, -- global clock, rising edge
rstn_i => rstn_i_int, -- global reset, low-active, async
-- Wishbone bus interface --
wb_tag_o => wb_tag_o_int, -- tag
wb_adr_o => wb_adr_o_int, -- address
wb_dat_i => wb_dat_i_int, -- read data
wb_dat_o => wb_dat_o_int, -- write data
220,7 → 224,6
wb_ack_i => wb_ack_i_int, -- transfer acknowledge
wb_err_i => wb_err_i_int, -- transfer error
-- Advanced memory control signals --
priv_o => priv_o_int, -- current CPU privilege level
fence_o => fence_o_int, -- indicates an executed FENCE operation
fencei_o => fencei_o_int, -- indicates an executed FENCEI operation
-- GPIO --
249,6 → 252,7
clk_i_int <= std_ulogic(clk_i);
rstn_i_int <= std_ulogic(rstn_i);
 
wb_tag_o <= std_logic_vector(wb_tag_o_int);
wb_adr_o <= std_logic_vector(wb_adr_o_int);
wb_dat_i_int <= std_ulogic_vector(wb_dat_i);
wb_dat_o <= std_logic_vector(wb_dat_o_int);
259,7 → 263,6
wb_ack_i_int <= std_ulogic(wb_ack_i);
wb_err_i_int <= std_ulogic(wb_err_i);
 
priv_o <= std_logic_vector(priv_o_int);
fence_o <= std_logic(fence_o_int);
fencei_o <= std_logic(fencei_o_int);
 
/sim/neorv32_tb.vhd
1,11 → 1,11
-- #################################################################################################
-- # << NEORV32 - Simple Testbench >> #
-- # << NEORV32 - Default Testbench >> #
-- # ********************************************************************************************* #
-- # This testbench provides a virtual UART receiver connected to the processor's uart_txd_o #
-- # signals. The received chars are shown in the simulator console and also written to a file #
-- # ("neorv32.testbench_uart.out"). #
-- # Futhermore, this testbench provides a simple RAM connected to the external Wishbone bus. #
-- # The testbench configures the processor with all optional element enabled by default. #
-- # signal. The received chars are shown in the simulator console and also written to a file #
-- # ("neorv32.testbench_uart.out"). Futhermore, this testbench provides a simple RAM connected #
-- # to the external Wishbone bus. The testbench configures the processor with all optional #
-- # elements enabled by default. #
-- # ********************************************************************************************* #
-- # BSD 3-Clause License #
-- # #
103,6 → 103,7
cyc : std_ulogic; -- valid cycle
ack : std_ulogic; -- transfer acknowledge
err : std_ulogic; -- transfer error
tag : std_ulogic_vector(2 downto 0); -- tag
end record;
signal wb_cpu : wishbone_t;
 
126,8 → 127,8
-- How to simulate a boot from an external memory --
-- ---------------------------------------------- --
-- The simulated Wishbone memory can be initialized with the compiled application init.
-- 1. Uncomment the init_wbmen function below; this will initialize the simulated wishbone memory with the neorv32_application_image.vhd image
-- 2. Increase the wb_mem_size_c constant above to (at least) the size of the application image (like 16kB)
-- 1. Uncomment the init_wbmem function below; this will initialize the simulated wishbone memory with the neorv32_application_image.vhd image
-- 2. Increase the wb_mem_size_c constant above to (at least) the size of the application image (like 16kB -> 16*1024)
-- 3. Disable the processor-internal IMEM in the processor instantiation below (MEM_INT_IMEM_USE => false)
-- 4. Set the Wishbone memory base address wb_mem_base_addr_c (above) to zero (constant wb_mem_base_addr_c : std_ulogic_vector(31 downto 0) := x"00000000";)
-- 5. Simulate!
157,7 → 158,8
-- General --
CLOCK_FREQUENCY => f_clock_nat_c, -- clock frequency of clk_i in Hz
BOOTLOADER_USE => false, -- implement processor-internal bootloader?
USER_CODE => x"19880704", -- custom user code
USER_CODE => x"12345678", -- custom user code
HW_THREAD_ID => x"00000000", -- hardware thread id (hartid)
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_C => true, -- implement compressed extension?
CPU_EXTENSION_RISCV_E => false, -- implement embedded RF extension?
198,6 → 200,7
clk_i => clk_gen, -- global clock, rising edge
rstn_i => rst_gen, -- global reset, low-active, async
-- Wishbone bus interface --
wb_tag_o => wb_cpu.tag, -- tag
wb_adr_o => wb_cpu.addr, -- address
wb_dat_i => wb_cpu.rdata, -- read data
wb_dat_o => wb_cpu.wdata, -- write data
232,7 → 235,7
mext_irq_i => '0' -- machine external interrupt
);
 
-- TWI termination --
-- TWI termination (pull-ups) --
twi_scl <= 'H';
twi_sda <= 'H';
 
/sw/bootloader/bootloader.c
189,12 → 189,12
// get clock speed (in Hz)
uint32_t clock_speed = SYSINFO_CLK;
 
// init SPI for 8-bit, clock-mode 0, MSB-first, no interrupt
// init SPI for 8-bit, clock-mode 0, no interrupt
if (clock_speed < 40000000) {
neorv32_spi_setup(SPI_FLASH_CLK_PRSC, 0, 0, 0, 0);
neorv32_spi_setup(SPI_FLASH_CLK_PRSC, 0, 0, 0);
}
else {
neorv32_spi_setup(CLK_PRSC_128, 0, 0, 0, 0);
neorv32_spi_setup(CLK_PRSC_128, 0, 0, 0);
}
 
// init UART (no interrupts)
/sw/bootloader/makefile
57,7 → 57,7
MABI ?= -mabi=ilp32
 
# User flags for additional configuration (will be added to compiler flags)
USER_FLAGS ?=
USER_FLAGS ?=
 
# Serial port for executable upload via bootloer
COM_PORT ?= /dev/ttyUSB0
187,7 → 187,7
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -D -S -z $< > $@
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
/sw/common/neorv32.ld
44,7 → 44,7
OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv")
OUTPUT_ARCH(riscv)
ENTRY(_start)
SEARCH_DIR("=/opt/riscv/riscv64-unknown-linux-gnu/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");
SEARCH_DIR("/opt/riscv/riscv32-unknown-elf/lib"); SEARCH_DIR("=/opt/riscv/riscv64-unknown-linux-gnu/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");
 
/* ************************************************************************* */
/* NEORV32 memory configuration. */
/sw/example/blink_led/makefile
57,7 → 57,7
MABI ?= -mabi=ilp32
 
# User flags for additional configuration (will be added to compiler flags)
USER_FLAGS ?=
USER_FLAGS ?=
 
# Serial port for executable upload via bootloer
COM_PORT ?= /dev/ttyUSB0
187,7 → 187,7
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -D -S -z $< > $@
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
/sw/example/coremark/makefile
57,7 → 57,7
MABI ?= -mabi=ilp32
 
# User flags for additional configuration (will be added to compiler flags)
USER_FLAGS ?=
USER_FLAGS ?=
 
# Serial port for executable upload via bootloer
COM_PORT ?= /dev/ttyUSB0
187,7 → 187,7
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -D -S -z $< > $@
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
/sw/example/cpu_test/main.c
867,7 → 867,7
cnt_test++;
 
// configure SPI, enable transfer-done IRQ
neorv32_spi_setup(CLK_PRSC_2, 0, 0, 0, 1);
neorv32_spi_setup(CLK_PRSC_2, 0, 0, 1);
 
// trigger SPI IRQ
neorv32_spi_trans(0);
1200,10 → 1200,10
 
// final result
if (cnt_fail == 0) {
neorv32_uart_printf("%c[1m[TEST OK!]%c[0m\n", 27, 27);
neorv32_uart_printf("%c[1m[CPU TEST COMPLETED SUCCESSFULLY!]%c[0m\n", 27, 27);
}
else {
neorv32_uart_printf("%c[1m[TEST FAILED!]%c[0m\n", 27, 27);
neorv32_uart_printf("%c[1m[CPU TEST FAILED!]%c[0m\n", 27, 27);
}
 
return 0;
/sw/example/cpu_test/makefile
57,7 → 57,7
MABI ?= -mabi=ilp32
 
# User flags for additional configuration (will be added to compiler flags)
USER_FLAGS ?=
USER_FLAGS ?=
 
# Serial port for executable upload via bootloer
COM_PORT ?= /dev/ttyUSB0
187,7 → 187,7
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -D -S -z $< > $@
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
/sw/example/demo_freeRTOS/full_demo/RegTest.s
0,0 → 1,266
/*
* FreeRTOS Kernel V10.3.0
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* http://www.FreeRTOS.org
* http://aws.amazon.com/freertos
*
* 1 tab == 4 spaces!
*/
 
.extern ulRegTest1LoopCounter
.extern ulRegTest2LoopCounter
 
.global vRegTest1Implementation
.global vRegTest2Implementation
 
/*-----------------------------------------------------------*/
 
/*
* The register check tasks are described in the comments at the top of
* main_full.c.
*/
 
.align( 4 )
vRegTest1Implementation:
 
/* Fill the core registers with known values. */
li x5, 0x5
li x6, 0x6
li x7, 0x7
li x8, 0x8
li x9, 0x9
li x10, 0xa
li x11, 0xb
li x12, 0xc
li x13, 0xd
li x14, 0xe
li x15, 0xf
li x16, 0x10
li x17, 0x11
li x18, 0x12
li x19, 0x13
li x20, 0x14
li x21, 0x15
li x22, 0x16
li x23, 0x17
li x24, 0x18
li x25, 0x19
li x26, 0x1a
li x27, 0x1b
li x28, 0x1c
li x29, 0x1d
li x30, 0x1e
 
reg1_loop:
 
/* Check each register still contains the expected known value.
vRegTest1Implementation uses x31 as the temporary, vRegTest2Implementation
uses x5 as the temporary. */
li x31, 0x5
bne x31, x5, reg1_error_loop
li x31, 0x6
bne x31, x6, reg1_error_loop
li x31, 0x7
bne x31, x7, reg1_error_loop
li x31, 0x8
bne x31, x8, reg1_error_loop
li x31, 0x9
bne x31, x9, reg1_error_loop
li x31, 0xa
bne x31, x10, reg1_error_loop
li x31, 0xb
bne x31, x11, reg1_error_loop
li x31, 0xc
bne x31, x12, reg1_error_loop
li x31, 0xd
bne x31, x13, reg1_error_loop
li x31, 0xe
bne x31, x14, reg1_error_loop
li x31, 0xf
bne x31, x15, reg1_error_loop
li x31, 0x10
bne x31, x16, reg1_error_loop
li x31, 0x11
bne x31, x17, reg1_error_loop
li x31, 0x12
bne x31, x18, reg1_error_loop
li x31, 0x13
bne x31, x19, reg1_error_loop
li x31, 0x14
bne x31, x20, reg1_error_loop
li x31, 0x15
bne x31, x21, reg1_error_loop
li x31, 0x16
bne x31, x22, reg1_error_loop
li x31, 0x17
bne x31, x23, reg1_error_loop
li x31, 0x18
bne x31, x24, reg1_error_loop
li x31, 0x19
bne x31, x25, reg1_error_loop
li x31, 0x1a
bne x31, x26, reg1_error_loop
li x31, 0x1b
bne x31, x27, reg1_error_loop
li x31, 0x1c
bne x31, x28, reg1_error_loop
li x31, 0x1d
bne x31, x29, reg1_error_loop
li x31, 0x1e
bne x31, x30, reg1_error_loop
 
/* Everything passed, increment the loop counter. */
lw x31, ulRegTest1LoopCounterConst
lw x30, 0(x31)
addi x30, x30, 1
sw x30, 0(x31)
 
/* Restore clobbered register reading for next loop. */
li x30, 0x1e
 
/* Yield to increase code coverage. */
ecall
 
/* Start again. */
jal reg1_loop
 
reg1_error_loop:
/* Jump here if a register contains an uxpected value. This stops the loop
counter being incremented so the check task knows an error was found. */
ebreak
jal reg1_error_loop
 
.align( 4 )
ulRegTest1LoopCounterConst: .word ulRegTest1LoopCounter
 
/*-----------------------------------------------------------*/
 
.align( 4 )
vRegTest2Implementation:
 
/* Fill the core registers with known values. */
li x6, 0x61
li x7, 0x71
li x8, 0x81
li x9, 0x91
li x10, 0xa1
li x11, 0xb1
li x12, 0xc1
li x13, 0xd1
li x14, 0xe1
li x15, 0xf1
li x16, 0x20
li x17, 0x21
li x18, 0x22
li x19, 0x23
li x20, 0x24
li x21, 0x25
li x22, 0x26
li x23, 0x27
li x24, 0x28
li x25, 0x29
li x26, 0x2a
li x27, 0x2b
li x28, 0x2c
li x29, 0x2d
li x30, 0x2e
li x31, 0x2f
 
Reg2_loop:
 
/* Check each register still contains the expected known value.
vRegTest2Implementation uses x5 as the temporary, vRegTest1Implementation
uses x31 as the temporary. */
li x5, 0x61
bne x5, x6, reg2_error_loop
li x5, 0x71
bne x5, x7, reg2_error_loop
li x5, 0x81
bne x5, x8, reg2_error_loop
li x5, 0x91
bne x5, x9, reg2_error_loop
li x5, 0xa1
bne x5, x10, reg2_error_loop
li x5, 0xb1
bne x5, x11, reg2_error_loop
li x5, 0xc1
bne x5, x12, reg2_error_loop
li x5, 0xd1
bne x5, x13, reg2_error_loop
li x5, 0xe1
bne x5, x14, reg2_error_loop
li x5, 0xf1
bne x5, x15, reg2_error_loop
li x5, 0x20
bne x5, x16, reg2_error_loop
li x5, 0x21
bne x5, x17, reg2_error_loop
li x5, 0x22
bne x5, x18, reg2_error_loop
li x5, 0x23
bne x5, x19, reg2_error_loop
li x5, 0x24
bne x5, x20, reg2_error_loop
li x5, 0x25
bne x5, x21, reg2_error_loop
li x5, 0x26
bne x5, x22, reg2_error_loop
li x5, 0x27
bne x5, x23, reg2_error_loop
li x5, 0x28
bne x5, x24, reg2_error_loop
li x5, 0x29
bne x5, x25, reg2_error_loop
li x5, 0x2a
bne x5, x26, reg2_error_loop
li x5, 0x2b
bne x5, x27, reg2_error_loop
li x5, 0x2c
bne x5, x28, reg2_error_loop
li x5, 0x2d
bne x5, x29, reg2_error_loop
li x5, 0x2e
bne x5, x30, reg2_error_loop
li x5, 0x2f
bne x5, x31, reg2_error_loop
 
/* Everything passed, increment the loop counter. */
lw x5, ulRegTest2LoopCounterConst
lw x6, 0(x5)
addi x6, x6, 1
sw x6, 0(x5)
 
/* Restore clobbered register reading for next loop. */
li x6, 0x61
 
/* Start again. */
jal Reg2_loop
 
reg2_error_loop:
/* Jump here if a register contains an uxpected value. This stops the loop
counter being incremented so the check task knows an error was found. */
ebreak
jal reg2_error_loop
 
.align( 4 )
ulRegTest2LoopCounterConst: .word ulRegTest2LoopCounter
 
 
/sw/example/demo_freeRTOS/full_demo/main_full.c
0,0 → 1,328
/*
* FreeRTOS Kernel V10.3.0
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* http://www.FreeRTOS.org
* http://aws.amazon.com/freertos
*
* 1 tab == 4 spaces!
*/
 
/******************************************************************************
* NOTE 1: This project provides two demo applications. A simple blinky style
* project, and a more comprehensive test and demo application. The
* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select
* between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY
* in main.c. This file implements the comprehensive test and demo version.
*
* NOTE 2: This file only contains the source code that is specific to the
* full demo. Generic functions, such FreeRTOS hook functions, and functions
* required to configure the hardware, are defined in main.c.
*
******************************************************************************
*
* main_full() creates all the demo application tasks and software timers, then
* starts the scheduler. The web documentation provides more details of the
* standard demo application tasks, which provide no particular functionality,
* but do provide a good example of how to use the FreeRTOS API.
*
* In addition to the standard demo tasks, the following tasks and tests are
* defined and/or created within this file:
*
* "Reg test" tasks - These fill both the core registers with known values, then
* check that each register maintains its expected value for the lifetime of the
* task. Each task uses a different set of values. The reg test tasks execute
* with a very low priority, so get preempted very frequently. A register
* containing an unexpected value is indicative of an error in the context
* switching mechanism.
*
* "Check" task - The check executes every three seconds. It checks that all
* the standard demo tasks, and the register check tasks, are not only still
* executing, but are executing without reporting any errors. The check task
* toggles the LED every three seconds if all the standard demo tasks are
* executing as expected, or every 500ms if a potential error is discovered in
* any task.
*/
 
/* Standard includes. */
#include <string.h>
#include <unistd.h>
 
/* NEORV32*/
#include <neorv32.h>
 
/* Kernel includes. */
#include <FreeRTOS.h>
#include <task.h>
#include <timers.h>
#include <semphr.h>
 
/* Standard demo application includes. */
#include <dynamic.h>
#include <blocktim.h>
#include <GenQTest.h>
#include <TimerDemo.h>
#include <TaskNotify.h>
 
/* Priorities for the demo application tasks. */
#define mainCHECK_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
 
/* The period of the check task, in ms, converted to ticks using the
pdMS_TO_TICKS() macro. mainNO_ERROR_CHECK_TASK_PERIOD is used if no errors have
been found, mainERROR_CHECK_TASK_PERIOD is used if an error has been found. */
#define mainNO_ERROR_CHECK_TASK_PERIOD pdMS_TO_TICKS( 2000UL )
#define mainERROR_CHECK_TASK_PERIOD pdMS_TO_TICKS( 100UL )
 
/* Parameters that are passed into the register check tasks solely for the
purpose of ensuring parameters are passed into tasks correctly. */
#define mainREG_TEST_TASK_1_PARAMETER ( ( void * ) 0x12345678 )
#define mainREG_TEST_TASK_2_PARAMETER ( ( void * ) 0x87654321 )
 
/* The base period used by the timer test tasks. */
#define mainTIMER_TEST_PERIOD ( 50 )
 
/* The size of the stack allocated to the check task (as described in the
comments at the top of this file. */
#define mainCHECK_TASK_STACK_SIZE_WORDS 160
 
/* Size of the stacks to allocated for the register check tasks. */
#define mainREG_TEST_STACK_SIZE_WORDS 90
 
/*-----------------------------------------------------------*/
 
/*
* Called by main() to run the full demo (as opposed to the blinky demo) when
* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.
*/
void main_full( void );
 
/*
* The check task, as described at the top of this file.
*/
static void prvCheckTask( void *pvParameters );
 
/*
* Register check tasks as described at the top of this file. The nature of
* these files necessitates that they are written in an assembly file, but the
* entry points are kept in the C file for the convenience of checking the task
* parameter.
*/
static void prvRegTestTaskEntry1( void *pvParameters );
extern void vRegTest1Implementation( void );
static void prvRegTestTaskEntry2( void *pvParameters );
extern void vRegTest2Implementation( void );
 
/*
* IO
*/
extern void vSendString( const char * pcString );
extern void vToggleLED( void );
 
/*
* Tick hook used by the full demo, which includes code that interacts with
* some of the tests.
*/
void vFullDemoTickHook( void );
 
/*-----------------------------------------------------------*/
 
/* The following two variables are used to communicate the status of the
register check tasks to the check task. If the variables keep incrementing,
then the register check tasks have not discovered any errors. If a variable
stops incrementing, then an error has been found. */
uint32_t ulRegTest1LoopCounter = 0UL, ulRegTest2LoopCounter = 0UL;
volatile uint32_t *pulRegTest1LoopCounter = &ulRegTest1LoopCounter;
volatile uint32_t *pulRegTest2LoopCounter = &ulRegTest2LoopCounter;
/*-----------------------------------------------------------*/
 
void main_full( void )
{
 
vSendString("FreeRTOS: Creating tasks...\n");
 
/* Start all the other standard demo/test tasks. They have no particular
functionality, but do demonstrate how to use the FreeRTOS API and test the
kernel port. */
 
vSendString("FreeRTOS: Starting <vStartDynamicPriorityTasks>...\n");
vStartDynamicPriorityTasks();
 
vSendString("FreeRTOS: Starting <vStartGenericQueueTasks>...\n");
vStartGenericQueueTasks( tskIDLE_PRIORITY );
 
vSendString("FreeRTOS: Starting <vStartTimerDemoTask>...\n");
vStartTimerDemoTask( mainTIMER_TEST_PERIOD );
 
vSendString("FreeRTOS: Starting <vStartTaskNotifyTask>...\n");
vStartTaskNotifyTask();
 
 
/* Create the register check tasks, as described at the top of this file.
Use xTaskCreateStatic() to create a task using only statically allocated
memory. */
vSendString("FreeRTOS: Creating tasks <prvRegTestTaskEntry1>...\n");
xTaskCreate( prvRegTestTaskEntry1, /* The function that implements the task. */
"Reg1", /* The name of the task. */
mainREG_TEST_STACK_SIZE_WORDS, /* Size of stack to allocate for the task - in words not bytes!. */
mainREG_TEST_TASK_1_PARAMETER, /* Parameter passed into the task. */
tskIDLE_PRIORITY, /* Priority of the task. */
NULL ); /* Can be used to pass out a handle to the created task. */
vSendString("FreeRTOS: Creating tasks <prvRegTestTaskEntry2>...\n");
xTaskCreate( prvRegTestTaskEntry2, "Reg2", mainREG_TEST_STACK_SIZE_WORDS, mainREG_TEST_TASK_2_PARAMETER, tskIDLE_PRIORITY, NULL );
 
/* Create the task that performs the 'check' functionality, as described at
the top of this file. */
xTaskCreate( prvCheckTask, "Check", mainCHECK_TASK_STACK_SIZE_WORDS, NULL, mainCHECK_TASK_PRIORITY, NULL );
 
 
/* Start the scheduler. */
vSendString("\nFreeRTOS: Starting scheduler...\n\n");
vTaskStartScheduler();
 
/* If all is well, the scheduler will now be running, and the following
line will never be reached. If the following line does execute, then
there was insufficient FreeRTOS heap memory available for the Idle and/or
timer tasks to be created. See the memory management section on the
FreeRTOS web site for more details on the FreeRTOS heap
http://www.freertos.org/a00111.html. */
for( ;; );
}
/*-----------------------------------------------------------*/
 
static void prvCheckTask( void *pvParameters )
{
TickType_t xDelayPeriod = mainNO_ERROR_CHECK_TASK_PERIOD;
TickType_t xLastExecutionTime;
uint32_t ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;
char * const pcPassMessage = ".";
char * pcStatusMessage = pcPassMessage;
 
/* Just to stop compiler warnings. */
( void ) pvParameters;
 
/* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()
works correctly. */
xLastExecutionTime = xTaskGetTickCount();
 
/* Cycle for ever, delaying then checking all the other tasks are still
operating without error. The onboard LED is toggled on each iteration.
If an error is detected then the delay period is decreased from
mainNO_ERROR_CHECK_TASK_PERIOD to mainERROR_CHECK_TASK_PERIOD. This has the
effect of increasing the rate at which the onboard LED toggles, and in so
doing gives visual feedback of the system status. */
for( ;; )
{
/* Delay until it is time to execute again. */
vTaskDelayUntil( &xLastExecutionTime, xDelayPeriod );
 
/* Check all the demo tasks (other than the flash tasks) to ensure
that they are all still running, and that none have detected an error. */
if( xAreDynamicPriorityTasksStillRunning() == pdFALSE )
{
pcStatusMessage = "ERROR: Dynamic priority demo/tests.\n";
}
 
if( xAreTimerDemoTasksStillRunning( ( TickType_t ) xDelayPeriod ) == pdFALSE )
{
pcStatusMessage = "ERROR: Timer demo/tests.\n";
}
 
if( xAreGenericQueueTasksStillRunning() == pdFALSE )
{
pcStatusMessage = "ERROR: Generic queue demo/tests.\n";
}
 
if( xAreTaskNotificationTasksStillRunning() == pdFALSE )
{
pcStatusMessage = "ERROR: Task notification demo/tests.\n";
}
 
if( ulLastRegTest1Value == ulRegTest1LoopCounter )
{
pcStatusMessage = "ERROR: Register test 1.\n";
}
ulLastRegTest1Value = ulRegTest1LoopCounter;
 
if( ulLastRegTest2Value == ulRegTest2LoopCounter )
{
pcStatusMessage = "ERROR: Register test 2.\n";
}
ulLastRegTest2Value = ulRegTest2LoopCounter;
 
/* Write the status message to the UART. */
vSendString( pcStatusMessage );
 
/* Toggle the LED to show the system status */
vToggleLED();
 
/* If an error has been found then increase the LED toggle rate by
increasing the cycle frequency. */
if( pcStatusMessage != pcPassMessage )
{
xDelayPeriod = mainERROR_CHECK_TASK_PERIOD;
}
}
}
/*-----------------------------------------------------------*/
 
static void prvRegTestTaskEntry1( void *pvParameters )
{
/* Although the regtest task is written in assembler, its entry point is
written in C for convenience of checking the task parameter is being passed
in correctly. */
if( pvParameters == mainREG_TEST_TASK_1_PARAMETER )
{
/* Start the part of the test that is written in assembler. */
vRegTest1Implementation();
}
 
/* The following line will only execute if the task parameter is found to
be incorrect. The check task will detect that the regtest loop counter is
not being incremented and flag an error. */
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
 
static void prvRegTestTaskEntry2( void *pvParameters )
{
/* Although the regtest task is written in assembler, its entry point is
written in C for convenience of checking the task parameter is being passed
in correctly. */
if( pvParameters == mainREG_TEST_TASK_2_PARAMETER )
{
/* Start the part of the test that is written in assembler. */
vRegTest2Implementation();
}
 
/* The following line will only execute if the task parameter is found to
be incorrect. The check task will detect that the regtest loop counter is
not being incremented and flag an error. */
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
 
void vFullDemoTickHook( void )
{
/* Called from vApplicationTickHook() when the project is configured to
build the full test/demo applications. */
 
/* Use task notifications from an interrupt. */
xNotifyTaskFromISR();
}
/sw/example/demo_freeRTOS/FreeRTOSConfig.h
97,10 → 97,11
#define configCPU_CLOCK_HZ 100000000
#define configTICK_RATE_HZ ( ( TickType_t ) 100 )
#define configMAX_PRIORITIES ( 5 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 200 ) /* Can be as low as 60 but some of the demo tasks that use this constant require it to be higher. */
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) /* Can be as low as 60 but some of the demo tasks that use this constant require it to be higher. */
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 7 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_TRACE_FACILITY 0
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 0
#define configUSE_MUTEXES 1
111,6 → 112,8
#define configUSE_APPLICATION_TASK_TAG 0
#define configUSE_COUNTING_SEMAPHORES 1
#define configGENERATE_RUN_TIME_STATS 0
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 4
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
 
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0
142,15 → 145,8
#define INCLUDE_xTaskGetHandle 1
#define INCLUDE_xSemaphoreGetMutexHolder 1
 
// get runtime stats
#define configGENERATE_RUN_TIME_STATS 0
 
/* Normal assert() semantics without relying on the provision of an assert.h
header file. */
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); __asm volatile( "ebreak" ); for( ;; ); }
 
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
#define configKERNEL_INTERRUPT_PRIORITY 7
 
 
#endif /* FREERTOS_CONFIG_H */
/sw/example/demo_freeRTOS/README.md
1,7 → 1,8
# FreeRTOS Demo for the NEORV32 Processor
# FreeRTOS Demo for the NEORV32 Processor
 
This is simple example shows the usage of [FreeRTOS](https://www.freertos.org/) on the NEORV32 processor. It uses the default *blink*
demo application (`blinky_demo/main_blinky.c`). See the comments in that source file for more information.
This example shows how to run [FreeRTOS](https://www.freertos.org/) on the NEORV32 processor. It features the default
"blinky_demo" and the more sophisticated "full_demo" demo applications. See the comments in `main.c` and the according
source files for more information.
 
The chip-specific extensions folder (`chip_specific_extensions/neorv32`) should be in `$(FREERTOS_HOME)/Source/portable/GCC/RISC-V/chip_specific_extensions`,
but is placed in this source directory for simplicity.
9,20 → 10,20
 
## Hardware Requirements
 
* 8kB DMEM and 16kB IMEM
* MTIME (machine timer)
* DMEM/IMEM requriements depend on the actual application (for example: 8kB DMEM and 16kB IMEM for *blinky_demo*)
* MTIME (machine timer) + UART + GPIO
* `Zicsr` CPU extension
 
 
## Instructions
 
Download FreeRTOS from the [official GitHub repository](https://github.com/FreeRTOS/FreeRTOS).
Download FreeRTOS from the [official GitHub repository](https://github.com/FreeRTOS/FreeRTOS) or from the its official homepage.
 
$ git clone https://github.com/FreeRTOS/FreeRTOS.git
 
Open the makefile from this example folder and configure the `FREERTOS_HOME` variable to point to the `FreeRTOS/FreeRTOS` home folder.
Open the makefile from this example folder and configure the `FREERTOS_HOME` variable to point to your FreeRTOS home folder.
 
FREERTOS_HOME ?= /mnt/n/Projects/FreeRTOS/FreeRTOS
FREERTOS_HOME ?= /mnt/n/Projects/FreeRTOSv10.4.1
 
Compile the NEORV32 executable. Do not forget the `RUN_FREERTOS_DEMO` switch.
 
38,15 → 39,26
CMD:> e
Booting...
 
FreeRTOS V10.3.1
FreeRTOS V10.4.1
Blink
Blink
Blink
```
 
## FreeRTOS Plus
 
## Note
To automatically add source and include files from FreeRTOS plus extensions add one (or more) of the following arguments when invoking `make`:
 
* FreeRTOS-Plus-CLI: `USER_FLAGS+=-FREERTOS_PLUS_CLI`
* FreeRTOS-Plus-TCP: `USER_FLAGS+=-FREERTOS_PLUS_TCP`
 
Example:
 
$ make USER_FLAGS+=-DRUN_FREERTOS_DEMO USER_FLAGS+=-FREERTOS_PLUS_TCP clean_all exe
 
 
## Notes
 
The onfiguration of the FreeRTOS home folder (via `FREERTOS_HOME`) is corrupted if the compiler shows the following error:
 
```
/sw/example/demo_freeRTOS/main.c
25,6 → 25,23
* 1 tab == 4 spaces!
*/
 
/******************************************************************************
* This project provides two demo applications. A simple blinky style project,
* and a more comprehensive test and demo application. The
* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting (defined in this file) is used to
* select between the two. The simply blinky demo is implemented and described
* in main_blinky.c. The more comprehensive test and demo application is
* implemented and described in main_full.c.
*
* This file implements the code that is not demo specific, including the
* hardware setup and standard FreeRTOS hook functions.
*
* ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON
* THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO
* APPLICATION, AND ITS ASSOCIATE FreeRTOS ARCHITECTURE PORT!
*
*/
 
/*
* Modified for the NEORV32 processor by Stephan Nolting.
*/
31,40 → 48,45
 
#ifdef RUN_FREERTOS_DEMO
 
#include <stdint.h>
 
/* FreeRTOS kernel includes. */
#include <FreeRTOS.h>
#include <semphr.h>
#include <queue.h>
#include <task.h>
 
/* NEORV32 includes. */
#include <neorv32.h>
 
/* misc */
//#include "driver_wrapper/uart_serial.h"
 
/* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo,
or 0 to run the more comprehensive test and demo application. */
#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1
 
/* UART hardware constants. */
#define BAUD_RATE 19200
 
/*-----------------------------------------------------------*/
 
/******************************************************************************
* This project provides two demo applications. A simple blinky style project,
* and a more comprehensive test and demo application. The
* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting (defined in this file) is used to
* select between the two. The simply blinky demo is implemented and described
* in main_blinky.c. The more comprehensive test and demo application is
* implemented and described in main_full.c.
*
* This file implements the code that is not demo specific, including the
* hardware setup and standard FreeRTOS hook functions.
*
* ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON
* THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO
* APPLICATION, AND ITS ASSOCIATE FreeRTOS ARCHITECTURE PORT!
*
/*
* main_blinky() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1.
* main_full() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.
*/
#if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1
extern void main_blinky( void );
#else
extern void main_full( void );
#endif /* #if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 */
 
extern void main_blinky( void );
extern void freertos_risc_v_trap_handler( void );
 
/* Prototypes for the standard FreeRTOS callback/hook functions implemented
within this file. See https://www.freertos.org/a00016.html */
/*
* Prototypes for the standard FreeRTOS callback/hook functions implemented
* within this file. See https://www.freertos.org/a00016.html
*/
void vApplicationMallocFailedHook( void );
void vApplicationIdleHook( void );
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );
73,8 → 95,9
/* Prepare hardware to run the demo. */
static void prvSetupHardware( void );
 
/* Send a message to the UART initialised in prvSetupHardware. */
void vSendString( const char * const pcString );
/* System */
void vToggleLED( void );
void vSendString( const char * pcString );
 
/*-----------------------------------------------------------*/
 
82,9 → 105,16
{
prvSetupHardware();
 
neorv32_uart_printf("FreeRTOS %s\n", tskKERNEL_VERSION_NUMBER);
/* say hi */
neorv32_uart_printf("FreeRTOS %s on NEORV32 Demo\n\n", tskKERNEL_VERSION_NUMBER);
 
main_blinky();
/* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top
of this file. */
#if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 )
main_blinky();
#else
main_full();
#endif
}
 
/*-----------------------------------------------------------*/
94,6 → 124,9
// configure trap handler entry point
neorv32_cpu_csr_write(CSR_MTVEC, (uint32_t)&freertos_risc_v_trap_handler);
 
// clear GPIO.out port
neorv32_gpio_port_set(0);
 
// configure UART for default baud rate, no rx interrupt, no tx interrupt
neorv32_uart_setup(BAUD_RATE, 0, 0);
}
107,9 → 140,9
 
/*-----------------------------------------------------------*/
 
void vSendString( const char * const pcString )
void vSendString( const char * pcString )
{
neorv32_uart_print( (char *)pcString );
neorv32_uart_print( ( const char * ) pcString );
}
 
/*-----------------------------------------------------------*/
127,7 → 160,7
to query the size of free heap space that remains (although it does not
provide information on how the remaining heap might be fragmented). */
taskDISABLE_INTERRUPTS();
neorv32_uart_print("FreeRTOS_FAULT: vApplicationMallocFailedHook\n");
neorv32_uart_print("FreeRTOS_FAULT: vApplicationMallocFailedHook (solution: increase 'configTOTAL_HEAP_SIZE' in FreeRTOSConfig.h)\n");
__asm volatile( "ebreak" );
for( ;; );
}
167,7 → 200,13
 
void vApplicationTickHook( void )
{
 
/* The tests in the full demo expect some interaction with interrupts. */
#if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY != 1 )
{
extern void vFullDemoTickHook( void );
vFullDemoTickHook();
}
#endif
}
 
/*-----------------------------------------------------------*/
/sw/example/demo_freeRTOS/makefile
73,22 → 73,31
# -----------------------------------------------------------------------------
ifneq (,$(findstring RUN_FREERTOS_DEMO,$(USER_FLAGS)))
# FreeRTOS home folder (adapt this!)
FREERTOS_HOME ?= /mnt/n/Projects/FreeRTOS/FreeRTOS
FREERTOS_HOME ?= /mnt/n/Projects/FreeRTOSv10.4.1
 
# Application
APP_SRC += blinky_demo/main_blinky.c
# FreeRTOS RISC-V specific
APP_SRC += $(wildcard $(FREERTOS_HOME)/FreeRTOS/Source/portable/GCC/RISC-V/*.c)
APP_SRC += $(FREERTOS_HOME)/FreeRTOS/Source/portable/GCC/RISC-V/portASM.S
 
APP_INC += -I $(FREERTOS_HOME)/FreeRTOS/Source/portable/GCC/RISC-V
 
# FreeRTOS core
APP_SRC += $(wildcard $(FREERTOS_HOME)/Source/*.c)
APP_SRC += $(wildcard $(FREERTOS_HOME)/Source/portable/MemMang/heap_1.c)
APP_SRC += $(wildcard $(FREERTOS_HOME)/FreeRTOS/Source/*.c)
APP_SRC += $(wildcard $(FREERTOS_HOME)/FreeRTOS/Source/portable/MemMang/heap_4.c)
 
APP_INC += -I $(FREERTOS_HOME)/Source/include
APP_INC += -I $(FREERTOS_HOME)/FreeRTOS/Source/include
 
# FreeRTOS RISC-V specific
APP_SRC += $(wildcard $(FREERTOS_HOME)/Source/portable/GCC/RISC-V/*.c)
APP_SRC += $(FREERTOS_HOME)/Source/portable/GCC/RISC-V/portASM.S
# FreeRTOS sources for the full_demo
APP_SRC += $(FREERTOS_HOME)/FreeRTOS/Demo/Common/Minimal/blocktim.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS/Demo/Common/Minimal/dynamic.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS/Demo/Common/Minimal/EventGroupsDemo.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS/Demo/Common/Minimal/GenQTest.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS/Demo/Common/Minimal/recmutex.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS/Demo/Common/Minimal/TaskNotify.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS/Demo/Common/Minimal/TaskNotifyArray.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS/Demo/Common/Minimal/TimerDemo.c
 
APP_INC += -I $(FREERTOS_HOME)/Source/portable/GCC/RISC-V
APP_INC += -I $(FREERTOS_HOME)/FreeRTOS/Demo/Common/include
 
# NEORV32 specific
ASM_INC += -DportasmHANDLE_INTERRUPT=SystemIrqHandler
96,10 → 105,42
APP_INC += -I chip_specific_extensions/neorv32
 
ASM_INC += -I chip_specific_extensions/neorv32
 
# Demo application
APP_SRC += blinky_demo/main_blinky.c
APP_SRC += full_demo/main_full.c
APP_SRC += full_demo/RegTest.s
endif
 
# -----------------
# FreeRTOS-Plus-CLI
# -----------------
ifneq (,$(findstring FREERTOS_PLUS_CLI,$(USER_FLAGS)))
APP_SRC += $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-CLI/FreeRTOS_CLI.c
 
APP_INC += -I $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-CLI
endif
 
# -----------------
# FreeRTOS-Plus-TCP
# -----------------
ifneq (,$(findstring FREERTOS_PLUS_TCP,$(USER_FLAGS)))
APP_SRC += $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_ARP.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_DHCP.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_DNS.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_IP.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_Stream_Buffer.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_IP.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_WIN.c
APP_SRC += $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_UDP_IP.c
 
APP_INC += -I $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/include
APP_INC += -I $(FREERTOS_HOME)/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/portable/Compiler/GCC
endif
 
 
 
# -----------------------------------------------------------------------------
# NEORV32 framework
# -----------------------------------------------------------------------------
219,7 → 260,7
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -D -S -z $< > $@
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
/sw/example/demo_pwm/makefile
57,7 → 57,7
MABI ?= -mabi=ilp32
 
# User flags for additional configuration (will be added to compiler flags)
USER_FLAGS ?=
USER_FLAGS ?=
 
# Serial port for executable upload via bootloer
COM_PORT ?= /dev/ttyUSB0
187,7 → 187,7
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -D -S -z $< > $@
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
/sw/example/demo_trng/makefile
57,7 → 57,7
MABI ?= -mabi=ilp32
 
# User flags for additional configuration (will be added to compiler flags)
USER_FLAGS ?=
USER_FLAGS ?=
 
# Serial port for executable upload via bootloer
COM_PORT ?= /dev/ttyUSB0
187,7 → 187,7
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -D -S -z $< > $@
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
/sw/example/demo_twi/makefile
57,7 → 57,7
MABI ?= -mabi=ilp32
 
# User flags for additional configuration (will be added to compiler flags)
USER_FLAGS ?=
USER_FLAGS ?=
 
# Serial port for executable upload via bootloer
COM_PORT ?= /dev/ttyUSB0
187,7 → 187,7
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -D -S -z $< > $@
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
/sw/example/demo_wdt/makefile
57,7 → 57,7
MABI ?= -mabi=ilp32
 
# User flags for additional configuration (will be added to compiler flags)
USER_FLAGS ?=
USER_FLAGS ?=
 
# Serial port for executable upload via bootloer
COM_PORT ?= /dev/ttyUSB0
187,7 → 187,7
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -D -S -z $< > $@
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
/sw/example/game_of_life/makefile
57,7 → 57,7
MABI ?= -mabi=ilp32
 
# User flags for additional configuration (will be added to compiler flags)
USER_FLAGS ?=
USER_FLAGS ?=
 
# Serial port for executable upload via bootloer
COM_PORT ?= /dev/ttyUSB0
187,7 → 187,7
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -D -S -z $< > $@
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
/sw/example/hex_viewer/makefile
57,7 → 57,7
MABI ?= -mabi=ilp32
 
# User flags for additional configuration (will be added to compiler flags)
USER_FLAGS ?=
USER_FLAGS ?=
 
# Serial port for executable upload via bootloer
COM_PORT ?= /dev/ttyUSB0
187,7 → 187,7
 
# Assembly listing file (for debugging)
$(APP_ASM): main.elf
@$(OBJDUMP) -D -S -z $< > $@
@$(OBJDUMP) -d -S -z $< > $@
 
# Generate final executable from .text + .rodata + .data (in THIS order!)
main.bin: main.elf $(APP_ASM)
/sw/lib/include/neorv32.h
393,12 → 393,10
SPI_CT_PRSC0 = 10, /**< UART control register(10) (r/w): Clock prescaler select bit 0 */
SPI_CT_PRSC1 = 11, /**< UART control register(11) (r/w): Clock prescaler select bit 1 */
SPI_CT_PRSC2 = 12, /**< UART control register(12) (r/w): Clock prescaler select bit 2 */
SPI_CT_DIR = 13, /**< UART control register(13) (r/w): Shift direction (0: MSB first, 1: LSB first) */
SPI_CT_SIZE0 = 14, /**< UART control register(14) (r/w): Transfer data size lsb (00: 8-bit, 01: 16-bit, 10: 24-bit, 11: 32-bit) */
SPI_CT_SIZE1 = 15, /**< UART control register(15) (r/w): Transfer data size lsb (00: 8-bit, 01: 16-bit, 10: 24-bit, 11: 32-bit) */
SPI_CT_SIZE0 = 13, /**< UART control register(13) (r/w): Transfer data size lsb (00: 8-bit, 01: 16-bit, 10: 24-bit, 11: 32-bit) */
SPI_CT_SIZE1 = 14, /**< UART control register(14) (r/w): Transfer data size msb (00: 8-bit, 01: 16-bit, 10: 24-bit, 11: 32-bit) */
SPI_CT_IRQ_EN = 15, /**< UART control register(15) (r/w): Transfer done interrupt enable */
 
SPI_CT_IRQ_EN = 16, /**< UART control register(16) (r/w): Transfer done interrupt enable */
 
SPI_CT_BUSY = 31 /**< UART control register(31) (r/-): SPI busy flag */
};
/**@}*/
/sw/lib/include/neorv32_spi.h
46,7 → 46,7
 
// prototypes
int neorv32_spi_available(void);
void neorv32_spi_setup(uint8_t prsc, uint8_t clk_polarity, uint8_t dir, uint8_t data_size, uint8_t irq_en);
void neorv32_spi_setup(uint8_t prsc, uint8_t clk_polarity, uint8_t data_size, uint8_t irq_en);
void neorv32_spi_disable(void);
void neorv32_spi_cs_en(uint8_t cs);
void neorv32_spi_cs_dis(uint8_t cs);
/sw/lib/source/neorv32_spi.c
66,11 → 66,10
*
* @param[in] prsc Clock prescaler select (0..7). See #NEORV32_CLOCK_PRSC_enum.
* @param[in] clk_polarity Idle clock polarity (0, 1).
* @param[in] dir Shift direction (0: MSB first, 1: LSB first).
* @param[in] data_size Data transfer size (0: 8-bit, 1: 16-bit, 2: 24-bit, 3: 32-bit).
* @param[in] irq_en Enable transfer-done interrupt when 1.
**************************************************************************/
void neorv32_spi_setup(uint8_t prsc, uint8_t clk_polarity, uint8_t dir, uint8_t data_size, uint8_t irq_en) {
void neorv32_spi_setup(uint8_t prsc, uint8_t clk_polarity, uint8_t data_size, uint8_t irq_en) {
 
SPI_CT = 0; // reset
 
83,9 → 82,6
uint32_t ct_polarity = (uint32_t)(clk_polarity & 0x01);
ct_polarity = ct_polarity << SPI_CT_CPHA;
 
uint32_t ct_dir = (uint32_t)(dir & 0x01);
ct_dir = ct_dir << SPI_CT_DIR;
 
uint32_t ct_size = (uint32_t)(data_size & 0x03);
ct_size = ct_size << SPI_CT_SIZE0;
 
92,7 → 88,7
uint32_t ct_irq = (uint32_t)(irq_en & 0x01);
ct_irq = ct_irq << SPI_CT_IRQ_EN;
 
SPI_CT = ct_enable | ct_prsc | ct_polarity | ct_dir | ct_size | ct_irq;
SPI_CT = ct_enable | ct_prsc | ct_polarity | ct_size | ct_irq;
}
 
 
138,6 → 134,8
/**********************************************************************//**
* Initiate SPI transfer.
*
* @warning The SPI always sends MSB first.
*
* @note This function is blocking.
*
* @param tx_data Transmit data (8/16/24/32-bit, LSB-aligned).
/sw/lib/source/neorv32_uart.c
71,7 → 71,7
/**********************************************************************//**
* Enable and configure UART.
*
* @warning The 'UART_SIM_MODE' compiler flag will redirect all UART TX data to the simulation output. Use this for simulations only!
* @warning The 'UART_SIM_MODE' compiler flag will configure UART for simulation mode: all UART TX data will be redirected to simulation output. Use this for simulations only!
* @warning To enable simulation mode add <USER_FLAGS+=-DUART_SIM_MODE> when compiling.
*
* @param[in] baudrate Targeted BAUD rate (e.g. 9600).
82,14 → 82,21
 
UART_CT = 0; // reset
 
// raw baud rate prescaler
uint32_t clock = SYSINFO_CLK;
uint16_t i = 0; // BAUD rate divisor
uint8_t p = 0; // prsc = CLK/2
uint8_t p = 0; // initial prsc = CLK/2
 
// raw clock prescaler
#ifdef __riscv_div
// use div instructions
i = (uint16_t)(clock / (2*baudrate));
#else
// division via repeated subtraction
while (clock >= 2*baudrate) {
clock -= 2*baudrate;
i++;
}
#endif
 
// find clock prsc
while (i >= 0x0fff) {
/CHANGELOG.md
14,6 → 14,11
 
| Date (*dd.mm.yyyy*) | Version | Comment |
|:----------:|:-------:|:--------|
| 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 |
| 02.11.2020 | 1.4.6.5 | :warning: Fixed bug in CPU's illegal instruction detection logic; CPU rtl code optimizations - further reduced hardware footprint; rtl code clean-ups |
| 01.11.2020 | 1.4.6.4 | :warning: Fixed bug in `[m]instret[h]` and `[m]cycle[h]` carry logic; CPU hardware optimizations (area reduction, shortend critical path) |
| 29.10.2020 | 1.4.6.3 | rtl code clean-up; made preparations for additional co-processors |
| 25.10.2020 | 1.4.6.2 | Added tag signal (`wb_tag_o`) to processor's Wishbone bus; removed processors's `priv_o` - privilege level is now encoded in Wishbone *tag* signal; added a more sophisticated **FreeRTOS** example ("full_demo") |
| 24.10.2020 | [**:rocket:1.4.6.0**](https://github.com/stnolting/neorv32/releases/tag/v1.4.6.0) | Completely reworked external memory interface (WISHBONE), removed now-obsolete processor generic `MEM_EXT_REG_STAGES`; added processor wrapper with **AXI4-Lite master interface** |
| 22.10.2020 | 1.4.5.11 | TWI: Added new control register flag to enable/disable SCL clock stretching by peripheral devices |
| 22.10.2020 | 1.4.5.10 | Added `i_bus_priv_o` and `d_bus_priv_o` signals to CPU_top and `priv_o` to Processor_top to show privilege level of bus access (from `mstatus` MPP); :warning: Fixed bug in external memory interface [WISHBONE] (non-standard Wishbone components were able to corrupt processor-internal ACK/ERR signal logic) |
/README.md
19,63 → 19,43
## Overview
 
The NEORV32 Processor is a customizable microcontroller-like system on chip (SoC) that is based
on the RISC-V-compliant NEORV32 CPU. The project consists of two main parts:
on the RISC-V-compliant NEORV32 CPU. The processor is intended as *ready-to-go* auxiliary processor within a larger SoC
designs or as stand-alone custom microcontroller. Its top entity can be directly synthesized for *any* target technology without modifications.
 
 
### [NEORV32 CPU](#CPU-Features)
 
The CPU implements a `rv32i RISC-V` core with optional `C`, `E`, `M`, `U`, `Zicsr`, `Zifencei` and
`PMP` (physical memory protection) extensions. It passes the official [RISC-V compliance tests](https://github.com/stnolting/neorv32_riscv_compliance)
and is compliant to the *Unprivileged ISA Specification [Version 2.2](https://github.com/stnolting/neorv32/blob/master/docs/riscv-privileged.pdf)*
and a subset of the *Privileged Architecture Specification [Version 1.12-draft](https://github.com/stnolting/neorv32/blob/master/docs/riscv-spec.pdf)*.
 
If you do not want to use the NEORV32 Processor setup, you can also use the CPU in
stand-alone mode and build your own SoC around it.
 
 
### [NEORV32 Processor](#Processor-Features)
 
Based on the NEORV32 CPU, the NEORV32 Processor is a full-scale RISC-V microcontroller system (**SoC**)
that already provides common peripherals like GPIO, serial interfaces, timers, embedded
memories and an external bus interface for connectivity and custom extension.
All optional features and modules beyond the base CPU can be enabled and configured via
[VHDL generics](#Top-Entities).
 
The processor is intended as ready-to-use auxiliary processor within a larger SoC
designs or as stand-alone custom microcontroller. Its top entity can be directly
synthesized for any target technology without modifications.
 
This project comes with a complete software ecosystem that features core
libraries for high-level usage of the provided functions and peripherals,
makefiles, a runtime environment, several example programs to start with - including a free RTOS demo - and
even a builtin bootloader for easy program upload via UART.
 
 
### [How to get started?](#Getting-Started)
 
The processor is intended to work "out of the box". Just synthesize the
[test setup](#Create-a-new-Hardware-Project), upload it to your FPGA board of choice and start playing
with the NEORV32. For more information take a look at the [NEORV32 data sheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf) (pdf).
 
The project’s change log is available in the [CHANGELOG.md](https://github.com/stnolting/neorv32/blob/master/CHANGELOG.md) file in the root directory of this repository.
To see the changes between releases visit the project's [release page](https://github.com/stnolting/neorv32/releases).
 
 
### Key Features
 
* RISC-V-compliant `rv32i` CPU with optional `C`, `E`, `M`, `U`, `Zicsr`, `Zifencei` and `PMP` (physical memory protection) extensions
* GCC-based toolchain ([pre-compiled rv32i and rv32e toolchains available](https://github.com/stnolting/riscv_gcc_prebuilt))
* Application compilation based on [GNU makefiles](https://github.com/stnolting/neorv32/blob/master/sw/example/blink_led/makefile)
* [Doxygen-based](https://github.com/stnolting/neorv32/blob/master/docs/doxygen_makefile_sw) documentation of the software framework: available on [GitHub pages](https://stnolting.github.io/neorv32/files.html)
* RISC-V-[compliant](#Status) 32-bit `rv32i` [**NEORV32 CPU**](#NEORV32-CPU-Features)
* Compliant to *Unprivileged ISA Specification* [(Version 2.2)](https://github.com/stnolting/neorv32/blob/master/docs/riscv-privileged.pdf)
* Compliant to *Privileged Architecture Specification* [(Version 1.12-draft)](https://github.com/stnolting/neorv32/blob/master/docs/riscv-spec.pdf)
* Optional CPU extensions
* `C` - compressed instructions (16-bit)
* `E` - embedded CPU (reduced register file)
* `M` - integer multiplication and division hardware
* `U` - less-privileged *user mode*
* `Zicsr` - control and status register access instructions (+ exception/irq system)
* `Zifencei` - instruction stream synchronization
* `PMP` - physical memory protection
* Software framework
* Core libraries for high-level usage of the provided functions and peripherals
* Application compilation based on [GNU makefiles](https://github.com/stnolting/neorv32/blob/master/sw/example/blink_led/makefile)
* GCC-based toolchain ([pre-compiled toolchains available](https://github.com/stnolting/riscv_gcc_prebuilt))
* runtime environment
* several example programs
* [Doxygen-based](https://github.com/stnolting/neorv32/blob/master/docs/doxygen_makefile_sw) documentation of the software framework: available on [GitHub pages](https://stnolting.github.io/neorv32/files.html)
* [FreeRTOS port](https://github.com/stnolting/neorv32/blob/master/sw/example/demo_freeRTOS) available
* [**Full-blown data sheet**](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf) (pdf)
* Completely described in behavioral, platform-independent VHDL - no primitives, macros, etc.
* Fully synchronous design, no latches, no gated clocks
* Small hardware footprint and high operating frequency
* Highly configurable CPU and processor setup
* [AXI4-Lite connectivity](#AXI4-Connectivity) - compatible with Xilinx Vivado IP Packer
* [FreeRTOS port](https://github.com/stnolting/neorv32/blob/master/sw/example/demo_freeRTOS) available
* Full-scale RISC-V microcontroller system (**SoC**): [**NEORV32 Processor**](#NEORV32-Processor-Features)
* Optional embedded memories, timers, serial interfaces, external interfaces (Wishbone or [AXI4-Lite](#AXI4-Connectivity)) ...
 
The project’s change log is available in the [CHANGELOG.md](https://github.com/stnolting/neorv32/blob/master/CHANGELOG.md) file in the root directory of this repository.
To see the changes between releases visit the project's [release page](https://github.com/stnolting/neorv32/releases).
For more information take a look at the [NEORV32 data sheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf) (pdf).
 
 
### Design Principles
 
* From zero to `main()`: Completely open source and documented.
86,7 → 66,7
* The processor has to fit in a Lattice iCE40 UltraPlus 5k FPGA running at 20+ MHz.
 
 
## Status
### Status
 
The processor is [synthesizable](#FPGA-Implementation-Results) (tested on *real hardware* using Intel Quartus Prime, Xilinx Vivado and Lattice Radiant/Synplify Pro) and can successfully execute
all the [provided example programs](https://github.com/stnolting/neorv32/tree/master/sw/example) including the [CoreMark benchmark](#CoreMark-Benchmark).
102,24 → 82,25
 
### To-Do / Wish List / [Help Wanted](#Contribute)
 
* Add a cache for the external memory interface
* Use LaTeX for data sheet
* Further size and performance optimization
* Synthesis results (+ wrappers?) for more platforms
* Add a cache for the external memory interface
* 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 CPU extensions:
* Atomic operations (`A`)
* Bitmanipulation operations (`B`), when they are "official"
* Bitmanipulation operations (`B`) - when they are *official*
* Floating-point instructions (`F`)
* ...
* ...
 
 
 
## Features
 
The full-blown data sheet of the NEORV32 Processor and CPU is available as pdf file:
[![NEORV32 data sheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/PDF_32.png) NEORV32 data sheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf).
 
### NEORV32 Processor (SoC)
### NEORV32 Processor Features
 
![neorv32 Overview](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_processor.png)
 
127,7 → 108,7
is highly customizable via the processor's top generics.
 
* Optional processor-internal data and instruction memories (**DMEM** / **IMEM**)
* Optional internal **Bootloader** with UART console and automatic SPI flash boot option
* Optional internal **Bootloader** with UART console and automatic application boot from SPI flash option
* Optional machine system timer (**MTIME**), RISC-V-compliant
* Optional universal asynchronous receiver and transmitter (**UART**) with simulation output option via text.io
* Optional 8/16/24/32-bit serial peripheral interface controller (**SPI**) with 8 dedicated chip select lines
141,7 → 122,7
* Optional custom functions units (**CFU0** and **CFU1**) for tightly-coupled custom co-processors
* System configuration information memory to check hardware configuration by software (**SYSINFO**)
 
### NEORV32 CPU
### NEORV32 CPU Features
 
![neorv32 Overview](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_cpu.png)
 
361,176 → 342,41
The `FAST_MUL_EN` configuration uses DSPs for the multiplier of the `M` extension (enabled via the `FAST_MUL_EN` generic). The `FAST_SHIFT_EN` configuration
uses a barrel shifter for CPU shift operations (enabled via the `FAST_SHIFT_EN` generic).
 
When the `C` extension is enabled, branches to an unaligned uncompressed instruction require additional instruction fetch cycles.
When the `C` extension is enabled branches to an unaligned uncompressed instruction require additional instruction fetch cycles.
 
 
 
## Top Entities
 
The top entity of the **NEORV32 Processor** (SoC) is [**neorv32_top.vhd**](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_top.vhd)
and the top entity of the **NEORV32 CPU** is [**neorv32_cpu.vhd**](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_cpu.vhd). Both
top entities are located in `rtl/core`.
The top entity of the **NEORV32 Processor** (SoC) is [`rtl/core/neorv32_top.vhd`](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_top.vhd).
 
All signals of the top entities are of type *std_ulogic* or *std_ulogic_vector*, respectively
All signals of the top entity are of type *std_ulogic* or *std_ulogic_vector*, respectively
(except for the processor's TWI signals, which are of type *std_logic*). Leave all unused output ports unconnected (`open`) and tie all unused
input ports to zero (`'0'` or `(others => '0')`, respectively).
 
Alternative top entities, like the simplified ["hello world" test setup](#Create-a-new-Hardware-Project) or CPU/Processor
wrappers with resolved port signal types (i.e. *std_logic*), can be found in [`rtl/top_templates`](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates).
 
Use the top's generics to configure the processor/CPU according to your needs. Each generic is initilized with the default configuration.
Use the top's generics to configure the system according to your needs. Each generic is initilized with the default configuration.
Detailed information regarding the interface signals and configuration generics can be found in
the [NEORV32 documentary](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf).
the [NEORV32 data sheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf) (pdf).
 
### NEORV32 CPU
 
```vhdl
entity neorv32_cpu is
generic (
-- General --
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_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.?
-- 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
-- Physical Memory Protection (PMP) --
PMP_USE : boolean := false; -- implement PMP?
PMP_NUM_REGIONS : natural := 4; -- number of regions (max 8)
PMP_GRANULARITY : natural := 14 -- minimal region granularity (1=8B, 2=16B, 3=32B, ...) default is 64k
);
port (
-- global control --
clk_i : in std_ulogic := '0'; -- global clock, rising edge
rstn_i : in std_ulogic := '0'; -- global reset, low-active, async
-- instruction bus interface --
i_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
i_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data
i_bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
i_bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable
i_bus_we_o : out std_ulogic; -- write enable
i_bus_re_o : out std_ulogic; -- read enable
i_bus_cancel_o : out std_ulogic; -- cancel current bus transaction
i_bus_ack_i : in std_ulogic := '0'; -- bus transfer acknowledge
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
-- 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
d_bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
d_bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable
d_bus_we_o : out std_ulogic; -- write enable
d_bus_re_o : out std_ulogic; -- read enable
d_bus_cancel_o : out std_ulogic; -- cancel current bus transaction
d_bus_ack_i : in std_ulogic := '0'; -- bus transfer acknowledge
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
-- system time input from MTIME --
time_i : in std_ulogic_vector(63 downto 0) := (others => '0'); -- current system time
-- interrupts (risc-v compliant) --
msw_irq_i : in std_ulogic := '0'; -- machine software interrupt
mext_irq_i : in std_ulogic := '0'; -- machine external interrupt
mtime_irq_i : in std_ulogic := '0'; -- machine timer interrupt
-- fast interrupts (custom) --
firq_i : in std_ulogic_vector(3 downto 0) := (others => '0')
);
end neorv32_cpu;
```
### Using the CPU in Stand-Alone Mode
 
### NEORV32 Processor
If you do not want to use the NEORV32 processor setup, you can also use the CPU in stand-alone mode and build your own system around it.
The top entity of the stand-alone **NEORV32 CPU** is [`rtl/core/neorv32_cpu.vhd`](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_cpu.vhd).
Note that the CPU uses a proprietary interface for accessing data and instruction memory. More information can be found in the
[NEORV32 data sheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf).
 
```vhdl
entity neorv32_top is
generic (
-- General --
CLOCK_FREQUENCY : natural := 0; -- clock frequency of clk_i in Hz
BOOTLOADER_USE : boolean := true; -- implement processor-internal bootloader?
USER_CODE : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom user code
-- RISC-V CPU Extensions --
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.?
-- 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
-- Physical Memory Protection (PMP) --
PMP_USE : boolean := false; -- implement PMP?
PMP_NUM_REGIONS : natural := 4; -- number of regions (max 8)
PMP_GRANULARITY : natural := 14; -- minimal region granularity (1=8B, 2=16B, 3=32B, ...) default is 64kB
-- Internal Instruction memory --
MEM_INT_IMEM_USE : boolean := true; -- implement processor-internal instruction memory
MEM_INT_IMEM_SIZE : natural := 16*1024; -- size of processor-internal instruction memory in bytes
MEM_INT_IMEM_ROM : boolean := false; -- implement processor-internal instruction memory as ROM
-- Internal Data memory --
MEM_INT_DMEM_USE : boolean := true; -- implement processor-internal data memory
MEM_INT_DMEM_SIZE : natural := 8*1024; -- size of processor-internal data memory in bytes
-- External memory interface --
MEM_EXT_USE : boolean := false; -- implement external memory bus interface?
-- Processor peripherals --
IO_GPIO_USE : boolean := true; -- implement general purpose input/output port unit (GPIO)?
IO_MTIME_USE : boolean := true; -- implement machine system timer (MTIME)?
IO_UART_USE : boolean := true; -- implement universal asynchronous receiver/transmitter (UART)?
IO_SPI_USE : boolean := true; -- implement serial peripheral interface (SPI)?
IO_TWI_USE : boolean := true; -- implement two-wire interface (TWI)?
IO_PWM_USE : boolean := true; -- implement pulse-width modulation unit (PWM)?
IO_WDT_USE : boolean := true; -- implement watch dog timer (WDT)?
IO_TRNG_USE : boolean := false; -- implement true random number generator (TRNG)?
IO_CFU0_USE : boolean := false; -- implement custom functions unit 0 (CFU0)?
IO_CFU1_USE : boolean := false -- implement custom functions unit 1 (CFU1)?
);
port (
-- Global control --
clk_i : in std_ulogic := '0'; -- global clock, rising edge
rstn_i : in std_ulogic := '0'; -- global reset, low-active, async
-- Wishbone bus interface (available if MEM_EXT_USE = true) --
wb_adr_o : out std_ulogic_vector(31 downto 0); -- address
wb_dat_i : in std_ulogic_vector(31 downto 0) := (others => '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 := '0'; -- transfer acknowledge
wb_err_i : in std_ulogic := '0'; -- transfer error
-- Advanced memory control signals (available if MEM_EXT_USE = true) --
priv_o : out std_ulogic_vector(1 downto 0); -- current CPU privilege level
fence_o : out std_ulogic; -- indicates an executed FENCE operation
fencei_o : out std_ulogic; -- indicates an executed FENCEI operation
-- GPIO (available if IO_GPIO_USE = true) --
gpio_o : out std_ulogic_vector(31 downto 0); -- parallel output
gpio_i : in std_ulogic_vector(31 downto 0) := (others => '0'); -- parallel input
-- UART (available if IO_UART_USE = true) --
uart_txd_o : out std_ulogic; -- UART send data
uart_rxd_i : in std_ulogic := '0'; -- UART receive data
-- SPI (available if IO_SPI_USE = true) --
spi_sck_o : out std_ulogic; -- SPI serial clock
spi_sdo_o : out std_ulogic; -- controller data out, peripheral data in
spi_sdi_i : in std_ulogic := '0'; -- controller data in, peripheral data out
spi_csn_o : out std_ulogic_vector(07 downto 0); -- SPI CS
-- TWI (available if IO_TWI_USE = true) --
twi_sda_io : inout std_logic; -- twi serial data line
twi_scl_io : inout std_logic; -- twi serial clock line
-- PWM (available if IO_PWM_USE = true) --
pwm_o : out std_ulogic_vector(03 downto 0); -- pwm channels
-- Interrupts --
mtime_irq_i : in std_ulogic := '0'; -- machine timer interrupt, available if IO_MTIME_USE = false
msw_irq_i : in std_ulogic := '0'; -- machine software interrupt
mext_irq_i : in std_ulogic := '0' -- machine external interrupt
);
end neorv32_top;
```
:warning: It is recommended to use the processor setup even if you only want to use the CPU. Simply disable all the processor-internal modules via the generics
and you will get a "CPU wrapper" that provides a minimal CPU environment and an external memory interface (like AXI4). This setup also allows to further use the default
bootloader and application makefiles. From this base you can start building your own processor system.
 
 
### Alternative Top Entities
 
*Alternative top entities*, like the simplified ["hello world" test setup](#Create-a-new-Hardware-Project) or CPU/Processor
wrappers with resolved port signal types (i.e. *std_logic*), can be found in [`rtl/top_templates`](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates).
 
 
### AXI4 Connectivity
 
Via the [`rtl/top_templates/neorv32_top_axi4lite.vhd`](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates/neorv32_top_axi4lite.vhd)
591,9 → 437,9
Create a new project with your FPGA design tool of choice. Add all the `*.vhd` files from the [`rtl/core`](https://github.com/stnolting/neorv32/blob/master/rtl)
folder to this project. Make sure to add these files to a **new design library** called `neorv32`.
 
You can either instantiate the [processor's top entity](https://github.com/stnolting/neorv32#top-entity) in your own project or you
can use a simple [test setup](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates/neorv32_test_setup.vhd) (from the project's
[`rtl/top_templates`](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates) folder) as top entity.
You can either instantiate the [processor's top entity](https://github.com/stnolting/neorv32#top-entity) or one of its
[wrappers](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates) in your own project. If you just want to try out the processor,
you can use the simple [test setup](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates/neorv32_test_setup.vhd) as top entity.
 
This test setup instantiates the processor and implements most of the peripherals and some ISA extensions. Only the UART lines, clock, reset and some GPIO output signals are
propagated as actual entity signals. Basically, it is a FPGA "hello world" example:
688,10 → 534,9
## Contribute
 
I'm always thankful for help! So if you have any questions, bug reports, ideas or if you want to give some kind of feedback, feel free
to [open a new issue](https://github.com/stnolting/neorv32/issues) or directly [drop me a line](mailto:stnolting@gmail.com).
to [open a new issue](https://github.com/stnolting/neorv32/issues) or directly [drop me a line](mailto:stnolting@gmail.com). If you'd like to contribute:
 
If you'd like to contribute:
 
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`
699,10 → 544,7
4. Push to the branch: `git push origin awesome_new_feature_branch`
5. Create a new [pull request](https://github.com/stnolting/neorv32/pulls)
 
Please also check out the project's [code of conduct](https://github.com/stnolting/neorv32/tree/master/CODE_OF_CONDUCT.md).
 
 
 
## Legal
 
This project is released under the BSD 3-Clause license. No copyright infringement intended.
743,7 → 585,7
 
#### Limitation of Liability for External Links
 
Our website contains links to the websites of third parties („external links“). As the
Our website contains links to the websites of third parties ("external links"). As the
content of these websites is not under our control, we cannot assume any liability for
such external content. In all cases, the provider of information of the linked websites
is liable for the content and accuracy of the information provided. At the point in time
783,4 → 625,4
 
This repository was created on June 23th, 2020.
 
Made with :coffee: in Hannover, Germany.
Made with :coffee: in Hannover, Germany :eu:

powered by: WebSVN 2.1.0

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