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 10 to Rev 11
    Reverse comparison

Rev 10 → Rev 11

/docs/figures/neorv32_overview.png Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
docs/figures/neorv32_overview.png Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: docs/figures/neorv32_cpu.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: docs/figures/neorv32_cpu.png =================================================================== --- docs/figures/neorv32_cpu.png (nonexistent) +++ docs/figures/neorv32_cpu.png (revision 11)
docs/figures/neorv32_cpu.png Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: docs/figures/neorv32_processor.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: docs/figures/neorv32_processor.png =================================================================== --- docs/figures/neorv32_processor.png (nonexistent) +++ docs/figures/neorv32_processor.png (revision 11)
docs/figures/neorv32_processor.png Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: docs/NEORV32.pdf =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: docs/doxygen_makefile_sw =================================================================== --- docs/doxygen_makefile_sw (revision 10) +++ docs/doxygen_makefile_sw (revision 11) @@ -38,7 +38,7 @@ # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.0 +PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a
/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;
8,888 → 8,1146
 
type application_init_image_t is array (0 to 65535) of std_ulogic_vector(31 downto 0);
constant application_init_image : application_init_image_t := (
00000000 => x"00000013",
00000001 => x"00000093",
00000002 => x"00008113",
00000003 => x"00010193",
00000004 => x"00018213",
00000005 => x"00020293",
00000006 => x"00028313",
00000007 => x"00030393",
00000008 => x"00038413",
00000009 => x"00040493",
00000010 => x"00048513",
00000011 => x"00050593",
00000012 => x"00058613",
00000013 => x"00060693",
00000014 => x"00068713",
00000015 => x"00070793",
00000016 => x"00078813",
00000017 => x"00080893",
00000018 => x"00088913",
00000019 => x"00090993",
00000020 => x"00098a13",
00000021 => x"000a0a93",
00000022 => x"000a8b13",
00000023 => x"000b0b93",
00000024 => x"000b8c13",
00000025 => x"000c0c93",
00000026 => x"000c8d13",
00000027 => x"000d0d93",
00000028 => x"000d8e13",
00000029 => x"000e0e93",
00000030 => x"000e8f13",
00000031 => x"000f0f93",
00000032 => x"00000013",
00000033 => x"fc5025f3",
00000034 => x"fc702673",
00000035 => x"00c58133",
00000036 => x"ffc10113",
00000037 => x"00010413",
00000038 => x"80000197",
00000039 => x"7e818193",
00000040 => x"00000597",
00000041 => x"0b458593",
00000042 => x"30559073",
00000043 => x"fc5025f3",
00000044 => x"00000617",
00000045 => x"1f060613",
00000046 => x"02000693",
00000047 => x"00c5a023",
00000048 => x"00458593",
00000049 => x"fff68693",
00000050 => x"fed01ae3",
00000051 => x"f8000593",
00000052 => x"0005a023",
00000053 => x"00458593",
00000054 => x"feb01ce3",
00000055 => x"fff00593",
00000056 => x"f8b02c23",
00000057 => x"f8b02e23",
00000058 => x"80000597",
00000059 => x"f9858593",
00000060 => x"80000617",
00000061 => x"f9060613",
00000062 => x"00c5d863",
00000063 => x"00058023",
00000064 => x"00158593",
00000065 => x"ff5ff06f",
00000066 => x"00001597",
00000067 => x"cc058593",
00000068 => x"80000617",
00000069 => x"f7060613",
00000070 => x"80000697",
00000071 => x"f6868693",
00000072 => x"00d65c63",
00000073 => x"00058703",
00000074 => x"00e60023",
00000075 => x"00158593",
00000076 => x"00160613",
00000077 => x"fedff06f",
00000078 => x"00000513",
00000079 => x"00000593",
00000080 => x"164000ef",
00000081 => x"10500073",
00000082 => x"30047073",
00000083 => x"10500073",
00000084 => x"0000006f",
00000085 => x"f8810113",
00000086 => x"00112023",
00000087 => x"00312223",
00000088 => x"00412423",
00000089 => x"00512623",
00000090 => x"00612823",
00000091 => x"00712a23",
00000092 => x"00812c23",
00000093 => x"00912e23",
00000094 => x"02a12023",
00000095 => x"02b12223",
00000096 => x"02c12423",
00000097 => x"02d12623",
00000098 => x"02e12823",
00000099 => x"02f12a23",
00000100 => x"03012c23",
00000101 => x"03112e23",
00000102 => x"05212023",
00000103 => x"05312223",
00000104 => x"05412423",
00000105 => x"05512623",
00000106 => x"05612823",
00000107 => x"05712a23",
00000108 => x"05812c23",
00000109 => x"05912e23",
00000110 => x"07a12023",
00000111 => x"07b12223",
00000112 => x"07c12423",
00000113 => x"07d12623",
00000114 => x"07e12823",
00000115 => x"07f12a23",
00000116 => x"342022f3",
00000117 => x"00f2f313",
00000118 => x"00231313",
00000119 => x"fc5020f3",
00000120 => x"00130333",
00000121 => x"341020f3",
00000122 => x"0002cc63",
00000123 => x"34a022f3",
00000124 => x"0022f293",
00000125 => x"00208093",
00000126 => x"005080b3",
00000127 => x"0080006f",
00000128 => x"04030313",
00000129 => x"00032283",
00000130 => x"ffc10113",
00000131 => x"00112023",
00000132 => x"000280e7",
00000133 => x"00012083",
00000134 => x"00410113",
00000135 => x"34109073",
00000136 => x"00012083",
00000137 => x"00412183",
00000138 => x"00812203",
00000139 => x"00c12283",
00000140 => x"01012303",
00000141 => x"01412383",
00000142 => x"01812403",
00000143 => x"01c12483",
00000144 => x"02012503",
00000145 => x"02412583",
00000146 => x"02812603",
00000147 => x"02c12683",
00000148 => x"03012703",
00000149 => x"03412783",
00000150 => x"03812803",
00000151 => x"03c12883",
00000152 => x"04012903",
00000153 => x"04412983",
00000154 => x"04812a03",
00000155 => x"04c12a83",
00000156 => x"05012b03",
00000157 => x"05412b83",
00000158 => x"05812c03",
00000159 => x"05c12c83",
00000160 => x"06012d03",
00000161 => x"06412d83",
00000162 => x"06812e03",
00000163 => x"06c12e83",
00000164 => x"07012f03",
00000165 => x"07412f83",
00000166 => x"07810113",
00000167 => x"30200073",
00000168 => x"00008067",
00000169 => x"ff010113",
00000170 => x"00112623",
00000171 => x"00812423",
00000172 => x"6cc000ef",
00000173 => x"04050663",
00000174 => x"2c8000ef",
00000175 => x"00005537",
00000176 => x"00000613",
00000177 => x"00000593",
00000178 => x"b0050513",
00000179 => x"408000ef",
00000180 => x"00001537",
00000181 => x"adc50513",
00000182 => x"498000ef",
00000183 => x"00000513",
00000184 => x"6ac000ef",
00000185 => x"00000413",
00000186 => x"0ff47513",
00000187 => x"6a0000ef",
00000188 => x"0c800513",
00000189 => x"6d0000ef",
00000190 => x"00140413",
00000191 => x"fedff06f",
00000192 => x"00c12083",
00000193 => x"00812403",
00000194 => x"01010113",
00000195 => x"00008067",
00000196 => x"00001537",
00000197 => x"ff010113",
00000198 => x"af850513",
00000199 => x"00112623",
00000200 => x"00812423",
00000201 => x"00912223",
00000202 => x"01212023",
00000203 => x"49c000ef",
00000204 => x"c81025f3",
00000205 => x"c0102673",
00000206 => x"00001537",
00000207 => x"b2050513",
00000208 => x"488000ef",
00000209 => x"34202473",
00000210 => x"34102973",
00000211 => x"34a024f3",
00000212 => x"04045663",
00000213 => x"00001537",
00000214 => x"b3850513",
00000215 => x"46c000ef",
00000216 => x"00001537",
00000217 => x"00090593",
00000218 => x"b5050513",
00000219 => x"45c000ef",
00000220 => x"00001537",
00000221 => x"b7050513",
00000222 => x"450000ef",
00000223 => x"00b00793",
00000224 => x"0487e063",
00000225 => x"00001737",
00000226 => x"00241793",
00000227 => x"d7c70713",
00000228 => x"00e787b3",
00000229 => x"0007a783",
00000230 => x"00078067",
00000231 => x"00001537",
00000232 => x"b4450513",
00000233 => x"424000ef",
00000234 => x"0024f793",
00000235 => x"00079663",
00000236 => x"ffc90913",
00000237 => x"fadff06f",
00000238 => x"ffe90913",
00000239 => x"fa5ff06f",
00000240 => x"800007b7",
00000241 => x"00778713",
00000242 => x"10e40e63",
00000243 => x"00b78713",
00000244 => x"12e40063",
00000245 => x"00378793",
00000246 => x"10f40063",
00000247 => x"00001537",
00000248 => x"00040593",
00000249 => x"cd450513",
00000250 => x"3e0000ef",
00000251 => x"0100006f",
00000252 => x"00001537",
00000253 => x"b7850513",
00000254 => x"3d0000ef",
00000255 => x"00001537",
00000256 => x"d6850513",
00000257 => x"0240006f",
00000258 => x"00001537",
00000259 => x"b9850513",
00000260 => x"fe9ff06f",
00000261 => x"00001537",
00000262 => x"bb450513",
00000263 => x"3ac000ef",
00000264 => x"00001537",
00000265 => x"bc850513",
00000266 => x"3a0000ef",
00000267 => x"343025f3",
00000268 => x"00001537",
00000269 => x"ce450513",
00000270 => x"390000ef",
00000271 => x"00001537",
00000272 => x"00048593",
00000273 => x"cec50513",
00000274 => x"0024f493",
00000275 => x"37c000ef",
00000276 => x"00049863",
00000277 => x"00001537",
00000278 => x"d0850513",
00000279 => x"36c000ef",
00000280 => x"341025f3",
00000281 => x"00001537",
00000282 => x"d1850513",
00000283 => x"35c000ef",
00000284 => x"00812403",
00000285 => x"00c12083",
00000286 => x"00412483",
00000287 => x"00012903",
00000288 => x"00001537",
00000289 => x"d4050513",
00000290 => x"01010113",
00000291 => x"33c0006f",
00000292 => x"00001537",
00000293 => x"be050513",
00000294 => x"f61ff06f",
00000295 => x"00001537",
00000296 => x"bf450513",
00000297 => x"f55ff06f",
00000298 => x"00001537",
00000299 => x"c0c50513",
00000300 => x"f49ff06f",
00000301 => x"00001537",
00000302 => x"c2050513",
00000303 => x"f3dff06f",
00000304 => x"00001537",
00000305 => x"c3c50513",
00000306 => x"f31ff06f",
00000307 => x"00001537",
00000308 => x"c5050513",
00000309 => x"f25ff06f",
00000310 => x"00001537",
00000311 => x"c6c50513",
00000312 => x"f19ff06f",
00000313 => x"00001537",
00000314 => x"c8850513",
00000315 => x"f0dff06f",
00000316 => x"00001537",
00000317 => x"cac50513",
00000318 => x"f01ff06f",
00000319 => x"ff010113",
00000320 => x"00812423",
00000321 => x"00912223",
00000322 => x"00112623",
00000323 => x"00700793",
00000324 => x"00050413",
00000325 => x"00058493",
00000326 => x"02a7fc63",
00000327 => x"00b00793",
00000328 => x"02f50863",
00000329 => x"01300793",
00000330 => x"02f50063",
00000331 => x"01700793",
00000332 => x"04f50463",
00000333 => x"01b00793",
00000334 => x"00100513",
00000335 => x"02f41463",
00000336 => x"00b00513",
00000337 => x"0080006f",
00000338 => x"00300513",
00000339 => x"448000ef",
00000340 => x"fc502573",
00000341 => x"00241413",
00000342 => x"00a40433",
00000343 => x"00942023",
00000344 => x"00000513",
00000345 => x"00c12083",
00000346 => x"00812403",
00000347 => x"00412483",
00000348 => x"01010113",
00000349 => x"00008067",
00000350 => x"00700513",
00000351 => x"fd1ff06f",
00000352 => x"ff010113",
00000353 => x"00812423",
00000354 => x"00912223",
00000355 => x"01212023",
00000356 => x"00112623",
00000357 => x"00000413",
00000358 => x"02000493",
00000359 => x"00040513",
00000360 => x"00140413",
00000361 => x"31000593",
00000362 => x"0ff47413",
00000363 => x"f51ff0ef",
00000364 => x"fe9416e3",
00000365 => x"00c12083",
00000366 => x"00812403",
00000367 => x"00412483",
00000368 => x"00012903",
00000369 => x"01010113",
00000370 => x"00008067",
00000371 => x"fd010113",
00000372 => x"02812423",
00000373 => x"02912223",
00000374 => x"03212023",
00000375 => x"01312e23",
00000376 => x"01412c23",
00000377 => x"02112623",
00000378 => x"01512a23",
00000379 => x"00001a37",
00000380 => x"00050493",
00000381 => x"00058413",
00000382 => x"00058523",
00000383 => x"00000993",
00000384 => x"00410913",
00000385 => x"daca0a13",
00000386 => x"00a00593",
00000387 => x"00048513",
00000388 => x"468000ef",
00000389 => x"00aa0533",
00000390 => x"00054783",
00000391 => x"01390ab3",
00000392 => x"00048513",
00000393 => x"00fa8023",
00000394 => x"00a00593",
00000395 => x"404000ef",
00000396 => x"00198993",
00000397 => x"00a00793",
00000398 => x"00050493",
00000399 => x"fcf996e3",
00000400 => x"00090693",
00000401 => x"00900713",
00000402 => x"03000613",
00000403 => x"0096c583",
00000404 => x"00070793",
00000405 => x"fff70713",
00000406 => x"01071713",
00000407 => x"01075713",
00000408 => x"00c59a63",
00000409 => x"000684a3",
00000410 => x"fff68693",
00000411 => x"fe0710e3",
00000412 => x"00000793",
00000413 => x"00f907b3",
00000414 => x"00000593",
00000415 => x"0007c703",
00000416 => x"00070c63",
00000417 => x"00158693",
00000418 => x"00b405b3",
00000419 => x"00e58023",
00000420 => x"01069593",
00000421 => x"0105d593",
00000422 => x"fff78713",
00000423 => x"02f91863",
00000424 => x"00b40433",
00000425 => x"00040023",
00000426 => x"02c12083",
00000427 => x"02812403",
00000428 => x"02412483",
00000429 => x"02012903",
00000430 => x"01c12983",
00000431 => x"01812a03",
00000432 => x"01412a83",
00000433 => x"03010113",
00000434 => x"00008067",
00000435 => x"00070793",
00000436 => x"fadff06f",
00000437 => x"fa002023",
00000438 => x"fc1026f3",
00000439 => x"00000713",
00000440 => x"00151513",
00000441 => x"04a6f263",
00000442 => x"000016b7",
00000443 => x"00000793",
00000444 => x"ffe68693",
00000445 => x"04e6e463",
00000446 => x"00167613",
00000447 => x"0015f593",
00000448 => x"01879793",
00000449 => x"01e61613",
00000450 => x"00c7e7b3",
00000451 => x"01d59593",
00000452 => x"00b7e7b3",
00000453 => x"00e7e7b3",
00000454 => x"10000737",
00000455 => x"00e7e7b3",
00000456 => x"faf02023",
00000457 => x"00008067",
00000458 => x"00170793",
00000459 => x"01079713",
00000460 => x"40a686b3",
00000461 => x"01075713",
00000462 => x"fadff06f",
00000463 => x"ffe78513",
00000464 => x"0fd57513",
00000465 => x"00051a63",
00000466 => x"00375713",
00000467 => x"00178793",
00000468 => x"0ff7f793",
00000469 => x"fa1ff06f",
00000470 => x"00175713",
00000471 => x"ff1ff06f",
00000472 => x"fa002783",
00000473 => x"fe07cee3",
00000474 => x"faa02223",
00000475 => x"00008067",
00000476 => x"ff010113",
00000477 => x"00812423",
00000478 => x"01212023",
00000479 => x"00112623",
00000480 => x"00912223",
00000481 => x"00050413",
00000482 => x"00a00913",
00000483 => x"00044483",
00000484 => x"00140413",
00000485 => x"00049e63",
00000486 => x"00c12083",
00000487 => x"00812403",
00000488 => x"00412483",
00000489 => x"00012903",
00000490 => x"01010113",
00000491 => x"00008067",
00000492 => x"01249663",
00000493 => x"00d00513",
00000494 => x"fa9ff0ef",
00000495 => x"00048513",
00000496 => x"fa1ff0ef",
00000497 => x"fc9ff06f",
00000498 => x"fa010113",
00000499 => x"02912a23",
00000500 => x"04f12a23",
00000501 => x"000014b7",
00000502 => x"04410793",
00000503 => x"02812c23",
00000504 => x"03212823",
00000505 => x"03412423",
00000506 => x"03512223",
00000507 => x"03612023",
00000508 => x"01712e23",
00000509 => x"02112e23",
00000510 => x"03312623",
00000511 => x"01812c23",
00000512 => x"00050413",
00000513 => x"04b12223",
00000514 => x"04c12423",
00000515 => x"04d12623",
00000516 => x"04e12823",
00000517 => x"05012c23",
00000518 => x"05112e23",
00000519 => x"00f12023",
00000520 => x"02500a13",
00000521 => x"00a00a93",
00000522 => x"07300913",
00000523 => x"07500b13",
00000524 => x"07800b93",
00000525 => x"db848493",
00000526 => x"00044c03",
00000527 => x"020c0463",
00000528 => x"134c1263",
00000529 => x"00144783",
00000530 => x"00240993",
00000531 => x"09278c63",
00000532 => x"04f96263",
00000533 => x"06300713",
00000534 => x"0ae78463",
00000535 => x"06900713",
00000536 => x"0ae78c63",
00000537 => x"03c12083",
00000538 => x"03812403",
00000539 => x"03412483",
00000540 => x"03012903",
00000541 => x"02c12983",
00000542 => x"02812a03",
00000543 => x"02412a83",
00000544 => x"02012b03",
00000545 => x"01c12b83",
00000546 => x"01812c03",
00000547 => x"06010113",
00000548 => x"00008067",
00000549 => x"0b678c63",
00000550 => x"fd7796e3",
00000551 => x"00012783",
00000552 => x"00410693",
00000553 => x"00068513",
00000554 => x"0007a583",
00000555 => x"00478713",
00000556 => x"00e12023",
00000557 => x"02000613",
00000558 => x"00000713",
00000559 => x"00e5d7b3",
00000560 => x"00f7f793",
00000561 => x"00f487b3",
00000562 => x"0007c783",
00000563 => x"00470713",
00000564 => x"fff68693",
00000565 => x"00f68423",
00000566 => x"fec712e3",
00000567 => x"00010623",
00000568 => x"0140006f",
00000569 => x"00012783",
00000570 => x"0007a503",
00000571 => x"00478713",
00000572 => x"00e12023",
00000573 => x"e7dff0ef",
00000574 => x"00098413",
00000575 => x"f3dff06f",
00000576 => x"00012783",
00000577 => x"0007c503",
00000578 => x"00478713",
00000579 => x"00e12023",
00000580 => x"e51ff0ef",
00000581 => x"fe5ff06f",
00000582 => x"00012783",
00000583 => x"0007a403",
00000584 => x"00478713",
00000585 => x"00e12023",
00000586 => x"00045863",
00000587 => x"02d00513",
00000588 => x"40800433",
00000589 => x"e2dff0ef",
00000590 => x"00410593",
00000591 => x"00040513",
00000592 => x"c8dff0ef",
00000593 => x"00410513",
00000594 => x"fadff06f",
00000595 => x"00012783",
00000596 => x"00410593",
00000597 => x"00478713",
00000598 => x"0007a503",
00000599 => x"00e12023",
00000600 => x"fe1ff06f",
00000601 => x"015c1663",
00000602 => x"00d00513",
00000603 => x"df5ff0ef",
00000604 => x"00140993",
00000605 => x"000c0513",
00000606 => x"f99ff06f",
00000607 => x"fc002573",
00000608 => x"01055513",
00000609 => x"00157513",
00000610 => x"00008067",
00000611 => x"f8a02223",
00000612 => x"00008067",
00000613 => x"0fb57693",
00000614 => x"00300713",
00000615 => x"00050793",
00000616 => x"00e68863",
00000617 => x"00b00713",
00000618 => x"00100513",
00000619 => x"00e79a63",
00000620 => x"00100513",
00000621 => x"00f517b3",
00000622 => x"3047a073",
00000623 => x"00000513",
00000624 => x"00008067",
00000625 => x"ff010113",
00000626 => x"00112623",
00000627 => x"00050593",
00000628 => x"fc102573",
00000629 => x"00f55513",
00000630 => x"02c000ef",
00000631 => x"00051863",
00000632 => x"00c12083",
00000633 => x"01010113",
00000634 => x"00008067",
00000635 => x"00000013",
00000636 => x"00000013",
00000637 => x"00000013",
00000638 => x"00000013",
00000639 => x"fff50513",
00000640 => x"fddff06f",
00000641 => x"00050613",
00000642 => x"00000513",
00000643 => x"0015f693",
00000644 => x"00068463",
00000645 => x"00c50533",
00000646 => x"0015d593",
00000647 => x"00161613",
00000648 => x"fe0596e3",
00000649 => x"00008067",
00000650 => x"06054063",
00000651 => x"0605c663",
00000652 => x"00058613",
00000653 => x"00050593",
00000654 => x"fff00513",
00000655 => x"02060c63",
00000656 => x"00100693",
00000657 => x"00b67a63",
00000658 => x"00c05863",
00000659 => x"00161613",
00000660 => x"00169693",
00000661 => x"feb66ae3",
00000662 => x"00000513",
00000663 => x"00c5e663",
00000664 => x"40c585b3",
00000665 => x"00d56533",
00000666 => x"0016d693",
00000667 => x"00165613",
00000668 => x"fe0696e3",
00000669 => x"00008067",
00000670 => x"00008293",
00000671 => x"fb5ff0ef",
00000672 => x"00058513",
00000673 => x"00028067",
00000674 => x"40a00533",
00000675 => x"0005d863",
00000676 => x"40b005b3",
00000677 => x"f9dff06f",
00000678 => x"40b005b3",
00000679 => x"00008293",
00000680 => x"f91ff0ef",
00000681 => x"40a00533",
00000682 => x"00028067",
00000683 => x"00008293",
00000684 => x"0005ca63",
00000685 => x"00054c63",
00000686 => x"f79ff0ef",
00000687 => x"00058513",
00000688 => x"00028067",
00000689 => x"40b005b3",
00000690 => x"fe0558e3",
00000691 => x"40a00533",
00000692 => x"f61ff0ef",
00000693 => x"40b00533",
00000694 => x"00028067",
00000695 => x"6e696c42",
00000696 => x"676e696b",
00000697 => x"44454c20",
00000698 => x"6d656420",
00000699 => x"7270206f",
00000700 => x"6172676f",
00000701 => x"00000a6d",
00000702 => x"3c3c0a0a",
00000703 => x"4f454e20",
00000704 => x"32335652",
00000705 => x"6e755220",
00000706 => x"656d6974",
00000707 => x"766e4520",
00000708 => x"6e6f7269",
00000709 => x"746e656d",
00000710 => x"0a3e3e20",
00000711 => x"00000000",
00000712 => x"74737953",
00000713 => x"74206d65",
00000714 => x"3a656d69",
00000715 => x"25783020",
00000716 => x"78255f78",
00000717 => x"0000000a",
00000718 => x"45544e49",
00000719 => x"50555252",
00000720 => x"00000054",
00000721 => x"45435845",
00000722 => x"4f495450",
00000723 => x"0000004e",
00000724 => x"20746120",
00000725 => x"74736e69",
00000726 => x"74637572",
00000727 => x"206e6f69",
00000728 => x"72646461",
00000729 => x"3a737365",
00000730 => x"25783020",
00000731 => x"00000a78",
00000732 => x"73756143",
00000733 => x"00203a65",
00000734 => x"74736e49",
00000735 => x"74637572",
00000736 => x"206e6f69",
00000737 => x"72646461",
00000738 => x"20737365",
00000739 => x"6173696d",
00000740 => x"6e67696c",
00000741 => x"00006465",
00000742 => x"74736e49",
00000743 => x"74637572",
00000744 => x"206e6f69",
00000745 => x"65636361",
00000746 => x"66207373",
00000747 => x"746c7561",
00000748 => x"00000000",
00000749 => x"656c6c49",
00000750 => x"206c6167",
00000751 => x"74736e69",
00000752 => x"74637572",
00000753 => x"006e6f69",
00000754 => x"7561460a",
00000755 => x"6e69746c",
00000756 => x"6e692067",
00000757 => x"75727473",
00000758 => x"6f697463",
00000759 => x"0000006e",
00000760 => x"61657242",
00000761 => x"696f706b",
00000762 => x"2820746e",
00000763 => x"45524245",
00000764 => x"00294b41",
00000765 => x"64616f4c",
00000766 => x"64646120",
00000767 => x"73736572",
00000768 => x"73696d20",
00000769 => x"67696c61",
00000770 => x"0064656e",
00000771 => x"64616f4c",
00000772 => x"63636120",
00000773 => x"20737365",
00000774 => x"6c756166",
00000775 => x"00000074",
00000776 => x"726f7453",
00000777 => x"64612065",
00000778 => x"73657264",
00000779 => x"696d2073",
00000780 => x"696c6173",
00000781 => x"64656e67",
00000782 => x"00000000",
00000783 => x"726f7453",
00000784 => x"63612065",
00000785 => x"73736563",
00000786 => x"75616620",
00000787 => x"0000746c",
00000788 => x"69766e45",
00000789 => x"6d6e6f72",
00000790 => x"20746e65",
00000791 => x"6c6c6163",
00000792 => x"43452820",
00000793 => x"294c4c41",
00000794 => x"00000000",
00000795 => x"6863614d",
00000796 => x"20656e69",
00000797 => x"74666f73",
00000798 => x"65726177",
00000799 => x"746e6920",
00000800 => x"75727265",
00000801 => x"00007470",
00000802 => x"6863614d",
00000803 => x"20656e69",
00000804 => x"656d6974",
00000805 => x"6e692072",
00000806 => x"72726574",
00000807 => x"20747075",
00000808 => x"61697628",
00000809 => x"49544d20",
00000810 => x"0029454d",
00000811 => x"6863614d",
00000812 => x"20656e69",
00000813 => x"65747865",
00000814 => x"6c616e72",
00000815 => x"746e6920",
00000816 => x"75727265",
00000817 => x"28207470",
00000818 => x"20616976",
00000819 => x"43494c43",
00000820 => x"00000029",
00000821 => x"6e6b6e55",
00000822 => x"206e776f",
00000823 => x"25783028",
00000824 => x"00002978",
00000825 => x"7830203a",
00000826 => x"000a7825",
00000827 => x"6e617254",
00000828 => x"202e6673",
00000829 => x"74736e69",
00000830 => x"74637572",
00000831 => x"3a6e6f69",
00000832 => x"25783020",
00000833 => x"00002078",
00000834 => x"63656428",
00000835 => x"72706d6f",
00000836 => x"65737365",
00000837 => x"000a2964",
00000838 => x"69797254",
00000839 => x"7420676e",
00000840 => x"6572206f",
00000841 => x"656d7573",
00000842 => x"70706120",
00000843 => x"6163696c",
00000844 => x"6e6f6974",
00000845 => x"30204020",
00000846 => x"2e782578",
00000847 => x"00002e2e",
00000848 => x"2f3c3c0a",
00000849 => x"524f454e",
00000850 => x"20323356",
00000851 => x"746e7552",
00000852 => x"20656d69",
00000853 => x"69766e45",
00000854 => x"6d6e6f72",
00000855 => x"20746e65",
00000856 => x"0a0a3e3e",
00000857 => x"00000000",
00000858 => x"7561460a",
00000859 => x"6e69746c",
00000860 => x"64612067",
00000861 => x"73657264",
00000862 => x"00000073",
00000863 => x"000003f0",
00000864 => x"00000408",
00000865 => x"00000414",
00000866 => x"00000490",
00000867 => x"0000049c",
00000868 => x"000004a8",
00000869 => x"000004b4",
00000870 => x"000004c0",
00000871 => x"000003dc",
00000872 => x"000003dc",
00000873 => x"000003dc",
00000874 => x"000004cc",
00000875 => x"33323130",
00000876 => x"37363534",
00000877 => x"00003938",
00000878 => x"33323130",
00000879 => x"37363534",
00000880 => x"62613938",
00000881 => x"66656463",
00000000 => x"00930001",
00000001 => x"81130000",
00000002 => x"01930000",
00000003 => x"82130001",
00000004 => x"02930001",
00000005 => x"83130002",
00000006 => x"03930002",
00000007 => x"84130003",
00000008 => x"04930003",
00000009 => x"85130004",
00000010 => x"05930004",
00000011 => x"86130005",
00000012 => x"06930005",
00000013 => x"87130006",
00000014 => x"07930006",
00000015 => x"88130007",
00000016 => x"08930007",
00000017 => x"89130008",
00000018 => x"09930008",
00000019 => x"8a130009",
00000020 => x"0a930009",
00000021 => x"8b13000a",
00000022 => x"0b93000a",
00000023 => x"8c13000b",
00000024 => x"0c93000b",
00000025 => x"8d13000c",
00000026 => x"0d93000c",
00000027 => x"8e13000d",
00000028 => x"0e93000d",
00000029 => x"8f13000e",
00000030 => x"0f93000e",
00000031 => x"0001000f",
00000032 => x"fc5025f3",
00000033 => x"fc702673",
00000034 => x"00c58133",
00000035 => x"04131171",
00000036 => x"01970001",
00000037 => x"81938000",
00000038 => x"05977ee1",
00000039 => x"85930000",
00000040 => x"90730925",
00000041 => x"25f33055",
00000042 => x"0617fc50",
00000043 => x"06130000",
00000044 => x"069314c6",
00000045 => x"c1900200",
00000046 => x"16fd0591",
00000047 => x"fed01de3",
00000048 => x"f8000593",
00000049 => x"0005a023",
00000050 => x"1de30591",
00000051 => x"55fdfeb0",
00000052 => x"f8b02c23",
00000053 => x"f8b02e23",
00000054 => x"80818593",
00000055 => x"82c18613",
00000056 => x"00c5d663",
00000057 => x"00058023",
00000058 => x"bfdd0585",
00000059 => x"00001597",
00000060 => x"0dc58593",
00000061 => x"80000617",
00000062 => x"f8c60613",
00000063 => x"80818693",
00000064 => x"00d65963",
00000065 => x"00058703",
00000066 => x"00e60023",
00000067 => x"06050585",
00000068 => x"0513bfc5",
00000069 => x"05930000",
00000070 => x"00ef0000",
00000071 => x"00730e00",
00000072 => x"70731050",
00000073 => x"00733004",
00000074 => x"a0011050",
00000075 => x"f8810113",
00000076 => x"c20ec006",
00000077 => x"c616c412",
00000078 => x"ca1ec81a",
00000079 => x"ce26cc22",
00000080 => x"d22ed02a",
00000081 => x"d636d432",
00000082 => x"da3ed83a",
00000083 => x"de46dc42",
00000084 => x"c2cec0ca",
00000085 => x"c6d6c4d2",
00000086 => x"cadec8da",
00000087 => x"cee6cce2",
00000088 => x"d2eed0ea",
00000089 => x"d6f6d4f2",
00000090 => x"dafed8fa",
00000091 => x"342022f3",
00000092 => x"00f2f313",
00000093 => x"20f3030a",
00000094 => x"9306fc50",
00000095 => x"341020f3",
00000096 => x"0002cd63",
00000097 => x"00009283",
00000098 => x"00300393",
00000099 => x"0072f2b3",
00000100 => x"96630089",
00000101 => x"00890072",
00000102 => x"0313a019",
00000103 => x"22830403",
00000104 => x"11710003",
00000105 => x"80e7c006",
00000106 => x"40820002",
00000107 => x"90730111",
00000108 => x"40823410",
00000109 => x"42224192",
00000110 => x"434242b2",
00000111 => x"446243d2",
00000112 => x"550244f2",
00000113 => x"56225592",
00000114 => x"574256b2",
00000115 => x"586257d2",
00000116 => x"490658f2",
00000117 => x"4a264996",
00000118 => x"4b464ab6",
00000119 => x"4c664bd6",
00000120 => x"5d064cf6",
00000121 => x"5e265d96",
00000122 => x"5f465eb6",
00000123 => x"01135fd6",
00000124 => x"00730781",
00000125 => x"80823020",
00000126 => x"71790000",
00000127 => x"d422d606",
00000128 => x"d04ad226",
00000129 => x"00efce4e",
00000130 => x"0a630870",
00000131 => x"00ef0c05",
00000132 => x"066325b0",
00000133 => x"00ef0c05",
00000134 => x"02637de0",
00000135 => x"65150c05",
00000136 => x"45814601",
00000137 => x"b0050513",
00000138 => x"06f000ef",
00000139 => x"557d55fd",
00000140 => x"7ce000ef",
00000141 => x"05136505",
00000142 => x"00efce85",
00000143 => x"00ef0db0",
00000144 => x"23997ae0",
00000145 => x"05136505",
00000146 => x"00efd045",
00000147 => x"45810cb0",
00000148 => x"67c00593",
00000149 => x"21d54501",
00000150 => x"842a4581",
00000151 => x"68a00593",
00000152 => x"29e14505",
00000153 => x"942a4581",
00000154 => x"69800593",
00000155 => x"21f14509",
00000156 => x"942a4581",
00000157 => x"6a600593",
00000158 => x"21c1450d",
00000159 => x"942a4581",
00000160 => x"6b400593",
00000161 => x"29554511",
00000162 => x"942a4581",
00000163 => x"6c200593",
00000164 => x"21654515",
00000165 => x"942a4581",
00000166 => x"6d000593",
00000167 => x"29714519",
00000168 => x"942a4581",
00000169 => x"6de00593",
00000170 => x"2941451d",
00000171 => x"942a4581",
00000172 => x"6ec00593",
00000173 => x"2151452d",
00000174 => x"942a4581",
00000175 => x"6fa00593",
00000176 => x"29a5454d",
00000177 => x"942a4581",
00000178 => x"71600593",
00000179 => x"21b5455d",
00000180 => x"cc11942a",
00000181 => x"05136505",
00000182 => x"00efd385",
00000183 => x"50b203b0",
00000184 => x"54925422",
00000185 => x"49f25902",
00000186 => x"61454501",
00000187 => x"45818082",
00000188 => x"70800593",
00000189 => x"00ef4501",
00000190 => x"842a17d0",
00000191 => x"6505c509",
00000192 => x"d4850513",
00000193 => x"6073bfd9",
00000194 => x"65053004",
00000195 => x"d6050513",
00000196 => x"8201a423",
00000197 => x"001000ef",
00000198 => x"0ff0000f",
00000199 => x"0000100f",
00000200 => x"8281a783",
00000201 => x"28078663",
00000202 => x"05136505",
00000203 => x"00efd705",
00000204 => x"49017e60",
00000205 => x"65054405",
00000206 => x"d7c50513",
00000207 => x"8201a423",
00000208 => x"7d4000ef",
00000209 => x"301027f3",
00000210 => x"91638b91",
00000211 => x"47892807",
00000212 => x"a7039782",
00000213 => x"57b78281",
00000214 => x"87931234",
00000215 => x"10636787",
00000216 => x"650526f7",
00000217 => x"d7850513",
00000218 => x"7ac000ef",
00000219 => x"a4230905",
00000220 => x"49898201",
00000221 => x"05136505",
00000222 => x"00efdb85",
00000223 => x"079379a0",
00000224 => x"9782f000",
00000225 => x"8281a703",
00000226 => x"aabb17b7",
00000227 => x"13378793",
00000228 => x"24f71563",
00000229 => x"05136505",
00000230 => x"00efd785",
00000231 => x"090577a0",
00000232 => x"05136505",
00000233 => x"a423dc85",
00000234 => x"00ef8201",
00000235 => x"07b776a0",
00000236 => x"87938000",
00000237 => x"80e70807",
00000238 => x"a7030007",
00000239 => x"27b78281",
00000240 => x"87930199",
00000241 => x"116303b7",
00000242 => x"650522f7",
00000243 => x"d7850513",
00000244 => x"744000ef",
00000245 => x"65050905",
00000246 => x"dd850513",
00000247 => x"8201a423",
00000248 => x"734000ef",
00000249 => x"a7039002",
00000250 => x"27b78281",
00000251 => x"87931232",
00000252 => x"12633307",
00000253 => x"650520f7",
00000254 => x"d7850513",
00000255 => x"718000ef",
00000256 => x"65050905",
00000257 => x"de850513",
00000258 => x"8201a423",
00000259 => x"708000ef",
00000260 => x"00202003",
00000261 => x"8281a703",
00000262 => x"babcd7b7",
00000263 => x"ccc78793",
00000264 => x"1ef71263",
00000265 => x"05136505",
00000266 => x"00efd785",
00000267 => x"09056ea0",
00000268 => x"05136505",
00000269 => x"a423df85",
00000270 => x"00ef8201",
00000271 => x"27836da0",
00000272 => x"c63ef000",
00000273 => x"8281a703",
00000274 => x"def737b7",
00000275 => x"8aa78793",
00000276 => x"1cf71163",
00000277 => x"05136505",
00000278 => x"00efd785",
00000279 => x"09056ba0",
00000280 => x"05136505",
00000281 => x"a423e085",
00000282 => x"00ef8201",
00000283 => x"21236aa0",
00000284 => x"a7030000",
00000285 => x"27b78281",
00000286 => x"8793ff09",
00000287 => x"11637dd7",
00000288 => x"65051af7",
00000289 => x"d7850513",
00000290 => x"68c000ef",
00000291 => x"65050905",
00000292 => x"e1850513",
00000293 => x"8201a423",
00000294 => x"67c000ef",
00000295 => x"f0002023",
00000296 => x"8281a703",
00000297 => x"200917b7",
00000298 => x"77778793",
00000299 => x"18f71163",
00000300 => x"05136505",
00000301 => x"00efd785",
00000302 => x"090565e0",
00000303 => x"05136505",
00000304 => x"a423e285",
00000305 => x"00ef8201",
00000306 => x"007364e0",
00000307 => x"a7030000",
00000308 => x"27b78281",
00000309 => x"87935566",
00000310 => x"11632447",
00000311 => x"650516f7",
00000312 => x"d7850513",
00000313 => x"630000ef",
00000314 => x"65050905",
00000315 => x"e3850513",
00000316 => x"8201a423",
00000317 => x"620000ef",
00000318 => x"34446073",
00000319 => x"00010001",
00000320 => x"8281a703",
00000321 => x"cdece7b7",
00000322 => x"ea978793",
00000323 => x"12f71f63",
00000324 => x"05136505",
00000325 => x"00efd785",
00000326 => x"09055fe0",
00000327 => x"05136505",
00000328 => x"a423e485",
00000329 => x"00ef8201",
00000330 => x"45015ee0",
00000331 => x"00ef4581",
00000332 => x"00014d00",
00000333 => x"00010001",
00000334 => x"a7030001",
00000335 => x"07b78281",
00000336 => x"87930013",
00000337 => x"1963a537",
00000338 => x"650510f7",
00000339 => x"d7850513",
00000340 => x"5c4000ef",
00000341 => x"65050905",
00000342 => x"e5850513",
00000343 => x"8201a423",
00000344 => x"5b4000ef",
00000345 => x"00ef4501",
00000346 => x"09ad7600",
00000347 => x"00010001",
00000348 => x"00010001",
00000349 => x"8281a703",
00000350 => x"eef337b7",
00000351 => x"08878793",
00000352 => x"0ef71363",
00000353 => x"05136505",
00000354 => x"00efd785",
00000355 => x"090558a0",
00000356 => x"86a26505",
00000357 => x"85ce864a",
00000358 => x"e6850513",
00000359 => x"8201a423",
00000360 => x"574000ef",
00000361 => x"0c041863",
00000362 => x"05136505",
00000363 => x"b335e8c5",
00000364 => x"05136505",
00000365 => x"00efd785",
00000366 => x"490555e0",
00000367 => x"6505bbad",
00000368 => x"d7050513",
00000369 => x"550000ef",
00000370 => x"b3550405",
00000371 => x"05136505",
00000372 => x"00efd8c5",
00000373 => x"49855420",
00000374 => x"6505bb71",
00000375 => x"d7050513",
00000376 => x"534000ef",
00000377 => x"bb6d0405",
00000378 => x"05136505",
00000379 => x"00efd705",
00000380 => x"04055260",
00000381 => x"6505b3cd",
00000382 => x"d7050513",
00000383 => x"518000ef",
00000384 => x"b5010405",
00000385 => x"05136505",
00000386 => x"00efd705",
00000387 => x"040550a0",
00000388 => x"6505b505",
00000389 => x"d7050513",
00000390 => x"4fc000ef",
00000391 => x"b5890405",
00000392 => x"05136505",
00000393 => x"00efd705",
00000394 => x"04054ee0",
00000395 => x"6505b58d",
00000396 => x"d7050513",
00000397 => x"4e0000ef",
00000398 => x"b5490405",
00000399 => x"05136505",
00000400 => x"00efd705",
00000401 => x"04054d20",
00000402 => x"6505b54d",
00000403 => x"d7050513",
00000404 => x"4c4000ef",
00000405 => x"b5d90405",
00000406 => x"05136505",
00000407 => x"00efd705",
00000408 => x"04054b60",
00000409 => x"6505bdcd",
00000410 => x"d7050513",
00000411 => x"4a8000ef",
00000412 => x"bf390405",
00000413 => x"05136505",
00000414 => x"b185e985",
00000415 => x"123457b7",
00000416 => x"67878793",
00000417 => x"82f1a423",
00000418 => x"17b78082",
00000419 => x"8793aabb",
00000420 => x"a4231337",
00000421 => x"808282f1",
00000422 => x"019927b7",
00000423 => x"03b78793",
00000424 => x"82f1a423",
00000425 => x"27b78082",
00000426 => x"87931232",
00000427 => x"a4233307",
00000428 => x"808282f1",
00000429 => x"babcd7b7",
00000430 => x"ccc78793",
00000431 => x"82f1a423",
00000432 => x"37b78082",
00000433 => x"8793def7",
00000434 => x"a4238aa7",
00000435 => x"808282f1",
00000436 => x"ff0927b7",
00000437 => x"7dd78793",
00000438 => x"82f1a423",
00000439 => x"17b78082",
00000440 => x"87932009",
00000441 => x"a4237777",
00000442 => x"808282f1",
00000443 => x"556627b7",
00000444 => x"24478793",
00000445 => x"82f1a423",
00000446 => x"e7b78082",
00000447 => x"8793cdec",
00000448 => x"a423ea97",
00000449 => x"808282f1",
00000450 => x"eef337b7",
00000451 => x"08878793",
00000452 => x"82f1a423",
00000453 => x"07b78082",
00000454 => x"87930013",
00000455 => x"557da537",
00000456 => x"a42355fd",
00000457 => x"ace182f1",
00000458 => x"6505c509",
00000459 => x"ea850513",
00000460 => x"6505a6d5",
00000461 => x"eb050513",
00000462 => x"1141bfe5",
00000463 => x"c226c422",
00000464 => x"479dc606",
00000465 => x"84ae842a",
00000466 => x"02a7f363",
00000467 => x"006347ad",
00000468 => x"47cd02f5",
00000469 => x"00f50b63",
00000470 => x"056347dd",
00000471 => x"47ed02f5",
00000472 => x"1c634505",
00000473 => x"452d00f4",
00000474 => x"450da011",
00000475 => x"2573297d",
00000476 => x"040afc50",
00000477 => x"c004942a",
00000478 => x"40b24501",
00000479 => x"44924422",
00000480 => x"80820141",
00000481 => x"b7dd451d",
00000482 => x"71796505",
00000483 => x"eb850513",
00000484 => x"d422d606",
00000485 => x"d04ad226",
00000486 => x"cc52ce4e",
00000487 => x"c85aca56",
00000488 => x"65052e95",
00000489 => x"eec50513",
00000490 => x"25f326b5",
00000491 => x"6505f140",
00000492 => x"f0c50513",
00000493 => x"65052685",
00000494 => x"f2450513",
00000495 => x"29732ea1",
00000496 => x"4b01f130",
00000497 => x"4a2559e1",
00000498 => x"44914a8d",
00000499 => x"033b0433",
00000500 => x"04614501",
00000501 => x"00895433",
00000502 => x"0ff47413",
00000503 => x"1c8a6f63",
00000504 => x"0513c511",
00000505 => x"75130305",
00000506 => x"26210ff5",
00000507 => x"03040513",
00000508 => x"0ff57513",
00000509 => x"05632cfd",
00000510 => x"0513015b",
00000511 => x"2cd502e0",
00000512 => x"15e30b05",
00000513 => x"25f3fc9b",
00000514 => x"6505f130",
00000515 => x"f3850513",
00000516 => x"65052611",
00000517 => x"f4450513",
00000518 => x"27f32cf5",
00000519 => x"83f93010",
00000520 => x"1a079463",
00000521 => x"05136505",
00000522 => x"24edf585",
00000523 => x"05136505",
00000524 => x"24cdf785",
00000525 => x"301025f3",
00000526 => x"49054401",
00000527 => x"17b344e9",
00000528 => x"8fed0089",
00000529 => x"0513cb99",
00000530 => x"75130414",
00000531 => x"c62e0ff5",
00000532 => x"0513244d",
00000533 => x"2c710200",
00000534 => x"040545b2",
00000535 => x"fe9411e3",
00000536 => x"05136505",
00000537 => x"247df8c5",
00000538 => x"05136505",
00000539 => x"245df945",
00000540 => x"fc002573",
00000541 => x"02057513",
00000542 => x"25f33d45",
00000543 => x"6505fc10",
00000544 => x"fa850513",
00000545 => x"65052c41",
00000546 => x"fc450513",
00000547 => x"25f32461",
00000548 => x"2673fc60",
00000549 => x"6505fc40",
00000550 => x"fe450513",
00000551 => x"65052ca5",
00000552 => x"00c50513",
00000553 => x"25732c85",
00000554 => x"8911fc00",
00000555 => x"65053db5",
00000556 => x"02450513",
00000557 => x"25732485",
00000558 => x"8921fc00",
00000559 => x"25f335b5",
00000560 => x"2673fc70",
00000561 => x"6505fc50",
00000562 => x"03c50513",
00000563 => x"650524a1",
00000564 => x"06450513",
00000565 => x"25732481",
00000566 => x"8941fc00",
00000567 => x"650535b1",
00000568 => x"07c50513",
00000569 => x"25732c05",
00000570 => x"8905fc00",
00000571 => x"65053d35",
00000572 => x"09450513",
00000573 => x"25732405",
00000574 => x"8909fc00",
00000575 => x"65053535",
00000576 => x"0ac50513",
00000577 => x"24732c01",
00000578 => x"6505fc00",
00000579 => x"0c050513",
00000580 => x"65412411",
00000581 => x"3d098d61",
00000582 => x"05136505",
00000583 => x"2add0cc5",
00000584 => x"00020537",
00000585 => x"35098d61",
00000586 => x"05136505",
00000587 => x"22dd0d85",
00000588 => x"00040537",
00000589 => x"3bcd8d61",
00000590 => x"05136505",
00000591 => x"2ad90e45",
00000592 => x"00080537",
00000593 => x"33cd8d61",
00000594 => x"05136505",
00000595 => x"22d90f05",
00000596 => x"00100537",
00000597 => x"3bc98d61",
00000598 => x"05136505",
00000599 => x"2a5d0fc5",
00000600 => x"00200537",
00000601 => x"33c98d61",
00000602 => x"05136505",
00000603 => x"225d1085",
00000604 => x"00400537",
00000605 => x"3b4d8d61",
00000606 => x"05136505",
00000607 => x"2a591145",
00000608 => x"00800537",
00000609 => x"334d8d61",
00000610 => x"05136505",
00000611 => x"22591205",
00000612 => x"01000537",
00000613 => x"3b498d61",
00000614 => x"05136505",
00000615 => x"2a9d12c5",
00000616 => x"02000537",
00000617 => x"54228d61",
00000618 => x"549250b2",
00000619 => x"49f25902",
00000620 => x"4ad24a62",
00000621 => x"61454b42",
00000622 => x"1459bb85",
00000623 => x"74130505",
00000624 => x"75130ff4",
00000625 => x"bd190ff5",
00000626 => x"89634705",
00000627 => x"470900e7",
00000628 => x"00e79a63",
00000629 => x"05136505",
00000630 => x"bd81f705",
00000631 => x"05136505",
00000632 => x"b5a1f605",
00000633 => x"05136505",
00000634 => x"b581f685",
00000635 => x"05136505",
00000636 => x"a2191385",
00000637 => x"fc002573",
00000638 => x"89058145",
00000639 => x"06938082",
00000640 => x"567df980",
00000641 => x"c288c290",
00000642 => x"8082c2cc",
00000643 => x"68051141",
00000644 => x"00058523",
00000645 => x"00544781",
00000646 => x"1ac80813",
00000647 => x"76334729",
00000648 => x"88b302e5",
00000649 => x"078500f6",
00000650 => x"46039642",
00000651 => x"55330006",
00000652 => x"802302e5",
00000653 => x"94e300c8",
00000654 => x"8636fee7",
00000655 => x"05134725",
00000656 => x"48030300",
00000657 => x"87ba0096",
00000658 => x"0742177d",
00000659 => x"17638341",
00000660 => x"04a300a8",
00000661 => x"167d0006",
00000662 => x"4781f76d",
00000663 => x"470197b6",
00000664 => x"0007c603",
00000665 => x"0513ca09",
00000666 => x"972e0017",
00000667 => x"00c70023",
00000668 => x"01051713",
00000669 => x"86138341",
00000670 => x"9763fff7",
00000671 => x"95ba00f6",
00000672 => x"00058023",
00000673 => x"80820141",
00000674 => x"bfd987b2",
00000675 => x"fc002573",
00000676 => x"89058149",
00000677 => x"20238082",
00000678 => x"26f3fa00",
00000679 => x"4701fc10",
00000680 => x"f5630506",
00000681 => x"668502a6",
00000682 => x"16f94781",
00000683 => x"02e6e763",
00000684 => x"89858a05",
00000685 => x"067a07e2",
00000686 => x"05f68fd1",
00000687 => x"8fd98fcd",
00000688 => x"10000737",
00000689 => x"20238fd9",
00000690 => x"8082faf0",
00000691 => x"00170793",
00000692 => x"01079713",
00000693 => x"83418e89",
00000694 => x"8513b7e9",
00000695 => x"7513ffe7",
00000696 => x"e5110fd5",
00000697 => x"0785830d",
00000698 => x"0ff7f793",
00000699 => x"8305b7c1",
00000700 => x"2e23bfdd",
00000701 => x"8082fea0",
00000702 => x"46b54729",
00000703 => x"00054783",
00000704 => x"e3910505",
00000705 => x"94638082",
00000706 => x"2e2300e7",
00000707 => x"2e23fed0",
00000708 => x"b7edfef0",
00000709 => x"d422715d",
00000710 => x"6405c2be",
00000711 => x"d226185c",
00000712 => x"cc52ce4e",
00000713 => x"c85aca56",
00000714 => x"d04ad606",
00000715 => x"dc32da2e",
00000716 => x"c0bade36",
00000717 => x"c6c6c4c2",
00000718 => x"0993c03e",
00000719 => x"4a290250",
00000720 => x"04934ab5",
00000721 => x"0b130730",
00000722 => x"04130750",
00000723 => x"47831b84",
00000724 => x"c39d0005",
00000725 => x"0d379463",
00000726 => x"00154783",
00000727 => x"00250913",
00000728 => x"06978563",
00000729 => x"02f4e463",
00000730 => x"06300713",
00000731 => x"06e78763",
00000732 => x"06900713",
00000733 => x"06e78c63",
00000734 => x"542250b2",
00000735 => x"59025492",
00000736 => x"4a6249f2",
00000737 => x"4b424ad2",
00000738 => x"80826161",
00000739 => x"09678163",
00000740 => x"07800713",
00000741 => x"fee792e3",
00000742 => x"00544782",
00000743 => x"438c8536",
00000744 => x"00478713",
00000745 => x"0613c03a",
00000746 => x"47010200",
00000747 => x"00e5d7b3",
00000748 => x"97a28bbd",
00000749 => x"0007c783",
00000750 => x"16fd0711",
00000751 => x"00f68423",
00000752 => x"fec716e3",
00000753 => x"00010623",
00000754 => x"4782a031",
00000755 => x"87134388",
00000756 => x"c03a0047",
00000757 => x"854a3715",
00000758 => x"4782bf9d",
00000759 => x"00478713",
00000760 => x"0007c783",
00000761 => x"2e23c03a",
00000762 => x"b7f5fef0",
00000763 => x"43884782",
00000764 => x"00478713",
00000765 => x"5863c03a",
00000766 => x"07930005",
00000767 => x"053302d0",
00000768 => x"2e2340a0",
00000769 => x"004cfef0",
00000770 => x"00483511",
00000771 => x"4782b7e1",
00000772 => x"8713004c",
00000773 => x"43880047",
00000774 => x"b7fdc03a",
00000775 => x"01479463",
00000776 => x"ff502e23",
00000777 => x"00150913",
00000778 => x"7693bf7d",
00000779 => x"470d0fb5",
00000780 => x"866387aa",
00000781 => x"472d00e6",
00000782 => x"98634505",
00000783 => x"450500e7",
00000784 => x"00f517b3",
00000785 => x"3047a073",
00000786 => x"80824501",
00000787 => x"f8800713",
00000788 => x"e693431c",
00000789 => x"c3140087",
00000790 => x"078a8b8d",
00000791 => x"80818713",
00000792 => x"a30397ba",
00000793 => x"83020007",
00000794 => x"fc002573",
00000795 => x"8905815d",
00000796 => x"479d8082",
00000797 => x"00a7fa63",
00000798 => x"80824505",
00000799 => x"40b24505",
00000800 => x"44924422",
00000801 => x"80820141",
00000802 => x"c2261141",
00000803 => x"658584ae",
00000804 => x"8593c422",
00000805 => x"842ac4c5",
00000806 => x"c606456d",
00000807 => x"a9fff0ef",
00000808 => x"1713fd71",
00000809 => x"87930024",
00000810 => x"97ba8081",
00000811 => x"2703c384",
00000812 => x"0421f880",
00000813 => x"97b34785",
00000814 => x"8fd90087",
00000815 => x"0107e793",
00000816 => x"f8f02423",
00000817 => x"479dbf6d",
00000818 => x"00a7ed63",
00000819 => x"f8802783",
00000820 => x"8d5d0542",
00000821 => x"000807b7",
00000822 => x"24238d5d",
00000823 => x"4501f8a0",
00000824 => x"45058082",
00000825 => x"00008082",
00000826 => x"2d2d0a0a",
00000827 => x"2d2d2d2d",
00000828 => x"55504320",
00000829 => x"53455420",
00000830 => x"2d2d2054",
00000831 => x"2d2d2d2d",
00000832 => x"00000a0a",
00000833 => x"454e0a0a",
00000834 => x"3356524f",
00000835 => x"78652032",
00000836 => x"74706563",
00000837 => x"736e6f69",
00000838 => x"646e6120",
00000839 => x"746e6920",
00000840 => x"75727265",
00000841 => x"20737470",
00000842 => x"74736574",
00000843 => x"6f727020",
00000844 => x"6d617267",
00000845 => x"00000a0a",
00000846 => x"74736e69",
00000847 => x"206c6c61",
00000848 => x"6f727265",
00000849 => x"000a2172",
00000850 => x"43494c43",
00000851 => x"736e6920",
00000852 => x"6c6c6174",
00000853 => x"72726520",
00000854 => x"0a21726f",
00000855 => x"00000000",
00000856 => x"434e4546",
00000857 => x"492e2845",
00000858 => x"20203a29",
00000859 => x"00000020",
00000860 => x"6c696166",
00000861 => x"0000000a",
00000862 => x"000a6b6f",
00000863 => x"20435845",
00000864 => x"4c415f49",
00000865 => x"3a4e4749",
00000866 => x"00000020",
00000867 => x"70696b73",
00000868 => x"20646570",
00000869 => x"746f6e28",
00000870 => x"736f7020",
00000871 => x"6c626973",
00000872 => x"68772065",
00000873 => x"43206e65",
00000874 => x"5458452d",
00000875 => x"616e6520",
00000876 => x"64656c62",
00000877 => x"00000a29",
00000878 => x"20435845",
00000879 => x"43415f49",
00000880 => x"20203a43",
00000881 => x"00000020",
00000882 => x"20435845",
00000883 => x"4c495f49",
00000884 => x"3a47454c",
00000885 => x"00000020",
00000886 => x"20435845",
00000887 => x"41455242",
00000888 => x"20203a4b",
00000889 => x"00000020",
00000890 => x"20435845",
00000891 => x"4c415f4c",
00000892 => x"3a4e4749",
00000893 => x"00000020",
00000894 => x"20435845",
00000895 => x"43415f4c",
00000896 => x"20203a43",
00000897 => x"00000020",
00000898 => x"20435845",
00000899 => x"4c415f53",
00000900 => x"3a4e4749",
00000901 => x"00000020",
00000902 => x"20435845",
00000903 => x"43415f53",
00000904 => x"20203a43",
00000905 => x"00000020",
00000906 => x"20435845",
00000907 => x"43564e45",
00000908 => x"3a4c4c41",
00000909 => x"00000020",
00000910 => x"20515249",
00000911 => x"3a49534d",
00000912 => x"20202020",
00000913 => x"00000020",
00000914 => x"20515249",
00000915 => x"3a49544d",
00000916 => x"20202020",
00000917 => x"00000020",
00000918 => x"20515249",
00000919 => x"3a49454d",
00000920 => x"20202020",
00000921 => x"00000020",
00000922 => x"65540a0a",
00000923 => x"3a737473",
00000924 => x"0a692520",
00000925 => x"203a4b4f",
00000926 => x"25202020",
00000927 => x"41460a69",
00000928 => x"203a4c49",
00000929 => x"0a692520",
00000930 => x"0000000a",
00000931 => x"54534554",
00000932 => x"214b4f20",
00000933 => x"0000000a",
00000934 => x"54534554",
00000935 => x"49414620",
00000936 => x"2144454c",
00000937 => x"0000000a",
00000938 => x"65757254",
00000939 => x"0000000a",
00000940 => x"736c6146",
00000941 => x"00000a65",
00000942 => x"3c3c0a0a",
00000943 => x"4f454e20",
00000944 => x"32335652",
00000945 => x"72614820",
00000946 => x"72617764",
00000947 => x"6f432065",
00000948 => x"6769666e",
00000949 => x"74617275",
00000950 => x"206e6f69",
00000951 => x"7265764f",
00000952 => x"77656976",
00000953 => x"0a3e3e20",
00000954 => x"00000000",
00000955 => x"202d2d0a",
00000956 => x"746e6543",
00000957 => x"206c6172",
00000958 => x"636f7250",
00000959 => x"69737365",
00000960 => x"5520676e",
00000961 => x"2074696e",
00000962 => x"000a2d2d",
00000963 => x"74726148",
00000964 => x"3a444920",
00000965 => x"20202020",
00000966 => x"20202020",
00000967 => x"78302020",
00000968 => x"000a7825",
00000969 => x"64726148",
00000970 => x"65726177",
00000971 => x"72657620",
00000972 => x"6e6f6973",
00000973 => x"0000203a",
00000974 => x"78302820",
00000975 => x"0a297825",
00000976 => x"00000000",
00000977 => x"68637241",
00000978 => x"63657469",
00000979 => x"65727574",
00000980 => x"2020203a",
00000981 => x"00002020",
00000982 => x"6e6b6e75",
00000983 => x"006e776f",
00000984 => x"32335652",
00000985 => x"00000000",
00000986 => x"32315652",
00000987 => x"00000038",
00000988 => x"34365652",
00000989 => x"00000000",
00000990 => x"5550430a",
00000991 => x"74786520",
00000992 => x"69736e65",
00000993 => x"3a736e6f",
00000994 => x"00202020",
00000995 => x"25783028",
00000996 => x"000a2978",
00000997 => x"20544e43",
00000998 => x"69742026",
00000999 => x"4320656d",
00001000 => x"3a735253",
00001001 => x"00002020",
00001002 => x"636f6c43",
00001003 => x"7073206b",
00001004 => x"3a646565",
00001005 => x"20202020",
00001006 => x"75252020",
00001007 => x"0a7a4820",
00001008 => x"00000000",
00001009 => x"202d2d0a",
00001010 => x"6f6d654d",
00001011 => x"43207972",
00001012 => x"69666e6f",
00001013 => x"61727567",
00001014 => x"6e6f6974",
00001015 => x"0a2d2d20",
00001016 => x"00000000",
00001017 => x"74736e49",
00001018 => x"74637572",
00001019 => x"206e6f69",
00001020 => x"6f6d656d",
00001021 => x"203a7972",
00001022 => x"75252020",
00001023 => x"74796220",
00001024 => x"40207365",
00001025 => x"25783020",
00001026 => x"00000a78",
00001027 => x"65746e49",
00001028 => x"6c616e72",
00001029 => x"454d4920",
00001030 => x"20203a4d",
00001031 => x"20202020",
00001032 => x"00002020",
00001033 => x"65746e49",
00001034 => x"6c616e72",
00001035 => x"454d4920",
00001036 => x"7361204d",
00001037 => x"4d4f5220",
00001038 => x"0000203a",
00001039 => x"61746144",
00001040 => x"6d656d20",
00001041 => x"3a79726f",
00001042 => x"20202020",
00001043 => x"20202020",
00001044 => x"75252020",
00001045 => x"74796220",
00001046 => x"40207365",
00001047 => x"25783020",
00001048 => x"00000a78",
00001049 => x"65746e49",
00001050 => x"6c616e72",
00001051 => x"454d4420",
00001052 => x"20203a4d",
00001053 => x"20202020",
00001054 => x"00002020",
00001055 => x"746f6f42",
00001056 => x"64616f6c",
00001057 => x"203a7265",
00001058 => x"20202020",
00001059 => x"20202020",
00001060 => x"00002020",
00001061 => x"65747845",
00001062 => x"6c616e72",
00001063 => x"746e6920",
00001064 => x"61667265",
00001065 => x"203a6563",
00001066 => x"00002020",
00001067 => x"202d2d0a",
00001068 => x"69726550",
00001069 => x"72656870",
00001070 => x"20736c61",
00001071 => x"000a2d2d",
00001072 => x"4f495047",
00001073 => x"2020203a",
00001074 => x"00000020",
00001075 => x"4d49544d",
00001076 => x"20203a45",
00001077 => x"00000020",
00001078 => x"54524155",
00001079 => x"2020203a",
00001080 => x"00000020",
00001081 => x"3a495053",
00001082 => x"20202020",
00001083 => x"00000020",
00001084 => x"3a495754",
00001085 => x"20202020",
00001086 => x"00000020",
00001087 => x"3a4d5750",
00001088 => x"20202020",
00001089 => x"00000020",
00001090 => x"3a544457",
00001091 => x"20202020",
00001092 => x"00000020",
00001093 => x"43494c43",
00001094 => x"2020203a",
00001095 => x"00000020",
00001096 => x"474e5254",
00001097 => x"2020203a",
00001098 => x"00000020",
00001099 => x"4e564544",
00001100 => x"3a4c4c55",
00001101 => x"00000020",
00001102 => x"68540a0a",
00001103 => x"454e2065",
00001104 => x"3356524f",
00001105 => x"72502032",
00001106 => x"7365636f",
00001107 => x"20726f73",
00001108 => x"6a6f7250",
00001109 => x"0a746365",
00001110 => x"53207962",
00001111 => x"68706574",
00001112 => x"4e206e61",
00001113 => x"69746c6f",
00001114 => x"680a676e",
00001115 => x"73707474",
00001116 => x"672f2f3a",
00001117 => x"75687469",
00001118 => x"6f632e62",
00001119 => x"74732f6d",
00001120 => x"746c6f6e",
00001121 => x"2f676e69",
00001122 => x"726f656e",
00001123 => x"0a323376",
00001124 => x"6564616d",
00001125 => x"206e6920",
00001126 => x"6e6e6148",
00001127 => x"7265766f",
00001128 => x"6547202c",
00001129 => x"6e616d72",
00001130 => x"000a0a79",
00001131 => x"33323130",
00001132 => x"37363534",
00001133 => x"00003938",
00001134 => x"33323130",
00001135 => x"37363534",
00001136 => x"62613938",
00001137 => x"66656463",
00001138 => x"dead007f",
00001139 => x"00008067",
others => x"00000000"
);
 
/rtl/core/neorv32_bootloader_image.vhd
41,982 → 41,988
00000030 => x"00410113",
00000031 => x"30200073",
00000032 => x"fd010113",
00000033 => x"02112623",
00000034 => x"02812423",
00000035 => x"02912223",
00000036 => x"03212023",
00000037 => x"01312e23",
00000038 => x"01412c23",
00000039 => x"01512a23",
00000040 => x"01612823",
00000041 => x"01712623",
00000042 => x"01812423",
00000043 => x"4ed000ef",
00000044 => x"4c1000ef",
00000045 => x"429000ef",
00000046 => x"299000ef",
00000047 => x"4c9000ef",
00000048 => x"281000ef",
00000049 => x"fc102473",
00000050 => x"026267b7",
00000051 => x"9ff78793",
00000052 => x"00000713",
00000053 => x"00000693",
00000054 => x"00000613",
00000055 => x"00000593",
00000056 => x"00200513",
00000057 => x"0087f463",
00000058 => x"00400513",
00000059 => x"3a5000ef",
00000060 => x"00005537",
00000061 => x"00000613",
00000062 => x"00000593",
00000063 => x"b0050513",
00000064 => x"28d000ef",
00000065 => x"265000ef",
00000066 => x"00245793",
00000067 => x"00a78533",
00000068 => x"00f537b3",
00000069 => x"00b785b3",
00000070 => x"25d000ef",
00000071 => x"ffff07b7",
00000072 => x"42878793",
00000073 => x"30579073",
00000074 => x"08000793",
00000075 => x"30479073",
00000076 => x"30046073",
00000077 => x"00100513",
00000078 => x"431000ef",
00000079 => x"00000793",
00000080 => x"34079073",
00000081 => x"ffff1537",
00000082 => x"edc50513",
00000083 => x"2ed000ef",
00000084 => x"3d0000ef",
00000085 => x"ffff1537",
00000086 => x"f1450513",
00000087 => x"2dd000ef",
00000088 => x"fc102573",
00000089 => x"254000ef",
00000090 => x"ffff1537",
00000091 => x"f1c50513",
00000092 => x"2c9000ef",
00000093 => x"f1402573",
00000094 => x"240000ef",
00000095 => x"ffff1537",
00000096 => x"f2850513",
00000097 => x"2b5000ef",
00000098 => x"30102573",
00000099 => x"22c000ef",
00000100 => x"ffff1537",
00000101 => x"f3050513",
00000102 => x"2a1000ef",
00000103 => x"fc002573",
00000104 => x"218000ef",
00000105 => x"ffff1537",
00000106 => x"f3850513",
00000107 => x"28d000ef",
00000108 => x"fc602573",
00000109 => x"ffff14b7",
00000110 => x"200000ef",
00000111 => x"f4048513",
00000112 => x"279000ef",
00000113 => x"fc402573",
00000114 => x"1f0000ef",
00000115 => x"ffff1537",
00000116 => x"f4c50513",
00000117 => x"265000ef",
00000118 => x"fc702573",
00000119 => x"1dc000ef",
00000120 => x"f4048513",
00000121 => x"255000ef",
00000122 => x"fc502573",
00000123 => x"1cc000ef",
00000124 => x"ffff1537",
00000125 => x"f5450513",
00000126 => x"241000ef",
00000127 => x"00341413",
00000128 => x"00000493",
00000129 => x"ffff1937",
00000130 => x"fa402783",
00000131 => x"0607d063",
00000132 => x"ffff1537",
00000133 => x"f8050513",
00000134 => x"221000ef",
00000135 => x"ffff1937",
00000136 => x"0f4000ef",
00000137 => x"ffff19b7",
00000138 => x"07200a13",
00000139 => x"06800a93",
00000140 => x"07500b13",
00000141 => x"07300b93",
00000142 => x"ffff14b7",
00000143 => x"ffff1c37",
00000144 => x"f8c90513",
00000145 => x"1f5000ef",
00000146 => x"1e1000ef",
00000147 => x"00050413",
00000148 => x"1c9000ef",
00000149 => x"f7c98513",
00000150 => x"1e1000ef",
00000151 => x"09440263",
00000152 => x"03541863",
00000153 => x"0b0000ef",
00000154 => x"fd9ff06f",
00000155 => x"0fd000ef",
00000156 => x"00b49463",
00000157 => x"f8856ae3",
00000158 => x"00100513",
00000159 => x"508000ef",
00000160 => x"f7c90513",
00000161 => x"1b5000ef",
00000162 => x"098000ef",
00000163 => x"f7dff06f",
00000164 => x"00000513",
00000165 => x"01640e63",
00000166 => x"01741663",
00000167 => x"72c000ef",
00000168 => x"fa1ff06f",
00000169 => x"06c00793",
00000170 => x"00f41863",
00000171 => x"00100513",
00000172 => x"4d4000ef",
00000173 => x"f8dff06f",
00000174 => x"06500793",
00000175 => x"00f41663",
00000176 => x"060000ef",
00000177 => x"f7dff06f",
00000178 => x"03f00793",
00000179 => x"f94c0513",
00000180 => x"00f40463",
00000181 => x"fa848513",
00000182 => x"161000ef",
00000183 => x"f65ff06f",
00000184 => x"02c12083",
00000185 => x"02812403",
00000186 => x"02412483",
00000187 => x"02012903",
00000188 => x"01c12983",
00000189 => x"01812a03",
00000190 => x"01412a83",
00000191 => x"01012b03",
00000192 => x"00c12b83",
00000193 => x"00812c03",
00000194 => x"00000513",
00000195 => x"03010113",
00000196 => x"00008067",
00000197 => x"ffff1537",
00000198 => x"dac50513",
00000199 => x"11d0006f",
00000200 => x"340027f3",
00000201 => x"00079863",
00000202 => x"ffff1537",
00000203 => x"e1050513",
00000204 => x"1090006f",
00000205 => x"ff010113",
00000206 => x"00112623",
00000207 => x"30047073",
00000208 => x"00000793",
00000209 => x"30479073",
00000210 => x"ffff1537",
00000211 => x"e2c50513",
00000212 => x"0e9000ef",
00000213 => x"fa002783",
00000214 => x"fe07cee3",
00000215 => x"fc4027f3",
00000216 => x"00078067",
00000217 => x"ff9ff06f",
00000218 => x"ff010113",
00000219 => x"00812423",
00000220 => x"00050413",
00000221 => x"ffff1537",
00000222 => x"e3c50513",
00000223 => x"00112623",
00000224 => x"0b9000ef",
00000225 => x"00500793",
00000226 => x"0287e063",
00000227 => x"03040513",
00000228 => x"0ff57513",
00000229 => x"085000ef",
00000230 => x"30047073",
00000231 => x"00100513",
00000232 => x"1c9000ef",
00000233 => x"0000006f",
00000234 => x"ffff1537",
00000235 => x"e4450513",
00000236 => x"089000ef",
00000237 => x"fe5ff06f",
00000238 => x"fe010113",
00000239 => x"01212823",
00000240 => x"00050913",
00000241 => x"ffff1537",
00000242 => x"00912a23",
00000243 => x"e4c50513",
00000244 => x"ffff14b7",
00000245 => x"00812c23",
00000246 => x"01312623",
00000247 => x"00112e23",
00000248 => x"01c00413",
00000249 => x"055000ef",
00000250 => x"fb448493",
00000251 => x"ffc00993",
00000252 => x"008957b3",
00000253 => x"00f7f793",
00000254 => x"00f487b3",
00000255 => x"0007c503",
00000256 => x"ffc40413",
00000257 => x"015000ef",
00000258 => x"ff3414e3",
00000259 => x"01c12083",
00000260 => x"01812403",
00000261 => x"01412483",
00000262 => x"01012903",
00000263 => x"00c12983",
00000264 => x"02010113",
00000265 => x"00008067",
00000266 => x"fb010113",
00000267 => x"04112623",
00000268 => x"04512423",
00000269 => x"04612223",
00000270 => x"04712023",
00000271 => x"02812e23",
00000272 => x"02a12c23",
00000273 => x"02b12a23",
00000274 => x"02c12823",
00000275 => x"02d12623",
00000276 => x"02e12423",
00000277 => x"02f12223",
00000278 => x"03012023",
00000279 => x"01112e23",
00000280 => x"01c12c23",
00000281 => x"01d12a23",
00000282 => x"01e12823",
00000283 => x"01f12623",
00000284 => x"34202473",
00000285 => x"800007b7",
00000286 => x"00778793",
00000287 => x"02f40a63",
00000288 => x"ffff1537",
00000289 => x"e5050513",
00000290 => x"7b0000ef",
00000291 => x"00040513",
00000292 => x"f29ff0ef",
00000293 => x"ffff1537",
00000294 => x"e6050513",
00000295 => x"79c000ef",
00000296 => x"34102573",
00000297 => x"f15ff0ef",
00000298 => x"00500513",
00000299 => x"ebdff0ef",
00000300 => x"00000513",
00000301 => x"095000ef",
00000302 => x"6b0000ef",
00000303 => x"fc1027f3",
00000304 => x"0027d793",
00000305 => x"00a78533",
00000306 => x"00f537b3",
00000307 => x"00b785b3",
00000308 => x"6a4000ef",
00000309 => x"03c12403",
00000310 => x"04c12083",
00000311 => x"04812283",
00000312 => x"04412303",
00000313 => x"04012383",
00000314 => x"03812503",
00000315 => x"03412583",
00000316 => x"03012603",
00000317 => x"02c12683",
00000318 => x"02812703",
00000319 => x"02412783",
00000320 => x"02012803",
00000321 => x"01c12883",
00000322 => x"01812e03",
00000323 => x"01412e83",
00000324 => x"01012f03",
00000325 => x"00c12f83",
00000326 => x"05010113",
00000327 => x"30200073",
00000328 => x"fe010113",
00000329 => x"00112e23",
00000330 => x"00812c23",
00000331 => x"00912a23",
00000332 => x"01212823",
00000333 => x"01312623",
00000334 => x"01412423",
00000335 => x"01512223",
00000336 => x"f1302973",
00000337 => x"00000a93",
00000338 => x"00900993",
00000339 => x"00300a13",
00000340 => x"00400493",
00000341 => x"41500433",
00000342 => x"00341413",
00000343 => x"01840413",
00000344 => x"00895433",
00000345 => x"0ff47413",
00000346 => x"00000513",
00000347 => x"0489ec63",
00000348 => x"00050863",
00000349 => x"03050513",
00000350 => x"0ff57513",
00000351 => x"69c000ef",
00000352 => x"03040513",
00000033 => x"00000513",
00000034 => x"00000593",
00000035 => x"02112623",
00000036 => x"02812423",
00000037 => x"02912223",
00000038 => x"03212023",
00000039 => x"01312e23",
00000040 => x"01412c23",
00000041 => x"01512a23",
00000042 => x"01612823",
00000043 => x"01712623",
00000044 => x"01812423",
00000045 => x"2c1000ef",
00000046 => x"4f9000ef",
00000047 => x"4cd000ef",
00000048 => x"435000ef",
00000049 => x"299000ef",
00000050 => x"4d5000ef",
00000051 => x"281000ef",
00000052 => x"fc102473",
00000053 => x"026267b7",
00000054 => x"9ff78793",
00000055 => x"00000713",
00000056 => x"00000693",
00000057 => x"00000613",
00000058 => x"00000593",
00000059 => x"00200513",
00000060 => x"0087f463",
00000061 => x"00400513",
00000062 => x"3b1000ef",
00000063 => x"00005537",
00000064 => x"00000613",
00000065 => x"00000593",
00000066 => x"b0050513",
00000067 => x"299000ef",
00000068 => x"271000ef",
00000069 => x"00245793",
00000070 => x"00a78533",
00000071 => x"00f537b3",
00000072 => x"00b785b3",
00000073 => x"269000ef",
00000074 => x"ffff07b7",
00000075 => x"43478793",
00000076 => x"30579073",
00000077 => x"08000793",
00000078 => x"30479073",
00000079 => x"30046073",
00000080 => x"00100513",
00000081 => x"43d000ef",
00000082 => x"00000793",
00000083 => x"34079073",
00000084 => x"ffff1537",
00000085 => x"ef450513",
00000086 => x"2f9000ef",
00000087 => x"3d0000ef",
00000088 => x"ffff1537",
00000089 => x"f2c50513",
00000090 => x"2e9000ef",
00000091 => x"fc102573",
00000092 => x"254000ef",
00000093 => x"ffff1537",
00000094 => x"f3450513",
00000095 => x"2d5000ef",
00000096 => x"f1402573",
00000097 => x"240000ef",
00000098 => x"ffff1537",
00000099 => x"f4050513",
00000100 => x"2c1000ef",
00000101 => x"30102573",
00000102 => x"22c000ef",
00000103 => x"ffff1537",
00000104 => x"f4850513",
00000105 => x"2ad000ef",
00000106 => x"fc002573",
00000107 => x"218000ef",
00000108 => x"ffff1537",
00000109 => x"f5050513",
00000110 => x"299000ef",
00000111 => x"fc602573",
00000112 => x"ffff14b7",
00000113 => x"200000ef",
00000114 => x"f5848513",
00000115 => x"285000ef",
00000116 => x"fc402573",
00000117 => x"1f0000ef",
00000118 => x"ffff1537",
00000119 => x"f6450513",
00000120 => x"271000ef",
00000121 => x"fc702573",
00000122 => x"1dc000ef",
00000123 => x"f5848513",
00000124 => x"261000ef",
00000125 => x"fc502573",
00000126 => x"1cc000ef",
00000127 => x"ffff1537",
00000128 => x"f6c50513",
00000129 => x"24d000ef",
00000130 => x"00341413",
00000131 => x"00000493",
00000132 => x"ffff1937",
00000133 => x"fa402783",
00000134 => x"0607d063",
00000135 => x"ffff1537",
00000136 => x"f9850513",
00000137 => x"22d000ef",
00000138 => x"ffff1937",
00000139 => x"0f4000ef",
00000140 => x"ffff19b7",
00000141 => x"07200a13",
00000142 => x"06800a93",
00000143 => x"07500b13",
00000144 => x"07300b93",
00000145 => x"ffff14b7",
00000146 => x"ffff1c37",
00000147 => x"fa490513",
00000148 => x"201000ef",
00000149 => x"1ed000ef",
00000150 => x"00050413",
00000151 => x"1d5000ef",
00000152 => x"f9498513",
00000153 => x"1ed000ef",
00000154 => x"09440263",
00000155 => x"03541863",
00000156 => x"0b0000ef",
00000157 => x"fd9ff06f",
00000158 => x"109000ef",
00000159 => x"00b49463",
00000160 => x"f8856ae3",
00000161 => x"00100513",
00000162 => x"508000ef",
00000163 => x"f9490513",
00000164 => x"1c1000ef",
00000165 => x"098000ef",
00000166 => x"f7dff06f",
00000167 => x"00000513",
00000168 => x"01640e63",
00000169 => x"01741663",
00000170 => x"72c000ef",
00000171 => x"fa1ff06f",
00000172 => x"06c00793",
00000173 => x"00f41863",
00000174 => x"00100513",
00000175 => x"4d4000ef",
00000176 => x"f8dff06f",
00000177 => x"06500793",
00000178 => x"00f41663",
00000179 => x"060000ef",
00000180 => x"f7dff06f",
00000181 => x"03f00793",
00000182 => x"facc0513",
00000183 => x"00f40463",
00000184 => x"fc048513",
00000185 => x"16d000ef",
00000186 => x"f65ff06f",
00000187 => x"02c12083",
00000188 => x"02812403",
00000189 => x"02412483",
00000190 => x"02012903",
00000191 => x"01c12983",
00000192 => x"01812a03",
00000193 => x"01412a83",
00000194 => x"01012b03",
00000195 => x"00c12b83",
00000196 => x"00812c03",
00000197 => x"00000513",
00000198 => x"03010113",
00000199 => x"00008067",
00000200 => x"ffff1537",
00000201 => x"dc450513",
00000202 => x"1290006f",
00000203 => x"340027f3",
00000204 => x"00079863",
00000205 => x"ffff1537",
00000206 => x"e2850513",
00000207 => x"1150006f",
00000208 => x"ff010113",
00000209 => x"00112623",
00000210 => x"30047073",
00000211 => x"00000793",
00000212 => x"30479073",
00000213 => x"ffff1537",
00000214 => x"e4450513",
00000215 => x"0f5000ef",
00000216 => x"fa002783",
00000217 => x"fe07cee3",
00000218 => x"fc4027f3",
00000219 => x"00078067",
00000220 => x"ff9ff06f",
00000221 => x"ff010113",
00000222 => x"00812423",
00000223 => x"00050413",
00000224 => x"ffff1537",
00000225 => x"e5450513",
00000226 => x"00112623",
00000227 => x"0c5000ef",
00000228 => x"00500793",
00000229 => x"0287e063",
00000230 => x"03040513",
00000231 => x"0ff57513",
00000232 => x"091000ef",
00000233 => x"30047073",
00000234 => x"00100513",
00000235 => x"1d5000ef",
00000236 => x"0000006f",
00000237 => x"ffff1537",
00000238 => x"e5c50513",
00000239 => x"095000ef",
00000240 => x"fe5ff06f",
00000241 => x"fe010113",
00000242 => x"01212823",
00000243 => x"00050913",
00000244 => x"ffff1537",
00000245 => x"00912a23",
00000246 => x"e6450513",
00000247 => x"ffff14b7",
00000248 => x"00812c23",
00000249 => x"01312623",
00000250 => x"00112e23",
00000251 => x"01c00413",
00000252 => x"061000ef",
00000253 => x"fcc48493",
00000254 => x"ffc00993",
00000255 => x"008957b3",
00000256 => x"00f7f793",
00000257 => x"00f487b3",
00000258 => x"0007c503",
00000259 => x"ffc40413",
00000260 => x"021000ef",
00000261 => x"ff3414e3",
00000262 => x"01c12083",
00000263 => x"01812403",
00000264 => x"01412483",
00000265 => x"01012903",
00000266 => x"00c12983",
00000267 => x"02010113",
00000268 => x"00008067",
00000269 => x"fb010113",
00000270 => x"04112623",
00000271 => x"04512423",
00000272 => x"04612223",
00000273 => x"04712023",
00000274 => x"02812e23",
00000275 => x"02a12c23",
00000276 => x"02b12a23",
00000277 => x"02c12823",
00000278 => x"02d12623",
00000279 => x"02e12423",
00000280 => x"02f12223",
00000281 => x"03012023",
00000282 => x"01112e23",
00000283 => x"01c12c23",
00000284 => x"01d12a23",
00000285 => x"01e12823",
00000286 => x"01f12623",
00000287 => x"34202473",
00000288 => x"800007b7",
00000289 => x"00778793",
00000290 => x"02f40a63",
00000291 => x"ffff1537",
00000292 => x"e6850513",
00000293 => x"7bc000ef",
00000294 => x"00040513",
00000295 => x"f29ff0ef",
00000296 => x"ffff1537",
00000297 => x"e7850513",
00000298 => x"7a8000ef",
00000299 => x"34102573",
00000300 => x"f15ff0ef",
00000301 => x"00500513",
00000302 => x"ebdff0ef",
00000303 => x"00000513",
00000304 => x"0a1000ef",
00000305 => x"6bc000ef",
00000306 => x"fc1027f3",
00000307 => x"0027d793",
00000308 => x"00a78533",
00000309 => x"00f537b3",
00000310 => x"00b785b3",
00000311 => x"6b0000ef",
00000312 => x"03c12403",
00000313 => x"04c12083",
00000314 => x"04812283",
00000315 => x"04412303",
00000316 => x"04012383",
00000317 => x"03812503",
00000318 => x"03412583",
00000319 => x"03012603",
00000320 => x"02c12683",
00000321 => x"02812703",
00000322 => x"02412783",
00000323 => x"02012803",
00000324 => x"01c12883",
00000325 => x"01812e03",
00000326 => x"01412e83",
00000327 => x"01012f03",
00000328 => x"00c12f83",
00000329 => x"05010113",
00000330 => x"30200073",
00000331 => x"fe010113",
00000332 => x"00112e23",
00000333 => x"00812c23",
00000334 => x"00912a23",
00000335 => x"01212823",
00000336 => x"01312623",
00000337 => x"01412423",
00000338 => x"01512223",
00000339 => x"f1302973",
00000340 => x"00000a93",
00000341 => x"00900993",
00000342 => x"00300a13",
00000343 => x"00400493",
00000344 => x"41500433",
00000345 => x"00341413",
00000346 => x"01840413",
00000347 => x"00895433",
00000348 => x"0ff47413",
00000349 => x"00000513",
00000350 => x"0489ec63",
00000351 => x"00050863",
00000352 => x"03050513",
00000353 => x"0ff57513",
00000354 => x"690000ef",
00000355 => x"014a8663",
00000356 => x"02e00513",
00000357 => x"684000ef",
00000358 => x"001a8a93",
00000359 => x"fa9a9ce3",
00000360 => x"01c12083",
00000361 => x"01812403",
00000362 => x"01412483",
00000363 => x"01012903",
00000364 => x"00c12983",
00000365 => x"00812a03",
00000366 => x"00412a83",
00000367 => x"02010113",
00000368 => x"00008067",
00000369 => x"ff640413",
00000370 => x"00150513",
00000371 => x"0ff47413",
00000372 => x"0ff57513",
00000373 => x"f99ff06f",
00000374 => x"ff010113",
00000375 => x"00000513",
00000376 => x"00112623",
00000377 => x"00812423",
00000378 => x"708000ef",
00000379 => x"00500513",
00000380 => x"744000ef",
00000381 => x"00000513",
00000382 => x"73c000ef",
00000383 => x"00050413",
00000354 => x"6a8000ef",
00000355 => x"03040513",
00000356 => x"0ff57513",
00000357 => x"69c000ef",
00000358 => x"014a8663",
00000359 => x"02e00513",
00000360 => x"690000ef",
00000361 => x"001a8a93",
00000362 => x"fa9a9ce3",
00000363 => x"01c12083",
00000364 => x"01812403",
00000365 => x"01412483",
00000366 => x"01012903",
00000367 => x"00c12983",
00000368 => x"00812a03",
00000369 => x"00412a83",
00000370 => x"02010113",
00000371 => x"00008067",
00000372 => x"ff640413",
00000373 => x"00150513",
00000374 => x"0ff47413",
00000375 => x"0ff57513",
00000376 => x"f99ff06f",
00000377 => x"ff010113",
00000378 => x"00000513",
00000379 => x"00112623",
00000380 => x"00812423",
00000381 => x"714000ef",
00000382 => x"00500513",
00000383 => x"750000ef",
00000384 => x"00000513",
00000385 => x"70c000ef",
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"00812423",
00000395 => x"6c4000ef",
00000396 => x"09e00513",
00000397 => x"700000ef",
00000398 => x"00000513",
00000399 => x"6f8000ef",
00000400 => x"00050413",
00000385 => x"748000ef",
00000386 => x"00050413",
00000387 => x"00000513",
00000388 => x"718000ef",
00000389 => x"00c12083",
00000390 => x"0ff47513",
00000391 => x"00812403",
00000392 => x"01010113",
00000393 => x"00008067",
00000394 => x"ff010113",
00000395 => x"00000513",
00000396 => x"00112623",
00000397 => x"00812423",
00000398 => x"6d0000ef",
00000399 => x"09e00513",
00000400 => x"70c000ef",
00000401 => x"00000513",
00000402 => x"6c8000ef",
00000403 => x"00c12083",
00000404 => x"0ff47513",
00000405 => x"00812403",
00000406 => x"01010113",
00000407 => x"00008067",
00000408 => x"ff010113",
00000409 => x"00000513",
00000410 => x"00112623",
00000411 => x"684000ef",
00000412 => x"00600513",
00000413 => x"6c0000ef",
00000414 => x"00c12083",
00000415 => x"00000513",
00000416 => x"01010113",
00000417 => x"68c0006f",
00000418 => x"ff010113",
00000419 => x"00812423",
00000420 => x"00050413",
00000421 => x"01055513",
00000422 => x"0ff57513",
00000423 => x"00112623",
00000424 => x"694000ef",
00000425 => x"00845513",
00000426 => x"0ff57513",
00000427 => x"688000ef",
00000428 => x"0ff47513",
00000429 => x"00812403",
00000430 => x"00c12083",
00000431 => x"01010113",
00000432 => x"6740006f",
00000433 => x"ff010113",
00000434 => x"00812423",
00000435 => x"00050413",
00000436 => x"00000513",
00000437 => x"00112623",
00000438 => x"618000ef",
00000439 => x"00300513",
00000440 => x"654000ef",
00000441 => x"00040513",
00000442 => x"fa1ff0ef",
00000443 => x"00000513",
00000444 => x"644000ef",
00000445 => x"00050413",
00000402 => x"704000ef",
00000403 => x"00050413",
00000404 => x"00000513",
00000405 => x"6d4000ef",
00000406 => x"00c12083",
00000407 => x"0ff47513",
00000408 => x"00812403",
00000409 => x"01010113",
00000410 => x"00008067",
00000411 => x"ff010113",
00000412 => x"00000513",
00000413 => x"00112623",
00000414 => x"690000ef",
00000415 => x"00600513",
00000416 => x"6cc000ef",
00000417 => x"00c12083",
00000418 => x"00000513",
00000419 => x"01010113",
00000420 => x"6980006f",
00000421 => x"ff010113",
00000422 => x"00812423",
00000423 => x"00050413",
00000424 => x"01055513",
00000425 => x"0ff57513",
00000426 => x"00112623",
00000427 => x"6a0000ef",
00000428 => x"00845513",
00000429 => x"0ff57513",
00000430 => x"694000ef",
00000431 => x"0ff47513",
00000432 => x"00812403",
00000433 => x"00c12083",
00000434 => x"01010113",
00000435 => x"6800006f",
00000436 => x"ff010113",
00000437 => x"00812423",
00000438 => x"00050413",
00000439 => x"00000513",
00000440 => x"00112623",
00000441 => x"624000ef",
00000442 => x"00300513",
00000443 => x"660000ef",
00000444 => x"00040513",
00000445 => x"fa1ff0ef",
00000446 => x"00000513",
00000447 => x"614000ef",
00000448 => x"00c12083",
00000449 => x"0ff47513",
00000450 => x"00812403",
00000451 => x"01010113",
00000452 => x"00008067",
00000453 => x"fd010113",
00000454 => x"02812423",
00000455 => x"02912223",
00000456 => x"03212023",
00000457 => x"01312e23",
00000458 => x"02112623",
00000459 => x"00050493",
00000460 => x"00300413",
00000461 => x"00358913",
00000462 => x"fff00993",
00000463 => x"02049e63",
00000464 => x"4e8000ef",
00000465 => x"00c10793",
00000466 => x"008787b3",
00000467 => x"00a78023",
00000468 => x"fff40413",
00000469 => x"ff3414e3",
00000470 => x"02c12083",
00000471 => x"02812403",
00000472 => x"00c12503",
00000473 => x"02412483",
00000474 => x"02012903",
00000475 => x"01c12983",
00000476 => x"03010113",
00000477 => x"00008067",
00000478 => x"40890533",
00000479 => x"f49ff0ef",
00000480 => x"fc5ff06f",
00000481 => x"fd010113",
00000482 => x"02112623",
00000483 => x"02812423",
00000484 => x"02912223",
00000485 => x"03212023",
00000486 => x"01312e23",
00000487 => x"01412c23",
00000488 => x"01512a23",
00000489 => x"01612823",
00000490 => x"01712623",
00000491 => x"fc002473",
00000492 => x"00847413",
00000493 => x"00040663",
00000494 => x"00400513",
00000495 => x"badff0ef",
00000496 => x"00050493",
00000497 => x"02051863",
00000498 => x"ffff1537",
00000499 => x"e6850513",
00000500 => x"468000ef",
00000501 => x"000405b7",
00000502 => x"00048513",
00000503 => x"f39ff0ef",
00000504 => x"4788d7b7",
00000505 => x"afe78793",
00000506 => x"02f50463",
00000507 => x"00000513",
00000508 => x"fcdff06f",
00000509 => x"ffff1537",
00000510 => x"e8850513",
00000511 => x"43c000ef",
00000512 => x"e1dff0ef",
00000513 => x"fc0518e3",
00000514 => x"00300513",
00000515 => x"fb1ff06f",
00000516 => x"00040a37",
00000517 => x"004a0593",
00000518 => x"00048513",
00000519 => x"ef9ff0ef",
00000520 => x"00050913",
00000521 => x"008a0593",
00000522 => x"00048513",
00000523 => x"ee9ff0ef",
00000524 => x"00050a93",
00000525 => x"fc6027f3",
00000526 => x"00100513",
00000527 => x"f927e0e3",
00000528 => x"fc402bf3",
00000529 => x"00000993",
00000530 => x"ffc97b13",
00000531 => x"00ca0a13",
00000532 => x"014985b3",
00000533 => x"053b1663",
00000534 => x"01540433",
00000535 => x"00200513",
00000536 => x"f4041ee3",
00000537 => x"ffff1537",
00000538 => x"e9450513",
00000539 => x"3cc000ef",
00000540 => x"34091073",
00000541 => x"02c12083",
00000542 => x"02812403",
00000543 => x"02412483",
00000544 => x"02012903",
00000545 => x"01c12983",
00000546 => x"01812a03",
00000547 => x"01412a83",
00000548 => x"01012b03",
00000549 => x"00c12b83",
00000550 => x"03010113",
00000551 => x"00008067",
00000552 => x"00048513",
00000553 => x"e71ff0ef",
00000554 => x"017987b3",
00000555 => x"00a40433",
00000556 => x"00a7a023",
00000557 => x"00498993",
00000558 => x"f99ff06f",
00000559 => x"ff010113",
00000560 => x"00112623",
00000561 => x"00812423",
00000562 => x"00912223",
00000563 => x"00058413",
00000564 => x"00050493",
00000565 => x"d8dff0ef",
00000566 => x"00000513",
00000567 => x"414000ef",
00000568 => x"00200513",
00000569 => x"450000ef",
00000570 => x"00048513",
00000571 => x"d9dff0ef",
00000572 => x"00040513",
00000573 => x"440000ef",
00000574 => x"00000513",
00000575 => x"414000ef",
00000576 => x"cd9ff0ef",
00000577 => x"00157513",
00000578 => x"fe051ce3",
00000579 => x"00c12083",
00000580 => x"00812403",
00000581 => x"00412483",
00000582 => x"01010113",
00000583 => x"00008067",
00000584 => x"fe010113",
00000585 => x"00812c23",
00000586 => x"00912a23",
00000587 => x"01212823",
00000588 => x"00112e23",
00000589 => x"00b12623",
00000590 => x"00300413",
00000591 => x"00350493",
00000592 => x"fff00913",
00000593 => x"00c10793",
00000594 => x"008787b3",
00000595 => x"0007c583",
00000596 => x"40848533",
00000597 => x"fff40413",
00000598 => x"f65ff0ef",
00000599 => x"ff2414e3",
00000600 => x"01c12083",
00000601 => x"01812403",
00000602 => x"01412483",
00000603 => x"01012903",
00000604 => x"02010113",
00000605 => x"00008067",
00000606 => x"ff010113",
00000607 => x"00112623",
00000608 => x"00812423",
00000609 => x"00050413",
00000610 => x"cd9ff0ef",
00000611 => x"00000513",
00000612 => x"360000ef",
00000613 => x"0d800513",
00000614 => x"39c000ef",
00000615 => x"00040513",
00000616 => x"ce9ff0ef",
00000617 => x"00000513",
00000618 => x"368000ef",
00000619 => x"c2dff0ef",
00000620 => x"00157513",
00000621 => x"fe051ce3",
00000622 => x"00c12083",
00000623 => x"00812403",
00000624 => x"01010113",
00000625 => x"00008067",
00000626 => x"fe010113",
00000627 => x"00112e23",
00000628 => x"00812c23",
00000629 => x"00912a23",
00000630 => x"01212823",
00000631 => x"01312623",
00000632 => x"01412423",
00000633 => x"01512223",
00000634 => x"34002473",
00000635 => x"02041863",
00000636 => x"ffff1537",
00000637 => x"e1050513",
00000638 => x"01812403",
00000639 => x"01c12083",
00000640 => x"01412483",
00000641 => x"01012903",
00000642 => x"00c12983",
00000643 => x"00812a03",
00000644 => x"00412a83",
00000645 => x"02010113",
00000646 => x"2200006f",
00000647 => x"ffff1537",
00000648 => x"e9850513",
00000649 => x"214000ef",
00000650 => x"00040513",
00000651 => x"98dff0ef",
00000652 => x"ffff1537",
00000653 => x"ea450513",
00000654 => x"200000ef",
00000655 => x"00040537",
00000656 => x"979ff0ef",
00000657 => x"ffff1537",
00000658 => x"ec050513",
00000659 => x"1ec000ef",
00000660 => x"1d8000ef",
00000661 => x"00050493",
00000662 => x"1c0000ef",
00000663 => x"07900793",
00000664 => x"0af49e63",
00000665 => x"bb9ff0ef",
00000666 => x"00051663",
00000667 => x"00300513",
00000668 => x"8f9ff0ef",
00000669 => x"ffff1537",
00000670 => x"ecc50513",
00000671 => x"01045493",
00000672 => x"1b8000ef",
00000673 => x"00148493",
00000674 => x"00040937",
00000675 => x"fff00993",
00000676 => x"00010a37",
00000677 => x"fff48493",
00000678 => x"07349063",
00000679 => x"4788d5b7",
00000680 => x"afe58593",
00000681 => x"00040537",
00000682 => x"e79ff0ef",
00000683 => x"00040537",
00000684 => x"00040593",
00000685 => x"00450513",
00000686 => x"e69ff0ef",
00000687 => x"fc402a73",
00000688 => x"000409b7",
00000689 => x"ffc47413",
00000690 => x"00000493",
00000691 => x"00000913",
00000692 => x"00c98a93",
00000693 => x"01548533",
00000694 => x"014487b3",
00000695 => x"02849663",
00000696 => x"00898513",
00000697 => x"412005b3",
00000698 => x"e39ff0ef",
00000699 => x"ffff1537",
00000700 => x"e9450513",
00000701 => x"f05ff06f",
00000702 => x"00090513",
00000703 => x"e7dff0ef",
00000704 => x"01490933",
00000705 => x"f91ff06f",
00000706 => x"0007a583",
00000707 => x"00448493",
00000708 => x"00b90933",
00000709 => x"e0dff0ef",
00000710 => x"fbdff06f",
00000711 => x"01c12083",
00000712 => x"01812403",
00000713 => x"01412483",
00000714 => x"01012903",
00000715 => x"00c12983",
00000716 => x"00812a03",
00000717 => x"00412a83",
00000718 => x"02010113",
00000719 => x"00008067",
00000720 => x"000047b7",
00000721 => x"70078793",
00000722 => x"f8f02623",
00000723 => x"00008067",
00000724 => x"fc000713",
00000725 => x"00072783",
00000726 => x"00179793",
00000727 => x"0017d793",
00000728 => x"00f72023",
00000729 => x"00008067",
00000730 => x"f9002503",
00000731 => x"f9402583",
00000447 => x"650000ef",
00000448 => x"00050413",
00000449 => x"00000513",
00000450 => x"620000ef",
00000451 => x"00c12083",
00000452 => x"0ff47513",
00000453 => x"00812403",
00000454 => x"01010113",
00000455 => x"00008067",
00000456 => x"fd010113",
00000457 => x"02812423",
00000458 => x"02912223",
00000459 => x"03212023",
00000460 => x"01312e23",
00000461 => x"02112623",
00000462 => x"00050493",
00000463 => x"00300413",
00000464 => x"00358913",
00000465 => x"fff00993",
00000466 => x"02049e63",
00000467 => x"4f4000ef",
00000468 => x"00c10793",
00000469 => x"008787b3",
00000470 => x"00a78023",
00000471 => x"fff40413",
00000472 => x"ff3414e3",
00000473 => x"02c12083",
00000474 => x"02812403",
00000475 => x"00c12503",
00000476 => x"02412483",
00000477 => x"02012903",
00000478 => x"01c12983",
00000479 => x"03010113",
00000480 => x"00008067",
00000481 => x"40890533",
00000482 => x"f49ff0ef",
00000483 => x"fc5ff06f",
00000484 => x"fd010113",
00000485 => x"02112623",
00000486 => x"02812423",
00000487 => x"02912223",
00000488 => x"03212023",
00000489 => x"01312e23",
00000490 => x"01412c23",
00000491 => x"01512a23",
00000492 => x"01612823",
00000493 => x"01712623",
00000494 => x"fc002473",
00000495 => x"00847413",
00000496 => x"00040663",
00000497 => x"00400513",
00000498 => x"badff0ef",
00000499 => x"00050493",
00000500 => x"02051863",
00000501 => x"ffff1537",
00000502 => x"e8050513",
00000503 => x"474000ef",
00000504 => x"008005b7",
00000505 => x"00048513",
00000506 => x"f39ff0ef",
00000507 => x"4788d7b7",
00000508 => x"afe78793",
00000509 => x"02f50463",
00000510 => x"00000513",
00000511 => x"fcdff06f",
00000512 => x"ffff1537",
00000513 => x"ea050513",
00000514 => x"448000ef",
00000515 => x"e1dff0ef",
00000516 => x"fc0518e3",
00000517 => x"00300513",
00000518 => x"fb1ff06f",
00000519 => x"00800a37",
00000520 => x"004a0593",
00000521 => x"00048513",
00000522 => x"ef9ff0ef",
00000523 => x"00050913",
00000524 => x"008a0593",
00000525 => x"00048513",
00000526 => x"ee9ff0ef",
00000527 => x"00050a93",
00000528 => x"fc6027f3",
00000529 => x"00100513",
00000530 => x"f927e0e3",
00000531 => x"fc402bf3",
00000532 => x"00000993",
00000533 => x"ffc97b13",
00000534 => x"00ca0a13",
00000535 => x"014985b3",
00000536 => x"053b1663",
00000537 => x"01540433",
00000538 => x"00200513",
00000539 => x"f4041ee3",
00000540 => x"ffff1537",
00000541 => x"eac50513",
00000542 => x"3d8000ef",
00000543 => x"34091073",
00000544 => x"02c12083",
00000545 => x"02812403",
00000546 => x"02412483",
00000547 => x"02012903",
00000548 => x"01c12983",
00000549 => x"01812a03",
00000550 => x"01412a83",
00000551 => x"01012b03",
00000552 => x"00c12b83",
00000553 => x"03010113",
00000554 => x"00008067",
00000555 => x"00048513",
00000556 => x"e71ff0ef",
00000557 => x"017987b3",
00000558 => x"00a40433",
00000559 => x"00a7a023",
00000560 => x"00498993",
00000561 => x"f99ff06f",
00000562 => x"ff010113",
00000563 => x"00112623",
00000564 => x"00812423",
00000565 => x"00912223",
00000566 => x"00058413",
00000567 => x"00050493",
00000568 => x"d8dff0ef",
00000569 => x"00000513",
00000570 => x"420000ef",
00000571 => x"00200513",
00000572 => x"45c000ef",
00000573 => x"00048513",
00000574 => x"d9dff0ef",
00000575 => x"00040513",
00000576 => x"44c000ef",
00000577 => x"00000513",
00000578 => x"420000ef",
00000579 => x"cd9ff0ef",
00000580 => x"00157513",
00000581 => x"fe051ce3",
00000582 => x"00c12083",
00000583 => x"00812403",
00000584 => x"00412483",
00000585 => x"01010113",
00000586 => x"00008067",
00000587 => x"fe010113",
00000588 => x"00812c23",
00000589 => x"00912a23",
00000590 => x"01212823",
00000591 => x"00112e23",
00000592 => x"00b12623",
00000593 => x"00300413",
00000594 => x"00350493",
00000595 => x"fff00913",
00000596 => x"00c10793",
00000597 => x"008787b3",
00000598 => x"0007c583",
00000599 => x"40848533",
00000600 => x"fff40413",
00000601 => x"f65ff0ef",
00000602 => x"ff2414e3",
00000603 => x"01c12083",
00000604 => x"01812403",
00000605 => x"01412483",
00000606 => x"01012903",
00000607 => x"02010113",
00000608 => x"00008067",
00000609 => x"ff010113",
00000610 => x"00112623",
00000611 => x"00812423",
00000612 => x"00050413",
00000613 => x"cd9ff0ef",
00000614 => x"00000513",
00000615 => x"36c000ef",
00000616 => x"0d800513",
00000617 => x"3a8000ef",
00000618 => x"00040513",
00000619 => x"ce9ff0ef",
00000620 => x"00000513",
00000621 => x"374000ef",
00000622 => x"c2dff0ef",
00000623 => x"00157513",
00000624 => x"fe051ce3",
00000625 => x"00c12083",
00000626 => x"00812403",
00000627 => x"01010113",
00000628 => x"00008067",
00000629 => x"fe010113",
00000630 => x"00112e23",
00000631 => x"00812c23",
00000632 => x"00912a23",
00000633 => x"01212823",
00000634 => x"01312623",
00000635 => x"01412423",
00000636 => x"01512223",
00000637 => x"34002473",
00000638 => x"02041863",
00000639 => x"ffff1537",
00000640 => x"e2850513",
00000641 => x"01812403",
00000642 => x"01c12083",
00000643 => x"01412483",
00000644 => x"01012903",
00000645 => x"00c12983",
00000646 => x"00812a03",
00000647 => x"00412a83",
00000648 => x"02010113",
00000649 => x"22c0006f",
00000650 => x"ffff1537",
00000651 => x"eb050513",
00000652 => x"220000ef",
00000653 => x"00040513",
00000654 => x"98dff0ef",
00000655 => x"ffff1537",
00000656 => x"ebc50513",
00000657 => x"20c000ef",
00000658 => x"00800537",
00000659 => x"979ff0ef",
00000660 => x"ffff1537",
00000661 => x"ed850513",
00000662 => x"1f8000ef",
00000663 => x"1e4000ef",
00000664 => x"00050493",
00000665 => x"1cc000ef",
00000666 => x"07900793",
00000667 => x"0af49e63",
00000668 => x"bb9ff0ef",
00000669 => x"00051663",
00000670 => x"00300513",
00000671 => x"8f9ff0ef",
00000672 => x"ffff1537",
00000673 => x"ee450513",
00000674 => x"01045493",
00000675 => x"1c4000ef",
00000676 => x"00148493",
00000677 => x"00800937",
00000678 => x"fff00993",
00000679 => x"00010a37",
00000680 => x"fff48493",
00000681 => x"07349063",
00000682 => x"4788d5b7",
00000683 => x"afe58593",
00000684 => x"00800537",
00000685 => x"e79ff0ef",
00000686 => x"00800537",
00000687 => x"00040593",
00000688 => x"00450513",
00000689 => x"e69ff0ef",
00000690 => x"fc402a73",
00000691 => x"008009b7",
00000692 => x"ffc47413",
00000693 => x"00000493",
00000694 => x"00000913",
00000695 => x"00c98a93",
00000696 => x"01548533",
00000697 => x"014487b3",
00000698 => x"02849663",
00000699 => x"00898513",
00000700 => x"412005b3",
00000701 => x"e39ff0ef",
00000702 => x"ffff1537",
00000703 => x"eac50513",
00000704 => x"f05ff06f",
00000705 => x"00090513",
00000706 => x"e7dff0ef",
00000707 => x"01490933",
00000708 => x"f91ff06f",
00000709 => x"0007a583",
00000710 => x"00448493",
00000711 => x"00b90933",
00000712 => x"e0dff0ef",
00000713 => x"fbdff06f",
00000714 => x"01c12083",
00000715 => x"01812403",
00000716 => x"01412483",
00000717 => x"01012903",
00000718 => x"00c12983",
00000719 => x"00812a03",
00000720 => x"00412a83",
00000721 => x"02010113",
00000722 => x"00008067",
00000723 => x"000047b7",
00000724 => x"70078793",
00000725 => x"f8f02623",
00000726 => x"00008067",
00000727 => x"fc000713",
00000728 => x"00072783",
00000729 => x"00179793",
00000730 => x"0017d793",
00000731 => x"00f72023",
00000732 => x"00008067",
00000733 => x"f9800693",
00000734 => x"fff00613",
00000735 => x"00c6a023",
00000736 => x"00a6a023",
00000737 => x"00b6a223",
00000733 => x"f8a02823",
00000734 => x"f8b02a23",
00000735 => x"00008067",
00000736 => x"f9002503",
00000737 => x"f9402583",
00000738 => x"00008067",
00000739 => x"fa002023",
00000740 => x"fc1026f3",
00000741 => x"00000713",
00000742 => x"00151513",
00000743 => x"04a6f263",
00000744 => x"000016b7",
00000745 => x"00000793",
00000746 => x"ffe68693",
00000747 => x"04e6e463",
00000748 => x"00167613",
00000749 => x"0015f593",
00000750 => x"01879793",
00000751 => x"01e61613",
00000752 => x"00c7e7b3",
00000753 => x"01d59593",
00000754 => x"00b7e7b3",
00000755 => x"00e7e7b3",
00000756 => x"10000737",
00000757 => x"00e7e7b3",
00000758 => x"faf02023",
00000759 => x"00008067",
00000760 => x"00170793",
00000761 => x"01079713",
00000762 => x"40a686b3",
00000763 => x"01075713",
00000764 => x"fadff06f",
00000765 => x"ffe78513",
00000766 => x"0fd57513",
00000767 => x"00051a63",
00000768 => x"00375713",
00000769 => x"00178793",
00000770 => x"0ff7f793",
00000771 => x"fa1ff06f",
00000772 => x"00175713",
00000773 => x"ff1ff06f",
00000774 => x"fa002783",
00000775 => x"fe07cee3",
00000776 => x"faa02223",
00000777 => x"00008067",
00000778 => x"fa402503",
00000779 => x"fe055ee3",
00000780 => x"0ff57513",
00000781 => x"00008067",
00000782 => x"ff010113",
00000783 => x"00812423",
00000784 => x"01212023",
00000785 => x"00112623",
00000786 => x"00912223",
00000787 => x"00050413",
00000788 => x"00a00913",
00000789 => x"00044483",
00000790 => x"00140413",
00000791 => x"00049e63",
00000792 => x"00c12083",
00000793 => x"00812403",
00000794 => x"00412483",
00000795 => x"00012903",
00000796 => x"01010113",
00000797 => x"00008067",
00000798 => x"01249663",
00000799 => x"00d00513",
00000800 => x"f99ff0ef",
00000801 => x"00048513",
00000802 => x"f91ff0ef",
00000803 => x"fc9ff06f",
00000804 => x"00757513",
00000805 => x"00177793",
00000806 => x"01079793",
00000807 => x"0036f693",
00000808 => x"00a51513",
00000809 => x"00f56533",
00000810 => x"00167613",
00000811 => x"00e69793",
00000812 => x"0015f593",
00000813 => x"00f567b3",
00000814 => x"00d61613",
00000815 => x"00c7e7b3",
00000816 => x"00959593",
00000817 => x"fa800813",
00000818 => x"00b7e7b3",
00000819 => x"00082023",
00000820 => x"1007e793",
00000821 => x"00f82023",
00000822 => x"00008067",
00000823 => x"fa800713",
00000824 => x"00072783",
00000825 => x"eff7f793",
00000826 => x"00f72023",
00000827 => x"00008067",
00000828 => x"fa800713",
00000829 => x"00072683",
00000830 => x"00757793",
00000831 => x"00100513",
00000832 => x"00f51533",
00000833 => x"00d56533",
00000834 => x"00a72023",
00000835 => x"00008067",
00000836 => x"fa800713",
00000837 => x"00072683",
00000838 => x"00757513",
00000839 => x"00100793",
00000840 => x"00a797b3",
00000841 => x"fff7c793",
00000842 => x"00d7f7b3",
00000843 => x"00f72023",
00000844 => x"00008067",
00000845 => x"faa02623",
00000846 => x"fa802783",
00000847 => x"fe07cee3",
00000848 => x"fac02503",
00000849 => x"00008067",
00000850 => x"f8400713",
00000851 => x"00072683",
00000852 => x"00f57793",
00000853 => x"00100513",
00000854 => x"00f51533",
00000855 => x"00d54533",
00000856 => x"00a72023",
00000857 => x"00008067",
00000858 => x"f8a02223",
00000859 => x"00008067",
00000860 => x"fb800713",
00000861 => x"00072783",
00000862 => x"ffe7f793",
00000863 => x"00f72023",
00000864 => x"00008067",
00000865 => x"fb000713",
00000866 => x"00072783",
00000867 => x"ff77f793",
00000868 => x"00f72023",
00000869 => x"00008067",
00000870 => x"f8800713",
00000871 => x"00072783",
00000872 => x"fef7f793",
00000873 => x"00f72023",
00000874 => x"00008067",
00000875 => x"69617641",
00000876 => x"6c62616c",
00000877 => x"4d432065",
00000878 => x"0a3a7344",
00000879 => x"203a6820",
00000880 => x"706c6548",
00000881 => x"3a72200a",
00000882 => x"73655220",
00000883 => x"74726174",
00000884 => x"3a75200a",
00000885 => x"6c705520",
00000886 => x"0a64616f",
00000887 => x"203a7320",
00000888 => x"726f7453",
00000889 => x"6f742065",
00000890 => x"616c6620",
00000891 => x"200a6873",
00000892 => x"4c203a6c",
00000893 => x"2064616f",
00000894 => x"6d6f7266",
00000895 => x"616c6620",
00000896 => x"200a6873",
00000897 => x"45203a65",
00000898 => x"75636578",
00000899 => x"00006574",
00000900 => x"65206f4e",
00000901 => x"75636578",
00000902 => x"6c626174",
00000903 => x"76612065",
00000904 => x"616c6961",
00000905 => x"2e656c62",
00000906 => x"00000000",
00000907 => x"746f6f42",
00000908 => x"2e676e69",
00000909 => x"0a0a2e2e",
00000910 => x"00000000",
00000911 => x"52450a07",
00000912 => x"00005f52",
00000913 => x"6e6b6e75",
00000914 => x"006e776f",
00000915 => x"00007830",
00000916 => x"58450a0a",
00000917 => x"54504543",
00000918 => x"3a4e4f49",
00000919 => x"00000020",
00000920 => x"30204020",
00000921 => x"00000078",
00000922 => x"69617741",
00000923 => x"676e6974",
00000924 => x"6f656e20",
00000925 => x"32337672",
00000926 => x"6578655f",
00000927 => x"6e69622e",
00000928 => x"202e2e2e",
00000929 => x"00000000",
00000930 => x"64616f4c",
00000931 => x"2e676e69",
00000932 => x"00202e2e",
00000933 => x"00004b4f",
00000934 => x"74697257",
00000935 => x"78302065",
00000936 => x"00000000",
00000937 => x"74796220",
00000938 => x"74207365",
00000939 => x"5053206f",
00000940 => x"6c662049",
00000941 => x"20687361",
00000942 => x"78302040",
00000943 => x"00000000",
00000944 => x"7928203f",
00000945 => x"20296e2f",
00000946 => x"00000000",
00000947 => x"616c460a",
00000948 => x"6e696873",
00000949 => x"2e2e2e67",
00000950 => x"00000020",
00000951 => x"0a0a0a0a",
00000952 => x"4e203c3c",
00000953 => x"56524f45",
00000954 => x"42203233",
00000955 => x"6c746f6f",
00000956 => x"6564616f",
00000957 => x"3e3e2072",
00000958 => x"4c420a0a",
00000959 => x"203a5644",
00000960 => x"206c754a",
00000961 => x"32203720",
00000962 => x"0a303230",
00000963 => x"3a565748",
00000964 => x"00002020",
00000965 => x"4b4c430a",
00000966 => x"0020203a",
00000967 => x"0a7a4820",
00000968 => x"4449484d",
00000969 => x"0000203a",
00000970 => x"53494d0a",
00000971 => x"00203a41",
00000972 => x"4e4f430a",
00000973 => x"00203a46",
00000974 => x"454d490a",
00000975 => x"00203a4d",
00000976 => x"74796220",
00000977 => x"40207365",
00000978 => x"00000020",
00000979 => x"454d440a",
00000980 => x"00203a4d",
00000981 => x"75410a0a",
00000982 => x"6f626f74",
00000983 => x"6920746f",
00000984 => x"7338206e",
00000985 => x"7250202e",
00000986 => x"20737365",
00000987 => x"2079656b",
00000988 => x"61206f74",
00000989 => x"74726f62",
00000990 => x"00000a2e",
00000991 => x"0000000a",
00000992 => x"726f6241",
00000993 => x"2e646574",
00000994 => x"00000a0a",
00000995 => x"444d430a",
00000996 => x"00203e3a",
00000997 => x"53207962",
00000998 => x"68706574",
00000999 => x"4e206e61",
00001000 => x"69746c6f",
00001001 => x"0000676e",
00001002 => x"61766e49",
00001003 => x"2064696c",
00001004 => x"00444d43",
00001005 => x"33323130",
00001006 => x"37363534",
00001007 => x"42413938",
00001008 => x"46454443",
00000739 => x"f9800693",
00000740 => x"fff00613",
00000741 => x"00c6a023",
00000742 => x"00a6a023",
00000743 => x"00b6a223",
00000744 => x"00008067",
00000745 => x"fa002023",
00000746 => x"fc1026f3",
00000747 => x"00000713",
00000748 => x"00151513",
00000749 => x"04a6f263",
00000750 => x"000016b7",
00000751 => x"00000793",
00000752 => x"ffe68693",
00000753 => x"04e6e463",
00000754 => x"00167613",
00000755 => x"0015f593",
00000756 => x"01879793",
00000757 => x"01e61613",
00000758 => x"00c7e7b3",
00000759 => x"01d59593",
00000760 => x"00b7e7b3",
00000761 => x"00e7e7b3",
00000762 => x"10000737",
00000763 => x"00e7e7b3",
00000764 => x"faf02023",
00000765 => x"00008067",
00000766 => x"00170793",
00000767 => x"01079713",
00000768 => x"40a686b3",
00000769 => x"01075713",
00000770 => x"fadff06f",
00000771 => x"ffe78513",
00000772 => x"0fd57513",
00000773 => x"00051a63",
00000774 => x"00375713",
00000775 => x"00178793",
00000776 => x"0ff7f793",
00000777 => x"fa1ff06f",
00000778 => x"00175713",
00000779 => x"ff1ff06f",
00000780 => x"fa002783",
00000781 => x"fe07cee3",
00000782 => x"faa02223",
00000783 => x"00008067",
00000784 => x"fa402503",
00000785 => x"fe055ee3",
00000786 => x"0ff57513",
00000787 => x"00008067",
00000788 => x"ff010113",
00000789 => x"00812423",
00000790 => x"01212023",
00000791 => x"00112623",
00000792 => x"00912223",
00000793 => x"00050413",
00000794 => x"00a00913",
00000795 => x"00044483",
00000796 => x"00140413",
00000797 => x"00049e63",
00000798 => x"00c12083",
00000799 => x"00812403",
00000800 => x"00412483",
00000801 => x"00012903",
00000802 => x"01010113",
00000803 => x"00008067",
00000804 => x"01249663",
00000805 => x"00d00513",
00000806 => x"f99ff0ef",
00000807 => x"00048513",
00000808 => x"f91ff0ef",
00000809 => x"fc9ff06f",
00000810 => x"00757513",
00000811 => x"00177793",
00000812 => x"01079793",
00000813 => x"0036f693",
00000814 => x"00a51513",
00000815 => x"00f56533",
00000816 => x"00167613",
00000817 => x"00e69793",
00000818 => x"0015f593",
00000819 => x"00f567b3",
00000820 => x"00d61613",
00000821 => x"00c7e7b3",
00000822 => x"00959593",
00000823 => x"fa800813",
00000824 => x"00b7e7b3",
00000825 => x"00082023",
00000826 => x"1007e793",
00000827 => x"00f82023",
00000828 => x"00008067",
00000829 => x"fa800713",
00000830 => x"00072783",
00000831 => x"eff7f793",
00000832 => x"00f72023",
00000833 => x"00008067",
00000834 => x"fa800713",
00000835 => x"00072683",
00000836 => x"00757793",
00000837 => x"00100513",
00000838 => x"00f51533",
00000839 => x"00d56533",
00000840 => x"00a72023",
00000841 => x"00008067",
00000842 => x"fa800713",
00000843 => x"00072683",
00000844 => x"00757513",
00000845 => x"00100793",
00000846 => x"00a797b3",
00000847 => x"fff7c793",
00000848 => x"00d7f7b3",
00000849 => x"00f72023",
00000850 => x"00008067",
00000851 => x"faa02623",
00000852 => x"fa802783",
00000853 => x"fe07cee3",
00000854 => x"fac02503",
00000855 => x"00008067",
00000856 => x"f8400713",
00000857 => x"00072683",
00000858 => x"00f57793",
00000859 => x"00100513",
00000860 => x"00f51533",
00000861 => x"00d54533",
00000862 => x"00a72023",
00000863 => x"00008067",
00000864 => x"f8a02223",
00000865 => x"00008067",
00000866 => x"fb800713",
00000867 => x"00072783",
00000868 => x"ffe7f793",
00000869 => x"00f72023",
00000870 => x"00008067",
00000871 => x"fb000713",
00000872 => x"00072783",
00000873 => x"ff77f793",
00000874 => x"00f72023",
00000875 => x"00008067",
00000876 => x"f8800713",
00000877 => x"00072783",
00000878 => x"fef7f793",
00000879 => x"00f72023",
00000880 => x"00008067",
00000881 => x"69617641",
00000882 => x"6c62616c",
00000883 => x"4d432065",
00000884 => x"0a3a7344",
00000885 => x"203a6820",
00000886 => x"706c6548",
00000887 => x"3a72200a",
00000888 => x"73655220",
00000889 => x"74726174",
00000890 => x"3a75200a",
00000891 => x"6c705520",
00000892 => x"0a64616f",
00000893 => x"203a7320",
00000894 => x"726f7453",
00000895 => x"6f742065",
00000896 => x"616c6620",
00000897 => x"200a6873",
00000898 => x"4c203a6c",
00000899 => x"2064616f",
00000900 => x"6d6f7266",
00000901 => x"616c6620",
00000902 => x"200a6873",
00000903 => x"45203a65",
00000904 => x"75636578",
00000905 => x"00006574",
00000906 => x"65206f4e",
00000907 => x"75636578",
00000908 => x"6c626174",
00000909 => x"76612065",
00000910 => x"616c6961",
00000911 => x"2e656c62",
00000912 => x"00000000",
00000913 => x"746f6f42",
00000914 => x"2e676e69",
00000915 => x"0a0a2e2e",
00000916 => x"00000000",
00000917 => x"52450a07",
00000918 => x"00005f52",
00000919 => x"6e6b6e75",
00000920 => x"006e776f",
00000921 => x"00007830",
00000922 => x"58450a0a",
00000923 => x"54504543",
00000924 => x"3a4e4f49",
00000925 => x"00000020",
00000926 => x"30204020",
00000927 => x"00000078",
00000928 => x"69617741",
00000929 => x"676e6974",
00000930 => x"6f656e20",
00000931 => x"32337672",
00000932 => x"6578655f",
00000933 => x"6e69622e",
00000934 => x"202e2e2e",
00000935 => x"00000000",
00000936 => x"64616f4c",
00000937 => x"2e676e69",
00000938 => x"00202e2e",
00000939 => x"00004b4f",
00000940 => x"74697257",
00000941 => x"78302065",
00000942 => x"00000000",
00000943 => x"74796220",
00000944 => x"74207365",
00000945 => x"5053206f",
00000946 => x"6c662049",
00000947 => x"20687361",
00000948 => x"78302040",
00000949 => x"00000000",
00000950 => x"7928203f",
00000951 => x"20296e2f",
00000952 => x"00000000",
00000953 => x"616c460a",
00000954 => x"6e696873",
00000955 => x"2e2e2e67",
00000956 => x"00000020",
00000957 => x"0a0a0a0a",
00000958 => x"4e203c3c",
00000959 => x"56524f45",
00000960 => x"42203233",
00000961 => x"6c746f6f",
00000962 => x"6564616f",
00000963 => x"3e3e2072",
00000964 => x"4c420a0a",
00000965 => x"203a5644",
00000966 => x"206c754a",
00000967 => x"32203920",
00000968 => x"0a303230",
00000969 => x"3a565748",
00000970 => x"00002020",
00000971 => x"4b4c430a",
00000972 => x"0020203a",
00000973 => x"0a7a4820",
00000974 => x"4449484d",
00000975 => x"0000203a",
00000976 => x"53494d0a",
00000977 => x"00203a41",
00000978 => x"4e4f430a",
00000979 => x"00203a46",
00000980 => x"454d490a",
00000981 => x"00203a4d",
00000982 => x"74796220",
00000983 => x"40207365",
00000984 => x"00000020",
00000985 => x"454d440a",
00000986 => x"00203a4d",
00000987 => x"75410a0a",
00000988 => x"6f626f74",
00000989 => x"6920746f",
00000990 => x"7338206e",
00000991 => x"7250202e",
00000992 => x"20737365",
00000993 => x"2079656b",
00000994 => x"61206f74",
00000995 => x"74726f62",
00000996 => x"00000a2e",
00000997 => x"0000000a",
00000998 => x"726f6241",
00000999 => x"2e646574",
00001000 => x"00000a0a",
00001001 => x"444d430a",
00001002 => x"00203e3a",
00001003 => x"53207962",
00001004 => x"68706574",
00001005 => x"4e206e61",
00001006 => x"69746c6f",
00001007 => x"0000676e",
00001008 => x"61766e49",
00001009 => x"2064696c",
00001010 => x"00444d43",
00001011 => x"33323130",
00001012 => x"37363534",
00001013 => x"42413938",
00001014 => x"46454443",
others => x"00000000"
);
 
/rtl/core/neorv32_cpu.vhd
88,20 → 88,23
);
port (
-- global control --
clk_i : in std_ulogic; -- global clock, rising edge
rstn_i : in std_ulogic; -- global reset, low-active, async
clk_i : in std_ulogic; -- global clock, rising edge
rstn_i : in std_ulogic; -- global reset, low-active, async
-- bus interface --
bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable
bus_we_o : out std_ulogic; -- write enable
bus_re_o : out std_ulogic; -- read enable
bus_ack_i : in std_ulogic; -- bus transfer acknowledge
bus_err_i : in std_ulogic; -- bus transfer error
bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable
bus_we_o : out std_ulogic; -- write enable
bus_re_o : out std_ulogic; -- read enable
bus_cancel_o : out std_ulogic; -- cancel current bus transaction
bus_ack_i : in std_ulogic; -- bus transfer acknowledge
bus_err_i : in std_ulogic; -- bus transfer error
-- system time input from MTIME --
time_i : in std_ulogic_vector(63 downto 0); -- current system time
-- external interrupts --
clic_irq_i : in std_ulogic; -- CLIC interrupt request
mtime_irq_i : in std_ulogic -- machine timer interrupt
clic_irq_i : in std_ulogic; -- CLIC interrupt request
mtime_irq_i : in std_ulogic -- machine timer interrupt
);
end neorv32_cpu;
 
126,7 → 129,6
signal be_instr : std_ulogic; -- bus error on instruction access
signal be_load : std_ulogic; -- bus error on load data access
signal be_store : std_ulogic; -- bus error on store data access
signal bus_exc_ack : std_ulogic; -- bus exception error acknowledge
signal bus_busy : std_ulogic; -- bus unit is busy
signal fetch_pc : std_ulogic_vector(data_width_c-1 downto 0); -- pc for instruction fetch
signal curr_pc : std_ulogic_vector(data_width_c-1 downto 0); -- current pc (for current executed instruction)
201,6 → 203,8
-- external interrupt --
clic_irq_i => clic_irq_i, -- CLIC interrupt request
mtime_irq_i => mtime_irq_i, -- machine timer interrupt
-- system time input from MTIME --
time_i => time_i, -- current system time
-- bus access exceptions --
mar_i => mar, -- memory address register
ma_instr_i => ma_instr, -- misaligned instruction address
209,7 → 213,6
be_instr_i => be_instr, -- bus error on instruction access
be_load_i => be_load, -- bus error on load data access
be_store_i => be_store, -- bus error on store data access
bus_exc_ack_o => bus_exc_ack, -- bus exception error acknowledge
bus_busy_i => bus_busy -- bus unit is busy
);
 
238,6 → 241,9
-- ALU ------------------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
neorv32_cpu_alu_inst: neorv32_cpu_alu
generic map (
CPU_EXTENSION_RISCV_M => CPU_EXTENSION_RISCV_M -- implement muld/div extension?
)
port map (
-- global control --
clk_i => clk_i, -- global clock, rising edge
299,40 → 305,41
-- -------------------------------------------------------------------------------------------
neorv32_cpu_bus_inst: neorv32_cpu_bus
generic map (
MEM_EXT_TIMEOUT => MEM_EXT_TIMEOUT -- cycles after which a valid bus access will timeout
CPU_EXTENSION_RISCV_C => CPU_EXTENSION_RISCV_C, -- implement compressed extension?
MEM_EXT_TIMEOUT => MEM_EXT_TIMEOUT -- cycles after which a valid bus access will timeout
)
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
clk_i => clk_i, -- global clock, rising edge
rstn_i => rstn_i, -- global reset, low-active, async
ctrl_i => ctrl, -- main control bus
-- data input --
wdata_i => rs2, -- write data
pc_i => fetch_pc, -- current PC for instruction fetch
alu_i => alu_res, -- ALU result
wdata_i => rs2, -- write data
pc_i => fetch_pc, -- current PC for instruction fetch
alu_i => alu_res, -- ALU result
-- data output --
instr_o => instr, -- instruction
rdata_o => rdata, -- read data
instr_o => instr, -- instruction
rdata_o => rdata, -- read data
-- status --
mar_o => mar, -- current memory address register
ma_instr_o => ma_instr, -- misaligned instruction address
ma_load_o => ma_load, -- misaligned load data address
ma_store_o => ma_store, -- misaligned store data address
be_instr_o => be_instr, -- bus error on instruction access
be_load_o => be_load, -- bus error on load data access
be_store_o => be_store, -- bus error on store data access
bus_wait_o => bus_wait, -- wait for bus operation to finish
bus_busy_o => bus_busy, -- bus unit is busy
exc_ack_i => bus_exc_ack, -- exception controller ACK
mar_o => mar, -- current memory address register
ma_instr_o => ma_instr, -- misaligned instruction address
ma_load_o => ma_load, -- misaligned load data address
ma_store_o => ma_store, -- misaligned store data address
be_instr_o => be_instr, -- bus error on instruction access
be_load_o => be_load, -- bus error on load data access
be_store_o => be_store, -- bus error on store data access
bus_wait_o => bus_wait, -- wait for bus operation to finish
bus_busy_o => bus_busy, -- bus unit is busy
-- bus system --
bus_addr_o => bus_addr_o, -- bus access address
bus_rdata_i => bus_rdata_i, -- bus read data
bus_wdata_o => bus_wdata_o, -- bus write data
bus_ben_o => bus_ben_o, -- byte enable
bus_we_o => bus_we_o, -- write enable
bus_re_o => bus_re_o, -- read enable
bus_ack_i => bus_ack_i, -- bus transfer acknowledge
bus_err_i => bus_err_i -- bus transfer error
bus_addr_o => bus_addr_o, -- bus access address
bus_rdata_i => bus_rdata_i, -- bus read data
bus_wdata_o => bus_wdata_o, -- bus write data
bus_ben_o => bus_ben_o, -- byte enable
bus_we_o => bus_we_o, -- write enable
bus_re_o => bus_re_o, -- read enable
bus_cancel_o => bus_cancel_o, -- cancel current bus transaction
bus_ack_i => bus_ack_i, -- bus transfer acknowledge
bus_err_i => bus_err_i -- bus transfer error
);
 
 
/rtl/core/neorv32_cpu_alu.vhd
42,6 → 42,9
use neorv32.neorv32_package.all;
 
entity neorv32_cpu_alu is
generic (
CPU_EXTENSION_RISCV_M : boolean := true -- implement muld/div extension?
);
port (
-- global control --
clk_i : in std_ulogic; -- global clock, rising edge
200,7 → 203,7
cp_rb_ff0 <= '0';
cp_rb_ff1 <= '0';
elsif rising_edge(clk_i) then
if (ctrl_i(ctrl_sys_m_ext_en_c) = '1') then -- FIXME add second cp (floating point stuff?)
if (CPU_EXTENSION_RISCV_M = true) then -- FIXME add second cp (floating point stuff?)
cp_cmd_ff <= ctrl_i(ctrl_cp_use_c);
cp_rb_ff0 <= '0';
cp_rb_ff1 <= cp_rb_ff0;
/rtl/core/neorv32_cpu_bus.vhd
43,40 → 43,41
 
entity neorv32_cpu_bus is
generic (
MEM_EXT_TIMEOUT : natural := 15 -- cycles after which a valid bus access will timeout
CPU_EXTENSION_RISCV_C : boolean := true; -- implement compressed extension?
MEM_EXT_TIMEOUT : natural := 15 -- cycles after which a valid bus access will timeout
);
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
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
-- data input --
wdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- write data
pc_i : in std_ulogic_vector(data_width_c-1 downto 0); -- current PC
alu_i : in std_ulogic_vector(data_width_c-1 downto 0); -- ALU result
wdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- write data
pc_i : in std_ulogic_vector(data_width_c-1 downto 0); -- current PC
alu_i : in std_ulogic_vector(data_width_c-1 downto 0); -- ALU result
-- data output --
instr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- instruction
rdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- read data
instr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- instruction
rdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- read data
-- status --
mar_o : out std_ulogic_vector(data_width_c-1 downto 0); -- current memory address register
ma_instr_o : out std_ulogic; -- misaligned instruction address
ma_load_o : out std_ulogic; -- misaligned load data address
ma_store_o : out std_ulogic; -- misaligned store data address
be_instr_o : out std_ulogic; -- bus error on instruction access
be_load_o : out std_ulogic; -- bus error on load data access
be_store_o : out std_ulogic; -- bus error on store data access
bus_wait_o : out std_ulogic; -- wait for bus operation to finish
bus_busy_o : out std_ulogic; -- bus unit is busy
exc_ack_i : in std_ulogic; -- exception controller ACK
mar_o : out std_ulogic_vector(data_width_c-1 downto 0); -- current memory address register
ma_instr_o : out std_ulogic; -- misaligned instruction address
ma_load_o : out std_ulogic; -- misaligned load data address
ma_store_o : out std_ulogic; -- misaligned store data address
be_instr_o : out std_ulogic; -- bus error on instruction access
be_load_o : out std_ulogic; -- bus error on load data access
be_store_o : out std_ulogic; -- bus error on store data access
bus_wait_o : out std_ulogic; -- wait for bus operation to finish
bus_busy_o : out std_ulogic; -- bus unit is busy
-- bus system --
bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable
bus_we_o : out std_ulogic; -- write enable
bus_re_o : out std_ulogic; -- read enable
bus_ack_i : in std_ulogic; -- bus transfer acknowledge
bus_err_i : in std_ulogic -- bus transfer error
bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable
bus_we_o : out std_ulogic; -- write enable
bus_re_o : out std_ulogic; -- read enable
bus_cancel_o : out std_ulogic; -- cancel current bus transaction
bus_ack_i : in std_ulogic; -- bus transfer acknowledge
bus_err_i : in std_ulogic -- bus transfer error
);
end neorv32_cpu_bus;
 
103,9 → 104,7
-- -------------------------------------------------------------------------------------------
mem_adr_reg: process(rstn_i, clk_i)
begin
if (rstn_i = '0') then
mar <= (others => '0');
elsif rising_edge(clk_i) then
if rising_edge(clk_i) then
if (ctrl_i(ctrl_bus_mar_we_c) = '1') then
mar <= alu_i;
end if;
113,7 → 112,7
end process mem_adr_reg;
 
-- address output --
bus_addr_o <= pc_i when ((bus_if_req or ctrl_i(ctrl_bus_if_c)) = '1') else mar; -- is instruction fetch?
bus_addr_o <= pc_i when ((bus_if_req or ctrl_i(ctrl_bus_if_c)) = '1') else mar; -- is instruction fetch? keep output at PC as long as IF request is active
mar_o <= mar;
 
-- write request output --
120,7 → 119,7
bus_we_o <= ctrl_i(ctrl_bus_wr_c) and (not misaligned_data);
 
-- read request output (also used for instruction fetch) --
bus_re_o <= (ctrl_i(ctrl_bus_rd_c) and (not misaligned_data)) or ((bus_if_req or ctrl_i(ctrl_bus_if_c)) and (not misaligned_instr));
bus_re_o <= (ctrl_i(ctrl_bus_rd_c) and (not misaligned_data)) or (ctrl_i(ctrl_bus_if_c) and (not misaligned_instr)); -- FIXME i_reg and misaligned
 
 
-- Write Data -----------------------------------------------------------------------------
223,7 → 222,7
align_err <= '0';
bus_timeout <= (others => '0');
elsif rising_edge(clk_i) then
if (bus_busy = '0') then -- wait for new request
if (bus_busy = '0') or (ctrl_i(ctrl_bus_reset_c) = '1') then -- wait for new request or reset
bus_busy <= ctrl_i(ctrl_bus_if_c) or ctrl_i(ctrl_bus_rd_c) or ctrl_i(ctrl_bus_wr_c); -- any request at all?
bus_if_req <= ctrl_i(ctrl_bus_if_c); -- instruction fetch
bus_rd_req <= ctrl_i(ctrl_bus_rd_c); -- store access
233,10 → 232,10
align_err <= '0';
else -- bus transfer in progress
bus_timeout <= std_ulogic_vector(unsigned(bus_timeout) - 1);
align_err <= (align_err or misaligned_data or misaligned_instr) and (not exc_ack_i);
access_err <= (access_err or (not or_all_f(bus_timeout)) or bus_err_i) and (not exc_ack_i);
align_err <= (align_err or misaligned_data or misaligned_instr) and (not ctrl_i(ctrl_bus_exc_ack_c));
access_err <= (access_err or (not or_all_f(bus_timeout)) or bus_err_i) and (not ctrl_i(ctrl_bus_exc_ack_c));
if (align_err = '1') or (access_err = '1') then
if (exc_ack_i = '1') then -- wait for controller to ack exception
if (ctrl_i(ctrl_bus_exc_ack_c) = '1') then -- wait for controller to ack exception
bus_if_req <= '0';
bus_rd_req <= '0';
bus_wr_req <= '0';
262,6 → 261,9
ma_load_o <= bus_rd_req and align_err;
ma_store_o <= bus_wr_req and align_err;
 
-- terminate bus access --
bus_cancel_o <= (bus_busy and (align_err or access_err)) or ctrl_i(ctrl_bus_reset_c);
 
-- wait for bus --
bus_busy_o <= bus_busy;
bus_wait_o <= bus_busy and (not bus_ack_i); -- FIXME: 'async' ack
291,10 → 293,10
begin
-- check instruction access --
misaligned_instr <= '0'; -- default
if (ctrl_i(ctrl_sys_c_ext_en_c) = '1') then -- 16-bit and 32-bit instruction accesses
misaligned_instr <= '0';
if (CPU_EXTENSION_RISCV_C = true) then -- 16-bit and 32-bit instruction accesses
misaligned_instr <= '0'; -- no alignment exceptions possible
else -- 32-bit instruction accesses only
if (pc_i(1 downto 0) /= "00") then
if (pc_i(1) = '1') then -- PC(0) is always zero
misaligned_instr <= '1';
end if;
end if;
/rtl/core/neorv32_cpu_control.vhd
104,6 → 104,8
-- external interrupt --
clic_irq_i : in std_ulogic; -- CLIC interrupt request
mtime_irq_i : in std_ulogic; -- machine timer interrupt
-- system time input from MTIME --
time_i : in std_ulogic_vector(63 downto 0); -- current system time
-- 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
112,7 → 114,6
be_instr_i : in std_ulogic; -- bus error on instruction access
be_load_i : in std_ulogic; -- bus error on load data access
be_store_i : in std_ulogic; -- bus error on store data access
bus_exc_ack_o : out std_ulogic; -- bus exception error acknowledge
bus_busy_i : in std_ulogic -- bus unit is busy
);
end neorv32_cpu_control;
140,6 → 141,7
ci_return_nxt : std_ulogic;
reset : std_ulogic;
bus_err_ack : std_ulogic;
bus_reset : std_ulogic;
end record;
signal fetch_engine : fetch_engine_t;
 
179,6 → 181,8
pc_nxt : std_ulogic_vector(data_width_c-1 downto 0);
next_pc : std_ulogic_vector(data_width_c-1 downto 0); -- next PC, corresponding to next instruction to be executed
last_pc : std_ulogic_vector(data_width_c-1 downto 0); -- PC of last executed instruction
sleep : std_ulogic; -- CPU in sleep mode
sleep_nxt : std_ulogic; -- CPU in sleep mode
end record;
signal execute_engine : execute_engine_t;
 
212,8 → 216,6
 
-- fast bus access --
signal bus_fast_ir : std_ulogic;
signal bus_fast_rd : std_ulogic;
signal bus_fast_wr : std_ulogic;
 
-- RISC-V control and status registers (CSRs) --
type csr_t is record
228,21 → 230,19
mie_meie : std_ulogic; -- mie.MEIE: machine external interrupt enable (R/W)
mie_mtie : std_ulogic; -- mie.MEIE: machine timer interrupt enable (R/W)
mepc : std_ulogic_vector(data_width_c-1 downto 0); -- mepc: machine exception pc (R/W)
mcause : std_ulogic_vector(data_width_c-1 downto 0); -- mcause: machine trap cause (R/-)
mcause : std_ulogic_vector(data_width_c-1 downto 0); -- mcause: machine trap cause (R/W)
mtvec : std_ulogic_vector(data_width_c-1 downto 0); -- mtvec: machine trap-handler base address (R/W)
mtval : std_ulogic_vector(data_width_c-1 downto 0); -- mtval: machine bad address or isntruction (R/-)
mtval : std_ulogic_vector(data_width_c-1 downto 0); -- mtval: machine bad address or isntruction (R/W)
mscratch : std_ulogic_vector(data_width_c-1 downto 0); -- mscratch: scratch register (R/W)
cycle : std_ulogic_vector(32 downto 0); -- cycle, mtime (R/-), plus carry bit
instret : std_ulogic_vector(32 downto 0); -- instret (R/-), plus carry bit
cycleh : std_ulogic_vector(31 downto 0); -- cycleh, mtimeh (R/-)
instreth : std_ulogic_vector(31 downto 0); -- instreth (R/-)
misa_c_en : std_ulogic; -- misa: C extension enable bit (R/W)
misa_m_en : std_ulogic; -- misa: M extension enable bit (R/W)
mcycle : std_ulogic_vector(32 downto 0); -- mcycle (R/W), plus carry bit
minstret : std_ulogic_vector(32 downto 0); -- minstret (R/W), plus carry bit
mcycleh : std_ulogic_vector(31 downto 0); -- mcycleh (R/W)
minstreth : std_ulogic_vector(31 downto 0); -- minstreth (R/W)
end record;
signal csr : csr_t;
 
signal cycle_msb : std_ulogic;
signal instret_msb : std_ulogic;
signal mcycle_msb : std_ulogic;
signal minstret_msb : std_ulogic;
 
-- illegal instruction check --
signal illegal_instruction : std_ulogic;
330,6 → 330,7
fetch_engine.ci_reg_nxt <= fetch_engine.ci_reg;
fetch_engine.ci_return_nxt <= fetch_engine.ci_return;
fetch_engine.bus_err_ack <= '0';
fetch_engine.bus_reset <= '0';
 
-- instruction prefetch buffer interface --
ipb.we <= '0';
340,12 → 341,12
-- state machine --
case fetch_engine.state is
 
when IFETCH_RESET => -- reset engine, prefetch buffer, get PC
when IFETCH_RESET => -- reset engine, prefetch buffer, get appilcation PC
-- ------------------------------------------------------------
fetch_engine.i_buf_state_nxt <= (others => '0');
fetch_engine.ci_return_nxt <= '0';
fetch_engine.bus_reset <= '1'; -- reset bus unit
ipb.clear <= '1'; -- clear instruction prefetch buffer
fetch_engine.bus_err_ack <= '1'; -- ack bus errors, the execute engine has to take care of them
fetch_engine.state_nxt <= IFETCH_0;
 
when IFETCH_0 => -- output current PC to bus system, request 32-bit word
364,7 → 365,7
fetch_engine.i_buf_state_nxt(1) <= fetch_engine.i_buf_state(0);
fetch_engine.state_nxt <= IFETCH_2;
end if;
 
fetch_engine.i_buf_state_nxt(0) <= '1';
if (be_instr_i = '1') or (ma_instr_i = '1') then -- any fetch exception?
fetch_engine.bus_err_ack <= '1'; -- ack bus errors, the execute engine has to take care of them
373,11 → 374,11
when IFETCH_2 => -- construct instruction and issue
-- ------------------------------------------------------------
if (fetch_engine.i_buf_state(1) = '1') then
if (fetch_engine.pc_fetch(1) = '0') or (CPU_EXTENSION_RISCV_C = false) or (csr.misa_c_en = '0') then -- 32-bit aligned
if (fetch_engine.pc_fetch(1) = '0') or (CPU_EXTENSION_RISCV_C = false) then -- 32-bit aligned
fetch_engine.ci_reg_nxt <= fetch_engine.i_buf2(33 downto 32) & fetch_engine.i_buf2(15 downto 00);
ipb.wdata <= fetch_engine.i_buf2(33 downto 32) & '0' & fetch_engine.i_buf2(31 downto 0);
if (fetch_engine.i_buf2(01 downto 00) = "11") or (CPU_EXTENSION_RISCV_C = false) or (csr.misa_c_en = '0') then -- uncompressed
if (fetch_engine.i_buf2(01 downto 00) = "11") or (CPU_EXTENSION_RISCV_C = false) then -- uncompressed
if (ipb.free = '1') then -- free entry in buffer?
ipb.we <= '1';
fetch_engine.pc_real_add <= std_ulogic_vector(to_unsigned(4, data_width_c));
548,6 → 549,8
end if;
execute_engine.state <= SYS_WAIT;
execute_engine.state_prev <= SYS_WAIT;
--
execute_engine.sleep <= '0';
elsif rising_edge(clk_i) then
execute_engine.pc <= execute_engine.pc_nxt(data_width_c-1 downto 1) & '0';
if (execute_engine.state = EXECUTE) then
555,6 → 558,8
end if;
execute_engine.state <= execute_engine.state_nxt;
execute_engine.state_prev <= execute_engine.state;
--
execute_engine.sleep <= execute_engine.sleep_nxt;
end if;
end process execute_engine_fsm_sync_rst;
 
582,7 → 587,7
 
-- CPU Control Bus Output -----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
ctrl_output: process(ctrl, execute_engine, csr, bus_fast_ir, bus_fast_rd, bus_fast_wr)
ctrl_output: process(ctrl, execute_engine, fetch_engine, trap_ctrl, csr, bus_fast_ir)
begin
ctrl_o <= ctrl;
-- direct output of register addresses --
591,11 → 596,9
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);
-- bus access requests --
ctrl_o(ctrl_bus_if_c) <= ctrl(ctrl_bus_if_c) or bus_fast_ir;
ctrl_o(ctrl_bus_rd_c) <= ctrl(ctrl_bus_rd_c) or bus_fast_rd;
ctrl_o(ctrl_bus_wr_c) <= ctrl(ctrl_bus_wr_c) or bus_fast_wr;
-- cpu extension control --
ctrl_o(ctrl_sys_c_ext_en_c) <= csr.misa_c_en; -- C extension enabled
ctrl_o(ctrl_sys_m_ext_en_c) <= csr.misa_m_en; -- M extension enabled
-- bus control --
ctrl_o(ctrl_bus_exc_ack_c) <= trap_ctrl.env_start_ack or fetch_engine.bus_err_ack;
ctrl_o(ctrl_bus_reset_c) <= fetch_engine.bus_reset;
end process ctrl_output;
 
 
614,6 → 617,7
execute_engine.is_jump_nxt <= '0';
execute_engine.is_ci_nxt <= execute_engine.is_ci;
execute_engine.pc_nxt <= execute_engine.pc(data_width_c-1 downto 1) & '0';
execute_engine.sleep_nxt <= execute_engine.sleep;
 
-- instruction dispatch --
fetch_engine.reset <= '0';
623,10 → 627,6
trap_ctrl.env_start_ack <= '0';
trap_ctrl.env_end <= '0';
 
-- bus access (fast) --
bus_fast_rd <= '0';
bus_fast_wr <= '0';
 
-- exception trigger --
trap_ctrl.instr_be <= '0';
trap_ctrl.instr_ma <= '0';
708,16 → 708,21
execute_engine.is_ci_nxt <= ipb.rdata(32); -- flag to indicate this is a compressed instruction beeing executed
execute_engine.i_reg_nxt <= ipb.rdata(31 downto 0);
execute_engine.pc_nxt <= ipb.raddr(data_width_c-1 downto 1) & '0'; -- the PC according to the current instruction
execute_engine.state_nxt <= EXECUTE;
if (execute_engine.sleep = '1') then
execute_engine.state_nxt <= TRAP;
else
execute_engine.state_nxt <= EXECUTE;
end if;
end if;
end if;
 
when TRAP => -- Start trap environment (also used as sleep state)
when TRAP => -- Start trap environment (also used as cpu sleep state)
-- ------------------------------------------------------------
fetch_engine.reset <= '1';
if (trap_ctrl.env_start = '1') then
trap_ctrl.env_start_ack <= '1';
execute_engine.sleep_nxt <= '0'; -- waky waky
execute_engine.pc_nxt <= csr.mtvec(data_width_c-1 downto 1) & '0';
fetch_engine.reset <= '1';
execute_engine.state_nxt <= SYS_WAIT;
end if;
 
732,18 → 737,23
ctrl_nxt(ctrl_alu_opc_mux_c) <= not alu_immediate_v;
ctrl_nxt(ctrl_alu_cmd2_c downto ctrl_alu_cmd0_c) <= alu_operation_v; -- actual ALU operation
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "00"; -- RF input = ALU result
if (CPU_EXTENSION_RISCV_M = true) and (execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c) = opcode_alu_c) and
(execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0000001") then -- MULDIV?
ctrl_nxt(ctrl_cp_use_c) <= '1'; -- use CP
ctrl_nxt(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) <= cp_sel_muldiv_c; -- muldiv CP
-- multi cycle alu operation? --
if (alu_operation_v = alu_cmd_shift_c) or -- shift operation
((CPU_EXTENSION_RISCV_M = true) and (execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c) = opcode_alu_c) and
(execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0000001")) then -- MULDIV?
execute_engine.state_nxt <= ALU_WAIT;
elsif (alu_operation_v = alu_cmd_shift_c) then -- multi-cycle shift operation?
execute_engine.state_nxt <= ALU_WAIT;
else
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back
execute_engine.state_nxt <= DISPATCH;
end if;
-- cp access? --
if (CPU_EXTENSION_RISCV_M = true) and (execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c) = opcode_alu_c) and
(execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0000001") then -- MULDIV?
ctrl_nxt(ctrl_cp_use_c) <= '1'; -- use CP
ctrl_nxt(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) <= cp_sel_muldiv_c; -- muldiv CP
end if;
 
 
when opcode_lui_c | opcode_auipc_c => -- load upper immediate (add to PC)
-- ------------------------------------------------------------
ctrl_nxt(ctrl_rf_clear_rs1_c) <= '1'; -- force RS1 = r0
817,22 → 827,20
--
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 x"000" => -- ECALL
when funct12_ecall_c => -- ECALL
trap_ctrl.env_call <= '1';
execute_engine.state_nxt <= SYS_WAIT;
when x"001" => -- EBREAK
when funct12_ebreak_c => -- EBREAK
trap_ctrl.break_point <= '1';
execute_engine.state_nxt <= SYS_WAIT;
when x"302" => -- MRET
trap_ctrl.env_end <= '1';
execute_engine.pc_nxt <= csr.mepc(data_width_c-1 downto 1) & '0';
fetch_engine.reset <= '1';
execute_engine.state_nxt <= SYS_WAIT;
when x"105" => -- WFI
execute_engine.state_nxt <= TRAP;
when funct12_mret_c => -- MRET
trap_ctrl.env_end <= '1';
execute_engine.pc_nxt <= csr.mepc(data_width_c-1 downto 1) & '0';
fetch_engine.reset <= '1';
when funct12_wfi_c => -- WFI = "CPU sleep"
execute_engine.sleep_nxt <= '1'; -- good night
when others => -- undefined
NULL;
end case;
execute_engine.state_nxt <= SYS_WAIT;
elsif (CPU_EXTENSION_RISCV_Zicsr = true) then -- CSR access
execute_engine.state_nxt <= CSR_ACCESS;
else
892,7 → 900,7
-- RF write back --
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "11"; -- RF input = CSR output register
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back
execute_engine.state_nxt <= DISPATCH; -- FIXME should be SYS_WAIT? have another cycle to let side-effects kick in
execute_engine.state_nxt <= DISPATCH; -- FIXME should be SYS_WAIT? have another cycle to let side-effects kick in
 
when ALU_WAIT => -- wait for multi-cycle ALU operation to finish
-- ------------------------------------------------------------
906,19 → 914,21
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_add_i(data_width_c-1 downto 1) & '0';
fetch_engine.reset <= '1';
execute_engine.pc_nxt <= alu_add_i(data_width_c-1 downto 1) & '0'; -- branch/jump destination
fetch_engine.reset <= '1';
execute_engine.state_nxt <= SYS_WAIT;
else
execute_engine.state_nxt <= DISPATCH;
end if;
execute_engine.state_nxt <= SYS_WAIT;
 
when LOAD => -- trigger memory read request
-- ------------------------------------------------------------
ctrl_nxt(ctrl_bus_rd_c) <= '1';--bus_fast_rd <= '1'; -- fast read request
ctrl_nxt(ctrl_bus_rd_c) <= '1'; -- fast read request
execute_engine.state_nxt <= LOADSTORE_0;
 
when STORE => -- trigger memory write request
-- ------------------------------------------------------------
ctrl_nxt(ctrl_bus_wr_c) <= '1';--bus_fast_wr <= '1'; -- fast write request
ctrl_nxt(ctrl_bus_wr_c) <= '1'; -- fast write request
execute_engine.state_nxt <= LOADSTORE_0;
 
when LOADSTORE_0 => -- memory latency
951,6 → 961,8
-- -------------------------------------------------------------------------------------------
illegal_instruction_check: process(execute_engine, csr, ctrl_nxt, ci_illegal)
begin
-- illegal instructions are checked in the EXECUTE stage
-- the execute engine will only commit valid instructions
if (execute_engine.state = EXECUTE) then
-- defaults --
illegal_instruction <= '0';
1023,7 → 1035,7
 
when opcode_alu_c => -- check ALU funct3 & funct7
if (execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0000001") then -- MULDIV
if (CPU_EXTENSION_RISCV_M = false) or (csr.misa_m_en = '0') then -- not implemented or disabled
if (CPU_EXTENSION_RISCV_M = false) then -- not implemented
illegal_instruction <= '1';
end if;
elsif ((execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_subadd_c) or
1064,10 → 1076,10
(execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = x"344") or -- mip
--
((execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = x"c00") and (CPU_EXTENSION_RISCV_E = false) and (CSR_COUNTERS_USE = true)) or -- cycle
((execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = x"c01") and (CPU_EXTENSION_RISCV_E = false) and (CSR_COUNTERS_USE = true)) or -- time
((execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = x"c01") and (IO_MTIME_USE = true)) or -- time
((execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = x"c02") and (CPU_EXTENSION_RISCV_E = false) and (CSR_COUNTERS_USE = true)) or -- instret
((execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = x"c80") and (CPU_EXTENSION_RISCV_E = false) and (CSR_COUNTERS_USE = true)) or -- cycleh
((execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = x"c81") and (CPU_EXTENSION_RISCV_E = false) and (CSR_COUNTERS_USE = true)) or -- timeh
((execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = x"c81") and (IO_MTIME_USE = true)) or -- timeh
((execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = x"c82") and (CPU_EXTENSION_RISCV_E = false) and (CSR_COUNTERS_USE = true)) or -- instreth
--
((execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = x"b00") and (CPU_EXTENSION_RISCV_E = false) and (CSR_COUNTERS_USE = true)) or -- mcycle
1092,10 → 1104,10
-- ecall, ebreak, mret, wfi --
elsif (execute_engine.i_reg(instr_rd_msb_c downto instr_rd_lsb_c) = "00000") and
(execute_engine.i_reg(instr_rs1_msb_c downto instr_rs1_lsb_c) = "00000") then
if (execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = "000000000000") or -- ECALL
(execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = "000000000001") or -- EBREAK
(execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = "001100000010") or -- MRET
(execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = "000100000101") then -- WFI
if (execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = funct12_ecall_c) or -- ECALL
(execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = funct12_ebreak_c) or -- EBREAK
(execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = funct12_mret_c) or -- MRET
(execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = funct12_wfi_c) then -- WFI
illegal_instruction <= '0';
else
illegal_instruction <= '1';
1108,7 → 1120,7
if (execute_engine.i_reg(1 downto 0) = "11") then -- undefined/unimplemented opcode
illegal_instruction <= '1';
else -- compressed instruction: illegal or disabled / not implemented
illegal_compressed <= ci_illegal or (not csr.misa_c_en);
illegal_compressed <= ci_illegal;
end if;
 
end case;
1161,8 → 1173,8
 
-- trap control --
if (trap_ctrl.env_start = '0') then -- no started trap handler
if (trap_ctrl.exc_fire = '1') or ((trap_ctrl.irq_fire = '1') and
((execute_engine.state = EXECUTE) or (execute_engine.state = TRAP))) then -- exception/IRQ detected!
if (trap_ctrl.exc_fire = '1') or ((trap_ctrl.irq_fire = '1') and -- exception/IRQ detected!
((execute_engine.state = EXECUTE) or (execute_engine.state = TRAP))) then -- sample IRQs in EXECUTE or TRAP state only
trap_ctrl.cause <= trap_ctrl.cause_nxt; -- capture source ID for program
trap_ctrl.exc_src <= trap_ctrl.exc_buf; -- capture exception source for hardware
trap_ctrl.exc_ack <= '1'; -- clear execption
1184,13 → 1196,7
trap_ctrl.exc_fire <= or_all_f(trap_ctrl.exc_buf); -- classic exceptions (faults/traps) cannot be masked
trap_ctrl.irq_fire <= or_all_f(trap_ctrl.irq_buf) and csr.mstatus_mie; -- classic interrupts can be enabled/disabled
 
-- exception acknowledge for bus unit --
bus_exc_ack_o <= trap_ctrl.env_start_ack or fetch_engine.bus_err_ack;
 
-- exception/interrupt/status ID visible for program --
csr.mcause <= trap_ctrl.cause;
 
 
-- Trap Priority Detector -----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
trap_priority: process(trap_ctrl)
1284,22 → 1290,14
-- Control and Status Registers (CSRs)
-- ****************************************************************************************************************************
 
-- CSR CPU Access -------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
csr_cpu_acc: process(clk_i)
begin
if rising_edge(clk_i) then
csr.we <= csr.we_nxt;
csr.re <= csr.re_nxt;
end if;
end process csr_cpu_acc;
 
 
-- Control and Status Registers Write Access ----------------------------------------------
-- -------------------------------------------------------------------------------------------
csr_write_access: process(rstn_i, clk_i)
begin
if (rstn_i = '0') then
csr.we <= '0';
csr.re <= '0';
--
csr.mstatus_mie <= '0';
csr.mstatus_mpie <= '0';
csr.mie_msie <= '0';
1309,55 → 1307,64
csr.mtval <= (others => '0');
csr.mepc <= (others => '0');
csr.mip_msip <= '0';
csr.misa_c_en <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_C); -- C CPU extension
csr.misa_m_en <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_M); -- M CPU extension
elsif rising_edge(clk_i) then
if (CPU_EXTENSION_RISCV_Zicsr = true) then
-- access --
csr.we <= csr.we_nxt;
csr.re <= csr.re_nxt;
 
-- defaults --
csr.mip_msip <= '0';
 
-- register that can be modified by user --
-- registers that can be modified by user --
if (csr.we = '1') then -- manual update
 
-- machine trap setup --
if (execute_engine.i_reg(31 downto 24) = x"30") then
if (execute_engine.i_reg(23 downto 20) = x"0") then -- R/W: mstatus - machine status register
csr.mstatus_mie <= csr_wdata_i(03);
csr.mstatus_mpie <= csr_wdata_i(07);
-- Machine CSRs: Standard read/write
if (execute_engine.i_reg(31 downto 28) = x"3") then
-- machine trap setup --
if (execute_engine.i_reg(27 downto 24) = x"0") then
case execute_engine.i_reg(23 downto 20) is
when x"0" => -- R/W: mstatus - machine status register
csr.mstatus_mie <= csr_wdata_i(03);
csr.mstatus_mpie <= csr_wdata_i(07);
when x"4" => -- R/W: mie - machine interrupt-enable register
csr.mie_msie <= csr_wdata_i(03); -- SW IRQ enable
csr.mie_mtie <= csr_wdata_i(07); -- TIMER IRQ enable
csr.mie_meie <= csr_wdata_i(11); -- EXT IRQ enable
when x"5" => -- R/W: mtvec - machine trap-handler base address (for ALL exceptions)
csr.mtvec <= csr_wdata_i;
when others =>
NULL;
end case;
end if;
if (execute_engine.i_reg(23 downto 20) = x"1") then -- R/W: misa - machine instruction set extensions
csr.misa_c_en <= csr_wdata_i(02); -- C extension enable/disable during runtime
csr.misa_m_en <= csr_wdata_i(12); -- M extension enable/disable during runtime
-- machine trap handling --
if (execute_engine.i_reg(27 downto 24) = x"4") then
case execute_engine.i_reg(23 downto 20) is
when x"0" => -- R/W: mscratch - machine scratch register
csr.mscratch <= csr_wdata_i;
when x"1" => -- R/W: mepc - machine exception program counter
csr.mepc <= csr_wdata_i;
when x"2" => -- R/W: mcause - machine trap cause
csr.mcause <= csr_wdata_i;
when x"3" => -- R/W: mtval - machine bad address or instruction
csr.mtval <= csr_wdata_i;
when x"4" => -- R/W: mip - machine interrupt pending
csr.mip_msip <= csr_wdata_i(03); -- manual SW IRQ trigger
when others =>
NULL;
end case;
end if;
if (execute_engine.i_reg(23 downto 20) = x"4") then -- R/W: mie - machine interrupt-enable register
csr.mie_msie <= csr_wdata_i(03); -- SW IRQ enable
csr.mie_mtie <= csr_wdata_i(07); -- TIMER IRQ enable
csr.mie_meie <= csr_wdata_i(11); -- EXT IRQ enable
end if;
if (execute_engine.i_reg(23 downto 20) = x"5") then -- R/W: mtvec - machine trap-handler base address (for ALL exceptions)
csr.mtvec <= csr_wdata_i;
end if;
end if;
 
-- machine trap handling --
if (execute_engine.i_reg(31 downto 24) = x"34") then
if (execute_engine.i_reg(23 downto 20) = x"0") then -- R/W: mscratch - machine scratch register
csr.mscratch <= csr_wdata_i;
end if;
if (execute_engine.i_reg(23 downto 20) = x"1") then-- R/W: mepc - machine exception program counter
csr.mepc <= csr_wdata_i;
end if;
if (execute_engine.i_reg(23 downto 20) = x"4") then -- R/W: mip - machine interrupt pending
csr.mip_msip <= csr_wdata_i(03); -- manual SW IRQ trigger
end if;
end if;
-- automatic update by hardware --
else
 
else -- automatic update by hardware
 
-- machine exception PC & exception value register --
if (trap_ctrl.env_start_ack = '1') then -- trap handler started?
if (csr.mcause(data_width_c-1) = '1') then -- for INTERRUPTS only (mtval not defined for interrupts)
csr.mcause <= trap_ctrl.cause;
if (csr.mcause(data_width_c-1) = '1') then -- for INTERRUPTS only
csr.mepc <= execute_engine.pc(data_width_c-1 downto 1) & '0'; -- this is the CURRENT pc = interrupted instruction
csr.mtval <= (others => '0');
csr.mtval <= (others => '0'); -- mtval not defined 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.exc_src(exception_iaccess_c) or trap_ctrl.exc_src(exception_ialign_c)) = '1') then -- instruction access error OR misaligned instruction
1392,91 → 1399,100
begin
if rising_edge(clk_i) then
csr_rdata_o <= (others => '0'); -- default
if (CPU_EXTENSION_RISCV_Zicsr = true) then -- implement CSR access at all?
if (csr.re = '1') then
case execute_engine.i_reg(31 downto 20) is
-- machine trap setup --
when x"300" => -- R/W: mstatus - machine status register
csr_rdata_o(03) <= csr.mstatus_mie; -- MIE
csr_rdata_o(07) <= csr.mstatus_mpie; -- MPIE
csr_rdata_o(11) <= '1'; -- MPP low
csr_rdata_o(12) <= '1'; -- MPP high
when x"301" => -- R/W: misa - ISA and extensions
csr_rdata_o(02) <= csr.misa_c_en; -- C CPU extension
csr_rdata_o(04) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- E CPU extension
csr_rdata_o(08) <= not bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- I CPU extension (if not E)
csr_rdata_o(12) <= csr.misa_m_en; -- M CPU extension
csr_rdata_o(23) <= '1'; -- X CPU extension: non-standard extensions
csr_rdata_o(25) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_Zicsr) and bool_to_ulogic_f(CPU_EXTENSION_RISCV_Zifencei); -- Z CPU extension
csr_rdata_o(30) <= '1'; -- 32-bit architecture (MXL lo)
csr_rdata_o(31) <= '0'; -- 32-bit architecture (MXL hi)
when x"304" => -- R/W: mie - machine interrupt-enable register
csr_rdata_o(03) <= csr.mie_msie; -- software IRQ enable
csr_rdata_o(07) <= csr.mie_mtie; -- timer IRQ enable
csr_rdata_o(11) <= csr.mie_meie; -- external IRQ enable
when x"305" => -- R/W: mtvec - machine trap-handler base address (for ALL exceptions)
csr_rdata_o <= csr.mtvec;
-- machine trap handling --
when x"340" => -- R/W: mscratch - machine scratch register
csr_rdata_o <= csr.mscratch;
when x"341" => -- R/W: mepc - machine exception program counter
csr_rdata_o <= csr.mepc;
when x"342" => -- R/-: mcause - machine trap cause
csr_rdata_o <= csr.mcause;
when x"343" => -- R/-: mtval - machine bad address or instruction
csr_rdata_o <= csr.mtval;
when x"344" => -- R/W: mip - machine interrupt pending
csr_rdata_o(03) <= trap_ctrl.irq_buf(interrupt_msw_irq_c);
csr_rdata_o(07) <= trap_ctrl.irq_buf(interrupt_mtime_irq_c);
csr_rdata_o(11) <= trap_ctrl.irq_buf(interrupt_mext_irq_c);
-- counter and timers --
when x"c00" | x"c01" | x"b00" => -- R/-: cycle/time/mcycle: Cycle counter LOW / Timer LOW
csr_rdata_o <= csr.cycle(31 downto 0);
when x"c02" | x"b02" => -- R/-: instret/minstret: Instructions-retired counter LOW
csr_rdata_o <= csr.instret(31 downto 0);
when x"c80" | x"c81" | x"b80" => -- R/-: cycleh/timeh/mcycleh: Cycle counter HIGH / Timer HIGH
csr_rdata_o <= csr.cycleh;
when x"c82" | x"b82" => -- R/-: instreth/minstreth: Instructions-retired counter HIGH
csr_rdata_o <= csr.instreth;
-- machine information registers --
when x"f13" => -- R/-: mimpid - implementation ID / version
csr_rdata_o <= hw_version_c;
when x"f14" => -- R/-: mhartid - hardware thread ID
csr_rdata_o <= HART_ID;
-- CUSTOM read-only machine CSRs --
when x"fc0" => -- R/-: mfeatures - implemented processor devices/features
csr_rdata_o(00) <= bool_to_ulogic_f(BOOTLOADER_USE); -- implement processor-internal bootloader?
csr_rdata_o(01) <= bool_to_ulogic_f(MEM_EXT_USE); -- implement external memory bus interface?
csr_rdata_o(02) <= bool_to_ulogic_f(MEM_INT_IMEM_USE); -- implement processor-internal instruction memory?
csr_rdata_o(03) <= bool_to_ulogic_f(MEM_INT_IMEM_ROM); -- implement processor-internal instruction memory as ROM?
csr_rdata_o(04) <= bool_to_ulogic_f(MEM_INT_DMEM_USE); -- implement processor-internal data memory?
csr_rdata_o(05) <= bool_to_ulogic_f(CSR_COUNTERS_USE); -- implement RISC-V (performance) counter?
--
csr_rdata_o(16) <= bool_to_ulogic_f(IO_GPIO_USE); -- implement general purpose input/output port unit (GPIO)?
csr_rdata_o(17) <= bool_to_ulogic_f(IO_MTIME_USE); -- implement machine system timer (MTIME)?
csr_rdata_o(18) <= bool_to_ulogic_f(IO_UART_USE); -- implement universal asynchronous receiver/transmitter (UART)?
csr_rdata_o(19) <= bool_to_ulogic_f(IO_SPI_USE); -- implement serial peripheral interface (SPI)?
csr_rdata_o(20) <= bool_to_ulogic_f(IO_TWI_USE); -- implement two-wire interface (TWI)?
csr_rdata_o(21) <= bool_to_ulogic_f(IO_PWM_USE); -- implement pulse-width modulation unit (PWM)?
csr_rdata_o(22) <= bool_to_ulogic_f(IO_WDT_USE); -- implement watch dog timer (WDT)?
csr_rdata_o(23) <= bool_to_ulogic_f(IO_CLIC_USE); -- implement core local interrupt controller (CLIC)?
csr_rdata_o(24) <= bool_to_ulogic_f(IO_TRNG_USE); -- implement true random number generator (TRNG)?
csr_rdata_o(25) <= bool_to_ulogic_f(IO_DEVNULL_USE); -- implement dummy device (DEVNULL)?
when x"fc1" => -- R/-: mclock - processor clock speed
csr_rdata_o <= std_ulogic_vector(to_unsigned(CLOCK_FREQUENCY, 32));
when x"fc4" => -- R/-: mispacebase - Base address of instruction memory space
csr_rdata_o <= MEM_ISPACE_BASE;
when x"fc5" => -- R/-: mdspacebase - Base address of data memory space
csr_rdata_o <= MEM_DSPACE_BASE;
when x"fc6" => -- R/-: mispacesize - Total size of instruction memory space in byte
csr_rdata_o <= std_ulogic_vector(to_unsigned(MEM_ISPACE_SIZE, 32));
when x"fc7" => -- R/-: mdspacesize - Total size of data memory space in byte
csr_rdata_o <= std_ulogic_vector(to_unsigned(MEM_DSPACE_SIZE, 32));
-- undefined/unavailable --
when others =>
csr_rdata_o <= (others => '0'); -- not implemented (yet)
end case;
end if;
if (CPU_EXTENSION_RISCV_Zicsr = true) and (csr.re = '1') then
case execute_engine.i_reg(31 downto 20) is
 
-- machine trap setup --
when x"300" => -- R/W: mstatus - machine status register
csr_rdata_o(03) <= csr.mstatus_mie; -- MIE
csr_rdata_o(07) <= csr.mstatus_mpie; -- MPIE
csr_rdata_o(11) <= '1'; -- MPP low
csr_rdata_o(12) <= '1'; -- MPP high
when x"301" => -- R/-: misa - ISA and extensions
csr_rdata_o(02) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_C); -- C CPU extension
csr_rdata_o(04) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- E CPU extension
csr_rdata_o(08) <= not bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- I CPU extension (if not E)
csr_rdata_o(12) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_M); -- M CPU extension
csr_rdata_o(25) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_Zicsr) and bool_to_ulogic_f(CPU_EXTENSION_RISCV_Zifencei); -- Z CPU extension
csr_rdata_o(30) <= '1'; -- 32-bit architecture (MXL lo)
csr_rdata_o(31) <= '0'; -- 32-bit architecture (MXL hi)
when x"304" => -- R/W: mie - machine interrupt-enable register
csr_rdata_o(03) <= csr.mie_msie; -- software IRQ enable
csr_rdata_o(07) <= csr.mie_mtie; -- timer IRQ enable
csr_rdata_o(11) <= csr.mie_meie; -- external IRQ enable
when x"305" => -- R/W: mtvec - machine trap-handler base address (for ALL exceptions)
csr_rdata_o <= csr.mtvec;
 
-- machine trap handling --
when x"340" => -- R/W: mscratch - machine scratch register
csr_rdata_o <= csr.mscratch;
when x"341" => -- R/W: mepc - machine exception program counter
csr_rdata_o <= csr.mepc;
when x"342" => -- R/W: mcause - machine trap cause
csr_rdata_o <= csr.mcause;
when x"343" => -- R/W: mtval - machine bad address or instruction
csr_rdata_o <= csr.mtval;
when x"344" => -- R/W: mip - machine interrupt pending
csr_rdata_o(03) <= trap_ctrl.irq_buf(interrupt_msw_irq_c);
csr_rdata_o(07) <= trap_ctrl.irq_buf(interrupt_mtime_irq_c);
csr_rdata_o(11) <= trap_ctrl.irq_buf(interrupt_mext_irq_c);
 
-- counter and timers --
when x"c00" | x"b00" => -- R/(W): cycle/mcycle: Cycle counter LOW
csr_rdata_o <= csr.mcycle(31 downto 0);
when x"c02" | x"b02" => -- R/(W): instret/minstret: Instructions-retired counter LOW
csr_rdata_o <= csr.minstret(31 downto 0);
when x"c80" | x"b80" => -- R/(W): cycleh/mcycleh: Cycle counter HIGH
csr_rdata_o <= csr.mcycleh;
when x"c82" | x"b82" => -- R/(W): instreth/minstreth: Instructions-retired counter HIGH
csr_rdata_o <= csr.minstreth;
 
when x"c01" => -- R/-: time: System time LOW (from MTIME unit)
csr_rdata_o <= time_i(31 downto 0);
when x"c81" => -- R/-: timeh: System time HIGH (from MTIME unit)
csr_rdata_o <= time_i(63 downto 32);
 
-- machine information registers --
when x"f13" => -- R/-: mimpid - implementation ID / version
csr_rdata_o <= hw_version_c;
when x"f14" => -- R/-: mhartid - hardware thread ID
csr_rdata_o <= HART_ID;
 
-- CUSTOM read-only machine CSRs --
when x"fc0" => -- R/-: mfeatures - implemented processor devices/features
csr_rdata_o(00) <= bool_to_ulogic_f(BOOTLOADER_USE); -- implement processor-internal bootloader?
csr_rdata_o(01) <= bool_to_ulogic_f(MEM_EXT_USE); -- implement external memory bus interface?
csr_rdata_o(02) <= bool_to_ulogic_f(MEM_INT_IMEM_USE); -- implement processor-internal instruction memory?
csr_rdata_o(03) <= bool_to_ulogic_f(MEM_INT_IMEM_ROM); -- implement processor-internal instruction memory as ROM?
csr_rdata_o(04) <= bool_to_ulogic_f(MEM_INT_DMEM_USE); -- implement processor-internal data memory?
csr_rdata_o(05) <= bool_to_ulogic_f(CSR_COUNTERS_USE); -- implement RISC-V (performance) counter?
--
csr_rdata_o(16) <= bool_to_ulogic_f(IO_GPIO_USE); -- implement general purpose input/output port unit (GPIO)?
csr_rdata_o(17) <= bool_to_ulogic_f(IO_MTIME_USE); -- implement machine system timer (MTIME)?
csr_rdata_o(18) <= bool_to_ulogic_f(IO_UART_USE); -- implement universal asynchronous receiver/transmitter (UART)?
csr_rdata_o(19) <= bool_to_ulogic_f(IO_SPI_USE); -- implement serial peripheral interface (SPI)?
csr_rdata_o(20) <= bool_to_ulogic_f(IO_TWI_USE); -- implement two-wire interface (TWI)?
csr_rdata_o(21) <= bool_to_ulogic_f(IO_PWM_USE); -- implement pulse-width modulation unit (PWM)?
csr_rdata_o(22) <= bool_to_ulogic_f(IO_WDT_USE); -- implement watch dog timer (WDT)?
csr_rdata_o(23) <= bool_to_ulogic_f(IO_CLIC_USE); -- implement core local interrupt controller (CLIC)?
csr_rdata_o(24) <= bool_to_ulogic_f(IO_TRNG_USE); -- implement true random number generator (TRNG)?
csr_rdata_o(25) <= bool_to_ulogic_f(IO_DEVNULL_USE); -- implement dummy device (DEVNULL)?
when x"fc1" => -- R/-: mclock - processor clock speed
csr_rdata_o <= std_ulogic_vector(to_unsigned(CLOCK_FREQUENCY, 32));
when x"fc4" => -- R/-: mispacebase - Base address of instruction memory space
csr_rdata_o <= MEM_ISPACE_BASE;
when x"fc5" => -- R/-: mdspacebase - Base address of data memory space
csr_rdata_o <= MEM_DSPACE_BASE;
when x"fc6" => -- R/-: mispacesize - Total size of instruction memory space in byte
csr_rdata_o <= std_ulogic_vector(to_unsigned(MEM_ISPACE_SIZE, 32));
when x"fc7" => -- R/-: mdspacesize - Total size of data memory space in byte
csr_rdata_o <= std_ulogic_vector(to_unsigned(MEM_DSPACE_SIZE, 32));
 
-- undefined/unavailable --
when others =>
csr_rdata_o <= (others => '0'); -- not implemented
 
end case;
end if;
end if;
end process csr_read_access;
1487,29 → 1503,47
csr_counters: process(rstn_i, clk_i)
begin
if (rstn_i = '0') then
csr.cycle <= (others => '0');
csr.instret <= (others => '0');
csr.cycleh <= (others => '0');
csr.instreth <= (others => '0');
cycle_msb <= '0';
instret_msb <= '0';
csr.mcycle <= (others => '0');
csr.minstret <= (others => '0');
csr.mcycleh <= (others => '0');
csr.minstreth <= (others => '0');
mcycle_msb <= '0';
minstret_msb <= '0';
elsif rising_edge(clk_i) then
if (CPU_EXTENSION_RISCV_E = false) and (CSR_COUNTERS_USE = true) then
-- low word overflow buffers --
cycle_msb <= csr.cycle(csr.cycle'left);
instret_msb <= csr.instret(csr.instret'left);
-- low word counters --
csr.cycle <= std_ulogic_vector(unsigned(csr.cycle) + 1);
if (execute_engine.state_prev /= EXECUTE) and (execute_engine.state = EXECUTE) then
csr.instret <= std_ulogic_vector(unsigned(csr.instret) + 1);
 
-- mcycle (cycle) --
mcycle_msb <= csr.mcycle(csr.mcycle'left);
if (csr.we = '1') and (execute_engine.i_reg(31 downto 20) = x"b00") then -- write access
csr.mcycle(31 downto 0) <= csr_wdata_i;
csr.mcycle(32) <= '0';
elsif (execute_engine.sleep = '0') then -- automatic update
csr.mcycle <= std_ulogic_vector(unsigned(csr.mcycle) + 1);
end if;
-- high word counters --
if ((cycle_msb xor csr.cycle(csr.cycle'left)) = '1') then
csr.cycleh <= std_ulogic_vector(unsigned(csr.cycleh) + 1);
 
-- mcycleh (cycleh) --
if (csr.we = '1') and (execute_engine.i_reg(31 downto 20) = x"b80") then -- write access
csr.mcycleh <= csr_wdata_i;
elsif ((mcycle_msb xor csr.mcycle(csr.mcycle'left)) = '1') then -- automatic update
csr.mcycleh <= std_ulogic_vector(unsigned(csr.mcycleh) + 1);
end if;
if ((instret_msb xor csr.instret(csr.instret'left)) = '1') then
csr.instreth <= std_ulogic_vector(unsigned(csr.instreth) + 1);
 
-- minstret (instret) --
minstret_msb <= csr.minstret(csr.minstret'left);
if (csr.we = '1') and (execute_engine.i_reg(31 downto 20) = x"b02") then -- write access
csr.minstret(31 downto 0) <= csr_wdata_i;
csr.minstret(32) <= '0';
elsif (execute_engine.state_prev /= EXECUTE) and (execute_engine.state = EXECUTE) then -- automatic update
csr.minstret <= std_ulogic_vector(unsigned(csr.minstret) + 1);
end if;
 
-- minstreth (instreth) --
if (csr.we = '1') and (execute_engine.i_reg(31 downto 20) = x"b82") then -- write access
csr.minstreth <= csr_wdata_i;
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_counters;
/rtl/core/neorv32_mtime.vhd
7,6 → 7,7
-- # However, the achine time cannot issue a new interrupt until the mtimecmp.HI register is #
-- # written again. #
-- # Note: The 64-bit time and compare system is broken and de-coupled into two 32-bit systems. #
-- # Note: The register of this unit can only be written in WORD MODE. #
-- # ********************************************************************************************* #
-- # BSD 3-Clause License #
-- # #
58,6 → 59,8
data_i : in std_ulogic_vector(31 downto 0); -- data in
data_o : out std_ulogic_vector(31 downto 0); -- data out
ack_o : out std_ulogic; -- transfer acknowledge
-- time output for CPU --
time_o : out std_ulogic_vector(63 downto 0); -- current system time
-- interrupt --
irq_o : out std_ulogic -- interrupt request
);
75,7 → 78,8
signal wren : std_ulogic; -- module access enable
 
-- accessible regs --
signal mtimecmp : std_ulogic_vector(63 downto 0);
signal mtimecmp_lo : std_ulogic_vector(31 downto 0);
signal mtimecmp_hi : std_ulogic_vector(31 downto 0);
signal mtime_lo : std_ulogic_vector(32 downto 0);
signal mtime_lo_msb_ff : std_ulogic;
signal mtime_hi : std_ulogic_vector(31 downto 0);
85,8 → 89,6
signal cmp_lo_ff : std_ulogic;
signal cmp_hi : std_ulogic;
signal cmp_match_ff : std_ulogic;
signal irq_flag : std_ulogic;
signal irq_flag_ff : std_ulogic;
 
begin
 
94,52 → 96,38
-- -------------------------------------------------------------------------------------------
acc_en <= '1' when (addr_i(hi_abb_c downto lo_abb_c) = mtime_base_c(hi_abb_c downto lo_abb_c)) else '0';
addr <= mtime_base_c(31 downto lo_abb_c) & addr_i(lo_abb_c-1 downto 2) & "00"; -- word aligned
wren <= acc_en and wren_i;
wren <= acc_en and wren_i and and_all_f(ben_i);
 
 
-- System Time Update ---------------------------------------------------------------------
-- Write Access ---------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
system_time: process(clk_i)
wr_access: process(clk_i)
begin
if rising_edge(clk_i) then
if (rstn_i = '0') then
mtime_lo <= (others => '0');
mtime_hi <= (others => '0');
else
-- mtime low --
mtime_lo <= std_ulogic_vector(unsigned(mtime_lo) + 1);
mtime_lo_msb_ff <= mtime_lo(mtime_lo'left);
-- mtime high --
if ((mtime_lo_msb_ff xor mtime_lo(mtime_lo'left)) = '1') then -- mtime_lo carry?
mtime_hi <= std_ulogic_vector(unsigned(mtime_hi) + 1);
-- mtimecmp --
if (wren = '1') then
if (addr = mtime_cmp_lo_addr_c) then -- low
mtimecmp_lo <= data_i;
end if;
if (addr = mtime_cmp_hi_addr_c) then -- high
mtimecmp_hi <= data_i;
end if;
end if;
end if;
end process system_time;
 
 
-- Write Access ---------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
wr_access: process(clk_i)
begin
if rising_edge(clk_i) then
ack_o <= acc_en and (rden_i or wren_i);
-- mtimecmp low --
if (wren = '1') and (addr = mtime_cmp_lo_addr_c) then
for i in 0 to 3 loop
if (ben_i(i) = '1') then
mtimecmp(00+7+i*8 downto 00+0+i*8) <= data_i(7+i*8 downto 0+i*8);
end if;
end loop; -- byte enable
-- mtime low --
if (wren = '1') and (addr = mtime_time_lo_addr_c) then
mtime_lo_msb_ff <= '0';
mtime_lo <= '0' & data_i;
else -- auto increment
mtime_lo_msb_ff <= mtime_lo(mtime_lo'left);
mtime_lo <= std_ulogic_vector(unsigned(mtime_lo) + 1);
end if;
 
-- mtimecmp high --
if (wren = '1') and (addr = mtime_cmp_hi_addr_c) then
for i in 0 to 3 loop
if (ben_i(i) = '1') then
mtimecmp(32+7+i*8 downto 32+0+i*8) <= data_i(7+i*8 downto 0+i*8);
end if;
end loop; -- byte enable
-- mtime high --
if (wren = '1') and (addr = mtime_time_hi_addr_c) then
mtime_hi <= data_i;
elsif ((mtime_lo_msb_ff xor mtime_lo(mtime_lo'left)) = '1') then -- mtime_lo carry?
mtime_hi <= std_ulogic_vector(unsigned(mtime_hi) + 1);
end if;
end if;
end process wr_access;
150,6 → 138,7
rd_access: process(clk_i)
begin
if rising_edge(clk_i) then
ack_o <= acc_en and (rden_i or wren_i);
data_o <= (others => '0'); -- default
if (rden_i = '1') and (acc_en = '1') then
if (addr = mtime_time_lo_addr_c) then -- mtime LOW
157,15 → 146,18
elsif (addr = mtime_time_hi_addr_c) then -- mtime HIGH
data_o <= mtime_hi;
elsif (addr = mtime_cmp_lo_addr_c) then -- mtimecmp LOW
data_o <= mtimecmp(31 downto 00);
data_o <= mtimecmp_lo;
else -- (addr = mtime_cmp_hi_addr_c) then -- mtimecmp HIGH
data_o <= mtimecmp(63 downto 32);
data_o <= mtimecmp_hi;
end if;
end if;
end if;
end process rd_access;
 
-- time output for cpu --
time_o <= mtime_hi & mtime_lo(31 downto 00);
 
 
-- Comparator -----------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
cmp_sync: process(clk_i)
173,38 → 165,13
if rising_edge(clk_i) then
cmp_lo_ff <= cmp_lo;
cmp_match_ff <= cmp_lo_ff and cmp_hi;
irq_o <= cmp_lo_ff and cmp_hi and (not cmp_match_ff);
end if;
end process cmp_sync;
 
-- test words --
cmp_lo <= '1' when (unsigned(mtime_lo(31 downto 00)) >= unsigned(mtimecmp(31 downto 00))) else '0';
cmp_hi <= '1' when (unsigned(mtime_hi(31 downto 00)) >= unsigned(mtimecmp(63 downto 32))) else '0';
cmp_lo <= '1' when (unsigned(mtime_lo(31 downto 00)) >= unsigned(mtimecmp_lo)) else '0';
cmp_hi <= '1' when (unsigned(mtime_hi(31 downto 00)) >= unsigned(mtimecmp_hi)) else '0';
 
 
-- Interrupt Logic ------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
irq_ctrl: process(clk_i)
begin
if rising_edge(clk_i) then
if (rstn_i = '0') then
irq_flag_ff <= '0';
irq_flag <= '0';
else
irq_flag_ff <= irq_flag;
if (irq_flag = '0') then -- idle
irq_flag <= '0';
if (cmp_match_ff = '1') then
irq_flag <= '1';
end if;
elsif (wren = '1') and (addr = mtime_cmp_hi_addr_c) then -- ACK
irq_flag <= '0';
end if;
end if;
end if;
end process irq_ctrl;
 
-- irq output to CPU --
irq_o <= irq_flag and (not irq_flag_ff); -- rising edge detector
 
 
end neorv32_mtime_rtl;
/rtl/core/neorv32_package.vhd
41,7 → 41,7
-- Architecture Constants -----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
constant data_width_c : natural := 32; -- data width - FIXED!
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01000100"; -- no touchy!
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01000600"; -- no touchy!
 
-- Internal Functions ---------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
178,16 → 178,15
constant ctrl_bus_mdo_we_c : natural := 37; -- memory data out register write enable
constant ctrl_bus_mdi_we_c : natural := 38; -- memory data in register write enable
constant ctrl_bus_unsigned_c : natural := 39; -- is unsigned load
constant ctrl_bus_exc_ack_c : natural := 40; -- acknowledge bus exception
constant ctrl_bus_reset_c : natural := 41; -- reset bus unit, terminate all actions
-- co-processor --
constant ctrl_cp_use_c : natural := 40; -- is cp operation
constant ctrl_cp_id_lsb_c : natural := 41; -- cp select lsb
constant ctrl_cp_id_msb_c : natural := 42; -- cp select 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
-- system --
constant ctrl_sys_c_ext_en_c : natural := 46; -- CPU C extension enabled
constant ctrl_sys_m_ext_en_c : natural := 47; -- CPU M extension enabled
constant ctrl_cp_use_c : natural := 42; -- is cp operation
constant ctrl_cp_id_lsb_c : natural := 43; -- cp select lsb
constant ctrl_cp_id_msb_c : natural := 44; -- cp select msb
constant ctrl_cp_cmd0_c : natural := 45; -- cp command bit 0
constant ctrl_cp_cmd1_c : natural := 46; -- cp command bit 1
constant ctrl_cp_cmd2_c : natural := 47; -- cp command bit 2
-- control bus size --
constant ctrl_width_c : natural := 48; -- control bus size
 
277,6 → 276,14
constant funct3_fence_c : std_ulogic_vector(2 downto 0) := "000"; -- fence - order IO/memory access (->NOP)
constant funct3_fencei_c : std_ulogic_vector(2 downto 0) := "001"; -- fencei - instructon stream sync
 
-- RISC-V Funct12 --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- system --
constant funct12_ecall_c : std_ulogic_vector(11 downto 0) := x"000"; -- ECALL
constant funct12_ebreak_c : std_ulogic_vector(11 downto 0) := x"001"; -- EBREAK
constant funct12_mret_c : std_ulogic_vector(11 downto 0) := x"302"; -- MRET
constant funct12_wfi_c : std_ulogic_vector(11 downto 0) := x"105"; -- WFI
 
-- Co-Processor Operations ----------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
-- cp ids --
453,20 → 460,23
);
port (
-- global control --
clk_i : in std_ulogic; -- global clock, rising edge
rstn_i : in std_ulogic; -- global reset, low-active, async
clk_i : in std_ulogic; -- global clock, rising edge
rstn_i : in std_ulogic; -- global reset, low-active, async
-- bus interface --
bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable
bus_we_o : out std_ulogic; -- write enable
bus_re_o : out std_ulogic; -- read enable
bus_ack_i : in std_ulogic; -- bus transfer acknowledge
bus_err_i : in std_ulogic; -- bus transfer error
bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable
bus_we_o : out std_ulogic; -- write enable
bus_re_o : out std_ulogic; -- read enable
bus_cancel_o : out std_ulogic; -- cancel current bus transaction
bus_ack_i : in std_ulogic; -- bus transfer acknowledge
bus_err_i : in std_ulogic; -- bus transfer error
-- system time input from MTIME --
time_i : in std_ulogic_vector(63 downto 0); -- current system time
-- external interrupts --
clic_irq_i : in std_ulogic; -- CLIC interrupt request
mtime_irq_i : in std_ulogic -- machine timer interrupt
clic_irq_i : in std_ulogic; -- CLIC interrupt request
mtime_irq_i : in std_ulogic -- machine timer interrupt
);
end component;
 
533,6 → 543,8
-- external interrupt --
clic_irq_i : in std_ulogic; -- CLIC interrupt request
mtime_irq_i : in std_ulogic; -- machine timer interrupt
-- system time input from MTIME --
time_i : in std_ulogic_vector(63 downto 0); -- current system time
-- 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
541,7 → 553,6
be_instr_i : in std_ulogic; -- bus error on instruction access
be_load_i : in std_ulogic; -- bus error on load data access
be_store_i : in std_ulogic; -- bus error on store data access
bus_exc_ack_o : out std_ulogic; -- bus exception error acknowledge
bus_busy_i : in std_ulogic -- bus unit is busy
);
end component;
570,6 → 581,9
-- Component: CPU ALU ---------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
component neorv32_cpu_alu
generic (
CPU_EXTENSION_RISCV_M : boolean := true -- implement muld/div extension?
);
port (
-- global control --
clk_i : in std_ulogic; -- global clock, rising edge
616,40 → 630,41
-- -------------------------------------------------------------------------------------------
component neorv32_cpu_bus
generic (
MEM_EXT_TIMEOUT : natural := 15 -- cycles after which a valid bus access will timeout
CPU_EXTENSION_RISCV_C : boolean := true; -- implement compressed extension?
MEM_EXT_TIMEOUT : natural := 15 -- cycles after which a valid bus access will timeout
);
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
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
-- data input --
wdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- write data
pc_i : in std_ulogic_vector(data_width_c-1 downto 0); -- current PC
alu_i : in std_ulogic_vector(data_width_c-1 downto 0); -- ALU result
wdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- write data
pc_i : in std_ulogic_vector(data_width_c-1 downto 0); -- current PC
alu_i : in std_ulogic_vector(data_width_c-1 downto 0); -- ALU result
-- data output --
instr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- instruction
rdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- read data
instr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- instruction
rdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- read data
-- status --
mar_o : out std_ulogic_vector(data_width_c-1 downto 0); -- current memory address register
ma_instr_o : out std_ulogic; -- misaligned instruction address
ma_load_o : out std_ulogic; -- misaligned load data address
ma_store_o : out std_ulogic; -- misaligned store data address
be_instr_o : out std_ulogic; -- bus error on instruction access
be_load_o : out std_ulogic; -- bus error on load data access
be_store_o : out std_ulogic; -- bus error on store data
bus_wait_o : out std_ulogic; -- wait for bus operation to finish
bus_busy_o : out std_ulogic; -- bus unit is busy
exc_ack_i : in std_ulogic; -- exception controller ACK
mar_o : out std_ulogic_vector(data_width_c-1 downto 0); -- current memory address register
ma_instr_o : out std_ulogic; -- misaligned instruction address
ma_load_o : out std_ulogic; -- misaligned load data address
ma_store_o : out std_ulogic; -- misaligned store data address
be_instr_o : out std_ulogic; -- bus error on instruction access
be_load_o : out std_ulogic; -- bus error on load data access
be_store_o : out std_ulogic; -- bus error on store data
bus_wait_o : out std_ulogic; -- wait for bus operation to finish
bus_busy_o : out std_ulogic; -- bus unit is busy
-- bus system --
bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable
bus_we_o : out std_ulogic; -- write enable
bus_re_o : out std_ulogic; -- read enable
bus_ack_i : in std_ulogic; -- bus transfer acknowledge
bus_err_i : in std_ulogic -- bus transfer error
bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable
bus_we_o : out std_ulogic; -- write enable
bus_re_o : out std_ulogic; -- read enable
bus_cancel_o : out std_ulogic; -- cancel current bus transaction
bus_ack_i : in std_ulogic; -- bus transfer acknowledge
bus_err_i : in std_ulogic -- bus transfer error
);
end component;
 
732,6 → 747,8
data_i : in std_ulogic_vector(31 downto 0); -- data in
data_o : out std_ulogic_vector(31 downto 0); -- data out
ack_o : out std_ulogic; -- transfer acknowledge
-- time output for CPU --
time_o : out std_ulogic_vector(63 downto 0); -- current system time
-- interrupt --
irq_o : out std_ulogic -- interrupt request
);
940,6 → 957,7
ben_i : in std_ulogic_vector(03 downto 0); -- byte write enable
data_i : in std_ulogic_vector(31 downto 0); -- data in
data_o : out std_ulogic_vector(31 downto 0); -- data out
cancel_i : in std_ulogic; -- cancel current bus transaction
ack_o : out std_ulogic; -- transfer acknowledge
err_o : out std_ulogic; -- transfer error
-- wishbone interface --
/rtl/core/neorv32_top.vhd
52,9 → 52,9
BOOTLOADER_USE : boolean := true; -- implement processor-internal bootloader?
CSR_COUNTERS_USE : boolean := true; -- implement RISC-V perf. counters ([m]instret[h], [m]cycle[h], time[h])?
-- RISC-V CPU Extensions --
CPU_EXTENSION_RISCV_C : boolean := true; -- implement compressed extension?
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension?
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension?
CPU_EXTENSION_RISCV_M : boolean := true; -- implement muld/div extension?
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension?
CPU_EXTENSION_RISCV_Zicsr : boolean := true; -- implement CSR system?
CPU_EXTENSION_RISCV_Zifencei : boolean := true; -- implement instruction stream sync.?
-- Memory configuration: Instruction memory --
142,14 → 142,18
signal pwm_cg_en : std_ulogic;
 
-- cpu bus --
signal cpu_addr : std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
signal cpu_rdata : std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
signal cpu_wdata : std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
signal cpu_ben : std_ulogic_vector(03 downto 0); -- byte enable
signal cpu_we : std_ulogic; -- write enable
signal cpu_re : std_ulogic; -- read enable
signal cpu_ack : std_ulogic; -- bus transfer acknowledge
signal cpu_err : std_ulogic; -- bus transfer error
type cpu_bus_t is record
addr : std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
rdata : std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
wdata : std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
ben : std_ulogic_vector(03 downto 0); -- byte enable
we : std_ulogic; -- write enable
re : std_ulogic; -- read enable
cancel : std_ulogic; -- cancel current transfer
ack : std_ulogic; -- bus transfer acknowledge
err : std_ulogic; -- bus transfer error
end record;
signal cpu : cpu_bus_t;
 
-- io space access --
signal io_acc : std_ulogic;
198,6 → 202,9
signal spi_irq : std_ulogic;
signal twi_irq : std_ulogic;
 
-- misc --
signal mtime_time : std_ulogic_vector(63 downto 0); -- current system time from MTIME
 
begin
 
-- Sanity Checks --------------------------------------------------------------------------
352,32 → 359,35
)
port map (
-- global control --
clk_i => clk_i, -- global clock, rising edge
rstn_i => sys_rstn, -- global reset, low-active, async
clk_i => clk_i, -- global clock, rising edge
rstn_i => sys_rstn, -- global reset, low-active, async
-- bus interface --
bus_addr_o => cpu_addr, -- bus access address
bus_rdata_i => cpu_rdata, -- bus read data
bus_wdata_o => cpu_wdata, -- bus write data
bus_ben_o => cpu_ben, -- byte enable
bus_we_o => cpu_we, -- write enable
bus_re_o => cpu_re, -- read enable
bus_ack_i => cpu_ack, -- bus transfer acknowledge
bus_err_i => cpu_err, -- bus transfer error
bus_addr_o => cpu.addr, -- bus access address
bus_rdata_i => cpu.rdata, -- bus read data
bus_wdata_o => cpu.wdata, -- bus write data
bus_ben_o => cpu.ben, -- byte enable
bus_we_o => cpu.we, -- write enable
bus_re_o => cpu.re, -- read enable
bus_cancel_o => cpu.cancel, -- cancel current bus transaction
bus_ack_i => cpu.ack, -- bus transfer acknowledge
bus_err_i => cpu.err, -- bus transfer error
-- system time input from MTIME --
time_i => mtime_time, -- current system time
-- external interrupts --
clic_irq_i => clic_irq, -- CLIC interrupt request
mtime_irq_i => mtime_irq -- machine timer interrupt
clic_irq_i => clic_irq, -- CLIC interrupt request
mtime_irq_i => mtime_irq -- machine timer interrupt
);
 
-- CPU data input --
cpu_rdata <= (imem_rdata or dmem_rdata or bootrom_rdata) or wishbone_rdata or (gpio_rdata or mtime_rdata or
cpu.rdata <= (imem_rdata or dmem_rdata or bootrom_rdata) or wishbone_rdata or (gpio_rdata or mtime_rdata or
uart_rdata or spi_rdata or twi_rdata or pwm_rdata or wdt_rdata or clic_rdata or trng_rdata or devnull_rdata);
 
-- CPU ACK input --
cpu_ack <= (imem_ack or dmem_ack or bootrom_ack) or wishbone_ack or (gpio_ack or mtime_ack or
cpu.ack <= (imem_ack or dmem_ack or bootrom_ack) or wishbone_ack or (gpio_ack or mtime_ack or
uart_ack or spi_ack or twi_ack or pwm_ack or wdt_ack or clic_ack or trng_ack or devnull_ack);
 
-- CPU bus error input --
cpu_err <= wishbone_err;
cpu.err <= wishbone_err;
 
 
-- Processor-Internal Instruction Memory (IMEM) -------------------------------------------
393,12 → 403,12
)
port map (
clk_i => clk_i, -- global clock line
rden_i => cpu_re, -- read enable
wren_i => cpu_we, -- write enable
ben_i => cpu_ben, -- byte write enable
rden_i => cpu.re, -- read enable
wren_i => cpu.we, -- write enable
ben_i => cpu.ben, -- byte write enable
upen_i => '1', -- update enable
addr_i => cpu_addr, -- address
data_i => cpu_wdata, -- data in
addr_i => cpu.addr, -- address
data_i => cpu.wdata, -- data in
data_o => imem_rdata, -- data out
ack_o => imem_ack -- transfer acknowledge
);
422,11 → 432,11
)
port map (
clk_i => clk_i, -- global clock line
rden_i => cpu_re, -- read enable
wren_i => cpu_we, -- write enable
ben_i => cpu_ben, -- byte write enable
addr_i => cpu_addr, -- address
data_i => cpu_wdata, -- data in
rden_i => cpu.re, -- read enable
wren_i => cpu.we, -- write enable
ben_i => cpu.ben, -- byte write enable
addr_i => cpu.addr, -- address
data_i => cpu.wdata, -- data in
data_o => dmem_rdata, -- data out
ack_o => dmem_ack -- transfer acknowledge
);
446,8 → 456,8
neorv32_boot_rom_inst: neorv32_boot_rom
port map (
clk_i => clk_i, -- global clock line
rden_i => cpu_re, -- read enable
addr_i => cpu_addr, -- address
rden_i => cpu.re, -- read enable
addr_i => cpu.addr, -- address
data_o => bootrom_rdata, -- data out
ack_o => bootrom_ack -- transfer acknowledge
);
483,12 → 493,13
clk_i => clk_i, -- global clock line
rstn_i => sys_rstn, -- global reset line, low-active
-- host access --
addr_i => cpu_addr, -- address
rden_i => cpu_re, -- read enable
wren_i => cpu_we, -- write enable
ben_i => cpu_ben, -- byte write enable
data_i => cpu_wdata, -- data in
addr_i => cpu.addr, -- address
rden_i => cpu.re, -- read enable
wren_i => cpu.we, -- write enable
ben_i => cpu.ben, -- byte write enable
data_i => cpu.wdata, -- data in
data_o => wishbone_rdata, -- data out
cancel_i => cpu.cancel, -- cancel current transaction
ack_o => wishbone_ack, -- transfer acknowledge
err_o => wishbone_err, -- transfer error
-- wishbone interface --
521,9 → 532,9
 
-- IO Access? -----------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
io_acc <= '1' when (cpu_addr(data_width_c-1 downto index_size_f(io_size_c)) = io_base_c(data_width_c-1 downto index_size_f(io_size_c))) else '0';
io_rden <= io_acc and cpu_re;
io_wren <= io_acc and cpu_we;
io_acc <= '1' when (cpu.addr(data_width_c-1 downto index_size_f(io_size_c)) = io_base_c(data_width_c-1 downto index_size_f(io_size_c))) else '0';
io_rden <= io_acc and cpu.re;
io_wren <= io_acc and cpu.we;
 
 
-- General Purpose Input/Output Port (GPIO) -----------------------------------------------
534,11 → 545,11
port map (
-- host access --
clk_i => clk_i, -- global clock line
addr_i => cpu_addr, -- address
addr_i => cpu.addr, -- address
rden_i => io_rden, -- read enable
wren_i => io_wren, -- write enable
ben_i => cpu_ben, -- byte write enable
data_i => cpu_wdata, -- data in
ben_i => cpu.ben, -- byte write enable
data_i => cpu.wdata, -- data in
data_o => gpio_rdata, -- data out
ack_o => gpio_ack, -- transfer acknowledge
-- parallel io --
568,9 → 579,9
clk_i => clk_i, -- global clock line
rden_i => io_rden, -- read enable
wren_i => io_wren, -- write enable
ben_i => cpu_ben, -- byte write enable
addr_i => cpu_addr, -- address
data_i => cpu_wdata, -- data in
ben_i => cpu.ben, -- byte write enable
addr_i => cpu.addr, -- address
data_i => cpu.wdata, -- data in
data_o => clic_rdata, -- data out
ack_o => clic_ack, -- transfer acknowledge
-- cpu interrupt --
615,9 → 626,9
rstn_i => ext_rstn, -- global reset line, low-active
rden_i => io_rden, -- read enable
wren_i => io_wren, -- write enable
ben_i => cpu_ben, -- byte write enable
addr_i => cpu_addr, -- address
data_i => cpu_wdata, -- data in
ben_i => cpu.ben, -- byte write enable
addr_i => cpu.addr, -- address
data_i => cpu.wdata, -- data in
data_o => wdt_rdata, -- data out
ack_o => wdt_ack, -- transfer acknowledge
-- clock generator --
648,13 → 659,15
-- host access --
clk_i => clk_i, -- global clock line
rstn_i => sys_rstn, -- global reset, low-active, async
addr_i => cpu_addr, -- address
addr_i => cpu.addr, -- address
rden_i => io_rden, -- read enable
wren_i => io_wren, -- write enable
ben_i => cpu_ben, -- byte write enable
data_i => cpu_wdata, -- data in
ben_i => cpu.ben, -- byte write enable
data_i => cpu.wdata, -- data in
data_o => mtime_rdata, -- data out
ack_o => mtime_ack, -- transfer acknowledge
-- time output for CPU --
time_o => mtime_time, -- current system time
-- interrupt --
irq_o => mtime_irq -- interrupt request
);
663,6 → 676,7
neorv32_mtime_inst_false:
if (IO_MTIME_USE = false) generate
mtime_rdata <= (others => '0');
mtime_time <= (others => '0');
mtime_ack <= '0';
mtime_irq <= '0';
end generate;
676,11 → 690,11
port map (
-- host access --
clk_i => clk_i, -- global clock line
addr_i => cpu_addr, -- address
addr_i => cpu.addr, -- address
rden_i => io_rden, -- read enable
wren_i => io_wren, -- write enable
ben_i => cpu_ben, -- byte write enable
data_i => cpu_wdata, -- data in
ben_i => cpu.ben, -- byte write enable
data_i => cpu.wdata, -- data in
data_o => uart_rdata, -- data out
ack_o => uart_ack, -- transfer acknowledge
-- clock generator --
712,11 → 726,11
port map (
-- host access --
clk_i => clk_i, -- global clock line
addr_i => cpu_addr, -- address
addr_i => cpu.addr, -- address
rden_i => io_rden, -- read enable
wren_i => io_wren, -- write enable
ben_i => cpu_ben, -- byte write enable
data_i => cpu_wdata, -- data in
ben_i => cpu.ben, -- byte write enable
data_i => cpu.wdata, -- data in
data_o => spi_rdata, -- data out
ack_o => spi_ack, -- transfer acknowledge
-- clock generator --
752,11 → 766,11
port map (
-- host access --
clk_i => clk_i, -- global clock line
addr_i => cpu_addr, -- address
addr_i => cpu.addr, -- address
rden_i => io_rden, -- read enable
wren_i => io_wren, -- write enable
ben_i => cpu_ben, -- byte write enable
data_i => cpu_wdata, -- data in
ben_i => cpu.ben, -- byte write enable
data_i => cpu.wdata, -- data in
data_o => twi_rdata, -- data out
ack_o => twi_ack, -- transfer acknowledge
-- clock generator --
789,11 → 803,11
port map (
-- host access --
clk_i => clk_i, -- global clock line
addr_i => cpu_addr, -- address
addr_i => cpu.addr, -- address
rden_i => io_rden, -- read enable
wren_i => io_wren, -- write enable
ben_i => cpu_ben, -- byte write enable
data_i => cpu_wdata, -- data in
ben_i => cpu.ben, -- byte write enable
data_i => cpu.wdata, -- data in
data_o => pwm_rdata, -- data out
ack_o => pwm_ack, -- transfer acknowledge
-- clock generator --
821,11 → 835,11
port map (
-- host access --
clk_i => clk_i, -- global clock line
addr_i => cpu_addr, -- address
addr_i => cpu.addr, -- address
rden_i => io_rden, -- read enable
wren_i => io_wren, -- write enable
ben_i => cpu_ben, -- byte write enable
data_i => cpu_wdata, -- data in
ben_i => cpu.ben, -- byte write enable
data_i => cpu.wdata, -- data in
data_o => trng_rdata, -- data out
ack_o => trng_ack -- transfer acknowledge
);
846,11 → 860,11
port map (
-- host access --
clk_i => clk_i, -- global clock line
addr_i => cpu_addr, -- address
addr_i => cpu.addr, -- address
rden_i => io_rden, -- read enable
wren_i => io_wren, -- write enable
ben_i => cpu_ben, -- byte write enable
data_i => cpu_wdata, -- data in
ben_i => cpu.ben, -- byte write enable
data_i => cpu.wdata, -- data in
data_o => devnull_rdata, -- data out
ack_o => devnull_ack -- transfer acknowledge
);
/rtl/core/neorv32_wishbone.vhd
72,6 → 72,7
ben_i : in std_ulogic_vector(03 downto 0); -- byte write enable
data_i : in std_ulogic_vector(31 downto 0); -- data in
data_o : out std_ulogic_vector(31 downto 0); -- data out
cancel_i : in std_ulogic; -- cancel current bus transaction
ack_o : out std_ulogic; -- transfer acknowledge
err_o : out std_ulogic; -- transfer error
-- wishbone interface --
108,7 → 109,7
-- -------------------------------------------------------------------------------------------
sanity_check: process(clk_i)
begin
if rising_edge(clk_i) then -- just for simulation
if rising_edge(clk_i) then
if (INTERFACE_REG_STAGES > 2) then
assert false report "NEORV32 CONFIG ERROR! Number of external memory interface buffer stages must be 0, 1 or 2." severity error;
end if;
144,10 → 145,8
-- bus cycle --
if (INTERFACE_REG_STAGES = 0) then
wb_cyc_ff <= '0'; -- unused
elsif (INTERFACE_REG_STAGES = 1) then
wb_cyc_ff <= wb_access and ((not wb_ack_i) or (not wb_err_i));
elsif (INTERFACE_REG_STAGES = 2) then
wb_cyc_ff <= wb_access and ((not wb_ack_ff) or (not wb_err_ff));
else
wb_cyc_ff <= (wb_cyc_ff or wb_access) and ((not wb_ack_i) or (not wb_err_i)) and (not cancel_i);
end if;
-- bus strobe --
wb_stb_ff1 <= wb_stb_ff0;
188,10 → 187,12
buffer_stages_one: process(clk_i)
begin
if rising_edge(clk_i) then
wb_adr_o <= addr_i;
wb_dat_o <= data_i;
wb_sel_o <= ben_i;
wb_we_o <= wren_i;
if (wb_cyc_ff = '0') then
wb_adr_o <= addr_i;
wb_dat_o <= data_i;
wb_sel_o <= ben_i;
wb_we_o <= wren_i;
end if;
end if;
end process buffer_stages_one;
data_o <= wb_dat_i;
202,11 → 203,13
buffer_stages_two: process(clk_i)
begin
if rising_edge(clk_i) then
wb_adr_o <= addr_i;
wb_dat_o <= data_i;
wb_sel_o <= ben_i;
wb_we_o <= wren_i;
data_o <= wb_dat_i;
if (wb_cyc_ff = '0') then
wb_adr_o <= addr_i;
wb_dat_o <= data_i;
wb_sel_o <= ben_i;
wb_we_o <= wren_i;
data_o <= wb_dat_i;
end if;
end if;
end process buffer_stages_two;
end generate;
/rtl/top_templates/README.md
0,0 → 1,10
## Top Templates
 
The top entity of the NEORV32 processor is `rtl/core/neorv32_top.vhd`. This folder provides additional
top entities, that instantiate the processor's top entity and have a different top interface.
 
### `neorv32_test_setup.vhd`
 
This entity is intended as "FPGA hello world" example for playing with the NEORV32. It uses only some of the
provided peripherals and provides a very simple and basic interface - only the clock, reset, UART and a subset
of the GPIO output port are propagated to the outer world.
/sim/vivado/neorv32_tb_behav.wcfg
12,15 → 12,15
</db_ref>
</db_ref_list>
<zoom_setting>
<ZoomStartTime time="2538228050fs"></ZoomStartTime>
<ZoomEndTime time="2538245251fs"></ZoomEndTime>
<Cursor1Time time="2538353150fs"></Cursor1Time>
<ZoomStartTime time="84997884fs"></ZoomStartTime>
<ZoomEndTime time="85016285fs"></ZoomEndTime>
<Cursor1Time time="85050184fs"></Cursor1Time>
</zoom_setting>
<column_width_setting>
<NameColumnWidth column_width="178"></NameColumnWidth>
<ValueColumnWidth column_width="127"></ValueColumnWidth>
<ValueColumnWidth column_width="115"></ValueColumnWidth>
</column_width_setting>
<WVObjectSize size="156" />
<WVObjectSize size="157" />
<wvobject type="divider" fp_name="divider273">
<obj_property name="label">CPU: Control.FETCH</obj_property>
<obj_property name="DisplayName">label</obj_property>
65,154 → 65,6
<obj_property name="ElementShortName">fetch_engine</obj_property>
<obj_property name="ObjectShortName">fetch_engine</obj_property>
<obj_property name="isExpanded"></obj_property>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.state" type="other">
<obj_property name="ElementShortName">.state</obj_property>
<obj_property name="ObjectShortName">.state</obj_property>
<obj_property name="CustomSignalColor">#FFD700</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.state_nxt" type="other">
<obj_property name="ElementShortName">.state_nxt</obj_property>
<obj_property name="ObjectShortName">.state_nxt</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf" type="array">
<obj_property name="ElementShortName">.i_buf[33:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf[33:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf_nxt" type="array">
<obj_property name="ElementShortName">.i_buf_nxt[33:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf_nxt[33:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf2" type="array">
<obj_property name="ElementShortName">.i_buf2[33:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf2[33:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf2_nxt" type="array">
<obj_property name="ElementShortName">.i_buf2_nxt[33:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf2_nxt[33:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.ci_reg" type="array">
<obj_property name="ElementShortName">.ci_reg[17:0]</obj_property>
<obj_property name="ObjectShortName">.ci_reg[17:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.ci_reg_nxt" type="array">
<obj_property name="ElementShortName">.ci_reg_nxt[17:0]</obj_property>
<obj_property name="ObjectShortName">.ci_reg_nxt[17:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf_state" type="array">
<obj_property name="ElementShortName">.i_buf_state[1:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf_state[1:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf_state_nxt" type="array">
<obj_property name="ElementShortName">.i_buf_state_nxt[1:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf_state_nxt[1:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.pc_real" type="array">
<obj_property name="ElementShortName">.pc_real[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc_real[31:0]</obj_property>
<obj_property name="CustomSignalColor">#FFFFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.pc_real_add" type="array">
<obj_property name="ElementShortName">.pc_real_add[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc_real_add[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.pc_fetch" type="array">
<obj_property name="ElementShortName">.pc_fetch[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc_fetch[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.pc_fetch_add" type="array">
<obj_property name="ElementShortName">.pc_fetch_add[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc_fetch_add[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.ci_return" type="logic">
<obj_property name="ElementShortName">.ci_return</obj_property>
<obj_property name="ObjectShortName">.ci_return</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.ci_return_nxt" type="logic">
<obj_property name="ElementShortName">.ci_return_nxt</obj_property>
<obj_property name="ObjectShortName">.ci_return_nxt</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.reset" type="logic">
<obj_property name="ElementShortName">.reset</obj_property>
<obj_property name="ObjectShortName">.reset</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.bus_err_ack" type="logic">
<obj_property name="ElementShortName">.bus_err_ack</obj_property>
<obj_property name="ObjectShortName">.bus_err_ack</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.state" type="other">
<obj_property name="ElementShortName">.state</obj_property>
<obj_property name="ObjectShortName">.state</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.state_nxt" type="other">
<obj_property name="ElementShortName">.state_nxt</obj_property>
<obj_property name="ObjectShortName">.state_nxt</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf" type="array">
<obj_property name="ElementShortName">.i_buf[33:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf[33:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf_nxt" type="array">
<obj_property name="ElementShortName">.i_buf_nxt[33:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf_nxt[33:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf2" type="array">
<obj_property name="ElementShortName">.i_buf2[33:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf2[33:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf2_nxt" type="array">
<obj_property name="ElementShortName">.i_buf2_nxt[33:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf2_nxt[33:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.ci_reg" type="array">
<obj_property name="ElementShortName">.ci_reg[17:0]</obj_property>
<obj_property name="ObjectShortName">.ci_reg[17:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.ci_reg_nxt" type="array">
<obj_property name="ElementShortName">.ci_reg_nxt[17:0]</obj_property>
<obj_property name="ObjectShortName">.ci_reg_nxt[17:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf_state" type="array">
<obj_property name="ElementShortName">.i_buf_state[1:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf_state[1:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.i_buf_state_nxt" type="array">
<obj_property name="ElementShortName">.i_buf_state_nxt[1:0]</obj_property>
<obj_property name="ObjectShortName">.i_buf_state_nxt[1:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.pc_real" type="array">
<obj_property name="ElementShortName">.pc_real[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc_real[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.pc_real_add" type="array">
<obj_property name="ElementShortName">.pc_real_add[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc_real_add[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.pc_fetch" type="array">
<obj_property name="ElementShortName">.pc_fetch[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc_fetch[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.pc_fetch_add" type="array">
<obj_property name="ElementShortName">.pc_fetch_add[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc_fetch_add[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.ci_return" type="logic">
<obj_property name="ElementShortName">.ci_return</obj_property>
<obj_property name="ObjectShortName">.ci_return</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.ci_return_nxt" type="logic">
<obj_property name="ElementShortName">.ci_return_nxt</obj_property>
<obj_property name="ObjectShortName">.ci_return_nxt</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.reset" type="logic">
<obj_property name="ElementShortName">.reset</obj_property>
<obj_property name="ObjectShortName">.reset</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine.bus_err_ack" type="logic">
<obj_property name="ElementShortName">.bus_err_ack</obj_property>
<obj_property name="ObjectShortName">.bus_err_ack</obj_property>
</wvobject>
</wvobject>
<wvobject type="divider" fp_name="divider273">
<obj_property name="label">CPU: Control.IPB</obj_property>
287,10 → 139,6
<obj_property name="ElementShortName">be_store_i</obj_property>
<obj_property name="ObjectShortName">be_store_i</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/bus_exc_ack_o" type="logic">
<obj_property name="ElementShortName">bus_exc_ack_o</obj_property>
<obj_property name="ObjectShortName">bus_exc_ack_o</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/ctrl" type="array">
<obj_property name="ElementShortName">ctrl[47:0]</obj_property>
<obj_property name="ObjectShortName">ctrl[47:0]</obj_property>
299,14 → 147,6
<obj_property name="ElementShortName">ctrl_o[47:0]</obj_property>
<obj_property name="ObjectShortName">ctrl_o[47:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/bus_fast_rd" type="logic">
<obj_property name="ElementShortName">bus_fast_rd</obj_property>
<obj_property name="ObjectShortName">bus_fast_rd</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/bus_fast_wr" type="logic">
<obj_property name="ElementShortName">bus_fast_wr</obj_property>
<obj_property name="ObjectShortName">bus_fast_wr</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/ci_instr32" type="array">
<obj_property name="ElementShortName">ci_instr32[31:0]</obj_property>
<obj_property name="ObjectShortName">ci_instr32[31:0]</obj_property>
343,123 → 183,27
<obj_property name="ElementShortName">execute_engine</obj_property>
<obj_property name="ObjectShortName">execute_engine</obj_property>
<obj_property name="isExpanded"></obj_property>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.state" type="other">
<obj_property name="ElementShortName">.state</obj_property>
<obj_property name="ObjectShortName">.state</obj_property>
<obj_property name="CustomSignalColor">#FFD700</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.state_nxt" type="other">
<obj_property name="ElementShortName">.state_nxt</obj_property>
<obj_property name="ObjectShortName">.state_nxt</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.state_prev" type="other">
<obj_property name="ElementShortName">.state_prev</obj_property>
<obj_property name="ObjectShortName">.state_prev</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.i_reg" type="array">
<obj_property name="ElementShortName">.i_reg[31:0]</obj_property>
<obj_property name="ObjectShortName">.i_reg[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.i_reg_nxt" type="array">
<obj_property name="ElementShortName">.i_reg_nxt[31:0]</obj_property>
<obj_property name="ObjectShortName">.i_reg_nxt[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.is_ci" type="logic">
<obj_property name="ElementShortName">.is_ci</obj_property>
<obj_property name="ObjectShortName">.is_ci</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.is_ci_nxt" type="logic">
<obj_property name="ElementShortName">.is_ci_nxt</obj_property>
<obj_property name="ObjectShortName">.is_ci_nxt</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.is_jump" type="logic">
<obj_property name="ElementShortName">.is_jump</obj_property>
<obj_property name="ObjectShortName">.is_jump</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.is_jump_nxt" type="logic">
<obj_property name="ElementShortName">.is_jump_nxt</obj_property>
<obj_property name="ObjectShortName">.is_jump_nxt</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.branch_taken" type="logic">
<obj_property name="ElementShortName">.branch_taken</obj_property>
<obj_property name="ObjectShortName">.branch_taken</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.pc" type="array">
<obj_property name="ElementShortName">.pc[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc[31:0]</obj_property>
<obj_property name="CustomSignalColor">#FFFFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.pc_nxt" type="array">
<obj_property name="ElementShortName">.pc_nxt[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc_nxt[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.next_pc" type="array">
<obj_property name="ElementShortName">.next_pc[31:0]</obj_property>
<obj_property name="ObjectShortName">.next_pc[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.last_pc" type="array">
<obj_property name="ElementShortName">.last_pc[31:0]</obj_property>
<obj_property name="ObjectShortName">.last_pc[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.state" type="other">
<obj_property name="ElementShortName">.state</obj_property>
<obj_property name="ObjectShortName">.state</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.state_nxt" type="other">
<obj_property name="ElementShortName">.state_nxt</obj_property>
<obj_property name="ObjectShortName">.state_nxt</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.state_prev" type="other">
<obj_property name="ElementShortName">.state_prev</obj_property>
<obj_property name="ObjectShortName">.state_prev</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.i_reg" type="array">
<obj_property name="ElementShortName">.i_reg[31:0]</obj_property>
<obj_property name="ObjectShortName">.i_reg[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.i_reg_nxt" type="array">
<obj_property name="ElementShortName">.i_reg_nxt[31:0]</obj_property>
<obj_property name="ObjectShortName">.i_reg_nxt[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.is_ci" type="logic">
<obj_property name="ElementShortName">.is_ci</obj_property>
<obj_property name="ObjectShortName">.is_ci</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.is_ci_nxt" type="logic">
<obj_property name="ElementShortName">.is_ci_nxt</obj_property>
<obj_property name="ObjectShortName">.is_ci_nxt</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.is_jump" type="logic">
<obj_property name="ElementShortName">.is_jump</obj_property>
<obj_property name="ObjectShortName">.is_jump</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.is_jump_nxt" type="logic">
<obj_property name="ElementShortName">.is_jump_nxt</obj_property>
<obj_property name="ObjectShortName">.is_jump_nxt</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.branch_taken" type="logic">
<obj_property name="ElementShortName">.branch_taken</obj_property>
<obj_property name="ObjectShortName">.branch_taken</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.pc" type="array">
<obj_property name="ElementShortName">.pc[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.pc_nxt" type="array">
<obj_property name="ElementShortName">.pc_nxt[31:0]</obj_property>
<obj_property name="ObjectShortName">.pc_nxt[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.next_pc" type="array">
<obj_property name="ElementShortName">.next_pc[31:0]</obj_property>
<obj_property name="ObjectShortName">.next_pc[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.last_pc" type="array">
<obj_property name="ElementShortName">.last_pc[31:0]</obj_property>
<obj_property name="ObjectShortName">.last_pc[31:0]</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/CPU_EXTENSION_RISCV_C" type="other">
<obj_property name="ElementShortName">CPU_EXTENSION_RISCV_C</obj_property>
<obj_property name="ObjectShortName">CPU_EXTENSION_RISCV_C</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/CPU_EXTENSION_RISCV_E" type="other">
<obj_property name="ElementShortName">CPU_EXTENSION_RISCV_E</obj_property>
<obj_property name="ObjectShortName">CPU_EXTENSION_RISCV_E</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/CPU_EXTENSION_RISCV_M" type="other">
<obj_property name="ElementShortName">CPU_EXTENSION_RISCV_M</obj_property>
<obj_property name="ObjectShortName">CPU_EXTENSION_RISCV_M</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/CPU_EXTENSION_RISCV_Zicsr" type="other">
<obj_property name="ElementShortName">CPU_EXTENSION_RISCV_Zicsr</obj_property>
<obj_property name="ObjectShortName">CPU_EXTENSION_RISCV_Zicsr</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/CPU_EXTENSION_RISCV_Zifencei" type="other">
<obj_property name="ElementShortName">CPU_EXTENSION_RISCV_Zifencei</obj_property>
<obj_property name="ObjectShortName">CPU_EXTENSION_RISCV_Zifencei</obj_property>
</wvobject>
<wvobject type="divider" fp_name="divider139">
<obj_property name="label">CPU: Control.TRAP</obj_property>
<obj_property name="DisplayName">label</obj_property>
714,10 → 458,6
<obj_property name="ElementShortName">bus_wait_o</obj_property>
<obj_property name="ObjectShortName">bus_wait_o</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_bus_inst/exc_ack_i" type="logic">
<obj_property name="ElementShortName">exc_ack_i</obj_property>
<obj_property name="ObjectShortName">exc_ack_i</obj_property>
</wvobject>
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_bus_inst/bus_addr_o" type="array">
<obj_property name="ElementShortName">bus_addr_o[31:0]</obj_property>
<obj_property name="ObjectShortName">bus_addr_o[31:0]</obj_property>
/sim/neorv32_tb.vhd
5,6 → 5,7
-- # 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. #
-- # ********************************************************************************************* #
-- # BSD 3-Clause License #
-- # #
159,7 → 160,7
IO_PWM_USE => true, -- implement pulse-width modulation unit (PWM)?
IO_WDT_USE => true, -- implement watch dog timer (WDT)?
IO_CLIC_USE => true, -- implement core local interrupt controller (CLIC)?
IO_TRNG_USE => false, -- implement true random number generator (TRNG)?
IO_TRNG_USE => false, -- CANNOT BE SIMULATED!
IO_DEVNULL_USE => true -- implement dummy device (DEVNULL)?
)
port map (
/sw/bootloader/bootloader.c
67,7 → 67,7
/** Bootloader status LED at GPIO output port (0..15) */
#define STATUS_LED (0)
/** SPI flash boot image base address */
#define SPI_FLASH_BOOT_ADR (0x00040000)
#define SPI_FLASH_BOOT_ADR (0x00800000)
/** SPI flash chip select at spi_csn_o */
#define SPI_FLASH_CS (0)
/** Default SPI flash clock prescaler for serial peripheral interface */
171,6 → 171,9
// Processor hardware initialization
// ------------------------------------------------
 
// reset system time
neorv32_mtime_set_time(0);
 
// deactivate unused IO devices
neorv32_clic_disable();
neorv32_pwm_disable();
/sw/common/crt0.S
218,10 → 218,10
// Go to endless sleep mode if main returns
// *********************************************************
__crt0_this_is_the_end:
wfi // in case Ziscr is not available -> processor should stall here
csrrci zero, mstatus, 8 // mstatus: disable global IRQs (MIE)
csrrci zero, mstatus, 8 // mstatus: disable global IRQs (MIE)
wfi
j .
__crt0_this_is_the_end_end:
j __crt0_this_is_the_end_end // in case Ziscr is not available
 
 
// *********************************************************
/sw/example/cpu_test/main.c
119,6 → 119,12
int cnt_ok = 0;
int cnt_test = 0;
 
union {
uint64_t uint64;
uint32_t uint32[sizeof(uint64_t)/2];
} cpu_systime;
 
 
// check if UART unit is implemented at all
if (neorv32_uart_available() == 0) {
return 0;
139,6 → 145,7
neorv32_uart_setup(BAUD_RATE, 0, 0);
 
 
neorv32_mtime_set_time(0);
// set CMP of machine system timer MTIME to max to prevent an IRQ
uint64_t mtime_cmp_max = 0xFFFFFFFFFFFFFFFFL;
neorv32_mtime_set_timecmp(mtime_cmp_max);
146,11 → 153,14
// intro
neorv32_uart_printf("\n\n------ CPU TEST ------\n\n");
 
// show project credits
neorv32_rte_print_credits();
 
// show full HW config report
neorv32_rte_print_hw_config();
 
// intro2
neorv32_uart_printf("\n\nNEORV32 exceptions and interrupts test program\n\n");
neorv32_uart_printf("\n\nStarting tests...\n\n");
 
// install exception handler functions
int install_err = 0;
197,8 → 207,72
 
 
// ----------------------------------------------------------
// Test counter CSR access for mcycle[h]
// ----------------------------------------------------------
neorv32_uart_printf("MCYCLE[H]: ");
cnt_test++;
 
neorv32_cpu_csr_write(CSR_MCYCLE, 0x1BCD1234);
neorv32_cpu_csr_write(CSR_MCYCLEH, 0x22334455);
 
if (((neorv32_cpu_csr_read(CSR_MCYCLE) & 0xffff0000L) == 0x1BCD0000) &&
(neorv32_cpu_csr_read(CSR_MCYCLEH) == 0x22334455)) {
neorv32_uart_printf("ok\n");
cnt_ok++;
}
else {
neorv32_uart_printf("fail\n");
cnt_fail++;
}
 
 
// ----------------------------------------------------------
// Test counter CSR access for minstret[h]
// ----------------------------------------------------------
neorv32_uart_printf("MINSTRET[H]: ");
cnt_test++;
 
neorv32_cpu_csr_write(CSR_MINSTRET, 0x11224499);
neorv32_cpu_csr_write(CSR_MINSTRETH, 0x00110011);
 
if (((neorv32_cpu_csr_read(CSR_MINSTRET) & 0xffff0000L) == 0x11220000) &&
(neorv32_cpu_csr_read(CSR_MINSTRETH) == 0x00110011)) {
neorv32_uart_printf("ok\n");
cnt_ok++;
}
else {
neorv32_uart_printf("fail\n");
cnt_fail++;
}
 
 
// ----------------------------------------------------------
// Test time[h] (must be == MTIME)
// ----------------------------------------------------------
neorv32_uart_printf("TIME[H]: ");
cnt_test++;
 
cpu_systime.uint32[0] = neorv32_cpu_csr_read(CSR_TIME);
cpu_systime.uint32[1] = neorv32_cpu_csr_read(CSR_TIMEH);
cpu_systime.uint64 &= 0xFFFFFFFFFFFF0000LL;
 
uint64_t mtime_systime = neorv32_mtime_get_time() & 0xFFFFFFFFFFFF0000LL;
 
if (cpu_systime.uint64 == mtime_systime) {
neorv32_uart_printf("ok\n");
cnt_ok++;
}
else {
neorv32_uart_printf("fail\n");
cnt_fail++;
}
 
 
// ----------------------------------------------------------
// Test fence instructions - make sure CPU does not crash here and throws no exception
// a more complex test is provided by the RISC-V compliance test
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("FENCE(.I): ");
cnt_test++;
asm volatile ("fence");
212,12 → 286,12
neorv32_uart_printf("ok\n");
cnt_ok++;
}
exception_handler_answer = 0;
 
 
// ----------------------------------------------------------
// Unaligned instruction address
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("EXC I_ALIGN: ");
 
// skip if C-mode is not implemented
237,11 → 311,10
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
}
else {
neorv32_uart_printf("skipped (no EXC I_ALIGN possible in C-mode)\n");
neorv32_uart_printf("skipped (not possible when C-EXT enabled)\n");
}
 
 
248,6 → 321,7
// ----------------------------------------------------------
// Instruction access fault
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("EXC I_ACC: ");
cnt_test++;
 
263,7 → 337,6
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
 
 
270,6 → 343,7
// ----------------------------------------------------------
// Illegal instruction
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("EXC I_ILLEG: ");
cnt_test++;
 
291,7 → 365,6
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
 
 
298,6 → 371,7
// ----------------------------------------------------------
// Breakpoint instruction
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("EXC BREAK: ");
cnt_test++;
 
312,7 → 386,6
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
 
 
319,6 → 392,7
// ----------------------------------------------------------
// Unaligned load address
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("EXC L_ALIGN: ");
cnt_test++;
 
334,7 → 408,6
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
 
 
341,6 → 414,7
// ----------------------------------------------------------
// Load access fault
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("EXC L_ACC: ");
cnt_test++;
 
356,7 → 430,6
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
 
 
363,6 → 436,7
// ----------------------------------------------------------
// Unaligned store address
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("EXC S_ALIGN: ");
cnt_test++;
 
378,7 → 452,6
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
 
 
385,6 → 458,7
// ----------------------------------------------------------
// Store access fault
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("EXC S_ACC: ");
cnt_test++;
 
400,7 → 474,6
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
 
 
407,6 → 480,7
// ----------------------------------------------------------
// Environment call
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("EXC ENVCALL: ");
cnt_test++;
 
421,7 → 495,6
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
 
 
428,6 → 501,7
// ----------------------------------------------------------
// Machine software interrupt
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("IRQ MSI: ");
cnt_test++;
 
443,7 → 517,6
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
 
 
450,6 → 523,7
// ----------------------------------------------------------
// Machine timer interrupt (MTIME)
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("IRQ MTI: ");
cnt_test++;
 
471,13 → 545,16
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
 
// no more mtime interrupts
neorv32_mtime_set_timecmp(-1);
 
 
// ----------------------------------------------------------
// Machine external interrupt (via CLIC)
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("IRQ MEI: ");
cnt_test++;
 
499,10 → 576,36
neorv32_uart_printf("fail\n");
cnt_fail++;
}
exception_handler_answer = 0;
#endif
 
 
// ----------------------------------------------------------
// Test WFI ("sleep") instructions
// ----------------------------------------------------------
exception_handler_answer = 0;
neorv32_uart_printf("WFI: ");
cnt_test++;
 
// program timer to wake up
neorv32_mtime_set_timecmp(neorv32_mtime_get_time() + 1000);
 
// put CPU into sleep mode
asm volatile ("wfi");
 
if (exception_handler_answer != ANSWER_MTI) {
neorv32_uart_printf("fail\n");
cnt_fail++;
}
else {
neorv32_uart_printf("ok\n");
cnt_ok++;
}
 
 
 
 
 
 
// error report
neorv32_uart_printf("\n\nTests: %i\nOK: %i\nFAIL: %i\n\n", cnt_test, cnt_ok, cnt_fail);
 
/sw/lib/include/neorv32.h
71,17 → 71,17
CSR_MTVAL = 0x343, /**< 0x343 - mtval (r/-): Machine bad address or instruction */
CSR_MIP = 0x344, /**< 0x344 - mip (r/w): Machine interrupt pending register */
 
CSR_MCYCLE = 0xb00, /**< 0xb00 - mcycle (r/-): Machine cycle counter low word */
CSR_MINSTRET = 0xb02, /**< 0xb02 - minstret (r/-): Machine instructions-retired counter low word */
CSR_MCYCLEH = 0xb80, /**< 0xb80 - mcycleh (r/-): Machine cycle counter high word */
CSR_MINSTRETH = 0xb82, /**< 0xb82 - minstreth (r/-): Machine instructions-retired counter high word */
CSR_MCYCLE = 0xb00, /**< 0xb00 - mcycle (r/w): Machine cycle counter low word */
CSR_MINSTRET = 0xb02, /**< 0xb02 - minstret (r/w): Machine instructions-retired counter low word */
CSR_MCYCLEH = 0xb80, /**< 0xb80 - mcycleh (r/w): Machine cycle counter high word */
CSR_MINSTRETH = 0xb82, /**< 0xb82 - minstreth (r/w): Machine instructions-retired counter high word */
 
CSR_CYCLE = 0xc00, /**< 0xc00 - cycle (r/-): Cycle counter low word */
CSR_TIME = 0xc01, /**< 0xc01 - time (r/-): Timer low word*/
CSR_TIME = 0xc01, /**< 0xc01 - time (r/-): Timer low word (from MTIME.TIME) */
CSR_INSTRET = 0xc02, /**< 0xc02 - instret (r/-): Instructions-retired counter low word */
 
CSR_CYCLEH = 0xc80, /**< 0xc80 - cycleh (r/-): Cycle counter high word */
CSR_TIMEH = 0xc81, /**< 0xc81 - timeh (r/-): Timer high word*/
CSR_TIMEH = 0xc81, /**< 0xc81 - timeh (r/-): Timer high word (from MTIME.TIME) */
CSR_INSTRETH = 0xc82, /**< 0xc82 - instreth (r/-): Instructions-retired counter high word */
 
CSR_MIMPID = 0xf13, /**< 0xf13 - mimpid (r/-): Implementation ID/version */
129,10 → 129,10
* CPU <b>misa</b> CSR (r/w): Machine instruction set extensions (RISC-V spec.)
**************************************************************************/
enum NEORV32_CPU_MISA_enum {
CPU_MISA_C_EXT = 2, /**< CPU misa CSR (2): C: Compressed instructions CPU extension available (r/w), can be switched on/off */
CPU_MISA_C_EXT = 2, /**< CPU misa CSR (2): C: Compressed instructions CPU extension available (r/-), can be switched on/off */
CPU_MISA_E_EXT = 4, /**< CPU misa CSR (3): E: Embedded CPU extension available (r/-) */
CPU_MISA_I_EXT = 8, /**< CPU misa CSR (8): I: Base integer ISA CPU extension available (r/-) */
CPU_MISA_M_EXT = 12, /**< CPU misa CSR (12): M: Multiplier/divider CPU extension available (r/w), can be switched on/off */
CPU_MISA_M_EXT = 12, /**< CPU misa CSR (12): M: Multiplier/divider CPU extension available (r/-), can be switched on/off */
CPU_MISA_X_EXT = 23, /**< CPU misa CSR (23): X: Non-standard CPU extension available (r/-) */
CPU_MISA_Z_EXT = 25, /**< CPU misa CSR (25): Z: Privileged architecture CPU extension(s) available (r/-) */
CPU_MISA_MXL_LO_EXT = 30, /**< CPU misa CSR (30): MXL.lo: CPU data width (r/-) */
324,17 → 324,17
* @name IO Device: Machine System Timer (MTIME)
**************************************************************************/
/**@{*/
/** MTIME (time register) low word (r/-) */
#define MTIME_LO (*(IO_ROM32 0xFFFFFF90UL))
/** MTIME (time register) high word (r/-) */
#define MTIME_HI (*(IO_ROM32 0xFFFFFF94UL))
/** MTIME (time register) low word (r/w) */
#define MTIME_LO (*(IO_REG32 0xFFFFFF90UL))
/** MTIME (time register) high word (r/w) */
#define MTIME_HI (*(IO_REG32 0xFFFFFF94UL))
/** MTIMECMP (time compare register) low word (r/w) */
#define MTIMECMP_LO (*(IO_REG32 0xFFFFFF98UL))
/** MTIMECMP (time register) high word (r/w) */
#define MTIMECMP_HI (*(IO_REG32 0xFFFFFF9CUL))
 
/** MTIME (time register) 64-bit access (r/-) */
#define MTIME (*(IO_ROM64 (&MTIME_LO)))
/** MTIME (time register) 64-bit access (r/w) */
#define MTIME (*(IO_REG64 (&MTIME_LO)))
/** MTIMECMP (time compare register) low word (r/w) */
#define MTIMECMP (*(IO_REG64 (&MTIMECMP_LO)))
/**@}*/
/sw/lib/include/neorv32_cpu.h
43,7 → 43,6
#define neorv32_cpu_h
 
// prototypes
int neorv32_cpu_switch_extension(int sel, int state);
int neorv32_cpu_irq_enable(uint8_t irq_sel);
int neorv32_cpu_irq_disable(uint8_t irq_sel);
void neorv32_cpu_delay_ms(uint32_t time_ms);
/sw/lib/include/neorv32_mtime.h
46,6 → 46,7
 
// prototypes
int neorv32_mtime_available(void);
void neorv32_mtime_set_time(uint64_t time);
uint64_t neorv32_mtime_get_time(void);
void neorv32_mtime_set_timecmp(uint64_t timecmp);
uint64_t neorv32_mtime_get_timecmp(void);
/sw/lib/include/neorv32_rte.h
46,6 → 46,8
void neorv32_rte_enable_debug_mode(void);
int neorv32_rte_exception_install(uint8_t exc_id, void (*handler)(void));
int neorv32_rte_exception_uninstall(uint8_t exc_id);
 
void neorv32_rte_print_hw_config(void);
void neorv32_rte_print_credits(void);
 
#endif // neorv32_rte_h
/sw/lib/source/neorv32_cpu.c
44,54 → 44,6
 
 
/**********************************************************************//**
* Enable/disable CPU extension during runtime via the 'misa' CSR.
*
* @warning This is still highly experimental! This function requires the Zicsr + Zifencei CPU extensions.
*
* @param[in] sel Bit to be set in misa CSR / extension to be enabled. See #NEORV32_CPU_MISA_enum.
* @param[in] state Set 1 to enable the selected extension, set 0 to disable it;
* return 0 if success, 1 if error (invalid sel or extension cannot be enabled).
**************************************************************************/
int neorv32_cpu_switch_extension(int sel, int state) {
 
// get current misa setting
uint32_t misa_curr = neorv32_cpu_csr_read(CSR_MISA);
uint32_t misa_prev = misa_curr;
 
// abort if misa.z is cleared
if ((misa_curr & (1 << CPU_MISA_Z_EXT)) == 0) {
return 1;
}
 
// out of range?
if (sel > 25) {
return 1;
}
 
// enable/disable selected extension
if (state & 1) {
misa_curr |= (1 << sel);
}
else {
misa_curr &= ~(1 << sel);
}
 
// try updating misa
neorv32_cpu_csr_write(CSR_MISA, misa_curr);
asm volatile("fence.i"); // required to flush prefetch buffers
asm volatile("nop");
 
// dit it work?
if (neorv32_cpu_csr_read(CSR_MISA) == misa_prev) {
return 1; // nope
}
else {
return 0; // fine
}
}
 
 
/**********************************************************************//**
* Enable specific CPU interrupt.
*
* @note Interrupts have to be globally enabled via neorv32_cpu_eint(void), too.
/sw/lib/source/neorv32_mtime.c
62,10 → 62,23
 
 
/**********************************************************************//**
* Get current system time since reset.
* Set current system time.
*
* @note The MTIME timer increments with the primary processor clock.
*
* @param[in] time New system time (uint64_t)
**************************************************************************/
void neorv32_mtime_set_time(uint64_t time) {
 
MTIME = time;
}
 
 
/**********************************************************************//**
* Get current system time.
*
* @note The MTIME timer increments with the primary processor clock.
*
* @return Current system time (uint64_t)
**************************************************************************/
uint64_t neorv32_mtime_get_time(void) {
/sw/lib/source/neorv32_rte.c
373,3 → 373,16
}
}
}
 
 
/**********************************************************************//**
* NEORV32 runtime environment: Print project credits
**************************************************************************/
void neorv32_rte_print_credits(void) {
 
neorv32_uart_print("\n\nThe NEORV32 Processor Project\n"
"by Stephan Nolting\n"
"https://github.com/stnolting/neorv32\n"
"made in Hannover, Germany\n\n");
}
 
/README.md
1,4 → 1,4
# [The NEORV32 Processor](https://github.com/stnolting/neorv32)
# [The NEORV32 Processor](https://github.com/stnolting/neorv32) (RISC-V-compliant)
 
[![Build Status](https://travis-ci.com/stnolting/neorv32.svg?branch=master)](https://travis-ci.com/stnolting/neorv32)
[![license](https://img.shields.io/github/license/stnolting/neorv32)](https://github.com/stnolting/neorv32/blob/master/LICENSE)
20,23 → 20,24
 
## Introduction
 
The NEORV32 is a customizable mikrocontroller-like processor system based on a RISC-V `rv32i` or `rv32e` CPU with optional
`M`, `C`, `Zicsr` and `Zifencei` extensions. The CPU was built from scratch and is compliant to the **Unprivileged
ISA Specification Version 2.1** and a subset of the **Privileged Architecture Specification Version 1.12**. The NEORV32 is intended
as auxiliary processor within a larger SoC designs or as stand-alone custom microcontroller.
The NEORV32 is a customizable full-scale mikrocontroller-like processor system based on a [RISC-V-compliant](https://github.com/stnolting/neorv32_riscv_compliance)
`rv32i` CPU with optional `E`, `C`, `M`, `Zicsr` and `Zifencei` extensions. The CPU was built from scratch and is compliant to the **Unprivileged
ISA Specification Version 2.1** and a subset of the **Privileged Architecture Specification Version 1.12-draft**.
 
The NEORV32 is intended as auxiliary processor within a larger SoC designs or as stand-alone custom microcontroller.
Its top entity can be directly synthesized for any FPGA without modifications and provides a full-scale RISC-V based microcontroller.
 
The processor provides common peripherals and interfaces like input and output ports, serial interfaces for UART, I²C and SPI,
interrupt controller, timers and embedded memories. External memories, peripherals and custom IP can be attached via a
Wishbone-based external memory interface. All optional features beyond the base CPU can be enabled and configured via VHDL generics.
 
This project comes with a complete software ecosystem that features core libraries for high-level usage of the
provided functions and peripherals, application makefiles and example programs. All software source files
provide a doxygen-based documentary. The deployed doxygen-based software documentation can be found on the
project's [Github pages](https://stnolting.github.io/neorv32/files.html).
provided functions and peripherals, application makefiles, a runtime environment and several example programs. All software source files
provide a doxygen-based [documentary](https://stnolting.github.io/neorv32/files.html).
 
The project is intended to work "out of the box". Just synthesize the test setup from this project, upload
it to your FPGA board of choice and start playing with the NEORV32. If you do not want to [compile the GCC toolchains](https://github.com/riscv/riscv-gnu-toolchain)
by yourself, you can also download [pre-compiled toolchain](https://github.com/stnolting/riscv_gcc_prebuilt) for Linux.
by yourself, you can also download [pre-compiled toolchains](https://github.com/stnolting/riscv_gcc_prebuilt) for Linux.
 
For more information take a look a the [![NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/PDF_32.png) NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf).
 
57,16 → 58,17
 
The processor passes the official `rv32i`, `rv32im`, `rv32imc`, `rv32Zicsr` and `rv32Zifencei` [RISC-V compliance tests](https://github.com/riscv/riscv-compliance).
 
| Project | Status | Misc |
|:--------------------------------------------------------------------------------|:-------|:---------|
| [NEORV32 processor](https://github.com/stnolting/neorv32) | [![Test](https://img.shields.io/travis/stnolting/neorv32/master.svg?label=HW-test)](https://travis-ci.com/stnolting/neorv32) | [![sw doc](https://img.shields.io/badge/SW%20documentation-gh--pages-blue)](https://stnolting.github.io/neorv32/files.html) |
| [Pre-build toolchain](https://github.com/stnolting/riscv_gcc_prebuilt) | [![Test](https://img.shields.io/travis/stnolting/riscv_gcc_prebuilt/master.svg?label=compliance)](https://travis-ci.com/stnolting/riscv_gcc_prebuilt) | |
| [RISC-V compliance test](https://github.com/stnolting/neorv32_riscv_compliance) | [![Test](https://img.shields.io/travis/stnolting/neorv32_riscv_compliance/master.svg?label=test)](https://travis-ci.com/stnolting/neorv32_riscv_compliance) | |
| Project component | CI status | Note |
|:--------------------------------------------------------------------------------|:----------|:---------|
| [NEORV32 processor](https://github.com/stnolting/neorv32) | [![Test](https://img.shields.io/travis/stnolting/neorv32/master.svg?label=test)](https://travis-ci.com/stnolting/neorv32) | [![sw doc](https://img.shields.io/badge/SW%20documentation-gh--pages-blue)](https://stnolting.github.io/neorv32/files.html) |
| [Pre-build toolchain](https://github.com/stnolting/riscv_gcc_prebuilt) | [![Test](https://img.shields.io/travis/stnolting/riscv_gcc_prebuilt/master.svg?label=test)](https://travis-ci.com/stnolting/riscv_gcc_prebuilt) | |
| [RISC-V compliance test](https://github.com/stnolting/neorv32_riscv_compliance) | [![Test](https://img.shields.io/travis/stnolting/neorv32_riscv_compliance/master.svg?label=compliance)](https://travis-ci.com/stnolting/neorv32_riscv_compliance) | |
 
 
### Limitations to be fixed
 
* No exception is triggered in `E`-mode when using registers above `x15` yet
* `misa` CSR is read-only; no dynamic enabling/disabling of implemented CPU extensions during runtime
 
 
### To-Do / Wish List
83,14 → 85,15
 
## Features
 
![neorv32 Overview](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_overview.png)
 
### Processor Features
 
![neorv32 Overview](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_processor.png)
 
- RISC-V-compliant `rv32i` or `rv32e` CPU with optional `C`, `E`, `M`, `Zicsr` and `rv32Zifencei` extensions
- GCC-based toolchain ([pre-compiled rv32i and rv32 etoolchains 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 [@Github pages](https://stnolting.github.io/neorv32/files.html)
- [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)
- Detailed [datasheet](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
109,12 → 112,23
- _Optional_ core-local interrupt controller with 8 channels (CLIC)
- _Optional_ dummy device (DEVNULL) (can be used for *fast* simulation console output)
 
 
### CPU Features
 
The CPU is compliant to the [official RISC-V specifications](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/riscv-spec.pdf) including a subset of the
![neorv32 Overview](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_cpu.png)
 
The CPU is [compliant](https://github.com/stnolting/neorv32_riscv_compliance) to the
[official RISC-V specifications](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/riscv-spec.pdf) including a subset of the
[RISC-V privileged architecture specifications](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/riscv-spec.pdf).
 
More information regarding the CPU including a detailed list of the instruction set and the available CSRs can be found in
the [![NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/PDF_32.png) NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf).
 
 
**General**:
* No hardware support of unaligned accesses - they will trigger and exception
* Two stages in-order pipeline (FETCH, EXECUTE); each stage uses a multi-cycle processing scheme
 
 
**RV32I base instruction set** (`I` extension):
* ALU instructions: `LUI` `AUIPC` `ADDI` `SLTI` `SLTIU` `XORI` `ORI` `ANDI` `SLLI` `SRLI` `SRAI` `ADD` `SUB` `SLL` `SLT` `SLTU` `XOR` `SRL` `SRA` `OR` `AND`
* Jump and branch instructions: `JAL` `JALR` `BEQ` `BNE` `BLT` `BGE` `BLTU` `BGEU`
140,7 → 154,7
* CSR access instructions: `CSRRW` `CSRRS` `CSRRC` `CSRRWI` `CSRRSI` `CSRRCI`
* System instructions: `MRET` `WFI`
* Counter CSRs: `cycle` `cycleh` `time` `timeh` `instret` `instreth` `mcycle` `mcycleh` `minstret` `minstreth`
* Machine CSRs: `mstatus` `misa` `mie` `mtvec` `mscratch` `mepc` `mcause` `mtval` `mip` `mimpid` `mhartid`
* Machine CSRs: `mstatus` `misa`(read-only!) `mie` `mtvec` `mscratch` `mepc` `mcause` `mtval` `mip` `mimpid` `mhartid`
* Custom CSRs: `mfeatures` `mclock` `mispacebase` `mdspacebase` `mispacesize` `mdspacesize`
* Supported exceptions and interrupts:
* Misaligned instruction address
152,7 → 166,7
* Store address misaligned
* Store access fault
* Environment call from M-mode (via `ecall` instruction)
* Machine software instrrupt `msi`
* Machine software interrupt `msi`
* Machine timer interrupt `mti` (via MTIME unit)
* Machine external interrupt `mei` (via CLIC unit)
 
159,15 → 173,7
**Privileged architecture / FENCE.I** (`Zifencei` extension):
* System instructions: `FENCE.I`
 
**General**:
* No hardware support of unaligned accesses - they will trigger and exception
* Two stages in-order pipeline (FETCH, EXECUTE); each stage uses a multi-cycle execution
 
More information including a detailed list of the available CSRs can be found in
the [![NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/PDF_32.png) NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf).
 
 
 
## FPGA Implementation Results
 
This chapter shows exemplary implementation results of the NEORV32 processor for an **Intel Cyclone IV EP4CE22F17C6N FPGA** on
175,10 → 181,10
information is derived from the Timing Analyzer / Slow 1200mV 0C Model. If not otherwise specified, the default configuration
of the processor's generics is assumed. No constraints were used.
 
### CPU
 
Results generated for hardware version: `1.0.0.0`
 
### CPU
 
| CPU Configuration | LEs | FFs | Memory bits | DSPs | f_max |
|:--------------------|:----------:|:--------:|:-----------:|:------:|:-------:|
| `rv32i` | 1027 | 474 | 2048 | 0 (0%) | 111 MHz |
189,6 → 195,8
 
### Processor-Internal Peripherals and Memories
 
Results generated for hardware version: `1.0.5.0`
 
| Module | Description | LEs | FFs | Memory bits | DSPs |
|:---------|:------------------------------------------------|:---:|:---:|:-----------:|:----:|
| BOOT ROM | Bootloader ROM (4kB) | 3 | 1 | 32 768 | 0 |
196,7 → 204,7
| DMEM | Processor-internal data memory (8kB) | 12 | 2 | 65 536 | 0 |
| GPIO | General purpose input/output ports | 38 | 33 | 0 | 0 |
| IMEM | Processor-internal instruction memory (16kb) | 7 | 2 | 131 072 | 0 |
| MTIME | Machine system timer | 270 | 167 | 0 | 0 |
| MTIME | Machine system timer | 269 | 166 | 0 | 0 |
| PWM | Pulse-width modulation controller | 76 | 69 | 0 | 0 |
| SPI | Serial peripheral interface | 206 | 125 | 0 | 0 |
| TRNG | True random number generator | 104 | 93 | 0 | 0 |
204,32 → 212,30
| UART | Universal asynchronous receiver/transmitter | 151 | 108 | 0 | 0 |
| WDT | Watchdog timer | 57 | 45 | 0 | 0 |
 
### CPU + Peripheral
 
The following table shows the implementation results for an _Intel Cyclone IV EP4CE22F17C6N_ FPGA.
The design was synthesized using Intel Quartus Prime Lite 19.1 (“balanced implementation”).
IMEM uses 16kB and DMEM uses 8kB memory space.
### Exemplary FPGA Setups
 
| CPU Configuration | LEs | REGs | DSPs | Memory Bits | f_max |
|:--------------------|:----------:|:---------:|:------:|:------------:|:-------:|
| `rv32imc` + `Zicsr` | 3724 (17%) | 1899 (9%) | 0 (0%) | 231424 (38%) | 103 MHz |
Exemplary implementation results for different FPGA platforms. The processor setup uses *all provided peripherals*,
all CPU extensions (`rv32imc` + `Zicsr` + `Zifencei`, no `E` extension), no external memory interface and only internal
instruction and data memories. IMEM uses 16kB and DMEM uses 8kB memory space. The setup top entity connects most of the
processor's [top entity](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_top.vhd) signals
to FPGA pins - except for the Wishbone bus and the external interrupt signals.
 
Results generated for hardware version: `1.0.1.1`
 
### Lattice iCE40 UltraPlus 5k
| Vendor | FPGA | Board | Toolchain | Impl. strategy | LUT / LE | FF / REG | DSP | Memory Bits | BRAM / EBR | SPRAM | Frequency |
|:--------|:----------------------------------|:-----------------|:------------------------|:---------------|:-----------|:-----------|:-------|:-------------|:-----------|:---------|------------:|
| Intel | Cyclone IV `EP4CE22F17C6N` | Terasic DE0-Nano | Quartus Prime Lite 19.1 | balanced | 3841 (17%) | 1866 (8%) | 0 (0%) | 231424 (38%) | - | - | 103 MHz |
| Lattice | iCE40 UltraPlus `iCE40UP5K-SG48I` | Upduino v2.0 | Radiant 2.1 (LSE) | default | 5014 (95%) | 1952 (37%) | 0 (0%) | - | 12 (40%) | 4 (100%) | c 20.25 MHz |
| Xilinx | Artix-7 `XC7A35TICSG324-1L` | Arty A7-35T | Vivado 2019.2 | default | 2312 (11%) | 1924 (5%) | 0 (0%) | - | 8 (16%) | - | c 100 MHz |
 
The following table shows the hardware utilization for a [iCE40 UP5K](http://www.latticesemi.com/en/Products/FPGAandCPLD/iCE40UltraPlus) FPGA.
The setup uses all provided peripherals, all CPU extensions (except for the `E` extension), no external memory interface and internal
instruction and data memories (each 64kB) based on SPRAM primitives. The FPGA-specific memory components can be found in the
[`rtl/fpga_specific`](https://github.com/stnolting/neorv32/blob/master/rtl/fpga_specific/lattice_ice40up) folder.
**Notes**
* The Lattice iCE40 UltraPlus setup uses the FPGA's SPRAM memory primitives for the internal IMEM and DEMEM (each 64kb).
The FPGA-specific memory components can be found in the [`rtl/fpga_specific`](https://github.com/stnolting/neorv32/blob/master/rtl/fpga_specific/lattice_ice40up) folder.
* The clock frequencies marked with a "c" are constrained clocks. The remaining ones are `f_max` results from the place and route timing reports.
* The Upduino and the Arty board have on-board SPI flash memories for storing the FPGA configuration. These device can also be used by the default NEORV32
bootloader to store and automatically boot an application program after reset (both tested successfully).
 
Place & route reports generated with **Lattice Radiant 2.1** using Lattice LSE. The clock frequency
is constrained and generated via the PLL from the internal HF oscillator running at 12 MHz.
 
| CPU Configuration | LUTs | REGs | DSPs | SPRAM | EBR | f |
|:--------------------|:----------:|:----------:|:------:|:--------:|:--------:|:---------:|
| `rv32imc` + `Zicsr` | 4985 (94%) | 1982 (38%) | 0 (0%) | 4 (100%) | 12 (40%) | 20.25 MHz |
 
 
## Performance
 
### CoreMark Benchmark
245,7 → 251,7
Hardware: 32kB IMEM, 16kb DMEM, 100MHz clock
CoreMark: 2000 iterations, MEM_METHOD is MEM_STACK
CPU extensions: `rv32i` or `rv32im` or `rv32imc`
Used peripherals: MTIME for time measurement, UART for printing the results
Used peripherals: UART for printing the results
~~~
 
| __Configuration__ | __Optimization__ | __Executable Size__ | __CoreMark Score__ | __CoreMarks/MHz__ |
260,7 → 266,7
 
### Instruction Cycles
 
The NEORV32 CPU is based on two-stages pipelined architecutre. Each stage uses a multi-cycle processing scheme. Hence,
The NEORV32 CPU is based on a two-stages pipelined architecutre. Each stage uses a multi-cycle processing scheme. Hence,
each instruction requires several clock cycles to execute (2 cycles for ALU operations, ..., 40 cycles for divisions).
The average CPI (cycles per instruction) depends on the instruction mix of a specific applications and also on the available
CPU extensions.
411,7 → 417,7
[https://github.com/stnolting/riscv_gcc_prebuilt](https://github.com/stnolting/riscv_gcc_prebuilt)
 
 
### Dowload the NEORV32 Project and Create a Hardware Project
### Dowload the NEORV32 and Create a Hardware Project
 
Now its time to get the most recent version the NEORV32 Processor project from GitHub. Clone the NEORV32 repository using
`git` from the command line (suggested for easy project updates via `git pull`):
418,13 → 424,14
$ git clone https://github.com/stnolting/neorv32.git
 
Create a new HW project with your FPGA design tool of choice. Add all files from the [`rtl/core`](https://github.com/stnolting/neorv32/blob/master/rtl)
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 and add them to a **new library** called `neorv32`.
 
You can either instantiate the [processor's top entity](https://github.com/stnolting/neorv32#top-entity) in you own project, or you
can use a 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, implements most of the peripherals and the basic ISA. Only the UART, clock, reset and some GPIO output sginals are
propagated:
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.
This test setup instantiates the processor, implements most of the peripherals and the basic ISA. Only the UART, clock, reset and some GPIO output sginals are
propagated (basically, its a FPGA "hello world" example):
 
```vhdl
entity neorv32_test_setup is
441,12 → 448,10
end neorv32_test_setup;
```
 
This test setup is intended as quick and easy "hello world" test setup to get into the NEORV32.
 
 
### Compiling and Uploading One of the Example Projects
 
Make sure `GNU Make` and a native `GCC` compiler are installed. To test the installation of the RISC-V toolchain, navigate to an example project like
Make sure `GNU Make` and a native `GCC` compiler are installed. To test the installation of the RISC-V toolchain navigate to an example project like
`sw/example/blink_led` and run:
 
neorv32/sw/example/blink_led$ make check
513,19 → 518,17
 
 
 
## Citation
## Legal
 
This is project is released under the BSD 3-Clause license. No copyright infringement intended.
Other implied or used projects might have different licensing - see their documentation to get more information.
 
#### Citation
 
If you are using the NEORV32 Processor in some kind of publication, please cite it as follows:
 
> S. Nolting, "The NEORV32 Processor", github.com/stnolting/neorv32
 
 
 
## Legal
 
This is a hobby project released under the BSD 3-Clause license. No copyright infringement intended.
Other implied/used projects might have different licensing - see their documentation to get more information.
 
#### BSD 3-Clause License
 
Copyright (c) 2020, Stephan Nolting. All rights reserved.
564,21 → 567,25
link in question.
 
 
#### Propretary Notice
#### Proprietary Notice
 
"Windows" is a trademark of Microsoft Corporation.
 
"Artix" and "Vivado" are trademarks of Xilinx Inc.
 
"Cyclone", "Quartus Prime" and "Avalon Bus" are trademarks of Intel Corporation.
"Cyclone", "Quartus Prime", "Quartus Prime Lite" and "Avalon Bus" are trademarks of Intel Corporation.
 
"Artix" and "Vivado" are trademarks of Xilinx, Inc.
 
"iCE40", "UltraPlus" and "Lattice Radiant" are trademarks of Lattice Semiconductor Corporation.
 
"AXI4" and "AXI4-Lite" are trademarks of Arm Holdings plc.
 
 
#### Misc
## Acknowledgement
 
[RISC-V](https://riscv.org/) - Instruction Sets Want To Be Free :heart:
 
[![Continous Integration provided by Travis CI](https://travis-ci.com/images/logos/TravisCI-Full-Color.png)](https://travis-ci.com/stnolting/neorv32)
 
Continous integration provided by [Travis CI](https://travis-ci.com/stnolting/neorv32) and powered by [GHDL](https://github.com/ghdl/ghdl).
588,5 → 595,6
 
This project is not affiliated with or endorsed by the Open Source Initiative (https://www.oshwa.org / https://opensource.org).
 
\
 
Made with :coffee: in Hannover, Germany.

powered by: WebSVN 2.1.0

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