URL
https://opencores.org/ocsvn/neorv32/neorv32/trunk
Subversion Repositories neorv32
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 13 to Rev 14
- ↔ Reverse comparison
Rev 13 → Rev 14
/neorv32/trunk/.ci/install.sh
3,12 → 3,16
# Abort if any command returns != 0 |
set -e |
|
# Toolchain to be used |
TOOLCHAIN_V=riscv32-unknown-elf.gcc-10.1.0.rv32i.ilp32.newlib |
|
# Download toolchain |
wget https://github.com/stnolting/riscv_gcc_prebuilt/raw/master/data/riscv32-unknown-elf.gcc-9.2.0.rv32i.ilp32.tar.gz |
echo "Downloading prebuilt RISC-V GCC toolchain ($TOOLCHAIN_V)..." |
wget https://github.com/stnolting/riscv_gcc_prebuilt/raw/master/data/$TOOLCHAIN_V.tar.gz |
|
# Decompress |
mkdir riscv |
tar -xzf riscv32-unknown-elf.gcc-9.2.0.rv32i.ilp32.tar.gz -C riscv/ |
tar -xzf $TOOLCHAIN_V.tar.gz -C riscv/ |
pwd |
ls -al |
ls -al riscv/ |
/neorv32/trunk/docs/figures/neorv32_cpu.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/neorv32/trunk/docs/figures/neorv32_processor.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/neorv32/trunk/docs/NEORV32.pdf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/neorv32/trunk/rtl/core/neorv32_clic.vhd
File deleted
/neorv32/trunk/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 <cpu_test/main.bin> |
-- Auto-generated memory init file (for APPLICATION) from source file <blink_led/main.bin> |
|
library ieee; |
use ieee.std_logic_1164.all; |
8,1211 → 8,1009
|
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"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", |
00000000 => x"00000093", |
00000001 => x"00008113", |
00000002 => x"00010193", |
00000003 => x"00018213", |
00000004 => x"00020293", |
00000005 => x"00028313", |
00000006 => x"00030393", |
00000007 => x"00038413", |
00000008 => x"00040493", |
00000009 => x"00048513", |
00000010 => x"00050593", |
00000011 => x"00058613", |
00000012 => x"00060693", |
00000013 => x"00068713", |
00000014 => x"00070793", |
00000015 => x"00078813", |
00000016 => x"00080893", |
00000017 => x"00088913", |
00000018 => x"00090993", |
00000019 => x"00098a13", |
00000020 => x"000a0a93", |
00000021 => x"000a8b13", |
00000022 => x"000b0b93", |
00000023 => x"000b8c13", |
00000024 => x"000c0c93", |
00000025 => x"000c8d13", |
00000026 => x"000d0d93", |
00000027 => x"000d8e13", |
00000028 => x"000e0e93", |
00000029 => x"000e8f13", |
00000030 => x"000f0f93", |
00000031 => x"00000013", |
00000032 => x"ff402583", |
00000033 => x"ffc02603", |
00000034 => x"00c58133", |
00000035 => x"04131171", |
00000036 => x"01970001", |
00000037 => x"81938000", |
00000038 => x"05977ee1", |
00000039 => x"85930000", |
00000040 => x"90730965", |
00000041 => x"25833055", |
00000042 => x"0617ff40", |
00000043 => x"06130000", |
00000044 => x"06931506", |
00000045 => x"c1900200", |
00000046 => x"16fd0591", |
00000047 => x"fed01de3", |
00000048 => x"f8000593", |
00000049 => x"0005a023", |
00000050 => x"1de30591", |
00000051 => x"0597feb0", |
00000052 => x"85938000", |
00000053 => x"8613fba5", |
00000054 => x"d66382c1", |
00000055 => x"802300c5", |
00000056 => x"05850005", |
00000057 => x"1597bfdd", |
00000058 => x"85930000", |
00000059 => x"06171e65", |
00000060 => x"06138000", |
00000061 => x"0697f926", |
00000062 => x"86938000", |
00000063 => x"5963f926", |
00000064 => x"870300d6", |
00000065 => x"00230005", |
00000066 => x"058500e6", |
00000067 => x"bfc50605", |
00000068 => x"00000513", |
00000069 => x"00000593", |
00000070 => x"0ee000ef", |
00000071 => x"30047073", |
00000072 => x"10500073", |
00000073 => x"0013a001", |
00000074 => x"00130000", |
00000075 => x"00010000", |
00000076 => x"f8810113", |
00000077 => x"c20ec006", |
00000078 => x"c616c412", |
00000079 => x"ca1ec81a", |
00000080 => x"ce26cc22", |
00000081 => x"d22ed02a", |
00000082 => x"d636d432", |
00000083 => x"da3ed83a", |
00000084 => x"de46dc42", |
00000085 => x"c2cec0ca", |
00000086 => x"c6d6c4d2", |
00000087 => x"cadec8da", |
00000088 => x"cee6cce2", |
00000089 => x"d2eed0ea", |
00000090 => x"d6f6d4f2", |
00000091 => x"dafed8fa", |
00000092 => x"342022f3", |
00000093 => x"00f2f313", |
00000094 => x"2083030a", |
00000095 => x"9306ff40", |
00000096 => x"341020f3", |
00000097 => x"0002cd63", |
00000098 => x"00009283", |
00000099 => x"00300393", |
00000100 => x"0072f2b3", |
00000101 => x"96630089", |
00000102 => x"00890072", |
00000103 => x"0313a019", |
00000104 => x"22830403", |
00000105 => x"11710003", |
00000106 => x"80e7c006", |
00000107 => x"40820002", |
00000108 => x"90730111", |
00000109 => x"40823410", |
00000110 => x"42224192", |
00000111 => x"434242b2", |
00000112 => x"446243d2", |
00000113 => x"550244f2", |
00000114 => x"56225592", |
00000115 => x"574256b2", |
00000116 => x"586257d2", |
00000117 => x"490658f2", |
00000118 => x"4a264996", |
00000119 => x"4b464ab6", |
00000120 => x"4c664bd6", |
00000121 => x"5d064cf6", |
00000122 => x"5e265d96", |
00000123 => x"5f465eb6", |
00000124 => x"01135fd6", |
00000125 => x"00730781", |
00000126 => x"80823020", |
00000127 => x"00000000", |
00000128 => x"00000000", |
00000129 => x"71390000", |
00000130 => x"dc22de06", |
00000131 => x"d84ada26", |
00000132 => x"d452d64e", |
00000133 => x"00efd256", |
00000134 => x"00631230", |
00000135 => x"00ef0c05", |
00000136 => x"0c632fb0", |
00000137 => x"00ef0a05", |
00000138 => x"08630410", |
00000139 => x"65150a05", |
00000140 => x"45814601", |
00000141 => x"b0050513", |
00000142 => x"10b000ef", |
00000143 => x"45814501", |
00000144 => x"031000ef", |
00000145 => x"557d55fd", |
00000146 => x"063000ef", |
00000147 => x"05136505", |
00000148 => x"00efd9c5", |
00000149 => x"00ef16f0", |
00000150 => x"00ef0090", |
00000151 => x"650560a0", |
00000152 => x"db850513", |
00000153 => x"00ef4481", |
00000154 => x"059315b0", |
00000155 => x"450177e0", |
00000156 => x"842a232d", |
00000157 => x"77e00593", |
00000158 => x"23054505", |
00000159 => x"0593942a", |
00000160 => x"450977e0", |
00000161 => x"942a2b19", |
00000162 => x"77e00593", |
00000163 => x"2331450d", |
00000164 => x"0593942a", |
00000165 => x"451177e0", |
00000166 => x"942a2309", |
00000167 => x"77e00593", |
00000168 => x"29e54515", |
00000169 => x"0593942a", |
00000170 => x"451977e0", |
00000171 => x"942a21fd", |
00000172 => x"77e00593", |
00000173 => x"21d5451d", |
00000174 => x"0593942a", |
00000175 => x"452d77e0", |
00000176 => x"942a29e9", |
00000177 => x"77e00593", |
00000178 => x"29c1455d", |
00000179 => x"c005942a", |
00000180 => x"05136505", |
00000181 => x"00efdd05", |
00000182 => x"50f20eb0", |
00000183 => x"54d25462", |
00000184 => x"59b25942", |
00000185 => x"5a925a22", |
00000186 => x"61214501", |
00000187 => x"05938082", |
00000188 => x"450177e0", |
00000189 => x"22f000ef", |
00000190 => x"c509842a", |
00000191 => x"05136505", |
00000192 => x"bfd1de45", |
00000193 => x"30046073", |
00000194 => x"650554fd", |
00000195 => x"8291a423", |
00000196 => x"dfc50513", |
00000197 => x"a4236985", |
00000198 => x"00ef8291", |
00000199 => x"85130a70", |
00000200 => x"00efe0c9", |
00000201 => x"650509f0", |
00000202 => x"e2050513", |
00000203 => x"8291a423", |
00000204 => x"091000ef", |
00000205 => x"e0c98513", |
00000206 => x"089000ef", |
00000207 => x"05136505", |
00000208 => x"00efe305", |
00000209 => x"17b707f0", |
00000210 => x"87931bcd", |
00000211 => x"90732347", |
00000212 => x"47b7b007", |
00000213 => x"87930003", |
00000214 => x"90734557", |
00000215 => x"2773b807", |
00000216 => x"76c1b000", |
00000217 => x"06b78f75", |
00000218 => x"12631bcd", |
00000219 => x"277332d7", |
00000220 => x"1e63b800", |
00000221 => x"650530f7", |
00000222 => x"e4050513", |
00000223 => x"045000ef", |
00000224 => x"65054485", |
00000225 => x"e4c50513", |
00000226 => x"039000ef", |
00000227 => x"112247b7", |
00000228 => x"49978793", |
00000229 => x"b0279073", |
00000230 => x"000907b7", |
00000231 => x"907307c5", |
00000232 => x"2773b827", |
00000233 => x"76c1b020", |
00000234 => x"06b78f75", |
00000235 => x"18631122", |
00000236 => x"27732ed7", |
00000237 => x"1463b820", |
00000238 => x"65052ef7", |
00000239 => x"e4050513", |
00000240 => x"001000ef", |
00000241 => x"65050485", |
00000242 => x"e5c50513", |
00000243 => x"7f4000ef", |
00000244 => x"c01027f3", |
00000245 => x"2af3c83e", |
00000246 => x"79c1c810", |
00000247 => x"0137fa33", |
00000248 => x"00efca56", |
00000249 => x"f9b36aa0", |
00000250 => x"116300a9", |
00000251 => x"9f632d3a", |
00000252 => x"65052aba", |
00000253 => x"e4050513", |
00000254 => x"7c8000ef", |
00000255 => x"65050485", |
00000256 => x"051359fd", |
00000257 => x"a423e6c5", |
00000258 => x"00ef8331", |
00000259 => x"000f7b60", |
00000260 => x"100f0ff0", |
00000261 => x"a7830000", |
00000262 => x"80638281", |
00000263 => x"65052b37", |
00000264 => x"e4450513", |
00000265 => x"79c000ef", |
00000266 => x"65050405", |
00000267 => x"051357fd", |
00000268 => x"a423e7c5", |
00000269 => x"00ef82f1", |
00000270 => x"27f378a0", |
00000271 => x"8b913010", |
00000272 => x"28079b63", |
00000273 => x"97824789", |
00000274 => x"8281a783", |
00000275 => x"26079e63", |
00000276 => x"05136505", |
00000277 => x"00efe405", |
00000278 => x"048576a0", |
00000279 => x"65054995", |
00000280 => x"051357fd", |
00000281 => x"a423eb85", |
00000282 => x"00ef82f1", |
00000283 => x"07937560", |
00000284 => x"9782f000", |
00000285 => x"8281a703", |
00000286 => x"15634785", |
00000287 => x"650526f7", |
00000288 => x"e4050513", |
00000289 => x"73c000ef", |
00000290 => x"65050485", |
00000291 => x"051357fd", |
00000292 => x"a423ec85", |
00000293 => x"00ef82f1", |
00000294 => x"07b772a0", |
00000295 => x"87938000", |
00000296 => x"80e70807", |
00000297 => x"a7030007", |
00000298 => x"47898281", |
00000299 => x"24f71363", |
00000300 => x"05136505", |
00000301 => x"00efe405", |
00000302 => x"048570a0", |
00000303 => x"57fd6505", |
00000304 => x"ed850513", |
00000305 => x"82f1a423", |
00000306 => x"6f8000ef", |
00000307 => x"a7039002", |
00000308 => x"478d8281", |
00000309 => x"22f71663", |
00000310 => x"05136505", |
00000311 => x"00efe405", |
00000312 => x"04856e20", |
00000313 => x"57fd6505", |
00000314 => x"ee850513", |
00000315 => x"82f1a423", |
00000316 => x"6d0000ef", |
00000317 => x"00202003", |
00000318 => x"8281a703", |
00000319 => x"18634791", |
00000320 => x"650520f7", |
00000321 => x"e4050513", |
00000322 => x"6b8000ef", |
00000323 => x"65050485", |
00000324 => x"051357fd", |
00000325 => x"a423ef85", |
00000326 => x"00ef82f1", |
00000327 => x"27836a60", |
00000328 => x"c63ef000", |
00000329 => x"8281a703", |
00000330 => x"19634795", |
00000331 => x"65051ef7", |
00000332 => x"e4050513", |
00000333 => x"68c000ef", |
00000334 => x"65050485", |
00000335 => x"051357fd", |
00000336 => x"a423f085", |
00000337 => x"00ef82f1", |
00000338 => x"212367a0", |
00000339 => x"a7030000", |
00000340 => x"47998281", |
00000341 => x"1cf71b63", |
00000342 => x"05136505", |
00000343 => x"00efe405", |
00000344 => x"04856620", |
00000345 => x"57fd6505", |
00000346 => x"f1850513", |
00000347 => x"82f1a423", |
00000348 => x"650000ef", |
00000349 => x"f0002023", |
00000350 => x"8281a703", |
00000351 => x"1d63479d", |
00000352 => x"65051af7", |
00000353 => x"e4050513", |
00000354 => x"638000ef", |
00000355 => x"65050485", |
00000356 => x"051357fd", |
00000357 => x"a423f285", |
00000358 => x"00ef82f1", |
00000359 => x"00736260", |
00000360 => x"a7030000", |
00000361 => x"47ad8281", |
00000362 => x"18f71f63", |
00000363 => x"05136505", |
00000364 => x"00efe405", |
00000365 => x"048560e0", |
00000366 => x"57fd6505", |
00000367 => x"f3850513", |
00000368 => x"82f1a423", |
00000369 => x"5fc000ef", |
00000370 => x"45814501", |
00000371 => x"4de000ef", |
00000372 => x"00010001", |
00000373 => x"00010001", |
00000374 => x"8281a703", |
00000375 => x"800007b7", |
00000376 => x"1863079d", |
00000377 => x"650516f7", |
00000378 => x"e4050513", |
00000379 => x"5d4000ef", |
00000380 => x"55fd0485", |
00000381 => x"00ef557d", |
00000382 => x"65054b40", |
00000383 => x"051357fd", |
00000384 => x"a423f485", |
00000385 => x"00ef82f1", |
00000386 => x"45015ba0", |
00000387 => x"76e000ef", |
00000388 => x"00010001", |
00000389 => x"00010001", |
00000390 => x"8281a703", |
00000391 => x"800007b7", |
00000392 => x"1e6307ad", |
00000393 => x"650512f7", |
00000394 => x"e4050513", |
00000395 => x"594000ef", |
00000396 => x"65050485", |
00000397 => x"051357fd", |
00000398 => x"a423f585", |
00000399 => x"00ef82f1", |
00000400 => x"21a95820", |
00000401 => x"051387aa", |
00000402 => x"37b33e85", |
00000403 => x"95be00f5", |
00000404 => x"29a109ad", |
00000405 => x"10500073", |
00000406 => x"8281a703", |
00000407 => x"800007b7", |
00000408 => x"0463079d", |
00000409 => x"650510f7", |
00000410 => x"e4450513", |
00000411 => x"554000ef", |
00000412 => x"65050405", |
00000413 => x"862686a2", |
00000414 => x"051385ce", |
00000415 => x"00eff685", |
00000416 => x"1a635420", |
00000417 => x"65050e04", |
00000418 => x"f8c50513", |
00000419 => x"6505b1a9", |
00000420 => x"e4450513", |
00000421 => x"52c000ef", |
00000422 => x"44054481", |
00000423 => x"6505b1dd", |
00000424 => x"e4450513", |
00000425 => x"51c000ef", |
00000426 => x"bb310405", |
00000427 => x"05136505", |
00000428 => x"00efe445", |
00000429 => x"040550e0", |
00000430 => x"6505b399", |
00000431 => x"e4050513", |
00000432 => x"500000ef", |
00000433 => x"b3950485", |
00000434 => x"05136505", |
00000435 => x"00efe445", |
00000436 => x"04054f20", |
00000437 => x"6505b361", |
00000438 => x"e8c50513", |
00000439 => x"4e4000ef", |
00000440 => x"bbb54991", |
00000441 => x"05136505", |
00000442 => x"00efe445", |
00000443 => x"04054d60", |
00000444 => x"6505bb69", |
00000445 => x"e4450513", |
00000446 => x"4c8000ef", |
00000447 => x"bb7d0405", |
00000448 => x"05136505", |
00000449 => x"00efe445", |
00000450 => x"04054ba0", |
00000451 => x"6505bbe1", |
00000452 => x"e4450513", |
00000453 => x"4ac000ef", |
00000454 => x"bbd50405", |
00000455 => x"05136505", |
00000456 => x"00efe445", |
00000457 => x"040549e0", |
00000458 => x"6505bd09", |
00000459 => x"e4450513", |
00000460 => x"490000ef", |
00000461 => x"b53d0405", |
00000462 => x"05136505", |
00000463 => x"00efe445", |
00000464 => x"04054820", |
00000465 => x"6505b5a9", |
00000466 => x"e4450513", |
00000467 => x"04052995", |
00000468 => x"6505b5a5", |
00000469 => x"e4450513", |
00000470 => x"040521a5", |
00000471 => x"6505bd59", |
00000472 => x"e4450513", |
00000473 => x"040529b1", |
00000474 => x"6505b5e9", |
00000475 => x"e4050513", |
00000476 => x"04852981", |
00000477 => x"6505bdfd", |
00000478 => x"f9850513", |
00000479 => x"2773bea9", |
00000480 => x"a4233420", |
00000481 => x"808282e1", |
00000482 => x"6505c509", |
00000483 => x"fa850513", |
00000484 => x"6505a905", |
00000485 => x"fb050513", |
00000486 => x"1141bfe5", |
00000487 => x"c226c422", |
00000488 => x"479dc606", |
00000489 => x"84ae842a", |
00000490 => x"02a7f363", |
00000491 => x"006347ad", |
00000492 => x"47cd02f5", |
00000493 => x"00f50b63", |
00000494 => x"056347dd", |
00000495 => x"47ed02f5", |
00000496 => x"1c634505", |
00000497 => x"452d00f4", |
00000498 => x"450da011", |
00000499 => x"25032329", |
00000500 => x"040aff40", |
00000501 => x"c004942a", |
00000502 => x"40b24501", |
00000503 => x"44924422", |
00000504 => x"80820141", |
00000505 => x"b7dd451d", |
00000506 => x"ce061101", |
00000507 => x"ca26cc22", |
00000508 => x"c64ec84a", |
00000509 => x"c256c452", |
00000510 => x"2973c05a", |
00000511 => x"4b01f130", |
00000512 => x"4a2559e1", |
00000513 => x"44914a8d", |
00000514 => x"033b0433", |
00000515 => x"04614501", |
00000516 => x"00895433", |
00000517 => x"0ff47413", |
00000518 => x"028a6f63", |
00000519 => x"0513c511", |
00000520 => x"75130305", |
00000521 => x"2ea50ff5", |
00000522 => x"03040513", |
00000523 => x"0ff57513", |
00000524 => x"056326bd", |
00000525 => x"0513015b", |
00000526 => x"269502e0", |
00000527 => x"15e30b05", |
00000528 => x"40f2fc9b", |
00000529 => x"44d24462", |
00000530 => x"49b24942", |
00000531 => x"4a924a22", |
00000532 => x"61054b02", |
00000533 => x"14598082", |
00000534 => x"74130505", |
00000535 => x"75130ff4", |
00000536 => x"bf5d0ff5", |
00000537 => x"11016505", |
00000538 => x"fb850513", |
00000539 => x"cc22ce06", |
00000540 => x"c84aca26", |
00000541 => x"650526b1", |
00000542 => x"fec50513", |
00000543 => x"25f32691", |
00000544 => x"6505f140", |
00000545 => x"00c50513", |
00000546 => x"25832e25", |
00000547 => x"6505fe40", |
00000548 => x"02450513", |
00000549 => x"65052635", |
00000550 => x"03c50513", |
00000551 => x"37a92615", |
00000552 => x"f13025f3", |
00000553 => x"05136505", |
00000554 => x"2e190505", |
00000555 => x"05136505", |
00000556 => x"263905c5", |
00000557 => x"301027f3", |
00000558 => x"906383f9", |
00000559 => x"65051807", |
00000560 => x"07050513", |
00000561 => x"65052cf5", |
00000562 => x"09050513", |
00000563 => x"25f32cd5", |
00000564 => x"44013010", |
00000565 => x"44e94905", |
00000566 => x"008917b3", |
00000567 => x"cb998fed", |
00000568 => x"04140513", |
00000569 => x"0ff57513", |
00000570 => x"2c55c62e", |
00000571 => x"02000513", |
00000572 => x"45b2247d", |
00000573 => x"11e30405", |
00000574 => x"6505fe94", |
00000575 => x"0a450513", |
00000576 => x"258324c1", |
00000577 => x"6505fe00", |
00000578 => x"0ac50513", |
00000579 => x"65052c55", |
00000580 => x"0c850513", |
00000581 => x"25832475", |
00000582 => x"2603ff80", |
00000583 => x"6505ff00", |
00000584 => x"0e850513", |
00000585 => x"65052c71", |
00000586 => x"11050513", |
00000587 => x"25032c51", |
00000588 => x"8911fe80", |
00000589 => x"65053d91", |
00000590 => x"12850513", |
00000591 => x"25032451", |
00000592 => x"8921fe80", |
00000593 => x"25833591", |
00000594 => x"2603ffc0", |
00000595 => x"6505ff40", |
00000596 => x"14050513", |
00000597 => x"650524b5", |
00000598 => x"16850513", |
00000599 => x"25032495", |
00000600 => x"8941fe80", |
00000601 => x"65053515", |
00000602 => x"18050513", |
00000603 => x"25032c91", |
00000604 => x"8905fe80", |
00000605 => x"65053d11", |
00000606 => x"19850513", |
00000607 => x"25032491", |
00000608 => x"8909fe80", |
00000609 => x"65053511", |
00000610 => x"1b050513", |
00000611 => x"65052c15", |
00000612 => x"fe802403", |
00000613 => x"1c450513", |
00000614 => x"65412425", |
00000615 => x"33ed8d61", |
00000616 => x"05136505", |
00000617 => x"2c291d05", |
00000618 => x"00020537", |
00000619 => x"3be98d61", |
00000620 => x"05136505", |
00000621 => x"24291dc5", |
00000622 => x"00040537", |
00000623 => x"33e98d61", |
00000624 => x"05136505", |
00000625 => x"2aed1e85", |
00000626 => x"00080537", |
00000627 => x"3b6d8d61", |
00000628 => x"05136505", |
00000629 => x"22ed1f45", |
00000630 => x"00100537", |
00000631 => x"336d8d61", |
00000632 => x"05136505", |
00000633 => x"2ae92005", |
00000634 => x"00200537", |
00000635 => x"3b698d61", |
00000636 => x"05136505", |
00000637 => x"22e920c5", |
00000638 => x"00400537", |
00000639 => x"33698d61", |
00000640 => x"05136505", |
00000641 => x"2a6d2185", |
00000642 => x"00800537", |
00000643 => x"3bad8d61", |
00000644 => x"05136505", |
00000645 => x"226d2245", |
00000646 => x"01000537", |
00000647 => x"33ad8d61", |
00000648 => x"05136505", |
00000649 => x"2a692305", |
00000650 => x"02000537", |
00000651 => x"44628d61", |
00000652 => x"44d240f2", |
00000653 => x"61054942", |
00000654 => x"4705bb81", |
00000655 => x"00e78963", |
00000656 => x"9a634709", |
00000657 => x"650500e7", |
00000658 => x"08850513", |
00000659 => x"6505bda5", |
00000660 => x"07850513", |
00000661 => x"6505bd85", |
00000662 => x"08050513", |
00000663 => x"6505b5a5", |
00000664 => x"23c50513", |
00000665 => x"2503a281", |
00000666 => x"8145fe80", |
00000667 => x"80828905", |
00000668 => x"c02a1141", |
00000669 => x"0793c22e", |
00000670 => x"a023f900", |
00000671 => x"47120007", |
00000672 => x"f8e02a23", |
00000673 => x"c3984702", |
00000674 => x"80820141", |
00000675 => x"27831141", |
00000676 => x"2703f940", |
00000677 => x"2683f900", |
00000678 => x"9ae3f940", |
00000679 => x"c03afed7", |
00000680 => x"4502c23e", |
00000681 => x"01414592", |
00000682 => x"06938082", |
00000683 => x"567df980", |
00000684 => x"c288c290", |
00000685 => x"8082c2cc", |
00000686 => x"68051141", |
00000687 => x"00058523", |
00000688 => x"00544781", |
00000689 => x"2b080813", |
00000690 => x"76334729", |
00000691 => x"88b302e5", |
00000692 => x"078500f6", |
00000693 => x"46039642", |
00000694 => x"55330006", |
00000695 => x"802302e5", |
00000696 => x"94e300c8", |
00000697 => x"8636fee7", |
00000698 => x"05134725", |
00000699 => x"48030300", |
00000700 => x"87ba0096", |
00000701 => x"0742177d", |
00000702 => x"17638341", |
00000703 => x"04a300a8", |
00000704 => x"167d0006", |
00000705 => x"4781f76d", |
00000706 => x"470197b6", |
00000707 => x"0007c603", |
00000708 => x"0513ca09", |
00000709 => x"972e0017", |
00000710 => x"00c70023", |
00000711 => x"01051713", |
00000712 => x"86138341", |
00000713 => x"9763fff7", |
00000714 => x"95ba00f6", |
00000715 => x"00058023", |
00000716 => x"80820141", |
00000717 => x"bfd987b2", |
00000718 => x"fe802503", |
00000719 => x"89058149", |
00000720 => x"20238082", |
00000721 => x"2683fa00", |
00000722 => x"0506fe00", |
00000723 => x"f5634701", |
00000724 => x"668502a6", |
00000725 => x"16f94781", |
00000726 => x"02e6e763", |
00000727 => x"89858a05", |
00000728 => x"067a07e2", |
00000729 => x"05f68fd1", |
00000730 => x"8fd98fcd", |
00000731 => x"10000737", |
00000732 => x"20238fd9", |
00000733 => x"8082faf0", |
00000734 => x"00170793", |
00000735 => x"01079713", |
00000736 => x"83418e89", |
00000737 => x"8513b7e9", |
00000738 => x"7513ffe7", |
00000739 => x"e5110fd5", |
00000740 => x"0785830d", |
00000741 => x"0ff7f793", |
00000742 => x"8305b7c1", |
00000743 => x"2423bfdd", |
00000744 => x"8082fca0", |
00000745 => x"46b54729", |
00000746 => x"00054783", |
00000747 => x"e3910505", |
00000748 => x"94638082", |
00000749 => x"242300e7", |
00000750 => x"2423fcd0", |
00000751 => x"b7edfcf0", |
00000752 => x"d422715d", |
00000753 => x"6405c2be", |
00000754 => x"d226185c", |
00000755 => x"cc52ce4e", |
00000756 => x"c85aca56", |
00000757 => x"d04ad606", |
00000758 => x"dc32da2e", |
00000759 => x"c0bade36", |
00000760 => x"c6c6c4c2", |
00000761 => x"0993c03e", |
00000762 => x"4a290250", |
00000763 => x"04934ab5", |
00000764 => x"0b130730", |
00000765 => x"04130750", |
00000766 => x"47832bc4", |
00000767 => x"c39d0005", |
00000768 => x"0d379463", |
00000769 => x"00154783", |
00000770 => x"00250913", |
00000771 => x"06978563", |
00000772 => x"02f4e463", |
00000773 => x"06300713", |
00000774 => x"06e78763", |
00000775 => x"06900713", |
00000776 => x"06e78c63", |
00000777 => x"542250b2", |
00000778 => x"59025492", |
00000779 => x"4a6249f2", |
00000780 => x"4b424ad2", |
00000781 => x"80826161", |
00000782 => x"09678163", |
00000783 => x"07800713", |
00000784 => x"fee792e3", |
00000785 => x"00544782", |
00000786 => x"438c8536", |
00000787 => x"00478713", |
00000788 => x"0613c03a", |
00000789 => x"47010200", |
00000790 => x"00e5d7b3", |
00000791 => x"97a28bbd", |
00000792 => x"0007c783", |
00000793 => x"16fd0711", |
00000794 => x"00f68423", |
00000795 => x"fec716e3", |
00000796 => x"00010623", |
00000797 => x"4782a031", |
00000798 => x"87134388", |
00000799 => x"c03a0047", |
00000800 => x"854a3715", |
00000801 => x"4782bf9d", |
00000802 => x"00478713", |
00000803 => x"0007c783", |
00000804 => x"2423c03a", |
00000805 => x"b7f5fcf0", |
00000806 => x"43884782", |
00000807 => x"00478713", |
00000808 => x"5863c03a", |
00000809 => x"07930005", |
00000810 => x"053302d0", |
00000811 => x"242340a0", |
00000812 => x"004cfcf0", |
00000813 => x"00483511", |
00000814 => x"4782b7e1", |
00000815 => x"8713004c", |
00000816 => x"43880047", |
00000817 => x"b7fdc03a", |
00000818 => x"01479463", |
00000819 => x"fd502423", |
00000820 => x"00150913", |
00000821 => x"7693bf7d", |
00000822 => x"470d0fb5", |
00000823 => x"866387aa", |
00000824 => x"472d00e6", |
00000825 => x"98634505", |
00000826 => x"450500e7", |
00000827 => x"00f517b3", |
00000828 => x"3047a073", |
00000829 => x"80824501", |
00000830 => x"f8800713", |
00000831 => x"e693431c", |
00000832 => x"c3140087", |
00000833 => x"07378b8d", |
00000834 => x"078a8000", |
00000835 => x"08870713", |
00000836 => x"a30397ba", |
00000837 => x"83020007", |
00000838 => x"fe802503", |
00000839 => x"8905815d", |
00000840 => x"479d8082", |
00000841 => x"00a7fa63", |
00000842 => x"80824505", |
00000843 => x"40b24505", |
00000844 => x"44924422", |
00000845 => x"80820141", |
00000846 => x"c2261141", |
00000847 => x"658584ae", |
00000848 => x"8593c422", |
00000849 => x"842acf85", |
00000850 => x"c606456d", |
00000851 => x"a4fff0ef", |
00000852 => x"07b7fd71", |
00000853 => x"17138000", |
00000854 => x"87930024", |
00000855 => x"97ba0887", |
00000856 => x"2703c384", |
00000857 => x"0421f880", |
00000858 => x"97b34785", |
00000859 => x"8fd90087", |
00000860 => x"0107e793", |
00000861 => x"f8f02423", |
00000862 => x"479dbf5d", |
00000863 => x"00a7ed63", |
00000864 => x"f8802783", |
00000865 => x"8d5d0542", |
00000866 => x"000807b7", |
00000867 => x"24238d5d", |
00000868 => x"4501f8a0", |
00000869 => x"45058082", |
00000870 => x"00008082", |
00000871 => x"2d2d0a0a", |
00000872 => x"2d2d2d2d", |
00000873 => x"55504320", |
00000874 => x"53455420", |
00000875 => x"2d2d2054", |
00000876 => x"2d2d2d2d", |
00000877 => x"00000a0a", |
00000878 => x"74530a0a", |
00000879 => x"69747261", |
00000880 => x"7420676e", |
00000881 => x"73747365", |
00000882 => x"0a2e2e2e", |
00000883 => x"0000000a", |
00000884 => x"20455452", |
00000885 => x"74736e69", |
00000886 => x"206c6c61", |
00000887 => x"6f727265", |
00000888 => x"000a2172", |
00000889 => x"43494c43", |
00000890 => x"736e6920", |
00000891 => x"6c6c6174", |
00000892 => x"72726520", |
00000893 => x"0a21726f", |
00000894 => x"00000000", |
00000895 => x"4d454d49", |
00000896 => x"5345545f", |
00000897 => x"20203a54", |
00000898 => x"00000020", |
00000899 => x"70696b73", |
00000900 => x"20646570", |
00000901 => x"73696428", |
00000902 => x"656c6261", |
00000903 => x"000a2964", |
00000904 => x"4d454d44", |
00000905 => x"5345545f", |
00000906 => x"20203a54", |
00000907 => x"00000020", |
00000908 => x"4359434d", |
00000909 => x"485b454c", |
00000910 => x"20203a5d", |
00000911 => x"00000020", |
00000912 => x"000a6b6f", |
00000913 => x"6c696166", |
00000914 => x"0000000a", |
00000915 => x"534e494d", |
00000916 => x"54455254", |
00000917 => x"3a5d485b", |
00000918 => x"00000020", |
00000919 => x"454d4954", |
00000920 => x"3a5d485b", |
00000921 => x"20202020", |
00000922 => x"00000020", |
00000923 => x"434e4546", |
00000924 => x"492e2845", |
00000925 => x"20203a29", |
00000926 => x"00000020", |
00000927 => x"20435845", |
00000928 => x"4c415f49", |
00000929 => x"3a4e4749", |
00000930 => x"00000020", |
00000931 => x"70696b73", |
00000932 => x"20646570", |
00000933 => x"746f6e28", |
00000934 => x"736f7020", |
00000935 => x"6c626973", |
00000936 => x"68772065", |
00000937 => x"43206e65", |
00000938 => x"5458452d", |
00000939 => x"616e6520", |
00000940 => x"64656c62", |
00000941 => x"00000a29", |
00000942 => x"20435845", |
00000943 => x"43415f49", |
00000944 => x"20203a43", |
00000945 => x"00000020", |
00000946 => x"20435845", |
00000947 => x"4c495f49", |
00000948 => x"3a47454c", |
00000949 => x"00000020", |
00000950 => x"20435845", |
00000951 => x"41455242", |
00000952 => x"20203a4b", |
00000953 => x"00000020", |
00000954 => x"20435845", |
00000955 => x"4c415f4c", |
00000956 => x"3a4e4749", |
00000957 => x"00000020", |
00000958 => x"20435845", |
00000959 => x"43415f4c", |
00000960 => x"20203a43", |
00000961 => x"00000020", |
00000962 => x"20435845", |
00000963 => x"4c415f53", |
00000964 => x"3a4e4749", |
00000965 => x"00000020", |
00000966 => x"20435845", |
00000967 => x"43415f53", |
00000968 => x"20203a43", |
00000969 => x"00000020", |
00000970 => x"20435845", |
00000971 => x"43564e45", |
00000972 => x"3a4c4c41", |
00000973 => x"00000020", |
00000974 => x"20515249", |
00000975 => x"3a49544d", |
00000976 => x"20202020", |
00000977 => x"00000020", |
00000978 => x"20515249", |
00000979 => x"3a49454d", |
00000980 => x"20202020", |
00000981 => x"00000020", |
00000982 => x"3a494657", |
00000983 => x"20202020", |
00000984 => x"20202020", |
00000985 => x"00000020", |
00000986 => x"65540a0a", |
00000987 => x"3a737473", |
00000988 => x"0a692520", |
00000989 => x"203a4b4f", |
00000990 => x"25202020", |
00000991 => x"41460a69", |
00000992 => x"203a4c49", |
00000993 => x"0a692520", |
00000994 => x"0000000a", |
00000995 => x"54534554", |
00000996 => x"214b4f20", |
00000997 => x"0000000a", |
00000998 => x"54534554", |
00000999 => x"49414620", |
00001000 => x"2144454c", |
00001001 => x"0000000a", |
00001002 => x"65757254", |
00001003 => x"0000000a", |
00001004 => x"736c6146", |
00001005 => x"00000a65", |
00001006 => x"3c3c0a0a", |
00001007 => x"4f454e20", |
00001008 => x"32335652", |
00001009 => x"72614820", |
00001010 => x"72617764", |
00001011 => x"6f432065", |
00001012 => x"6769666e", |
00001013 => x"74617275", |
00001014 => x"206e6f69", |
00001015 => x"7265764f", |
00001016 => x"77656976", |
00001017 => x"0a3e3e20", |
00001018 => x"00000000", |
00001019 => x"202d2d0a", |
00001020 => x"746e6543", |
00001021 => x"206c6172", |
00001022 => x"636f7250", |
00001023 => x"69737365", |
00001024 => x"5520676e", |
00001025 => x"2074696e", |
00001026 => x"000a2d2d", |
00001027 => x"74726148", |
00001028 => x"3a444920", |
00001029 => x"20202020", |
00001030 => x"20202020", |
00001031 => x"78302020", |
00001032 => x"000a7825", |
00001033 => x"72657355", |
00001034 => x"646f6320", |
00001035 => x"20203a65", |
00001036 => x"20202020", |
00001037 => x"78302020", |
00001038 => x"000a7825", |
00001039 => x"64726148", |
00001040 => x"65726177", |
00001041 => x"72657620", |
00001042 => x"6e6f6973", |
00001043 => x"0000203a", |
00001044 => x"78302820", |
00001045 => x"0a297825", |
00001046 => x"00000000", |
00001047 => x"68637241", |
00001048 => x"63657469", |
00001049 => x"65727574", |
00001050 => x"2020203a", |
00001051 => x"00002020", |
00001052 => x"6e6b6e75", |
00001053 => x"006e776f", |
00001054 => x"32335652", |
00001055 => x"00000000", |
00001056 => x"32315652", |
00001057 => x"00000038", |
00001058 => x"34365652", |
00001059 => x"00000000", |
00001060 => x"5550430a", |
00001061 => x"74786520", |
00001062 => x"69736e65", |
00001063 => x"3a736e6f", |
00001064 => x"00202020", |
00001065 => x"25783028", |
00001066 => x"000a2978", |
00001067 => x"636f6c43", |
00001068 => x"7073206b", |
00001069 => x"3a646565", |
00001070 => x"20202020", |
00001071 => x"75252020", |
00001072 => x"0a7a4820", |
00001073 => x"00000000", |
00001074 => x"202d2d0a", |
00001075 => x"6f6d654d", |
00001076 => x"43207972", |
00001077 => x"69666e6f", |
00001078 => x"61727567", |
00001079 => x"6e6f6974", |
00001080 => x"0a2d2d20", |
00001081 => x"00000000", |
00001082 => x"74736e49", |
00001083 => x"74637572", |
00001084 => x"206e6f69", |
00001085 => x"6f6d656d", |
00001086 => x"203a7972", |
00001087 => x"75252020", |
00001088 => x"74796220", |
00001089 => x"40207365", |
00001090 => x"25783020", |
00001091 => x"00000a78", |
00001092 => x"65746e49", |
00001093 => x"6c616e72", |
00001094 => x"454d4920", |
00001095 => x"20203a4d", |
00001096 => x"20202020", |
00001097 => x"00002020", |
00001098 => x"65746e49", |
00001099 => x"6c616e72", |
00001100 => x"454d4920", |
00001101 => x"7361204d", |
00001102 => x"4d4f5220", |
00001103 => x"0000203a", |
00001104 => x"61746144", |
00001105 => x"6d656d20", |
00001106 => x"3a79726f", |
00001107 => x"20202020", |
00001108 => x"20202020", |
00001109 => x"75252020", |
00001110 => x"74796220", |
00001111 => x"40207365", |
00001112 => x"25783020", |
00001113 => x"00000a78", |
00001114 => x"65746e49", |
00001115 => x"6c616e72", |
00001116 => x"454d4420", |
00001117 => x"20203a4d", |
00001118 => x"20202020", |
00001119 => x"00002020", |
00001120 => x"746f6f42", |
00001121 => x"64616f6c", |
00001122 => x"203a7265", |
00001123 => x"20202020", |
00001124 => x"20202020", |
00001125 => x"00002020", |
00001126 => x"65747845", |
00001127 => x"6c616e72", |
00001128 => x"746e6920", |
00001129 => x"61667265", |
00001130 => x"203a6563", |
00001131 => x"00002020", |
00001132 => x"202d2d0a", |
00001133 => x"69726550", |
00001134 => x"72656870", |
00001135 => x"20736c61", |
00001136 => x"000a2d2d", |
00001137 => x"4f495047", |
00001138 => x"2020203a", |
00001139 => x"00000020", |
00001140 => x"4d49544d", |
00001141 => x"20203a45", |
00001142 => x"00000020", |
00001143 => x"54524155", |
00001144 => x"2020203a", |
00001145 => x"00000020", |
00001146 => x"3a495053", |
00001147 => x"20202020", |
00001148 => x"00000020", |
00001149 => x"3a495754", |
00001150 => x"20202020", |
00001151 => x"00000020", |
00001152 => x"3a4d5750", |
00001153 => x"20202020", |
00001154 => x"00000020", |
00001155 => x"3a544457", |
00001156 => x"20202020", |
00001157 => x"00000020", |
00001158 => x"43494c43", |
00001159 => x"2020203a", |
00001160 => x"00000020", |
00001161 => x"474e5254", |
00001162 => x"2020203a", |
00001163 => x"00000020", |
00001164 => x"4e564544", |
00001165 => x"3a4c4c55", |
00001166 => x"00000020", |
00001167 => x"68540a0a", |
00001168 => x"454e2065", |
00001169 => x"3356524f", |
00001170 => x"72502032", |
00001171 => x"7365636f", |
00001172 => x"20726f73", |
00001173 => x"6a6f7250", |
00001174 => x"0a746365", |
00001175 => x"53207962", |
00001176 => x"68706574", |
00001177 => x"4e206e61", |
00001178 => x"69746c6f", |
00001179 => x"680a676e", |
00001180 => x"73707474", |
00001181 => x"672f2f3a", |
00001182 => x"75687469", |
00001183 => x"6f632e62", |
00001184 => x"74732f6d", |
00001185 => x"746c6f6e", |
00001186 => x"2f676e69", |
00001187 => x"726f656e", |
00001188 => x"0a323376", |
00001189 => x"6564616d", |
00001190 => x"206e6920", |
00001191 => x"6e6e6148", |
00001192 => x"7265766f", |
00001193 => x"6547202c", |
00001194 => x"6e616d72", |
00001195 => x"000a0a79", |
00001196 => x"33323130", |
00001197 => x"37363534", |
00001198 => x"00003938", |
00001199 => x"33323130", |
00001200 => x"37363534", |
00001201 => x"62613938", |
00001202 => x"66656463", |
00001203 => x"dead007f", |
00001204 => x"00008067", |
00000035 => x"ffc10113", |
00000036 => x"00010413", |
00000037 => x"80000197", |
00000038 => x"76c18193", |
00000039 => x"00000597", |
00000040 => x"08058593", |
00000041 => x"30559073", |
00000042 => x"f8000593", |
00000043 => x"0005a023", |
00000044 => x"00458593", |
00000045 => x"feb01ce3", |
00000046 => x"80000597", |
00000047 => x"f4858593", |
00000048 => x"84018613", |
00000049 => x"00c5d863", |
00000050 => x"00058023", |
00000051 => x"00158593", |
00000052 => x"ff5ff06f", |
00000053 => x"00001597", |
00000054 => x"ed858593", |
00000055 => x"80000617", |
00000056 => x"f2460613", |
00000057 => x"80000697", |
00000058 => x"f1c68693", |
00000059 => x"00d65c63", |
00000060 => x"00058703", |
00000061 => x"00e60023", |
00000062 => x"00158593", |
00000063 => x"00160613", |
00000064 => x"fedff06f", |
00000065 => x"00000513", |
00000066 => x"00000593", |
00000067 => x"05c000ef", |
00000068 => x"30047073", |
00000069 => x"10500073", |
00000070 => x"0000006f", |
00000071 => x"ff810113", |
00000072 => x"00812023", |
00000073 => x"00912223", |
00000074 => x"34202473", |
00000075 => x"02044663", |
00000076 => x"34102473", |
00000077 => x"00041483", |
00000078 => x"0034f493", |
00000079 => x"00240413", |
00000080 => x"34141073", |
00000081 => x"00300413", |
00000082 => x"00941863", |
00000083 => x"34102473", |
00000084 => x"00240413", |
00000085 => x"34141073", |
00000086 => x"00012483", |
00000087 => x"00412403", |
00000088 => x"00810113", |
00000089 => x"30200073", |
00000090 => x"ff010113", |
00000091 => x"00112623", |
00000092 => x"00812423", |
00000093 => x"0dd000ef", |
00000094 => x"04050663", |
00000095 => x"4dc000ef", |
00000096 => x"00005537", |
00000097 => x"00000613", |
00000098 => x"00000593", |
00000099 => x"b0050513", |
00000100 => x"618000ef", |
00000101 => x"00001537", |
00000102 => x"bbc50513", |
00000103 => x"6a8000ef", |
00000104 => x"00000513", |
00000105 => x"0bd000ef", |
00000106 => x"00000413", |
00000107 => x"0ff47513", |
00000108 => x"0b1000ef", |
00000109 => x"0c800513", |
00000110 => x"0ed000ef", |
00000111 => x"00140413", |
00000112 => x"fedff06f", |
00000113 => x"00c12083", |
00000114 => x"00812403", |
00000115 => x"01010113", |
00000116 => x"00008067", |
00000117 => x"00000000", |
00000118 => x"00000000", |
00000119 => x"00000000", |
00000120 => x"fc010113", |
00000121 => x"02112e23", |
00000122 => x"02512c23", |
00000123 => x"02612a23", |
00000124 => x"02712823", |
00000125 => x"02a12623", |
00000126 => x"02b12423", |
00000127 => x"02c12223", |
00000128 => x"02d12023", |
00000129 => x"00e12e23", |
00000130 => x"00f12c23", |
00000131 => x"01012a23", |
00000132 => x"01112823", |
00000133 => x"01c12623", |
00000134 => x"01d12423", |
00000135 => x"01e12223", |
00000136 => x"01f12023", |
00000137 => x"34102773", |
00000138 => x"342027f3", |
00000139 => x"0807c863", |
00000140 => x"00071683", |
00000141 => x"00300593", |
00000142 => x"0036f693", |
00000143 => x"00270613", |
00000144 => x"00b69463", |
00000145 => x"00470613", |
00000146 => x"34161073", |
00000147 => x"00b00713", |
00000148 => x"04f77a63", |
00000149 => x"38000793", |
00000150 => x"000780e7", |
00000151 => x"03c12083", |
00000152 => x"03812283", |
00000153 => x"03412303", |
00000154 => x"03012383", |
00000155 => x"02c12503", |
00000156 => x"02812583", |
00000157 => x"02412603", |
00000158 => x"02012683", |
00000159 => x"01c12703", |
00000160 => x"01812783", |
00000161 => x"01412803", |
00000162 => x"01012883", |
00000163 => x"00c12e03", |
00000164 => x"00812e83", |
00000165 => x"00412f03", |
00000166 => x"00012f83", |
00000167 => x"04010113", |
00000168 => x"30200073", |
00000169 => x"00001737", |
00000170 => x"00279793", |
00000171 => x"bd870713", |
00000172 => x"00e787b3", |
00000173 => x"0007a783", |
00000174 => x"00078067", |
00000175 => x"80000737", |
00000176 => x"ffd74713", |
00000177 => x"00e787b3", |
00000178 => x"01000713", |
00000179 => x"f8f764e3", |
00000180 => x"00001737", |
00000181 => x"00279793", |
00000182 => x"c0870713", |
00000183 => x"00e787b3", |
00000184 => x"0007a783", |
00000185 => x"00078067", |
00000186 => x"800007b7", |
00000187 => x"0007a783", |
00000188 => x"f69ff06f", |
00000189 => x"800007b7", |
00000190 => x"0047a783", |
00000191 => x"f5dff06f", |
00000192 => x"800007b7", |
00000193 => x"0087a783", |
00000194 => x"f51ff06f", |
00000195 => x"800007b7", |
00000196 => x"00c7a783", |
00000197 => x"f45ff06f", |
00000198 => x"8101a783", |
00000199 => x"f3dff06f", |
00000200 => x"8141a783", |
00000201 => x"f35ff06f", |
00000202 => x"8181a783", |
00000203 => x"f2dff06f", |
00000204 => x"81c1a783", |
00000205 => x"f25ff06f", |
00000206 => x"8201a783", |
00000207 => x"f1dff06f", |
00000208 => x"8241a783", |
00000209 => x"f15ff06f", |
00000210 => x"8281a783", |
00000211 => x"f0dff06f", |
00000212 => x"82c1a783", |
00000213 => x"f05ff06f", |
00000214 => x"8301a783", |
00000215 => x"efdff06f", |
00000216 => x"8341a783", |
00000217 => x"ef5ff06f", |
00000218 => x"8381a783", |
00000219 => x"eedff06f", |
00000220 => x"83c1a783", |
00000221 => x"ee5ff06f", |
00000222 => x"00000000", |
00000223 => x"00000000", |
00000224 => x"00001537", |
00000225 => x"fe010113", |
00000226 => x"c4c50513", |
00000227 => x"00112e23", |
00000228 => x"00812c23", |
00000229 => x"00912a23", |
00000230 => x"01212823", |
00000231 => x"01312623", |
00000232 => x"4fc000ef", |
00000233 => x"c81025f3", |
00000234 => x"c0102673", |
00000235 => x"00001537", |
00000236 => x"c7450513", |
00000237 => x"4e8000ef", |
00000238 => x"342024f3", |
00000239 => x"34102473", |
00000240 => x"00041983", |
00000241 => x"0039f913", |
00000242 => x"0404de63", |
00000243 => x"00001537", |
00000244 => x"c8c50513", |
00000245 => x"4c8000ef", |
00000246 => x"00001537", |
00000247 => x"00040593", |
00000248 => x"ca450513", |
00000249 => x"4b8000ef", |
00000250 => x"00001537", |
00000251 => x"cc450513", |
00000252 => x"4ac000ef", |
00000253 => x"00b00793", |
00000254 => x"0697f463", |
00000255 => x"800007b7", |
00000256 => x"ffd7c793", |
00000257 => x"00f487b3", |
00000258 => x"01000713", |
00000259 => x"02f77e63", |
00000260 => x"00001537", |
00000261 => x"00048593", |
00000262 => x"e6c50513", |
00000263 => x"480000ef", |
00000264 => x"0640006f", |
00000265 => x"00001537", |
00000266 => x"c9850513", |
00000267 => x"470000ef", |
00000268 => x"00300793", |
00000269 => x"00f91663", |
00000270 => x"ffc40413", |
00000271 => x"f9dff06f", |
00000272 => x"ffe40413", |
00000273 => x"f95ff06f", |
00000274 => x"00001737", |
00000275 => x"00279793", |
00000276 => x"f1c70713", |
00000277 => x"00e787b3", |
00000278 => x"0007a783", |
00000279 => x"00078067", |
00000280 => x"00001737", |
00000281 => x"00249793", |
00000282 => x"f6070713", |
00000283 => x"00e787b3", |
00000284 => x"0007a783", |
00000285 => x"00078067", |
00000286 => x"00001537", |
00000287 => x"ccc50513", |
00000288 => x"41c000ef", |
00000289 => x"00001537", |
00000290 => x"00098593", |
00000291 => x"e7c50513", |
00000292 => x"40c000ef", |
00000293 => x"00300793", |
00000294 => x"00f90863", |
00000295 => x"00001537", |
00000296 => x"ea850513", |
00000297 => x"3f8000ef", |
00000298 => x"343025f3", |
00000299 => x"00001537", |
00000300 => x"ebc50513", |
00000301 => x"3e8000ef", |
00000302 => x"341025f3", |
00000303 => x"00001537", |
00000304 => x"ecc50513", |
00000305 => x"3d8000ef", |
00000306 => x"01812403", |
00000307 => x"01c12083", |
00000308 => x"01412483", |
00000309 => x"01012903", |
00000310 => x"00c12983", |
00000311 => x"00001537", |
00000312 => x"ef450513", |
00000313 => x"02010113", |
00000314 => x"3b40006f", |
00000315 => x"00001537", |
00000316 => x"cec50513", |
00000317 => x"f8dff06f", |
00000318 => x"00001537", |
00000319 => x"d0850513", |
00000320 => x"f81ff06f", |
00000321 => x"00001537", |
00000322 => x"d1c50513", |
00000323 => x"f75ff06f", |
00000324 => x"00001537", |
00000325 => x"d3050513", |
00000326 => x"f69ff06f", |
00000327 => x"00001537", |
00000328 => x"d4850513", |
00000329 => x"f5dff06f", |
00000330 => x"00001537", |
00000331 => x"d5c50513", |
00000332 => x"f51ff06f", |
00000333 => x"00001537", |
00000334 => x"d7850513", |
00000335 => x"f45ff06f", |
00000336 => x"00001537", |
00000337 => x"d8c50513", |
00000338 => x"f39ff06f", |
00000339 => x"00001537", |
00000340 => x"dac50513", |
00000341 => x"f2dff06f", |
00000342 => x"00001537", |
00000343 => x"dc850513", |
00000344 => x"f21ff06f", |
00000345 => x"00001537", |
00000346 => x"de050513", |
00000347 => x"f15ff06f", |
00000348 => x"00001537", |
00000349 => x"dfc50513", |
00000350 => x"f09ff06f", |
00000351 => x"00001537", |
00000352 => x"e1850513", |
00000353 => x"efdff06f", |
00000354 => x"00001537", |
00000355 => x"e3450513", |
00000356 => x"ef1ff06f", |
00000357 => x"00001537", |
00000358 => x"e5050513", |
00000359 => x"ee5ff06f", |
00000360 => x"00f00793", |
00000361 => x"0aa7e663", |
00000362 => x"ff010113", |
00000363 => x"00812423", |
00000364 => x"00112623", |
00000365 => x"00900793", |
00000366 => x"00050413", |
00000367 => x"02f51663", |
00000368 => x"00300513", |
00000369 => x"4a4000ef", |
00000370 => x"00c00793", |
00000371 => x"02f41663", |
00000372 => x"01000513", |
00000373 => x"494000ef", |
00000374 => x"00f00793", |
00000375 => x"02f41663", |
00000376 => x"01300513", |
00000377 => x"0200006f", |
00000378 => x"00a00793", |
00000379 => x"04f51463", |
00000380 => x"00700513", |
00000381 => x"474000ef", |
00000382 => x"00d00793", |
00000383 => x"01100513", |
00000384 => x"04f41063", |
00000385 => x"464000ef", |
00000386 => x"80000537", |
00000387 => x"00050513", |
00000388 => x"00241413", |
00000389 => x"00850433", |
00000390 => x"38000793", |
00000391 => x"00c12083", |
00000392 => x"00f42023", |
00000393 => x"00812403", |
00000394 => x"00000513", |
00000395 => x"01010113", |
00000396 => x"00008067", |
00000397 => x"00b00793", |
00000398 => x"f8f518e3", |
00000399 => x"42c000ef", |
00000400 => x"00e00793", |
00000401 => x"01200513", |
00000402 => x"f8f418e3", |
00000403 => x"fb9ff06f", |
00000404 => x"00100513", |
00000405 => x"00008067", |
00000406 => x"ff010113", |
00000407 => x"00112623", |
00000408 => x"00812423", |
00000409 => x"00912223", |
00000410 => x"1e000793", |
00000411 => x"30579073", |
00000412 => x"00000413", |
00000413 => x"01000493", |
00000414 => x"00040513", |
00000415 => x"00140413", |
00000416 => x"0ff47413", |
00000417 => x"f1dff0ef", |
00000418 => x"fe9418e3", |
00000419 => x"00c12083", |
00000420 => x"00812403", |
00000421 => x"00412483", |
00000422 => x"01010113", |
00000423 => x"00008067", |
00000424 => x"fd010113", |
00000425 => x"02812423", |
00000426 => x"02912223", |
00000427 => x"03212023", |
00000428 => x"01312e23", |
00000429 => x"01412c23", |
00000430 => x"02112623", |
00000431 => x"01512a23", |
00000432 => x"00001a37", |
00000433 => x"00050493", |
00000434 => x"00058413", |
00000435 => x"00058523", |
00000436 => x"00000993", |
00000437 => x"00410913", |
00000438 => x"f90a0a13", |
00000439 => x"00a00593", |
00000440 => x"00048513", |
00000441 => x"474000ef", |
00000442 => x"00aa0533", |
00000443 => x"00054783", |
00000444 => x"01390ab3", |
00000445 => x"00048513", |
00000446 => x"00fa8023", |
00000447 => x"00a00593", |
00000448 => x"410000ef", |
00000449 => x"00198993", |
00000450 => x"00a00793", |
00000451 => x"00050493", |
00000452 => x"fcf996e3", |
00000453 => x"00090693", |
00000454 => x"00900713", |
00000455 => x"03000613", |
00000456 => x"0096c583", |
00000457 => x"00070793", |
00000458 => x"fff70713", |
00000459 => x"01071713", |
00000460 => x"01075713", |
00000461 => x"00c59a63", |
00000462 => x"000684a3", |
00000463 => x"fff68693", |
00000464 => x"fe0710e3", |
00000465 => x"00000793", |
00000466 => x"00f907b3", |
00000467 => x"00000593", |
00000468 => x"0007c703", |
00000469 => x"00070c63", |
00000470 => x"00158693", |
00000471 => x"00b405b3", |
00000472 => x"00e58023", |
00000473 => x"01069593", |
00000474 => x"0105d593", |
00000475 => x"fff78713", |
00000476 => x"02f91863", |
00000477 => x"00b40433", |
00000478 => x"00040023", |
00000479 => x"02c12083", |
00000480 => x"02812403", |
00000481 => x"02412483", |
00000482 => x"02012903", |
00000483 => x"01c12983", |
00000484 => x"01812a03", |
00000485 => x"01412a83", |
00000486 => x"03010113", |
00000487 => x"00008067", |
00000488 => x"00070793", |
00000489 => x"fadff06f", |
00000490 => x"fa002023", |
00000491 => x"fe002683", |
00000492 => x"00151513", |
00000493 => x"00000713", |
00000494 => x"04a6f263", |
00000495 => x"000016b7", |
00000496 => x"00000793", |
00000497 => x"ffe68693", |
00000498 => x"04e6e463", |
00000499 => x"00167613", |
00000500 => x"0015f593", |
00000501 => x"01879793", |
00000502 => x"01e61613", |
00000503 => x"00c7e7b3", |
00000504 => x"01d59593", |
00000505 => x"00b7e7b3", |
00000506 => x"00e7e7b3", |
00000507 => x"10000737", |
00000508 => x"00e7e7b3", |
00000509 => x"faf02023", |
00000510 => x"00008067", |
00000511 => x"00170793", |
00000512 => x"01079713", |
00000513 => x"40a686b3", |
00000514 => x"01075713", |
00000515 => x"fadff06f", |
00000516 => x"ffe78513", |
00000517 => x"0fd57513", |
00000518 => x"00051a63", |
00000519 => x"00375713", |
00000520 => x"00178793", |
00000521 => x"0ff7f793", |
00000522 => x"fa1ff06f", |
00000523 => x"00175713", |
00000524 => x"ff1ff06f", |
00000525 => x"fa002783", |
00000526 => x"fe07cee3", |
00000527 => x"faa02223", |
00000528 => x"00008067", |
00000529 => x"ff010113", |
00000530 => x"00812423", |
00000531 => x"01212023", |
00000532 => x"00112623", |
00000533 => x"00912223", |
00000534 => x"00050413", |
00000535 => x"00a00913", |
00000536 => x"00044483", |
00000537 => x"00140413", |
00000538 => x"00049e63", |
00000539 => x"00c12083", |
00000540 => x"00812403", |
00000541 => x"00412483", |
00000542 => x"00012903", |
00000543 => x"01010113", |
00000544 => x"00008067", |
00000545 => x"01249663", |
00000546 => x"00d00513", |
00000547 => x"fa9ff0ef", |
00000548 => x"00048513", |
00000549 => x"fa1ff0ef", |
00000550 => x"fc9ff06f", |
00000551 => x"fa010113", |
00000552 => x"02912a23", |
00000553 => x"04f12a23", |
00000554 => x"000014b7", |
00000555 => x"04410793", |
00000556 => x"02812c23", |
00000557 => x"03212823", |
00000558 => x"03412423", |
00000559 => x"03512223", |
00000560 => x"03612023", |
00000561 => x"01712e23", |
00000562 => x"02112e23", |
00000563 => x"03312623", |
00000564 => x"01812c23", |
00000565 => x"00050413", |
00000566 => x"04b12223", |
00000567 => x"04c12423", |
00000568 => x"04d12623", |
00000569 => x"04e12823", |
00000570 => x"05012c23", |
00000571 => x"05112e23", |
00000572 => x"00f12023", |
00000573 => x"02500a13", |
00000574 => x"00a00a93", |
00000575 => x"07300913", |
00000576 => x"07500b13", |
00000577 => x"07800b93", |
00000578 => x"f9c48493", |
00000579 => x"00044c03", |
00000580 => x"020c0463", |
00000581 => x"134c1263", |
00000582 => x"00144783", |
00000583 => x"00240993", |
00000584 => x"09278c63", |
00000585 => x"04f96263", |
00000586 => x"06300713", |
00000587 => x"0ae78463", |
00000588 => x"06900713", |
00000589 => x"0ae78c63", |
00000590 => x"03c12083", |
00000591 => x"03812403", |
00000592 => x"03412483", |
00000593 => x"03012903", |
00000594 => x"02c12983", |
00000595 => x"02812a03", |
00000596 => x"02412a83", |
00000597 => x"02012b03", |
00000598 => x"01c12b83", |
00000599 => x"01812c03", |
00000600 => x"06010113", |
00000601 => x"00008067", |
00000602 => x"0b678c63", |
00000603 => x"fd7796e3", |
00000604 => x"00012783", |
00000605 => x"00410693", |
00000606 => x"00068513", |
00000607 => x"0007a583", |
00000608 => x"00478713", |
00000609 => x"00e12023", |
00000610 => x"02000613", |
00000611 => x"00000713", |
00000612 => x"00e5d7b3", |
00000613 => x"00f7f793", |
00000614 => x"00f487b3", |
00000615 => x"0007c783", |
00000616 => x"00470713", |
00000617 => x"fff68693", |
00000618 => x"00f68423", |
00000619 => x"fec712e3", |
00000620 => x"00010623", |
00000621 => x"0140006f", |
00000622 => x"00012783", |
00000623 => x"0007a503", |
00000624 => x"00478713", |
00000625 => x"00e12023", |
00000626 => x"e7dff0ef", |
00000627 => x"00098413", |
00000628 => x"f3dff06f", |
00000629 => x"00012783", |
00000630 => x"0007c503", |
00000631 => x"00478713", |
00000632 => x"00e12023", |
00000633 => x"e51ff0ef", |
00000634 => x"fe5ff06f", |
00000635 => x"00012783", |
00000636 => x"0007a403", |
00000637 => x"00478713", |
00000638 => x"00e12023", |
00000639 => x"00045863", |
00000640 => x"02d00513", |
00000641 => x"40800433", |
00000642 => x"e2dff0ef", |
00000643 => x"00410593", |
00000644 => x"00040513", |
00000645 => x"c8dff0ef", |
00000646 => x"00410513", |
00000647 => x"fadff06f", |
00000648 => x"00012783", |
00000649 => x"00410593", |
00000650 => x"00478713", |
00000651 => x"0007a503", |
00000652 => x"00e12023", |
00000653 => x"fe1ff06f", |
00000654 => x"015c1663", |
00000655 => x"00d00513", |
00000656 => x"df5ff0ef", |
00000657 => x"00140993", |
00000658 => x"000c0513", |
00000659 => x"f99ff06f", |
00000660 => x"fe802503", |
00000661 => x"01055513", |
00000662 => x"00157513", |
00000663 => x"00008067", |
00000664 => x"f8a02223", |
00000665 => x"00008067", |
00000666 => x"01300793", |
00000667 => x"00050713", |
00000668 => x"02a7e663", |
00000669 => x"000f17b7", |
00000670 => x"88878793", |
00000671 => x"00a7d7b3", |
00000672 => x"0017f793", |
00000673 => x"00100513", |
00000674 => x"00078c63", |
00000675 => x"00e51733", |
00000676 => x"30473073", |
00000677 => x"00000513", |
00000678 => x"00008067", |
00000679 => x"00100513", |
00000680 => x"00008067", |
00000681 => x"00050593", |
00000682 => x"fe002503", |
00000683 => x"ff010113", |
00000684 => x"00112623", |
00000685 => x"00f55513", |
00000686 => x"02c000ef", |
00000687 => x"00051863", |
00000688 => x"00c12083", |
00000689 => x"01010113", |
00000690 => x"00008067", |
00000691 => x"00000013", |
00000692 => x"00000013", |
00000693 => x"00000013", |
00000694 => x"00000013", |
00000695 => x"fff50513", |
00000696 => x"fddff06f", |
00000697 => x"00050613", |
00000698 => x"00000513", |
00000699 => x"0015f693", |
00000700 => x"00068463", |
00000701 => x"00c50533", |
00000702 => x"0015d593", |
00000703 => x"00161613", |
00000704 => x"fe0596e3", |
00000705 => x"00008067", |
00000706 => x"06054063", |
00000707 => x"0605c663", |
00000708 => x"00058613", |
00000709 => x"00050593", |
00000710 => x"fff00513", |
00000711 => x"02060c63", |
00000712 => x"00100693", |
00000713 => x"00b67a63", |
00000714 => x"00c05863", |
00000715 => x"00161613", |
00000716 => x"00169693", |
00000717 => x"feb66ae3", |
00000718 => x"00000513", |
00000719 => x"00c5e663", |
00000720 => x"40c585b3", |
00000721 => x"00d56533", |
00000722 => x"0016d693", |
00000723 => x"00165613", |
00000724 => x"fe0696e3", |
00000725 => x"00008067", |
00000726 => x"00008293", |
00000727 => x"fb5ff0ef", |
00000728 => x"00058513", |
00000729 => x"00028067", |
00000730 => x"40a00533", |
00000731 => x"00b04863", |
00000732 => x"40b005b3", |
00000733 => x"f9dff06f", |
00000734 => x"40b005b3", |
00000735 => x"00008293", |
00000736 => x"f91ff0ef", |
00000737 => x"40a00533", |
00000738 => x"00028067", |
00000739 => x"00008293", |
00000740 => x"0005ca63", |
00000741 => x"00054c63", |
00000742 => x"f79ff0ef", |
00000743 => x"00058513", |
00000744 => x"00028067", |
00000745 => x"40b005b3", |
00000746 => x"fe0558e3", |
00000747 => x"40a00533", |
00000748 => x"f61ff0ef", |
00000749 => x"40b00533", |
00000750 => x"00028067", |
00000751 => x"6e696c42", |
00000752 => x"676e696b", |
00000753 => x"44454c20", |
00000754 => x"6d656420", |
00000755 => x"7270206f", |
00000756 => x"6172676f", |
00000757 => x"00000a6d", |
00000758 => x"000002e8", |
00000759 => x"000002f4", |
00000760 => x"00000300", |
00000761 => x"0000030c", |
00000762 => x"00000318", |
00000763 => x"00000320", |
00000764 => x"00000328", |
00000765 => x"00000330", |
00000766 => x"00000254", |
00000767 => x"00000254", |
00000768 => x"00000254", |
00000769 => x"00000338", |
00000770 => x"00000340", |
00000771 => x"00000254", |
00000772 => x"00000254", |
00000773 => x"00000254", |
00000774 => x"00000348", |
00000775 => x"00000254", |
00000776 => x"00000254", |
00000777 => x"00000254", |
00000778 => x"00000350", |
00000779 => x"00000254", |
00000780 => x"00000254", |
00000781 => x"00000254", |
00000782 => x"00000254", |
00000783 => x"00000358", |
00000784 => x"00000360", |
00000785 => x"00000368", |
00000786 => x"00000370", |
00000787 => x"3c3c0a0a", |
00000788 => x"4f454e20", |
00000789 => x"32335652", |
00000790 => x"6e755220", |
00000791 => x"656d6974", |
00000792 => x"766e4520", |
00000793 => x"6e6f7269", |
00000794 => x"746e656d", |
00000795 => x"0a3e3e20", |
00000796 => x"00000000", |
00000797 => x"74737953", |
00000798 => x"74206d65", |
00000799 => x"3a656d69", |
00000800 => x"25783020", |
00000801 => x"78255f78", |
00000802 => x"0000000a", |
00000803 => x"45544e49", |
00000804 => x"50555252", |
00000805 => x"00000054", |
00000806 => x"45435845", |
00000807 => x"4f495450", |
00000808 => x"0000004e", |
00000809 => x"20746120", |
00000810 => x"74736e69", |
00000811 => x"74637572", |
00000812 => x"206e6f69", |
00000813 => x"72646461", |
00000814 => x"3a737365", |
00000815 => x"25783020", |
00000816 => x"00000a78", |
00000817 => x"73756143", |
00000818 => x"00203a65", |
00000819 => x"74736e49", |
00000820 => x"74637572", |
00000821 => x"206e6f69", |
00000822 => x"72646461", |
00000823 => x"20737365", |
00000824 => x"6173696d", |
00000825 => x"6e67696c", |
00000826 => x"00006465", |
00000827 => x"74736e49", |
00000828 => x"74637572", |
00000829 => x"206e6f69", |
00000830 => x"65636361", |
00000831 => x"66207373", |
00000832 => x"746c7561", |
00000833 => x"00000000", |
00000834 => x"656c6c49", |
00000835 => x"206c6167", |
00000836 => x"74736e69", |
00000837 => x"74637572", |
00000838 => x"006e6f69", |
00000839 => x"61657242", |
00000840 => x"696f706b", |
00000841 => x"2820746e", |
00000842 => x"45524245", |
00000843 => x"00294b41", |
00000844 => x"64616f4c", |
00000845 => x"64646120", |
00000846 => x"73736572", |
00000847 => x"73696d20", |
00000848 => x"67696c61", |
00000849 => x"0064656e", |
00000850 => x"64616f4c", |
00000851 => x"63636120", |
00000852 => x"20737365", |
00000853 => x"6c756166", |
00000854 => x"00000074", |
00000855 => x"726f7453", |
00000856 => x"64612065", |
00000857 => x"73657264", |
00000858 => x"696d2073", |
00000859 => x"696c6173", |
00000860 => x"64656e67", |
00000861 => x"00000000", |
00000862 => x"726f7453", |
00000863 => x"63612065", |
00000864 => x"73736563", |
00000865 => x"75616620", |
00000866 => x"0000746c", |
00000867 => x"69766e45", |
00000868 => x"6d6e6f72", |
00000869 => x"20746e65", |
00000870 => x"6c6c6163", |
00000871 => x"6f726620", |
00000872 => x"2d4d206d", |
00000873 => x"65646f6d", |
00000874 => x"00000000", |
00000875 => x"6863614d", |
00000876 => x"20656e69", |
00000877 => x"74666f73", |
00000878 => x"65726177", |
00000879 => x"746e6920", |
00000880 => x"75727265", |
00000881 => x"00007470", |
00000882 => x"6863614d", |
00000883 => x"20656e69", |
00000884 => x"656d6974", |
00000885 => x"6e692072", |
00000886 => x"72726574", |
00000887 => x"00747075", |
00000888 => x"6863614d", |
00000889 => x"20656e69", |
00000890 => x"65747865", |
00000891 => x"6c616e72", |
00000892 => x"746e6920", |
00000893 => x"75727265", |
00000894 => x"00007470", |
00000895 => x"74736146", |
00000896 => x"746e6920", |
00000897 => x"75727265", |
00000898 => x"63207470", |
00000899 => x"6e6e6168", |
00000900 => x"30206c65", |
00000901 => x"00000000", |
00000902 => x"74736146", |
00000903 => x"746e6920", |
00000904 => x"75727265", |
00000905 => x"63207470", |
00000906 => x"6e6e6168", |
00000907 => x"31206c65", |
00000908 => x"00000000", |
00000909 => x"74736146", |
00000910 => x"746e6920", |
00000911 => x"75727265", |
00000912 => x"63207470", |
00000913 => x"6e6e6168", |
00000914 => x"32206c65", |
00000915 => x"00000000", |
00000916 => x"74736146", |
00000917 => x"746e6920", |
00000918 => x"75727265", |
00000919 => x"63207470", |
00000920 => x"6e6e6168", |
00000921 => x"33206c65", |
00000922 => x"00000000", |
00000923 => x"6e6b6e55", |
00000924 => x"206e776f", |
00000925 => x"25783028", |
00000926 => x"00002978", |
00000927 => x"7561460a", |
00000928 => x"6e69746c", |
00000929 => x"6e692067", |
00000930 => x"75727473", |
00000931 => x"6f697463", |
00000932 => x"6c28206e", |
00000933 => x"6820776f", |
00000934 => x"20666c61", |
00000935 => x"64726f77", |
00000936 => x"30203a29", |
00000937 => x"00782578", |
00000938 => x"65642820", |
00000939 => x"706d6f63", |
00000940 => x"73736572", |
00000941 => x"0a296465", |
00000942 => x"00000000", |
00000943 => x"56544d0a", |
00000944 => x"203a4c41", |
00000945 => x"78257830", |
00000946 => x"0000000a", |
00000947 => x"69797254", |
00000948 => x"7420676e", |
00000949 => x"6572206f", |
00000950 => x"656d7573", |
00000951 => x"70706120", |
00000952 => x"6163696c", |
00000953 => x"6e6f6974", |
00000954 => x"30204020", |
00000955 => x"2e782578", |
00000956 => x"00002e2e", |
00000957 => x"2f3c3c0a", |
00000958 => x"524f454e", |
00000959 => x"20323356", |
00000960 => x"746e7552", |
00000961 => x"20656d69", |
00000962 => x"69766e45", |
00000963 => x"6d6e6f72", |
00000964 => x"20746e65", |
00000965 => x"0a0a3e3e", |
00000966 => x"00000000", |
00000967 => x"0000054c", |
00000968 => x"00000410", |
00000969 => x"00000410", |
00000970 => x"00000410", |
00000971 => x"00000558", |
00000972 => x"00000410", |
00000973 => x"00000410", |
00000974 => x"00000410", |
00000975 => x"00000564", |
00000976 => x"00000410", |
00000977 => x"00000410", |
00000978 => x"00000410", |
00000979 => x"00000410", |
00000980 => x"00000570", |
00000981 => x"0000057c", |
00000982 => x"00000588", |
00000983 => x"00000594", |
00000984 => x"00000478", |
00000985 => x"000004ec", |
00000986 => x"000004f8", |
00000987 => x"00000504", |
00000988 => x"00000510", |
00000989 => x"0000051c", |
00000990 => x"00000528", |
00000991 => x"00000534", |
00000992 => x"00000410", |
00000993 => x"00000410", |
00000994 => x"00000410", |
00000995 => x"00000540", |
00000996 => x"33323130", |
00000997 => x"37363534", |
00000998 => x"00003938", |
00000999 => x"33323130", |
00001000 => x"37363534", |
00001001 => x"62613938", |
00001002 => x"66656463", |
others => x"00000000" |
); |
|
/neorv32/trunk/rtl/core/neorv32_bootloader_image.vhd
27,1005 → 27,1010
00000016 => x"00000513", |
00000017 => x"00000713", |
00000018 => x"00000793", |
00000019 => x"030000ef", |
00000019 => x"054000ef", |
00000020 => x"0000006f", |
00000021 => x"ffc10113", |
00000021 => x"ff810113", |
00000022 => x"00812023", |
00000023 => x"34202473", |
00000024 => x"00044863", |
00000025 => x"34102473", |
00000026 => x"00440413", |
00000027 => x"34141073", |
00000028 => x"00012403", |
00000029 => x"00410113", |
00000030 => x"30200073", |
00000031 => x"fd010113", |
00000032 => x"02112623", |
00000033 => x"02812423", |
00000034 => x"02912223", |
00000035 => x"03212023", |
00000036 => x"01312e23", |
00000037 => x"01412c23", |
00000038 => x"01512a23", |
00000039 => x"01612823", |
00000040 => x"01712623", |
00000041 => x"01812423", |
00000042 => x"f8002823", |
00000043 => x"f8002a23", |
00000044 => x"1dd000ef", |
00000045 => x"509000ef", |
00000046 => x"4dd000ef", |
00000047 => x"445000ef", |
00000048 => x"295000ef", |
00000049 => x"4e5000ef", |
00000050 => x"fe002403", |
00000051 => x"026267b7", |
00000052 => x"9ff78793", |
00000053 => x"00000713", |
00000054 => x"00000693", |
00000055 => x"00000613", |
00000056 => x"00000593", |
00000057 => x"00200513", |
00000058 => x"0087f463", |
00000059 => x"00400513", |
00000060 => x"3c5000ef", |
00000061 => x"00005537", |
00000062 => x"00000613", |
00000063 => x"00000593", |
00000064 => x"b0050513", |
00000065 => x"2ad000ef", |
00000066 => x"265000ef", |
00000067 => x"00245793", |
00000068 => x"00a78533", |
00000069 => x"00f537b3", |
00000070 => x"00b785b3", |
00000071 => x"27d000ef", |
00000072 => x"ffff07b7", |
00000073 => x"42c78793", |
00000074 => x"30579073", |
00000075 => x"08000793", |
00000076 => x"30479073", |
00000077 => x"30046073", |
00000078 => x"00100513", |
00000079 => x"451000ef", |
00000080 => x"00000793", |
00000081 => x"34079073", |
00000082 => x"ffff1537", |
00000083 => x"f0050513", |
00000084 => x"30d000ef", |
00000085 => x"149000ef", |
00000086 => x"ffff1537", |
00000087 => x"f3850513", |
00000088 => x"2fd000ef", |
00000089 => x"fe002503", |
00000090 => x"254000ef", |
00000091 => x"ffff1537", |
00000092 => x"f4050513", |
00000093 => x"2e9000ef", |
00000094 => x"fe402503", |
00000095 => x"240000ef", |
00000096 => x"ffff1537", |
00000097 => x"f4c50513", |
00000098 => x"2d5000ef", |
00000099 => x"30102573", |
00000100 => x"22c000ef", |
00000101 => x"ffff1537", |
00000102 => x"f5450513", |
00000103 => x"2c1000ef", |
00000104 => x"fe802503", |
00000105 => x"ffff14b7", |
00000106 => x"00341413", |
00000107 => x"210000ef", |
00000108 => x"ffff1537", |
00000109 => x"f5c50513", |
00000110 => x"2a5000ef", |
00000111 => x"ff802503", |
00000112 => x"ffff1937", |
00000113 => x"1f8000ef", |
00000114 => x"f6448513", |
00000115 => x"291000ef", |
00000116 => x"ff002503", |
00000117 => x"1e8000ef", |
00000118 => x"ffff1537", |
00000119 => x"f7050513", |
00000120 => x"27d000ef", |
00000121 => x"ffc02503", |
00000122 => x"1d4000ef", |
00000123 => x"f6448513", |
00000124 => x"26d000ef", |
00000125 => x"ff402503", |
00000126 => x"1c4000ef", |
00000127 => x"ffff1537", |
00000128 => x"f7850513", |
00000129 => x"259000ef", |
00000130 => x"165000ef", |
00000131 => x"00a404b3", |
00000132 => x"0084b433", |
00000133 => x"00b40433", |
00000134 => x"fa402783", |
00000135 => x"0607d263", |
00000136 => x"ffff1537", |
00000137 => x"fa450513", |
00000138 => x"235000ef", |
00000139 => x"ffff1937", |
00000140 => x"0d4000ef", |
00000141 => x"ffff19b7", |
00000142 => x"07200a13", |
00000143 => x"06800a93", |
00000144 => x"07500b13", |
00000145 => x"07300b93", |
00000146 => x"ffff14b7", |
00000147 => x"ffff1c37", |
00000148 => x"fb090513", |
00000149 => x"209000ef", |
00000150 => x"1f5000ef", |
00000151 => x"00050413", |
00000152 => x"1dd000ef", |
00000153 => x"fa098513", |
00000154 => x"1f5000ef", |
00000155 => x"03441e63", |
00000156 => x"30047073", |
00000157 => x"ffff02b7", |
00000158 => x"00028067", |
00000159 => x"0000006f", |
00000160 => x"0ed000ef", |
00000161 => x"f885eae3", |
00000162 => x"00b41463", |
00000163 => x"f89566e3", |
00000164 => x"00100513", |
00000165 => x"43c000ef", |
00000166 => x"fa090513", |
00000167 => x"1c1000ef", |
00000168 => x"070000ef", |
00000169 => x"f75ff06f", |
00000170 => x"01541663", |
00000171 => x"058000ef", |
00000172 => x"fa1ff06f", |
00000173 => x"00000513", |
00000174 => x"01640e63", |
00000175 => x"01741663", |
00000176 => x"654000ef", |
00000177 => x"f8dff06f", |
00000178 => x"06c00793", |
00000179 => x"00f41863", |
00000180 => x"00100513", |
00000181 => x"3fc000ef", |
00000182 => x"f79ff06f", |
00000183 => x"06500793", |
00000184 => x"00f41663", |
00000185 => x"02c000ef", |
00000186 => x"f69ff06f", |
00000187 => x"03f00793", |
00000188 => x"fb8c0513", |
00000189 => x"00f40463", |
00000190 => x"fcc48513", |
00000191 => x"161000ef", |
00000192 => x"f51ff06f", |
00000193 => x"ffff1537", |
00000194 => x"dd050513", |
00000195 => x"1510006f", |
00000196 => x"340027f3", |
00000197 => x"00079863", |
00000198 => x"ffff1537", |
00000199 => x"e3450513", |
00000200 => x"13d0006f", |
00000201 => x"ff010113", |
00000202 => x"00112623", |
00000203 => x"30047073", |
00000204 => x"00000793", |
00000205 => x"30479073", |
00000023 => x"00912223", |
00000024 => x"34202473", |
00000025 => x"02044663", |
00000026 => x"34102473", |
00000027 => x"00041483", |
00000028 => x"0034f493", |
00000029 => x"00240413", |
00000030 => x"34141073", |
00000031 => x"00300413", |
00000032 => x"00941863", |
00000033 => x"34102473", |
00000034 => x"00240413", |
00000035 => x"34141073", |
00000036 => x"00012483", |
00000037 => x"00412403", |
00000038 => x"00810113", |
00000039 => x"30200073", |
00000040 => x"fd010113", |
00000041 => x"02112623", |
00000042 => x"02812423", |
00000043 => x"02912223", |
00000044 => x"03212023", |
00000045 => x"01312e23", |
00000046 => x"01412c23", |
00000047 => x"01512a23", |
00000048 => x"01612823", |
00000049 => x"01712623", |
00000050 => x"01812423", |
00000051 => x"f8002823", |
00000052 => x"f8002a23", |
00000053 => x"1e1000ef", |
00000054 => x"4cd000ef", |
00000055 => x"435000ef", |
00000056 => x"4ed000ef", |
00000057 => x"4d5000ef", |
00000058 => x"fe002403", |
00000059 => x"026267b7", |
00000060 => x"9ff78793", |
00000061 => x"00000713", |
00000062 => x"00000693", |
00000063 => x"00000613", |
00000064 => x"00000593", |
00000065 => x"00200513", |
00000066 => x"0087f463", |
00000067 => x"00400513", |
00000068 => x"3b5000ef", |
00000069 => x"00005537", |
00000070 => x"00000613", |
00000071 => x"00000593", |
00000072 => x"b0050513", |
00000073 => x"29d000ef", |
00000074 => x"255000ef", |
00000075 => x"00245793", |
00000076 => x"00a78533", |
00000077 => x"00f537b3", |
00000078 => x"00b785b3", |
00000079 => x"26d000ef", |
00000080 => x"ffff07b7", |
00000081 => x"44c78793", |
00000082 => x"30579073", |
00000083 => x"08000793", |
00000084 => x"30479073", |
00000085 => x"30046073", |
00000086 => x"00100513", |
00000087 => x"441000ef", |
00000088 => x"00000793", |
00000089 => x"34079073", |
00000090 => x"ffff1537", |
00000091 => x"f1450513", |
00000092 => x"2fd000ef", |
00000093 => x"151000ef", |
00000094 => x"ffff1537", |
00000095 => x"f4c50513", |
00000096 => x"2ed000ef", |
00000097 => x"fe002503", |
00000098 => x"254000ef", |
00000099 => x"ffff1537", |
00000100 => x"f5450513", |
00000101 => x"2d9000ef", |
00000102 => x"fe402503", |
00000103 => x"240000ef", |
00000104 => x"ffff1537", |
00000105 => x"f6050513", |
00000106 => x"2c5000ef", |
00000107 => x"30102573", |
00000108 => x"22c000ef", |
00000109 => x"ffff1537", |
00000110 => x"f6850513", |
00000111 => x"2b1000ef", |
00000112 => x"fe802503", |
00000113 => x"ffff14b7", |
00000114 => x"00341413", |
00000115 => x"210000ef", |
00000116 => x"ffff1537", |
00000117 => x"f7050513", |
00000118 => x"295000ef", |
00000119 => x"ff802503", |
00000120 => x"ffff1937", |
00000121 => x"1f8000ef", |
00000122 => x"f7848513", |
00000123 => x"281000ef", |
00000124 => x"ff002503", |
00000125 => x"1e8000ef", |
00000126 => x"ffff1537", |
00000127 => x"f8450513", |
00000128 => x"26d000ef", |
00000129 => x"ffc02503", |
00000130 => x"1d4000ef", |
00000131 => x"f7848513", |
00000132 => x"25d000ef", |
00000133 => x"ff402503", |
00000134 => x"1c4000ef", |
00000135 => x"ffff1537", |
00000136 => x"f8c50513", |
00000137 => x"249000ef", |
00000138 => x"155000ef", |
00000139 => x"00a404b3", |
00000140 => x"0084b433", |
00000141 => x"00b40433", |
00000142 => x"fa402783", |
00000143 => x"0607d263", |
00000144 => x"ffff1537", |
00000145 => x"fb850513", |
00000146 => x"225000ef", |
00000147 => x"ffff1937", |
00000148 => x"0d4000ef", |
00000149 => x"ffff19b7", |
00000150 => x"07200a13", |
00000151 => x"06800a93", |
00000152 => x"07500b13", |
00000153 => x"07300b93", |
00000154 => x"ffff14b7", |
00000155 => x"ffff1c37", |
00000156 => x"fc490513", |
00000157 => x"1f9000ef", |
00000158 => x"1e5000ef", |
00000159 => x"00050413", |
00000160 => x"1cd000ef", |
00000161 => x"fb498513", |
00000162 => x"1e5000ef", |
00000163 => x"03441e63", |
00000164 => x"30047073", |
00000165 => x"ffff02b7", |
00000166 => x"00028067", |
00000167 => x"0000006f", |
00000168 => x"0dd000ef", |
00000169 => x"f885eae3", |
00000170 => x"00b41463", |
00000171 => x"f89566e3", |
00000172 => x"00100513", |
00000173 => x"444000ef", |
00000174 => x"fb490513", |
00000175 => x"1b1000ef", |
00000176 => x"070000ef", |
00000177 => x"f75ff06f", |
00000178 => x"01541663", |
00000179 => x"058000ef", |
00000180 => x"fa1ff06f", |
00000181 => x"00000513", |
00000182 => x"01640e63", |
00000183 => x"01741663", |
00000184 => x"65c000ef", |
00000185 => x"f8dff06f", |
00000186 => x"06c00793", |
00000187 => x"00f41863", |
00000188 => x"00100513", |
00000189 => x"404000ef", |
00000190 => x"f79ff06f", |
00000191 => x"06500793", |
00000192 => x"00f41663", |
00000193 => x"02c000ef", |
00000194 => x"f69ff06f", |
00000195 => x"03f00793", |
00000196 => x"fccc0513", |
00000197 => x"00f40463", |
00000198 => x"fe048513", |
00000199 => x"151000ef", |
00000200 => x"f51ff06f", |
00000201 => x"ffff1537", |
00000202 => x"de450513", |
00000203 => x"1410006f", |
00000204 => x"340027f3", |
00000205 => x"00079863", |
00000206 => x"ffff1537", |
00000207 => x"e5050513", |
00000208 => x"11d000ef", |
00000209 => x"fa002783", |
00000210 => x"fe07cee3", |
00000211 => x"b0001073", |
00000212 => x"b8001073", |
00000213 => x"b0201073", |
00000214 => x"b8201073", |
00000215 => x"ff002783", |
00000216 => x"00078067", |
00000217 => x"ff9ff06f", |
00000218 => x"ff010113", |
00000219 => x"00812423", |
00000220 => x"00050413", |
00000221 => x"ffff1537", |
00000222 => x"e6050513", |
00000223 => x"00112623", |
00000224 => x"0dd000ef", |
00000225 => x"00500793", |
00000226 => x"0287e263", |
00000227 => x"03040513", |
00000228 => x"0ff57513", |
00000229 => x"0a9000ef", |
00000230 => x"30047073", |
00000231 => x"00100513", |
00000232 => x"1ed000ef", |
00000233 => x"10500073", |
00000234 => x"0000006f", |
00000235 => x"ffff1537", |
00000236 => x"e6850513", |
00000237 => x"0a9000ef", |
00000238 => x"fe1ff06f", |
00000239 => x"fe010113", |
00000240 => x"01212823", |
00000241 => x"00050913", |
00000242 => x"ffff1537", |
00000243 => x"00912a23", |
00000244 => x"e7050513", |
00000245 => x"ffff14b7", |
00000246 => x"00812c23", |
00000247 => x"01312623", |
00000248 => x"00112e23", |
00000249 => x"01c00413", |
00000250 => x"075000ef", |
00000251 => x"fd848493", |
00000252 => x"ffc00993", |
00000253 => x"008957b3", |
00000254 => x"00f7f793", |
00000255 => x"00f487b3", |
00000256 => x"0007c503", |
00000257 => x"ffc40413", |
00000258 => x"035000ef", |
00000259 => x"ff3414e3", |
00000260 => x"01c12083", |
00000261 => x"01812403", |
00000262 => x"01412483", |
00000263 => x"01012903", |
00000264 => x"00c12983", |
00000265 => x"02010113", |
00000266 => x"00008067", |
00000267 => x"fb010113", |
00000268 => x"04112623", |
00000269 => x"04512423", |
00000270 => x"04612223", |
00000271 => x"04712023", |
00000272 => x"02812e23", |
00000273 => x"02a12c23", |
00000274 => x"02b12a23", |
00000275 => x"02c12823", |
00000276 => x"02d12623", |
00000277 => x"02e12423", |
00000278 => x"02f12223", |
00000279 => x"03012023", |
00000280 => x"01112e23", |
00000281 => x"01c12c23", |
00000282 => x"01d12a23", |
00000283 => x"01e12823", |
00000284 => x"01f12623", |
00000285 => x"34202473", |
00000286 => x"800007b7", |
00000287 => x"00778793", |
00000288 => x"02f40a63", |
00000289 => x"ffff1537", |
00000290 => x"e7450513", |
00000291 => x"7d0000ef", |
00000292 => x"00040513", |
00000293 => x"f29ff0ef", |
00000294 => x"ffff1537", |
00000295 => x"e8450513", |
00000296 => x"7bc000ef", |
00000297 => x"34102573", |
00000298 => x"f15ff0ef", |
00000299 => x"00500513", |
00000300 => x"eb9ff0ef", |
00000301 => x"00000513", |
00000302 => x"0b5000ef", |
00000303 => x"6b0000ef", |
00000304 => x"fe002783", |
00000305 => x"0027d793", |
00000306 => x"00a78533", |
00000307 => x"00f537b3", |
00000308 => x"00b785b3", |
00000309 => x"6c4000ef", |
00000310 => x"03c12403", |
00000311 => x"04c12083", |
00000312 => x"04812283", |
00000313 => x"04412303", |
00000314 => x"04012383", |
00000315 => x"03812503", |
00000316 => x"03412583", |
00000317 => x"03012603", |
00000318 => x"02c12683", |
00000319 => x"02812703", |
00000320 => x"02412783", |
00000321 => x"02012803", |
00000322 => x"01c12883", |
00000323 => x"01812e03", |
00000324 => x"01412e83", |
00000325 => x"01012f03", |
00000326 => x"00c12f83", |
00000327 => x"05010113", |
00000328 => x"30200073", |
00000329 => x"ff010113", |
00000330 => x"00000513", |
00000331 => x"00112623", |
00000332 => x"00812423", |
00000333 => x"7e0000ef", |
00000334 => x"00500513", |
00000335 => x"01d000ef", |
00000336 => x"00000513", |
00000337 => x"015000ef", |
00000338 => x"00050413", |
00000339 => x"00000513", |
00000340 => x"7e4000ef", |
00000341 => x"00c12083", |
00000342 => x"0ff47513", |
00000343 => x"00812403", |
00000344 => x"01010113", |
00000345 => x"00008067", |
00000346 => x"ff010113", |
00000207 => x"e4850513", |
00000208 => x"12d0006f", |
00000209 => x"ff010113", |
00000210 => x"00112623", |
00000211 => x"30047073", |
00000212 => x"00000793", |
00000213 => x"30479073", |
00000214 => x"ffff1537", |
00000215 => x"e6450513", |
00000216 => x"10d000ef", |
00000217 => x"fa002783", |
00000218 => x"fe07cee3", |
00000219 => x"b0001073", |
00000220 => x"b8001073", |
00000221 => x"b0201073", |
00000222 => x"b8201073", |
00000223 => x"ff002783", |
00000224 => x"00078067", |
00000225 => x"0000006f", |
00000226 => x"ff010113", |
00000227 => x"00812423", |
00000228 => x"00050413", |
00000229 => x"ffff1537", |
00000230 => x"e7450513", |
00000231 => x"00112623", |
00000232 => x"0cd000ef", |
00000233 => x"00500793", |
00000234 => x"0287e263", |
00000235 => x"03040513", |
00000236 => x"0ff57513", |
00000237 => x"099000ef", |
00000238 => x"30047073", |
00000239 => x"00100513", |
00000240 => x"1dd000ef", |
00000241 => x"10500073", |
00000242 => x"0000006f", |
00000243 => x"ffff1537", |
00000244 => x"e7c50513", |
00000245 => x"099000ef", |
00000246 => x"fe1ff06f", |
00000247 => x"fe010113", |
00000248 => x"01212823", |
00000249 => x"00050913", |
00000250 => x"ffff1537", |
00000251 => x"00912a23", |
00000252 => x"e8450513", |
00000253 => x"ffff14b7", |
00000254 => x"00812c23", |
00000255 => x"01312623", |
00000256 => x"00112e23", |
00000257 => x"01c00413", |
00000258 => x"065000ef", |
00000259 => x"fec48493", |
00000260 => x"ffc00993", |
00000261 => x"008957b3", |
00000262 => x"00f7f793", |
00000263 => x"00f487b3", |
00000264 => x"0007c503", |
00000265 => x"ffc40413", |
00000266 => x"025000ef", |
00000267 => x"ff3414e3", |
00000268 => x"01c12083", |
00000269 => x"01812403", |
00000270 => x"01412483", |
00000271 => x"01012903", |
00000272 => x"00c12983", |
00000273 => x"02010113", |
00000274 => x"00008067", |
00000275 => x"fb010113", |
00000276 => x"04112623", |
00000277 => x"04512423", |
00000278 => x"04612223", |
00000279 => x"04712023", |
00000280 => x"02812e23", |
00000281 => x"02a12c23", |
00000282 => x"02b12a23", |
00000283 => x"02c12823", |
00000284 => x"02d12623", |
00000285 => x"02e12423", |
00000286 => x"02f12223", |
00000287 => x"03012023", |
00000288 => x"01112e23", |
00000289 => x"01c12c23", |
00000290 => x"01d12a23", |
00000291 => x"01e12823", |
00000292 => x"01f12623", |
00000293 => x"34202473", |
00000294 => x"800007b7", |
00000295 => x"00778793", |
00000296 => x"02f40a63", |
00000297 => x"ffff1537", |
00000298 => x"e8850513", |
00000299 => x"7c0000ef", |
00000300 => x"00040513", |
00000301 => x"f29ff0ef", |
00000302 => x"ffff1537", |
00000303 => x"e9850513", |
00000304 => x"7ac000ef", |
00000305 => x"34102573", |
00000306 => x"f15ff0ef", |
00000307 => x"00500513", |
00000308 => x"eb9ff0ef", |
00000309 => x"00000513", |
00000310 => x"0a5000ef", |
00000311 => x"6a0000ef", |
00000312 => x"fe002783", |
00000313 => x"0027d793", |
00000314 => x"00a78533", |
00000315 => x"00f537b3", |
00000316 => x"00b785b3", |
00000317 => x"6b4000ef", |
00000318 => x"03c12403", |
00000319 => x"04c12083", |
00000320 => x"04812283", |
00000321 => x"04412303", |
00000322 => x"04012383", |
00000323 => x"03812503", |
00000324 => x"03412583", |
00000325 => x"03012603", |
00000326 => x"02c12683", |
00000327 => x"02812703", |
00000328 => x"02412783", |
00000329 => x"02012803", |
00000330 => x"01c12883", |
00000331 => x"01812e03", |
00000332 => x"01412e83", |
00000333 => x"01012f03", |
00000334 => x"00c12f83", |
00000335 => x"05010113", |
00000336 => x"30200073", |
00000337 => x"ff010113", |
00000338 => x"00000513", |
00000339 => x"00112623", |
00000340 => x"00812423", |
00000341 => x"7d0000ef", |
00000342 => x"00500513", |
00000343 => x"00d000ef", |
00000344 => x"00000513", |
00000345 => x"005000ef", |
00000346 => x"00050413", |
00000347 => x"00000513", |
00000348 => x"00112623", |
00000349 => x"00812423", |
00000350 => x"79c000ef", |
00000351 => x"09e00513", |
00000352 => x"7d8000ef", |
00000353 => x"00000513", |
00000354 => x"7d0000ef", |
00000355 => x"00050413", |
00000356 => x"00000513", |
00000357 => x"7a0000ef", |
00000358 => x"00c12083", |
00000359 => x"0ff47513", |
00000360 => x"00812403", |
00000361 => x"01010113", |
00000362 => x"00008067", |
00000363 => x"ff010113", |
00000348 => x"7d4000ef", |
00000349 => x"00c12083", |
00000350 => x"0ff47513", |
00000351 => x"00812403", |
00000352 => x"01010113", |
00000353 => x"00008067", |
00000354 => x"ff010113", |
00000355 => x"00000513", |
00000356 => x"00112623", |
00000357 => x"00812423", |
00000358 => x"78c000ef", |
00000359 => x"09e00513", |
00000360 => x"7c8000ef", |
00000361 => x"00000513", |
00000362 => x"7c0000ef", |
00000363 => x"00050413", |
00000364 => x"00000513", |
00000365 => x"00112623", |
00000366 => x"75c000ef", |
00000367 => x"00600513", |
00000368 => x"798000ef", |
00000369 => x"00c12083", |
00000370 => x"00000513", |
00000371 => x"01010113", |
00000372 => x"7640006f", |
00000373 => x"ff010113", |
00000374 => x"00812423", |
00000375 => x"00050413", |
00000376 => x"01055513", |
00000377 => x"0ff57513", |
00000378 => x"00112623", |
00000379 => x"76c000ef", |
00000380 => x"00845513", |
00000381 => x"0ff57513", |
00000382 => x"760000ef", |
00000383 => x"0ff47513", |
00000384 => x"00812403", |
00000385 => x"00c12083", |
00000386 => x"01010113", |
00000387 => x"74c0006f", |
00000388 => x"ff010113", |
00000389 => x"00812423", |
00000390 => x"00050413", |
00000391 => x"00000513", |
00000392 => x"00112623", |
00000393 => x"6f0000ef", |
00000394 => x"00300513", |
00000395 => x"72c000ef", |
00000396 => x"00040513", |
00000397 => x"fa1ff0ef", |
00000398 => x"00000513", |
00000399 => x"71c000ef", |
00000400 => x"00050413", |
00000401 => x"00000513", |
00000402 => x"6ec000ef", |
00000403 => x"00c12083", |
00000404 => x"0ff47513", |
00000405 => x"00812403", |
00000406 => x"01010113", |
00000407 => x"00008067", |
00000408 => x"fd010113", |
00000409 => x"02812423", |
00000410 => x"02912223", |
00000411 => x"03212023", |
00000412 => x"01312e23", |
00000413 => x"02112623", |
00000414 => x"00050493", |
00000415 => x"00300413", |
00000416 => x"00358913", |
00000417 => x"fff00993", |
00000418 => x"02049e63", |
00000419 => x"5c0000ef", |
00000420 => x"00c10793", |
00000421 => x"008787b3", |
00000422 => x"00a78023", |
00000423 => x"fff40413", |
00000424 => x"ff3414e3", |
00000425 => x"02c12083", |
00000426 => x"02812403", |
00000427 => x"00c12503", |
00000428 => x"02412483", |
00000429 => x"02012903", |
00000430 => x"01c12983", |
00000431 => x"03010113", |
00000432 => x"00008067", |
00000433 => x"40890533", |
00000434 => x"f49ff0ef", |
00000435 => x"fc5ff06f", |
00000436 => x"fd010113", |
00000437 => x"02812423", |
00000438 => x"fe802403", |
00000439 => x"02112623", |
00000440 => x"02912223", |
00000441 => x"03212023", |
00000442 => x"01312e23", |
00000443 => x"01412c23", |
00000444 => x"01512a23", |
00000445 => x"01612823", |
00000446 => x"01712623", |
00000447 => x"00847413", |
00000448 => x"00040663", |
00000449 => x"00400513", |
00000450 => x"c61ff0ef", |
00000451 => x"00050493", |
00000452 => x"02051863", |
00000453 => x"ffff1537", |
00000454 => x"e8c50513", |
00000455 => x"540000ef", |
00000456 => x"008005b7", |
00000457 => x"00048513", |
00000458 => x"f39ff0ef", |
00000459 => x"4788d7b7", |
00000460 => x"afe78793", |
00000461 => x"02f50463", |
00000462 => x"00000513", |
00000463 => x"fcdff06f", |
00000464 => x"ffff1537", |
00000465 => x"eac50513", |
00000466 => x"514000ef", |
00000467 => x"e1dff0ef", |
00000468 => x"fc0518e3", |
00000469 => x"00300513", |
00000470 => x"fb1ff06f", |
00000471 => x"00800a37", |
00000472 => x"004a0593", |
00000473 => x"00048513", |
00000474 => x"ef9ff0ef", |
00000475 => x"00050913", |
00000476 => x"008a0593", |
00000477 => x"00048513", |
00000478 => x"ee9ff0ef", |
00000479 => x"ff802783", |
00000480 => x"00050a93", |
00000481 => x"00100513", |
00000482 => x"f927e0e3", |
00000483 => x"ff002b83", |
00000484 => x"ffc97b13", |
00000485 => x"00000993", |
00000486 => x"00ca0a13", |
00000487 => x"014985b3", |
00000488 => x"053b1663", |
00000489 => x"01540433", |
00000490 => x"00200513", |
00000491 => x"f4041ee3", |
00000492 => x"ffff1537", |
00000493 => x"eb850513", |
00000494 => x"4a4000ef", |
00000495 => x"34091073", |
00000496 => x"02c12083", |
00000497 => x"02812403", |
00000498 => x"02412483", |
00000499 => x"02012903", |
00000500 => x"01c12983", |
00000501 => x"01812a03", |
00000502 => x"01412a83", |
00000503 => x"01012b03", |
00000504 => x"00c12b83", |
00000505 => x"03010113", |
00000506 => x"00008067", |
00000507 => x"00048513", |
00000508 => x"e71ff0ef", |
00000509 => x"013b87b3", |
00000510 => x"00a40433", |
00000511 => x"00a7a023", |
00000512 => x"00498993", |
00000513 => x"f99ff06f", |
00000514 => x"ff010113", |
00000515 => x"00112623", |
00000516 => x"00812423", |
00000517 => x"00912223", |
00000518 => x"00058413", |
00000519 => x"00050493", |
00000520 => x"d8dff0ef", |
00000521 => x"00000513", |
00000522 => x"4ec000ef", |
00000523 => x"00200513", |
00000524 => x"528000ef", |
00000525 => x"00048513", |
00000526 => x"d9dff0ef", |
00000527 => x"00040513", |
00000528 => x"518000ef", |
00000529 => x"00000513", |
00000530 => x"4ec000ef", |
00000531 => x"cd9ff0ef", |
00000532 => x"00157513", |
00000533 => x"fe051ce3", |
00000534 => x"00c12083", |
00000535 => x"00812403", |
00000536 => x"00412483", |
00000537 => x"01010113", |
00000538 => x"00008067", |
00000539 => x"fe010113", |
00000540 => x"00812c23", |
00000541 => x"00912a23", |
00000542 => x"01212823", |
00000543 => x"00112e23", |
00000544 => x"00b12623", |
00000545 => x"00300413", |
00000546 => x"00350493", |
00000547 => x"fff00913", |
00000548 => x"00c10793", |
00000549 => x"008787b3", |
00000550 => x"0007c583", |
00000551 => x"40848533", |
00000552 => x"fff40413", |
00000553 => x"f65ff0ef", |
00000554 => x"ff2414e3", |
00000555 => x"01c12083", |
00000556 => x"01812403", |
00000557 => x"01412483", |
00000558 => x"01012903", |
00000559 => x"02010113", |
00000560 => x"00008067", |
00000561 => x"ff010113", |
00000562 => x"00112623", |
00000563 => x"00812423", |
00000564 => x"00050413", |
00000565 => x"cd9ff0ef", |
00000566 => x"00000513", |
00000567 => x"438000ef", |
00000568 => x"0d800513", |
00000569 => x"474000ef", |
00000570 => x"00040513", |
00000571 => x"ce9ff0ef", |
00000572 => x"00000513", |
00000573 => x"440000ef", |
00000574 => x"c2dff0ef", |
00000575 => x"00157513", |
00000576 => x"fe051ce3", |
00000577 => x"00c12083", |
00000578 => x"00812403", |
00000579 => x"01010113", |
00000580 => x"00008067", |
00000581 => x"fe010113", |
00000582 => x"00112e23", |
00000583 => x"00812c23", |
00000584 => x"00912a23", |
00000585 => x"01212823", |
00000586 => x"01312623", |
00000587 => x"01412423", |
00000588 => x"01512223", |
00000589 => x"34002473", |
00000590 => x"02041863", |
00000591 => x"ffff1537", |
00000592 => x"e3450513", |
00000593 => x"01812403", |
00000594 => x"01c12083", |
00000595 => x"01412483", |
00000596 => x"01012903", |
00000597 => x"00c12983", |
00000598 => x"00812a03", |
00000599 => x"00412a83", |
00000600 => x"02010113", |
00000601 => x"2f80006f", |
00000602 => x"ffff1537", |
00000603 => x"ebc50513", |
00000604 => x"2ec000ef", |
00000605 => x"00040513", |
00000606 => x"a45ff0ef", |
00000607 => x"ffff1537", |
00000608 => x"ec850513", |
00000609 => x"2d8000ef", |
00000610 => x"00800537", |
00000611 => x"a31ff0ef", |
00000365 => x"790000ef", |
00000366 => x"00c12083", |
00000367 => x"0ff47513", |
00000368 => x"00812403", |
00000369 => x"01010113", |
00000370 => x"00008067", |
00000371 => x"ff010113", |
00000372 => x"00000513", |
00000373 => x"00112623", |
00000374 => x"74c000ef", |
00000375 => x"00600513", |
00000376 => x"788000ef", |
00000377 => x"00c12083", |
00000378 => x"00000513", |
00000379 => x"01010113", |
00000380 => x"7540006f", |
00000381 => x"ff010113", |
00000382 => x"00812423", |
00000383 => x"00050413", |
00000384 => x"01055513", |
00000385 => x"0ff57513", |
00000386 => x"00112623", |
00000387 => x"75c000ef", |
00000388 => x"00845513", |
00000389 => x"0ff57513", |
00000390 => x"750000ef", |
00000391 => x"0ff47513", |
00000392 => x"00812403", |
00000393 => x"00c12083", |
00000394 => x"01010113", |
00000395 => x"73c0006f", |
00000396 => x"ff010113", |
00000397 => x"00812423", |
00000398 => x"00050413", |
00000399 => x"00000513", |
00000400 => x"00112623", |
00000401 => x"6e0000ef", |
00000402 => x"00300513", |
00000403 => x"71c000ef", |
00000404 => x"00040513", |
00000405 => x"fa1ff0ef", |
00000406 => x"00000513", |
00000407 => x"70c000ef", |
00000408 => x"00050413", |
00000409 => x"00000513", |
00000410 => x"6dc000ef", |
00000411 => x"00c12083", |
00000412 => x"0ff47513", |
00000413 => x"00812403", |
00000414 => x"01010113", |
00000415 => x"00008067", |
00000416 => x"fd010113", |
00000417 => x"02812423", |
00000418 => x"02912223", |
00000419 => x"03212023", |
00000420 => x"01312e23", |
00000421 => x"01412c23", |
00000422 => x"02112623", |
00000423 => x"00050913", |
00000424 => x"00058993", |
00000425 => x"00c10493", |
00000426 => x"00000413", |
00000427 => x"00400a13", |
00000428 => x"02091e63", |
00000429 => x"5a8000ef", |
00000430 => x"00a481a3", |
00000431 => x"00140413", |
00000432 => x"fff48493", |
00000433 => x"ff4416e3", |
00000434 => x"02c12083", |
00000435 => x"02812403", |
00000436 => x"00c12503", |
00000437 => x"02412483", |
00000438 => x"02012903", |
00000439 => x"01c12983", |
00000440 => x"01812a03", |
00000441 => x"03010113", |
00000442 => x"00008067", |
00000443 => x"00898533", |
00000444 => x"f41ff0ef", |
00000445 => x"fc5ff06f", |
00000446 => x"fd010113", |
00000447 => x"02812423", |
00000448 => x"fe802403", |
00000449 => x"02112623", |
00000450 => x"02912223", |
00000451 => x"03212023", |
00000452 => x"01312e23", |
00000453 => x"01412c23", |
00000454 => x"01512a23", |
00000455 => x"01612823", |
00000456 => x"01712623", |
00000457 => x"00847413", |
00000458 => x"00040663", |
00000459 => x"00400513", |
00000460 => x"c59ff0ef", |
00000461 => x"00050493", |
00000462 => x"02051863", |
00000463 => x"ffff1537", |
00000464 => x"ea050513", |
00000465 => x"528000ef", |
00000466 => x"008005b7", |
00000467 => x"00048513", |
00000468 => x"f31ff0ef", |
00000469 => x"4788d7b7", |
00000470 => x"afe78793", |
00000471 => x"02f50463", |
00000472 => x"00000513", |
00000473 => x"fcdff06f", |
00000474 => x"ffff1537", |
00000475 => x"ec050513", |
00000476 => x"4fc000ef", |
00000477 => x"e15ff0ef", |
00000478 => x"fc0518e3", |
00000479 => x"00300513", |
00000480 => x"fb1ff06f", |
00000481 => x"00800a37", |
00000482 => x"004a0593", |
00000483 => x"00048513", |
00000484 => x"ef1ff0ef", |
00000485 => x"00050913", |
00000486 => x"008a0593", |
00000487 => x"00048513", |
00000488 => x"ee1ff0ef", |
00000489 => x"ff802783", |
00000490 => x"00050a93", |
00000491 => x"00100513", |
00000492 => x"f927e0e3", |
00000493 => x"ff002b83", |
00000494 => x"ffc97b13", |
00000495 => x"00000993", |
00000496 => x"00ca0a13", |
00000497 => x"014985b3", |
00000498 => x"053b1663", |
00000499 => x"01540433", |
00000500 => x"00200513", |
00000501 => x"f4041ee3", |
00000502 => x"ffff1537", |
00000503 => x"ecc50513", |
00000504 => x"48c000ef", |
00000505 => x"34091073", |
00000506 => x"02c12083", |
00000507 => x"02812403", |
00000508 => x"02412483", |
00000509 => x"02012903", |
00000510 => x"01c12983", |
00000511 => x"01812a03", |
00000512 => x"01412a83", |
00000513 => x"01012b03", |
00000514 => x"00c12b83", |
00000515 => x"03010113", |
00000516 => x"00008067", |
00000517 => x"00048513", |
00000518 => x"e69ff0ef", |
00000519 => x"013b87b3", |
00000520 => x"00a40433", |
00000521 => x"00a7a023", |
00000522 => x"00498993", |
00000523 => x"f99ff06f", |
00000524 => x"ff010113", |
00000525 => x"00112623", |
00000526 => x"00812423", |
00000527 => x"00912223", |
00000528 => x"00058413", |
00000529 => x"00050493", |
00000530 => x"d85ff0ef", |
00000531 => x"00000513", |
00000532 => x"4d4000ef", |
00000533 => x"00200513", |
00000534 => x"510000ef", |
00000535 => x"00048513", |
00000536 => x"d95ff0ef", |
00000537 => x"00040513", |
00000538 => x"500000ef", |
00000539 => x"00000513", |
00000540 => x"4d4000ef", |
00000541 => x"cd1ff0ef", |
00000542 => x"00157513", |
00000543 => x"fe051ce3", |
00000544 => x"00c12083", |
00000545 => x"00812403", |
00000546 => x"00412483", |
00000547 => x"01010113", |
00000548 => x"00008067", |
00000549 => x"fe010113", |
00000550 => x"00812c23", |
00000551 => x"00912a23", |
00000552 => x"01212823", |
00000553 => x"00112e23", |
00000554 => x"00b12623", |
00000555 => x"00300413", |
00000556 => x"00350493", |
00000557 => x"fff00913", |
00000558 => x"00c10793", |
00000559 => x"008787b3", |
00000560 => x"0007c583", |
00000561 => x"40848533", |
00000562 => x"fff40413", |
00000563 => x"f65ff0ef", |
00000564 => x"ff2414e3", |
00000565 => x"01c12083", |
00000566 => x"01812403", |
00000567 => x"01412483", |
00000568 => x"01012903", |
00000569 => x"02010113", |
00000570 => x"00008067", |
00000571 => x"ff010113", |
00000572 => x"00112623", |
00000573 => x"00812423", |
00000574 => x"00050413", |
00000575 => x"cd1ff0ef", |
00000576 => x"00000513", |
00000577 => x"420000ef", |
00000578 => x"0d800513", |
00000579 => x"45c000ef", |
00000580 => x"00040513", |
00000581 => x"ce1ff0ef", |
00000582 => x"00000513", |
00000583 => x"428000ef", |
00000584 => x"c25ff0ef", |
00000585 => x"00157513", |
00000586 => x"fe051ce3", |
00000587 => x"00c12083", |
00000588 => x"00812403", |
00000589 => x"01010113", |
00000590 => x"00008067", |
00000591 => x"fe010113", |
00000592 => x"00112e23", |
00000593 => x"00812c23", |
00000594 => x"00912a23", |
00000595 => x"01212823", |
00000596 => x"01312623", |
00000597 => x"01412423", |
00000598 => x"01512223", |
00000599 => x"34002473", |
00000600 => x"02041863", |
00000601 => x"ffff1537", |
00000602 => x"e4850513", |
00000603 => x"01812403", |
00000604 => x"01c12083", |
00000605 => x"01412483", |
00000606 => x"01012903", |
00000607 => x"00c12983", |
00000608 => x"00812a03", |
00000609 => x"00412a83", |
00000610 => x"02010113", |
00000611 => x"2e00006f", |
00000612 => x"ffff1537", |
00000613 => x"ee450513", |
00000614 => x"2c4000ef", |
00000615 => x"2b0000ef", |
00000616 => x"00050493", |
00000617 => x"298000ef", |
00000618 => x"07900793", |
00000619 => x"0af49e63", |
00000620 => x"bb9ff0ef", |
00000621 => x"00051663", |
00000622 => x"00300513", |
00000623 => x"9adff0ef", |
00000624 => x"ffff1537", |
00000625 => x"ef050513", |
00000626 => x"01045493", |
00000627 => x"290000ef", |
00000628 => x"00148493", |
00000629 => x"00800937", |
00000630 => x"fff00993", |
00000631 => x"00010a37", |
00000632 => x"fff48493", |
00000633 => x"07349063", |
00000634 => x"4788d5b7", |
00000635 => x"afe58593", |
00000636 => x"00800537", |
00000637 => x"e79ff0ef", |
00000638 => x"00800537", |
00000639 => x"00040593", |
00000640 => x"00450513", |
00000641 => x"e69ff0ef", |
00000642 => x"ff002a03", |
00000643 => x"008009b7", |
00000644 => x"ffc47413", |
00000645 => x"00000493", |
00000646 => x"00000913", |
00000647 => x"00c98a93", |
00000648 => x"01548533", |
00000649 => x"009a07b3", |
00000650 => x"02849663", |
00000651 => x"00898513", |
00000652 => x"412005b3", |
00000653 => x"e39ff0ef", |
00000654 => x"ffff1537", |
00000655 => x"eb850513", |
00000656 => x"f05ff06f", |
00000657 => x"00090513", |
00000658 => x"e7dff0ef", |
00000659 => x"01490933", |
00000660 => x"f91ff06f", |
00000661 => x"0007a583", |
00000662 => x"00448493", |
00000663 => x"00b90933", |
00000664 => x"e0dff0ef", |
00000665 => x"fbdff06f", |
00000666 => x"01c12083", |
00000667 => x"01812403", |
00000668 => x"01412483", |
00000669 => x"01012903", |
00000670 => x"00c12983", |
00000671 => x"00812a03", |
00000672 => x"00412a83", |
00000673 => x"02010113", |
00000674 => x"00008067", |
00000675 => x"000047b7", |
00000676 => x"70078793", |
00000677 => x"f8f02623", |
00000678 => x"00008067", |
00000679 => x"fe010113", |
00000680 => x"00112e23", |
00000681 => x"00812c23", |
00000682 => x"00912a23", |
00000683 => x"01212823", |
00000684 => x"01312623", |
00000685 => x"01412423", |
00000686 => x"01512223", |
00000687 => x"f1302973", |
00000688 => x"00000a93", |
00000689 => x"00900993", |
00000690 => x"00300a13", |
00000691 => x"00400493", |
00000692 => x"41500433", |
00000693 => x"00341413", |
00000694 => x"01840413", |
00000695 => x"00895433", |
00000696 => x"0ff47413", |
00000697 => x"00000513", |
00000698 => x"0489ec63", |
00000699 => x"00050863", |
00000700 => x"03050513", |
00000701 => x"0ff57513", |
00000702 => x"144000ef", |
00000703 => x"03040513", |
00000704 => x"0ff57513", |
00000705 => x"138000ef", |
00000706 => x"014a8663", |
00000707 => x"02e00513", |
00000708 => x"12c000ef", |
00000709 => x"001a8a93", |
00000710 => x"fa9a9ce3", |
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"ff640413", |
00000721 => x"00150513", |
00000722 => x"0ff47413", |
00000723 => x"0ff57513", |
00000724 => x"f99ff06f", |
00000725 => x"fc000713", |
00000726 => x"00072783", |
00000727 => x"00179793", |
00000728 => x"0017d793", |
00000729 => x"00f72023", |
00000730 => x"00008067", |
00000731 => x"ff010113", |
00000732 => x"f9402783", |
00000733 => x"f9002703", |
00000734 => x"f9402683", |
00000735 => x"fed79ae3", |
00000736 => x"00e12023", |
00000737 => x"00f12223", |
00000738 => x"00012503", |
00000739 => x"00412583", |
00000740 => x"01010113", |
00000741 => x"00008067", |
00000742 => x"f9800693", |
00000743 => x"fff00613", |
00000744 => x"00c6a023", |
00000745 => x"00a6a023", |
00000746 => x"00b6a223", |
00000747 => x"00008067", |
00000748 => x"fa002023", |
00000749 => x"fe002683", |
00000750 => x"00151513", |
00000751 => x"00000713", |
00000752 => x"04a6f263", |
00000753 => x"000016b7", |
00000754 => x"00000793", |
00000755 => x"ffe68693", |
00000756 => x"04e6e463", |
00000757 => x"00167613", |
00000758 => x"0015f593", |
00000759 => x"01879793", |
00000760 => x"01e61613", |
00000761 => x"00c7e7b3", |
00000762 => x"01d59593", |
00000763 => x"00b7e7b3", |
00000764 => x"00e7e7b3", |
00000765 => x"10000737", |
00000766 => x"00e7e7b3", |
00000767 => x"faf02023", |
00000768 => x"00008067", |
00000769 => x"00170793", |
00000770 => x"01079713", |
00000771 => x"40a686b3", |
00000772 => x"01075713", |
00000773 => x"fadff06f", |
00000774 => x"ffe78513", |
00000775 => x"0fd57513", |
00000776 => x"00051a63", |
00000777 => x"00375713", |
00000778 => x"00178793", |
00000779 => x"0ff7f793", |
00000780 => x"fa1ff06f", |
00000781 => x"00175713", |
00000782 => x"ff1ff06f", |
00000783 => x"fa002783", |
00000784 => x"fe07cee3", |
00000785 => x"faa02223", |
00000786 => x"00008067", |
00000787 => x"fa402503", |
00000788 => x"fe055ee3", |
00000789 => x"0ff57513", |
00000613 => x"ed050513", |
00000614 => x"2d4000ef", |
00000615 => x"00040513", |
00000616 => x"a3dff0ef", |
00000617 => x"ffff1537", |
00000618 => x"edc50513", |
00000619 => x"2c0000ef", |
00000620 => x"00800537", |
00000621 => x"a29ff0ef", |
00000622 => x"ffff1537", |
00000623 => x"ef850513", |
00000624 => x"2ac000ef", |
00000625 => x"298000ef", |
00000626 => x"00050493", |
00000627 => x"280000ef", |
00000628 => x"07900793", |
00000629 => x"0af49e63", |
00000630 => x"bb1ff0ef", |
00000631 => x"00051663", |
00000632 => x"00300513", |
00000633 => x"9a5ff0ef", |
00000634 => x"ffff1537", |
00000635 => x"f0450513", |
00000636 => x"01045493", |
00000637 => x"278000ef", |
00000638 => x"00148493", |
00000639 => x"00800937", |
00000640 => x"fff00993", |
00000641 => x"00010a37", |
00000642 => x"fff48493", |
00000643 => x"07349063", |
00000644 => x"4788d5b7", |
00000645 => x"afe58593", |
00000646 => x"00800537", |
00000647 => x"e79ff0ef", |
00000648 => x"00800537", |
00000649 => x"00040593", |
00000650 => x"00450513", |
00000651 => x"e69ff0ef", |
00000652 => x"ff002a03", |
00000653 => x"008009b7", |
00000654 => x"ffc47413", |
00000655 => x"00000493", |
00000656 => x"00000913", |
00000657 => x"00c98a93", |
00000658 => x"01548533", |
00000659 => x"009a07b3", |
00000660 => x"02849663", |
00000661 => x"00898513", |
00000662 => x"412005b3", |
00000663 => x"e39ff0ef", |
00000664 => x"ffff1537", |
00000665 => x"ecc50513", |
00000666 => x"f05ff06f", |
00000667 => x"00090513", |
00000668 => x"e7dff0ef", |
00000669 => x"01490933", |
00000670 => x"f91ff06f", |
00000671 => x"0007a583", |
00000672 => x"00448493", |
00000673 => x"00b90933", |
00000674 => x"e0dff0ef", |
00000675 => x"fbdff06f", |
00000676 => x"01c12083", |
00000677 => x"01812403", |
00000678 => x"01412483", |
00000679 => x"01012903", |
00000680 => x"00c12983", |
00000681 => x"00812a03", |
00000682 => x"00412a83", |
00000683 => x"02010113", |
00000684 => x"00008067", |
00000685 => x"000047b7", |
00000686 => x"70078793", |
00000687 => x"f8f02623", |
00000688 => x"00008067", |
00000689 => x"fe010113", |
00000690 => x"00112e23", |
00000691 => x"00812c23", |
00000692 => x"00912a23", |
00000693 => x"01212823", |
00000694 => x"01312623", |
00000695 => x"01412423", |
00000696 => x"01512223", |
00000697 => x"f1302973", |
00000698 => x"00000a93", |
00000699 => x"00900993", |
00000700 => x"00300a13", |
00000701 => x"00400493", |
00000702 => x"41500433", |
00000703 => x"00341413", |
00000704 => x"01840413", |
00000705 => x"00895433", |
00000706 => x"0ff47413", |
00000707 => x"00000513", |
00000708 => x"0489ec63", |
00000709 => x"00050863", |
00000710 => x"03050513", |
00000711 => x"0ff57513", |
00000712 => x"12c000ef", |
00000713 => x"03040513", |
00000714 => x"0ff57513", |
00000715 => x"120000ef", |
00000716 => x"014a8663", |
00000717 => x"02e00513", |
00000718 => x"114000ef", |
00000719 => x"001a8a93", |
00000720 => x"fa9a9ce3", |
00000721 => x"01c12083", |
00000722 => x"01812403", |
00000723 => x"01412483", |
00000724 => x"01012903", |
00000725 => x"00c12983", |
00000726 => x"00812a03", |
00000727 => x"00412a83", |
00000728 => x"02010113", |
00000729 => x"00008067", |
00000730 => x"ff640413", |
00000731 => x"00150513", |
00000732 => x"0ff47413", |
00000733 => x"0ff57513", |
00000734 => x"f99ff06f", |
00000735 => x"ff010113", |
00000736 => x"f9402783", |
00000737 => x"f9002703", |
00000738 => x"f9402683", |
00000739 => x"fed79ae3", |
00000740 => x"00e12023", |
00000741 => x"00f12223", |
00000742 => x"00012503", |
00000743 => x"00412583", |
00000744 => x"01010113", |
00000745 => x"00008067", |
00000746 => x"f9800693", |
00000747 => x"fff00613", |
00000748 => x"00c6a023", |
00000749 => x"00a6a023", |
00000750 => x"00b6a223", |
00000751 => x"00008067", |
00000752 => x"fa002023", |
00000753 => x"fe002683", |
00000754 => x"00151513", |
00000755 => x"00000713", |
00000756 => x"04a6f263", |
00000757 => x"000016b7", |
00000758 => x"00000793", |
00000759 => x"ffe68693", |
00000760 => x"04e6e463", |
00000761 => x"00167613", |
00000762 => x"0015f593", |
00000763 => x"01879793", |
00000764 => x"01e61613", |
00000765 => x"00c7e7b3", |
00000766 => x"01d59593", |
00000767 => x"00b7e7b3", |
00000768 => x"00e7e7b3", |
00000769 => x"10000737", |
00000770 => x"00e7e7b3", |
00000771 => x"faf02023", |
00000772 => x"00008067", |
00000773 => x"00170793", |
00000774 => x"01079713", |
00000775 => x"40a686b3", |
00000776 => x"01075713", |
00000777 => x"fadff06f", |
00000778 => x"ffe78513", |
00000779 => x"0fd57513", |
00000780 => x"00051a63", |
00000781 => x"00375713", |
00000782 => x"00178793", |
00000783 => x"0ff7f793", |
00000784 => x"fa1ff06f", |
00000785 => x"00175713", |
00000786 => x"ff1ff06f", |
00000787 => x"fa002783", |
00000788 => x"fe07cee3", |
00000789 => x"faa02223", |
00000790 => x"00008067", |
00000791 => x"ff010113", |
00000792 => x"00812423", |
00000793 => x"01212023", |
00000794 => x"00112623", |
00000795 => x"00912223", |
00000796 => x"00050413", |
00000797 => x"00a00913", |
00000798 => x"00044483", |
00000799 => x"00140413", |
00000800 => x"00049e63", |
00000801 => x"00c12083", |
00000802 => x"00812403", |
00000803 => x"00412483", |
00000804 => x"00012903", |
00000805 => x"01010113", |
00000806 => x"00008067", |
00000807 => x"01249663", |
00000808 => x"00d00513", |
00000809 => x"f99ff0ef", |
00000810 => x"00048513", |
00000811 => x"f91ff0ef", |
00000812 => x"fc9ff06f", |
00000813 => x"00757513", |
00000814 => x"00177793", |
00000815 => x"01079793", |
00000816 => x"0036f693", |
00000817 => x"00a51513", |
00000818 => x"00f56533", |
00000819 => x"00167613", |
00000820 => x"00e69793", |
00000821 => x"0015f593", |
00000822 => x"00f567b3", |
00000823 => x"00d61613", |
00000824 => x"00c7e7b3", |
00000825 => x"00959593", |
00000826 => x"fa800813", |
00000827 => x"00b7e7b3", |
00000828 => x"00082023", |
00000829 => x"1007e793", |
00000830 => x"00f82023", |
00000831 => x"00008067", |
00000832 => x"fa800713", |
00000833 => x"00072783", |
00000834 => x"eff7f793", |
00000835 => x"00f72023", |
00000836 => x"00008067", |
00000837 => x"fa800713", |
00000838 => x"00072683", |
00000839 => x"00757793", |
00000840 => x"00100513", |
00000841 => x"00f51533", |
00000842 => x"00d56533", |
00000843 => x"00a72023", |
00000844 => x"00008067", |
00000845 => x"fa800713", |
00000846 => x"00072683", |
00000847 => x"00757513", |
00000848 => x"00100793", |
00000849 => x"00a797b3", |
00000850 => x"fff7c793", |
00000851 => x"00d7f7b3", |
00000852 => x"00f72023", |
00000853 => x"00008067", |
00000854 => x"faa02623", |
00000855 => x"fa802783", |
00000856 => x"fe07cee3", |
00000857 => x"fac02503", |
00000858 => x"00008067", |
00000859 => x"f8400713", |
00000860 => x"00072683", |
00000861 => x"00f57793", |
00000862 => x"00100513", |
00000863 => x"00f51533", |
00000864 => x"00d54533", |
00000865 => x"00a72023", |
00000866 => x"00008067", |
00000867 => x"f8a02223", |
00000868 => x"00008067", |
00000869 => x"fb800713", |
00000870 => x"00072783", |
00000871 => x"ffe7f793", |
00000872 => x"00f72023", |
00000873 => x"00008067", |
00000874 => x"fb000713", |
00000875 => x"00072783", |
00000876 => x"ff77f793", |
00000877 => x"00f72023", |
00000878 => x"00008067", |
00000879 => x"f8800713", |
00000880 => x"00072783", |
00000881 => x"fef7f793", |
00000882 => x"00f72023", |
00000883 => x"00008067", |
00000884 => x"69617641", |
00000885 => x"6c62616c", |
00000886 => x"4d432065", |
00000887 => x"0a3a7344", |
00000888 => x"203a6820", |
00000889 => x"706c6548", |
00000890 => x"3a72200a", |
00000891 => x"73655220", |
00000892 => x"74726174", |
00000893 => x"3a75200a", |
00000894 => x"6c705520", |
00000895 => x"0a64616f", |
00000896 => x"203a7320", |
00000897 => x"726f7453", |
00000898 => x"6f742065", |
00000899 => x"616c6620", |
00000900 => x"200a6873", |
00000901 => x"4c203a6c", |
00000902 => x"2064616f", |
00000903 => x"6d6f7266", |
00000791 => x"fa402503", |
00000792 => x"fe055ee3", |
00000793 => x"0ff57513", |
00000794 => x"00008067", |
00000795 => x"ff010113", |
00000796 => x"00812423", |
00000797 => x"01212023", |
00000798 => x"00112623", |
00000799 => x"00912223", |
00000800 => x"00050413", |
00000801 => x"00a00913", |
00000802 => x"00044483", |
00000803 => x"00140413", |
00000804 => x"00049e63", |
00000805 => x"00c12083", |
00000806 => x"00812403", |
00000807 => x"00412483", |
00000808 => x"00012903", |
00000809 => x"01010113", |
00000810 => x"00008067", |
00000811 => x"01249663", |
00000812 => x"00d00513", |
00000813 => x"f99ff0ef", |
00000814 => x"00048513", |
00000815 => x"f91ff0ef", |
00000816 => x"fc9ff06f", |
00000817 => x"00757513", |
00000818 => x"00177793", |
00000819 => x"01079793", |
00000820 => x"0036f693", |
00000821 => x"00a51513", |
00000822 => x"00f56533", |
00000823 => x"00167613", |
00000824 => x"00e69793", |
00000825 => x"0015f593", |
00000826 => x"00f567b3", |
00000827 => x"00d61613", |
00000828 => x"00c7e7b3", |
00000829 => x"00959593", |
00000830 => x"fa800813", |
00000831 => x"00b7e7b3", |
00000832 => x"00082023", |
00000833 => x"1007e793", |
00000834 => x"00f82023", |
00000835 => x"00008067", |
00000836 => x"fa800713", |
00000837 => x"00072783", |
00000838 => x"eff7f793", |
00000839 => x"00f72023", |
00000840 => x"00008067", |
00000841 => x"fa800713", |
00000842 => x"00072683", |
00000843 => x"00757793", |
00000844 => x"00100513", |
00000845 => x"00f51533", |
00000846 => x"00d56533", |
00000847 => x"00a72023", |
00000848 => x"00008067", |
00000849 => x"fa800713", |
00000850 => x"00072683", |
00000851 => x"00757513", |
00000852 => x"00100793", |
00000853 => x"00a797b3", |
00000854 => x"fff7c793", |
00000855 => x"00d7f7b3", |
00000856 => x"00f72023", |
00000857 => x"00008067", |
00000858 => x"faa02623", |
00000859 => x"fa802783", |
00000860 => x"fe07cee3", |
00000861 => x"fac02503", |
00000862 => x"00008067", |
00000863 => x"f8400713", |
00000864 => x"00072683", |
00000865 => x"00f57793", |
00000866 => x"00100513", |
00000867 => x"00f51533", |
00000868 => x"00d54533", |
00000869 => x"00a72023", |
00000870 => x"00008067", |
00000871 => x"f8a02223", |
00000872 => x"00008067", |
00000873 => x"fb800713", |
00000874 => x"00072783", |
00000875 => x"ffe7f793", |
00000876 => x"00f72023", |
00000877 => x"00008067", |
00000878 => x"fb000713", |
00000879 => x"00072783", |
00000880 => x"ff77f793", |
00000881 => x"00f72023", |
00000882 => x"00008067", |
00000883 => x"fc000713", |
00000884 => x"00072783", |
00000885 => x"00179793", |
00000886 => x"0017d793", |
00000887 => x"00f72023", |
00000888 => x"00008067", |
00000889 => x"69617641", |
00000890 => x"6c62616c", |
00000891 => x"4d432065", |
00000892 => x"0a3a7344", |
00000893 => x"203a6820", |
00000894 => x"706c6548", |
00000895 => x"3a72200a", |
00000896 => x"73655220", |
00000897 => x"74726174", |
00000898 => x"3a75200a", |
00000899 => x"6c705520", |
00000900 => x"0a64616f", |
00000901 => x"203a7320", |
00000902 => x"726f7453", |
00000903 => x"6f742065", |
00000904 => x"616c6620", |
00000905 => x"200a6873", |
00000906 => x"45203a65", |
00000907 => x"75636578", |
00000908 => x"00006574", |
00000909 => x"65206f4e", |
00000910 => x"75636578", |
00000911 => x"6c626174", |
00000912 => x"76612065", |
00000913 => x"616c6961", |
00000914 => x"2e656c62", |
00000915 => x"00000000", |
00000916 => x"746f6f42", |
00000917 => x"2e676e69", |
00000918 => x"0a0a2e2e", |
00000919 => x"00000000", |
00000920 => x"52450a07", |
00000921 => x"00005f52", |
00000922 => x"6e6b6e75", |
00000923 => x"006e776f", |
00000924 => x"00007830", |
00000925 => x"58450a0a", |
00000926 => x"54504543", |
00000927 => x"3a4e4f49", |
00000928 => x"00000020", |
00000929 => x"30204020", |
00000930 => x"00000078", |
00000931 => x"69617741", |
00000932 => x"676e6974", |
00000933 => x"6f656e20", |
00000934 => x"32337672", |
00000935 => x"6578655f", |
00000936 => x"6e69622e", |
00000937 => x"202e2e2e", |
00000938 => x"00000000", |
00000939 => x"64616f4c", |
00000940 => x"2e676e69", |
00000941 => x"00202e2e", |
00000942 => x"00004b4f", |
00000943 => x"74697257", |
00000944 => x"78302065", |
00000945 => x"00000000", |
00000946 => x"74796220", |
00000947 => x"74207365", |
00000948 => x"5053206f", |
00000949 => x"6c662049", |
00000950 => x"20687361", |
00000951 => x"78302040", |
00000952 => x"00000000", |
00000953 => x"7928203f", |
00000954 => x"20296e2f", |
00000955 => x"00000000", |
00000956 => x"616c460a", |
00000957 => x"6e696873", |
00000958 => x"2e2e2e67", |
00000959 => x"00000020", |
00000960 => x"0a0a0a0a", |
00000961 => x"4e203c3c", |
00000962 => x"56524f45", |
00000963 => x"42203233", |
00000964 => x"6c746f6f", |
00000965 => x"6564616f", |
00000966 => x"3e3e2072", |
00000967 => x"4c420a0a", |
00000968 => x"203a5644", |
00000969 => x"206c754a", |
00000970 => x"32203132", |
00000971 => x"0a303230", |
00000972 => x"3a565748", |
00000973 => x"00002020", |
00000974 => x"4b4c430a", |
00000975 => x"0020203a", |
00000976 => x"0a7a4820", |
00000977 => x"52455355", |
00000978 => x"0000203a", |
00000979 => x"53494d0a", |
00000980 => x"00203a41", |
00000981 => x"4e4f430a", |
00000982 => x"00203a46", |
00000983 => x"454d490a", |
00000984 => x"00203a4d", |
00000985 => x"74796220", |
00000986 => x"40207365", |
00000987 => x"00000020", |
00000988 => x"454d440a", |
00000906 => x"4c203a6c", |
00000907 => x"2064616f", |
00000908 => x"6d6f7266", |
00000909 => x"616c6620", |
00000910 => x"200a6873", |
00000911 => x"45203a65", |
00000912 => x"75636578", |
00000913 => x"00006574", |
00000914 => x"65206f4e", |
00000915 => x"75636578", |
00000916 => x"6c626174", |
00000917 => x"76612065", |
00000918 => x"616c6961", |
00000919 => x"2e656c62", |
00000920 => x"00000000", |
00000921 => x"746f6f42", |
00000922 => x"2e676e69", |
00000923 => x"0a0a2e2e", |
00000924 => x"00000000", |
00000925 => x"52450a07", |
00000926 => x"00005f52", |
00000927 => x"6e6b6e75", |
00000928 => x"006e776f", |
00000929 => x"00007830", |
00000930 => x"58450a0a", |
00000931 => x"54504543", |
00000932 => x"3a4e4f49", |
00000933 => x"00000020", |
00000934 => x"30204020", |
00000935 => x"00000078", |
00000936 => x"69617741", |
00000937 => x"676e6974", |
00000938 => x"6f656e20", |
00000939 => x"32337672", |
00000940 => x"6578655f", |
00000941 => x"6e69622e", |
00000942 => x"202e2e2e", |
00000943 => x"00000000", |
00000944 => x"64616f4c", |
00000945 => x"2e676e69", |
00000946 => x"00202e2e", |
00000947 => x"00004b4f", |
00000948 => x"74697257", |
00000949 => x"78302065", |
00000950 => x"00000000", |
00000951 => x"74796220", |
00000952 => x"74207365", |
00000953 => x"5053206f", |
00000954 => x"6c662049", |
00000955 => x"20687361", |
00000956 => x"78302040", |
00000957 => x"00000000", |
00000958 => x"7928203f", |
00000959 => x"20296e2f", |
00000960 => x"00000000", |
00000961 => x"616c460a", |
00000962 => x"6e696873", |
00000963 => x"2e2e2e67", |
00000964 => x"00000020", |
00000965 => x"0a0a0a0a", |
00000966 => x"4e203c3c", |
00000967 => x"56524f45", |
00000968 => x"42203233", |
00000969 => x"6c746f6f", |
00000970 => x"6564616f", |
00000971 => x"3e3e2072", |
00000972 => x"4c420a0a", |
00000973 => x"203a5644", |
00000974 => x"206c754a", |
00000975 => x"32203532", |
00000976 => x"0a303230", |
00000977 => x"3a565748", |
00000978 => x"00002020", |
00000979 => x"4b4c430a", |
00000980 => x"0020203a", |
00000981 => x"0a7a4820", |
00000982 => x"52455355", |
00000983 => x"0000203a", |
00000984 => x"53494d0a", |
00000985 => x"00203a41", |
00000986 => x"4e4f430a", |
00000987 => x"00203a46", |
00000988 => x"454d490a", |
00000989 => x"00203a4d", |
00000990 => x"75410a0a", |
00000991 => x"6f626f74", |
00000992 => x"6920746f", |
00000993 => x"7338206e", |
00000994 => x"7250202e", |
00000995 => x"20737365", |
00000996 => x"2079656b", |
00000997 => x"61206f74", |
00000998 => x"74726f62", |
00000999 => x"00000a2e", |
00001000 => x"0000000a", |
00001001 => x"726f6241", |
00001002 => x"2e646574", |
00001003 => x"00000a0a", |
00001004 => x"444d430a", |
00001005 => x"00203e3a", |
00001006 => x"53207962", |
00001007 => x"68706574", |
00001008 => x"4e206e61", |
00001009 => x"69746c6f", |
00001010 => x"0000676e", |
00001011 => x"61766e49", |
00001012 => x"2064696c", |
00001013 => x"00444d43", |
00001014 => x"33323130", |
00001015 => x"37363534", |
00001016 => x"42413938", |
00001017 => x"46454443", |
00000990 => x"74796220", |
00000991 => x"40207365", |
00000992 => x"00000020", |
00000993 => x"454d440a", |
00000994 => x"00203a4d", |
00000995 => x"75410a0a", |
00000996 => x"6f626f74", |
00000997 => x"6920746f", |
00000998 => x"7338206e", |
00000999 => x"7250202e", |
00001000 => x"20737365", |
00001001 => x"2079656b", |
00001002 => x"61206f74", |
00001003 => x"74726f62", |
00001004 => x"00000a2e", |
00001005 => x"0000000a", |
00001006 => x"726f6241", |
00001007 => x"2e646574", |
00001008 => x"00000a0a", |
00001009 => x"444d430a", |
00001010 => x"00203e3a", |
00001011 => x"53207962", |
00001012 => x"68706574", |
00001013 => x"4e206e61", |
00001014 => x"69746c6f", |
00001015 => x"0000676e", |
00001016 => x"61766e49", |
00001017 => x"2064696c", |
00001018 => x"00444d43", |
00001019 => x"33323130", |
00001020 => x"37363534", |
00001021 => x"42413938", |
00001022 => x"46454443", |
others => x"00000000" |
); |
|
/neorv32/trunk/rtl/core/neorv32_cpu.vhd
52,8 → 52,8
generic ( |
-- General -- |
CSR_COUNTERS_USE : boolean := true; -- implement RISC-V perf. counters ([m]instret[h], [m]cycle[h], time[h])? |
HW_THREAD_ID : std_ulogic_vector(31 downto 0):= x"00000000"; -- hardware thread id |
CPU_BOOT_ADDR : std_ulogic_vector(31 downto 0):= x"00000000"; -- cpu boot address |
HW_THREAD_ID : std_ulogic_vector(31 downto 0):= (others => '0'); -- hardware thread id |
CPU_BOOT_ADDR : std_ulogic_vector(31 downto 0):= (others => '0'); -- cpu boot address |
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension? |
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension? |
60,41 → 60,43
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: External memory interface -- |
MEM_EXT_TIMEOUT : natural := 15 -- cycles after which a valid bus access will timeout |
-- Bus Interface -- |
BUS_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 |
clk_i : in std_ulogic := '0'; -- global clock, rising edge |
rstn_i : in std_ulogic := '0'; -- global reset, low-active, async |
-- instruction bus interface -- |
i_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address |
i_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data |
i_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data |
i_bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data |
i_bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable |
i_bus_we_o : out std_ulogic; -- write enable |
i_bus_re_o : out std_ulogic; -- read enable |
i_bus_cancel_o : out std_ulogic; -- cancel current bus transaction |
i_bus_ack_i : in std_ulogic; -- bus transfer acknowledge |
i_bus_err_i : in std_ulogic; -- bus transfer error |
i_bus_ack_i : in std_ulogic := '0'; -- bus transfer acknowledge |
i_bus_err_i : in std_ulogic := '0'; -- bus transfer error |
i_bus_fence_o : out std_ulogic; -- executed FENCEI operation |
-- data bus interface -- |
d_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address |
d_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data |
d_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data |
d_bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data |
d_bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable |
d_bus_we_o : out std_ulogic; -- write enable |
d_bus_re_o : out std_ulogic; -- read enable |
d_bus_cancel_o : out std_ulogic; -- cancel current bus transaction |
d_bus_ack_i : in std_ulogic; -- bus transfer acknowledge |
d_bus_err_i : in std_ulogic; -- bus transfer error |
d_bus_ack_i : in std_ulogic := '0'; -- bus transfer acknowledge |
d_bus_err_i : in std_ulogic := '0'; -- bus transfer error |
d_bus_fence_o : out std_ulogic; -- executed FENCE operation |
-- system time input from MTIME -- |
time_i : in std_ulogic_vector(63 downto 0); -- current system time |
-- external interrupts -- |
msw_irq_i : in std_ulogic; -- software interrupt |
clic_irq_i : in std_ulogic; -- CLIC interrupt request |
mtime_irq_i : in std_ulogic -- machine timer interrupt |
time_i : in std_ulogic_vector(63 downto 0) := (others => '0'); -- current system time |
-- interrupts (risc-v compliant) -- |
msw_irq_i : in std_ulogic := '0'; -- machine software interrupt |
mext_irq_i : in std_ulogic := '0'; -- machine external interrupt |
mtime_irq_i : in std_ulogic := '0'; -- machine timer interrupt |
-- fast interrupts (custom) -- |
firq_i : in std_ulogic_vector(3 downto 0) := (others => '0') |
); |
end neorv32_cpu; |
|
166,10 → 168,12
-- csr interface -- |
csr_wdata_i => alu_res, -- CSR write data |
csr_rdata_o => csr_rdata, -- CSR read data |
-- external interrupt -- |
msw_irq_i => msw_irq_i, -- software interrupt |
clic_irq_i => clic_irq_i, -- CLIC interrupt request |
-- interrupts (risc-v compliant) -- |
msw_irq_i => msw_irq_i, -- machine software interrupt |
mext_irq_i => mext_irq_i, -- machine external interrupt |
mtime_irq_i => mtime_irq_i, -- machine timer interrupt |
-- fast interrupts (custom) -- |
firq_i => firq_i, |
-- system time input from MTIME -- |
time_i => time_i, -- current system time |
-- bus access exceptions -- |
272,7 → 276,7
neorv32_cpu_bus_inst: neorv32_cpu_bus |
generic map ( |
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 |
BUS_TIMEOUT => BUS_TIMEOUT -- cycles after which a valid bus access will timeout |
) |
port map ( |
-- global control -- |
/neorv32/trunk/rtl/core/neorv32_cpu_bus.vhd
44,7 → 44,7
entity neorv32_cpu_bus is |
generic ( |
CPU_EXTENSION_RISCV_C : boolean := true; -- implement compressed extension? |
MEM_EXT_TIMEOUT : natural := 15 -- cycles after which a valid bus access will timeout |
BUS_TIMEOUT : natural := 15 -- cycles after which a valid bus access will timeout |
); |
port ( |
-- global control -- |
113,7 → 113,7
wr_req : std_ulogic; -- write access in progress |
err_align : std_ulogic; -- alignment error |
err_bus : std_ulogic; -- bus access error |
timeout : std_ulogic_vector(index_size_f(MEM_EXT_TIMEOUT)-1 downto 0); |
timeout : std_ulogic_vector(index_size_f(BUS_TIMEOUT)-1 downto 0); |
end record; |
signal i_arbiter, d_arbiter : bus_arbiter_t; |
|
271,7 → 271,7
i_arbiter.rd_req <= ctrl_i(ctrl_bus_if_c); |
i_arbiter.err_align <= i_misaligned; |
i_arbiter.err_bus <= '0'; |
i_arbiter.timeout <= std_ulogic_vector(to_unsigned(MEM_EXT_TIMEOUT, index_size_f(MEM_EXT_TIMEOUT))); |
i_arbiter.timeout <= std_ulogic_vector(to_unsigned(BUS_TIMEOUT, index_size_f(BUS_TIMEOUT))); |
else -- in progress |
i_arbiter.timeout <= std_ulogic_vector(unsigned(i_arbiter.timeout) - 1); |
i_arbiter.err_align <= (i_arbiter.err_align or i_misaligned) and (not ctrl_i(ctrl_bus_ierr_ack_c)); |
326,7 → 326,7
d_arbiter.rd_req <= ctrl_i(ctrl_bus_rd_c); |
d_arbiter.err_align <= d_misaligned; |
d_arbiter.err_bus <= '0'; |
d_arbiter.timeout <= std_ulogic_vector(to_unsigned(MEM_EXT_TIMEOUT, index_size_f(MEM_EXT_TIMEOUT))); |
d_arbiter.timeout <= std_ulogic_vector(to_unsigned(BUS_TIMEOUT, index_size_f(BUS_TIMEOUT))); |
else -- in progress |
d_arbiter.timeout <= std_ulogic_vector(unsigned(d_arbiter.timeout) - 1); |
d_arbiter.err_align <= (d_arbiter.err_align or d_misaligned) and (not ctrl_i(ctrl_bus_derr_ack_c)); |
/neorv32/trunk/rtl/core/neorv32_cpu_control.vhd
77,10 → 77,12
-- csr data interface -- |
csr_wdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- CSR write data |
csr_rdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- CSR read data |
-- external interrupt -- |
msw_irq_i : in std_ulogic; -- software interrupt |
clic_irq_i : in std_ulogic; -- CLIC interrupt request |
-- interrupts (risc-v compliant) -- |
msw_irq_i : in std_ulogic; -- machine software interrupt |
mext_irq_i : in std_ulogic; -- machine external interrupt |
mtime_irq_i : in std_ulogic; -- machine timer interrupt |
-- fast interrupts (custom) -- |
firq_i : in std_ulogic_vector(3 downto 0); |
-- system time input from MTIME -- |
time_i : in std_ulogic_vector(63 downto 0); -- current system time |
-- bus access exceptions -- |
168,8 → 170,8
exc_ack : std_ulogic; -- acknowledge all exceptions |
irq_ack : std_ulogic_vector(interrupt_width_c-1 downto 0); -- acknowledge specific interrupt |
irq_ack_nxt : std_ulogic_vector(interrupt_width_c-1 downto 0); |
cause : std_ulogic_vector(4 downto 0); -- trap ID (for "mcause"), only for hw |
cause_nxt : std_ulogic_vector(4 downto 0); |
cause : std_ulogic_vector(5 downto 0); -- trap ID (for "mcause"), only for hw |
cause_nxt : std_ulogic_vector(5 downto 0); |
-- |
env_start : std_ulogic; -- start trap handler env |
env_start_ack : std_ulogic; -- start of trap handler acknowledged |
199,9 → 201,10
mstatus_mpie : std_ulogic; -- mstatus.MPIE: previous global IRQ enable (R/-) |
mie_msie : std_ulogic; -- mie.MSIE: machine software interrupt enable (R/W) |
mie_meie : std_ulogic; -- mie.MEIE: machine external interrupt enable (R/W) |
mie_mtie : std_ulogic; -- mie.MEIE: machine timer interrupt enable (R/W) |
mie_mtie : std_ulogic; -- mie.MEIE: machine timer interrupt enable (R/W |
mie_firqe : std_ulogic_vector(3 downto 0); -- mie.firq*e: fast interrupt enabled (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/W) |
mcause : std_ulogic_vector(data_width_c-1 downto 0); -- mcause: machine trap cause (R/-) |
mtvec : std_ulogic_vector(data_width_c-1 downto 0); -- mtvec: machine trap-handler base address (R/W), bit 1:0 == 00 |
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) |
633,17 → 636,14
trap_ctrl.instr_ma <= ipb.rdata(33); -- misaligned instruction fetch address |
trap_ctrl.instr_be <= ipb.rdata(34); -- bus access fault druing instrucion fetch |
illegal_compressed <= ipb.rdata(35); -- invalid decompressed instruction |
if (trap_ctrl.env_start = '1') or ((ipb.rdata(33) or ipb.rdata(34) or ipb.rdata(35)) = '1') then -- exception/interrupt? |
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; -- the PC according to the current instruction |
-- ipb.rdata(35) is not immediately checked here! |
if (execute_engine.sleep = '1') or (trap_ctrl.env_start = '1') or ((ipb.rdata(33) or ipb.rdata(34)) = '1') then |
execute_engine.state_nxt <= TRAP; |
else |
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; -- the PC according to the current instruction |
if (execute_engine.sleep = '1') then |
execute_engine.state_nxt <= TRAP; |
else |
execute_engine.state_nxt <= EXECUTE; |
end if; |
execute_engine.state_nxt <= EXECUTE; |
end if; |
end if; |
|
1074,10 → 1074,15
trap_ctrl.exc_buf(exception_m_envcall_c) <= (trap_ctrl.exc_buf(exception_m_envcall_c) or trap_ctrl.env_call) and (not trap_ctrl.exc_ack); |
trap_ctrl.exc_buf(exception_break_c) <= (trap_ctrl.exc_buf(exception_break_c) or trap_ctrl.break_point) and (not trap_ctrl.exc_ack); |
trap_ctrl.exc_buf(exception_iillegal_c) <= (trap_ctrl.exc_buf(exception_iillegal_c) or trap_ctrl.instr_il) and (not trap_ctrl.exc_ack); |
-- interrupt buffer: machine software/external/timer interrupt |
trap_ctrl.irq_buf(interrupt_msw_irq_c) <= csr.mie_msie and (trap_ctrl.irq_buf(interrupt_msw_irq_c) or msw_irq_i) and (not trap_ctrl.irq_ack(interrupt_msw_irq_c)); |
trap_ctrl.irq_buf(interrupt_mext_irq_c) <= csr.mie_meie and (trap_ctrl.irq_buf(interrupt_mext_irq_c) or clic_irq_i) and (not trap_ctrl.irq_ack(interrupt_mext_irq_c)); |
trap_ctrl.irq_buf(interrupt_mtime_irq_c) <= csr.mie_mtie and (trap_ctrl.irq_buf(interrupt_mtime_irq_c) or mtime_irq_i) and (not trap_ctrl.irq_ack(interrupt_mtime_irq_c)); |
-- interrupt buffer (RISC-V compliant): machine software/external/timer interrupt |
trap_ctrl.irq_buf(interrupt_msw_irq_c) <= csr.mie_msie and (trap_ctrl.irq_buf(interrupt_msw_irq_c) or msw_irq_i) and (not trap_ctrl.irq_ack(interrupt_msw_irq_c)); |
trap_ctrl.irq_buf(interrupt_mext_irq_c) <= csr.mie_meie and (trap_ctrl.irq_buf(interrupt_mext_irq_c) or mext_irq_i) and (not trap_ctrl.irq_ack(interrupt_mext_irq_c)); |
trap_ctrl.irq_buf(interrupt_mtime_irq_c) <= csr.mie_mtie and (trap_ctrl.irq_buf(interrupt_mtime_irq_c) or mtime_irq_i) and (not trap_ctrl.irq_ack(interrupt_mtime_irq_c)); |
-- interrupt buffer (custom): fast interrupts |
trap_ctrl.irq_buf(interrupt_firq_0_c) <= csr.mie_firqe(0) and (trap_ctrl.irq_buf(interrupt_firq_0_c) or firq_i(0)) and (not trap_ctrl.irq_ack(interrupt_firq_0_c)); |
trap_ctrl.irq_buf(interrupt_firq_1_c) <= csr.mie_firqe(1) and (trap_ctrl.irq_buf(interrupt_firq_1_c) or firq_i(1)) and (not trap_ctrl.irq_ack(interrupt_firq_1_c)); |
trap_ctrl.irq_buf(interrupt_firq_2_c) <= csr.mie_firqe(2) and (trap_ctrl.irq_buf(interrupt_firq_2_c) or firq_i(2)) and (not trap_ctrl.irq_ack(interrupt_firq_2_c)); |
trap_ctrl.irq_buf(interrupt_firq_3_c) <= csr.mie_firqe(3) and (trap_ctrl.irq_buf(interrupt_firq_3_c) or firq_i(3)) and (not trap_ctrl.irq_ack(interrupt_firq_3_c)); |
|
-- trap control -- |
if (trap_ctrl.env_start = '0') then -- no started trap handler |
1131,6 → 1136,27
trap_ctrl.irq_ack_nxt(interrupt_msw_irq_c) <= '1'; |
|
|
-- interrupt: 1.16 fast interrupt channel 0 -- |
elsif (trap_ctrl.irq_buf(interrupt_firq_0_c) = '1') then |
trap_ctrl.cause_nxt <= trap_firq0_c; |
trap_ctrl.irq_ack_nxt(interrupt_firq_0_c) <= '1'; |
|
-- interrupt: 1.17 fast interrupt channel 1 -- |
elsif (trap_ctrl.irq_buf(interrupt_firq_1_c) = '1') then |
trap_ctrl.cause_nxt <= trap_firq1_c; |
trap_ctrl.irq_ack_nxt(interrupt_firq_1_c) <= '1'; |
|
-- interrupt: 1.18 fast interrupt channel 2 -- |
elsif (trap_ctrl.irq_buf(interrupt_firq_2_c) = '1') then |
trap_ctrl.cause_nxt <= trap_firq2_c; |
trap_ctrl.irq_ack_nxt(interrupt_firq_2_c) <= '1'; |
|
-- interrupt: 1.19 fast interrupt channel 3 -- |
elsif (trap_ctrl.irq_buf(interrupt_firq_3_c) = '1') then |
trap_ctrl.cause_nxt <= trap_firq3_c; |
trap_ctrl.irq_ack_nxt(interrupt_firq_3_c) <= '1'; |
|
|
-- the following traps are caused by synchronous exceptions |
-- here we do not need a specific acknowledge mask since only one exception (the one |
-- with highest priority) can trigger at once |
1150,7 → 1176,7
|
-- trap/fault: 0.11 environment call from M-mode -- |
elsif (trap_ctrl.exc_buf(exception_m_envcall_c) = '1') then |
trap_ctrl.cause_nxt <= trap_env_c; |
trap_ctrl.cause_nxt <= trap_menv_c; |
|
-- trap/fault: 0.3 breakpoint -- |
elsif (trap_ctrl.exc_buf(exception_break_c) = '1') then |
1198,6 → 1224,7
csr.mie_msie <= '0'; |
csr.mie_meie <= '0'; |
csr.mie_mtie <= '0'; |
csr.mie_firqe <= (others => '0'); |
csr.mtvec <= (others => '0'); |
csr.mscratch <= (others => '0'); |
csr.mepc <= (others => '0'); |
1221,9 → 1248,14
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 |
csr.mie_msie <= csr_wdata_i(03); -- machine SW IRQ enable |
csr.mie_mtie <= csr_wdata_i(07); -- machine TIMER IRQ enable |
csr.mie_meie <= csr_wdata_i(11); -- machine EXT IRQ enable |
-- |
csr.mie_firqe(0) <= csr_wdata_i(16); -- fast interrupt channel 0 |
csr.mie_firqe(1) <= csr_wdata_i(17); -- fast interrupt channel 1 |
csr.mie_firqe(2) <= csr_wdata_i(18); -- fast interrupt channel 2 |
csr.mie_firqe(3) <= csr_wdata_i(19); -- fast interrupt channel 3 |
when x"5" => -- R/W: mtvec - machine trap-handler base address (for ALL exceptions) |
csr.mtvec <= csr_wdata_i(data_width_c-1 downto 2) & "00"; -- mtvec.MODE=0 |
when others => |
1237,8 → 1269,6
csr.mscratch <= csr_wdata_i; |
when x"1" => -- R/W: mepc - machine exception program counter |
csr.mepc <= csr_wdata_i(data_width_c-1 downto 1) & '0'; |
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 others => |
1250,20 → 1280,20
-- automatic update by hardware -- |
else |
|
-- machine exception PC & trap value register -- |
-- machine exception PC & machine trap value register -- |
if (trap_ctrl.env_start_ack = '1') then -- trap handler starting? |
csr.mcause <= trap_ctrl.cause(4) & "000" & x"000000" & trap_ctrl.cause(3 downto 0); |
if (trap_ctrl.cause(4) = '1') then -- for INTERRUPTS only (is mcause(31)) |
csr.mcause <= trap_ctrl.cause(trap_ctrl.cause'left) & "000" & x"00000" & "000" & trap_ctrl.cause(4 downto 0); |
if (trap_ctrl.cause(trap_ctrl.cause'left) = '1') then -- for INTERRUPTS only (is mcause(31)) |
csr.mepc <= execute_engine.pc(data_width_c-1 downto 1) & '0'; -- this is the CURRENT pc = interrupted instruction |
csr.mtval <= (others => '0'); -- mtval is zero for interrupts |
else -- for EXCEPTIONS (according to their priority) |
csr.mepc <= execute_engine.last_pc(data_width_c-1 downto 1) & '0'; -- this is the LAST pc = last executed instruction |
if (trap_ctrl.cause(3 downto 0) = trap_iba_c(3 downto 0)) or -- instr access error OR |
(trap_ctrl.cause(3 downto 0) = trap_ima_c(3 downto 0)) or -- misaligned instruction OR |
(trap_ctrl.cause(3 downto 0) = trap_brk_c(3 downto 0)) or -- breakpoint OR |
(trap_ctrl.cause(3 downto 0) = trap_env_c(3 downto 0)) then -- env call OR |
if (trap_ctrl.cause(4 downto 0) = trap_iba_c(4 downto 0)) or -- instr access error OR |
(trap_ctrl.cause(4 downto 0) = trap_ima_c(4 downto 0)) or -- misaligned instruction OR |
(trap_ctrl.cause(4 downto 0) = trap_brk_c(4 downto 0)) or -- breakpoint OR |
(trap_ctrl.cause(4 downto 0) = trap_menv_c(4 downto 0)) then -- env call OR |
csr.mtval <= execute_engine.pc(data_width_c-1 downto 1) & '0'; -- address of faulting instruction |
elsif (trap_ctrl.cause(3 downto 0) = trap_iil_c(3 downto 0)) then -- illegal instruction |
elsif (trap_ctrl.cause(4 downto 0) = trap_iil_c(4 downto 0)) then -- illegal instruction |
csr.mtval <= execute_engine.i_reg; -- faulting instruction itself |
else -- load/store misalignments/access errors |
csr.mtval <= mar_i; -- faulting data access address |
1307,13 → 1337,19
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(23) <= '1'; -- X CPU extension (non-std 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 |
csr_rdata_o(03) <= csr.mie_msie; -- machine software IRQ enable |
csr_rdata_o(07) <= csr.mie_mtie; -- machine timer IRQ enable |
csr_rdata_o(11) <= csr.mie_meie; -- machine external IRQ enable |
-- |
csr_rdata_o(16) <= csr.mie_firqe(0); -- fast interrupt channel 0 |
csr_rdata_o(17) <= csr.mie_firqe(1); -- fast interrupt channel 1 |
csr_rdata_o(18) <= csr.mie_firqe(2); -- fast interrupt channel 2 |
csr_rdata_o(19) <= csr.mie_firqe(3); -- fast interrupt channel 3 |
when x"305" => -- R/W: mtvec - machine trap-handler base address (for ALL exceptions) |
csr_rdata_o <= csr.mtvec(data_width_c-1 downto 2) & "00"; -- mtvec.MODE=0 |
|
1322,7 → 1358,7
csr_rdata_o <= csr.mscratch; |
when x"341" => -- R/W: mepc - machine exception program counter |
csr_rdata_o <= csr.mepc(data_width_c-1 downto 1) & '0'; |
when x"342" => -- R/W: mcause - machine trap cause |
when x"342" => -- R/-: 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; |
1330,6 → 1366,11
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); |
-- |
csr_rdata_o(16) <= trap_ctrl.irq_buf(interrupt_firq_0_c); |
csr_rdata_o(17) <= trap_ctrl.irq_buf(interrupt_firq_1_c); |
csr_rdata_o(18) <= trap_ctrl.irq_buf(interrupt_firq_2_c); |
csr_rdata_o(19) <= trap_ctrl.irq_buf(interrupt_firq_3_c); |
|
-- counter and timers -- |
when x"c00" | x"b00" => -- R/(W): cycle/mcycle: Cycle counter LOW |
/neorv32/trunk/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"01020006"; -- no touchy! |
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01030000"; -- no touchy! |
|
-- Helper Functions ----------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
76,10 → 76,9
constant gpio_in_addr_c : std_ulogic_vector(31 downto 0) := std_ulogic_vector(unsigned(gpio_base_c) + x"00000000"); |
constant gpio_out_addr_c : std_ulogic_vector(31 downto 0) := std_ulogic_vector(unsigned(gpio_base_c) + x"00000004"); |
|
-- Core-Local Interrupt Controller (CLIC) -- |
constant clic_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"FFFFFF88"; -- base address, fixed! |
constant clic_size_c : natural := 1*4; -- bytes, fixed! |
constant clic_ctrl_addr_c : std_ulogic_vector(31 downto 0) := std_ulogic_vector(unsigned(clic_base_c) + x"00000000"); |
-- RESERVED -- |
--constant ???_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"FFFFFF88"; -- base address, fixed! |
--constant ???_size_c : natural := 1*4; -- bytes, fixed! |
|
-- Watch Dog Timer (WDT) -- |
constant wdt_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"FFFFFF8C"; -- base address, fixed! |
317,18 → 316,25
|
-- Trap ID Codes -------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
constant trap_ima_c : std_ulogic_vector(4 downto 0) := "00000"; -- 0.0: instruction misaligned |
constant trap_iba_c : std_ulogic_vector(4 downto 0) := "00001"; -- 0.1: instruction access fault |
constant trap_iil_c : std_ulogic_vector(4 downto 0) := "00010"; -- 0.2: illegal instruction |
constant trap_brk_c : std_ulogic_vector(4 downto 0) := "00011"; -- 0.3: breakpoint |
constant trap_lma_c : std_ulogic_vector(4 downto 0) := "00100"; -- 0.4: load address misaligned |
constant trap_lbe_c : std_ulogic_vector(4 downto 0) := "00101"; -- 0.5: load access fault |
constant trap_sma_c : std_ulogic_vector(4 downto 0) := "00110"; -- 0.6: store address misaligned |
constant trap_sbe_c : std_ulogic_vector(4 downto 0) := "00111"; -- 0.7: store access fault |
constant trap_env_c : std_ulogic_vector(4 downto 0) := "01011"; -- 0.11: environment call from m-mode |
constant trap_msi_c : std_ulogic_vector(4 downto 0) := "10011"; -- 1.3: machine software interrupt |
constant trap_mti_c : std_ulogic_vector(4 downto 0) := "10111"; -- 1.7: machine timer interrupt |
constant trap_mei_c : std_ulogic_vector(4 downto 0) := "11011"; -- 1.11: machine external interrupt |
-- risc-v compliant -- |
constant trap_ima_c : std_ulogic_vector(5 downto 0) := "000000"; -- 0.0: instruction misaligned |
constant trap_iba_c : std_ulogic_vector(5 downto 0) := "000001"; -- 0.1: instruction access fault |
constant trap_iil_c : std_ulogic_vector(5 downto 0) := "000010"; -- 0.2: illegal instruction |
constant trap_brk_c : std_ulogic_vector(5 downto 0) := "000011"; -- 0.3: breakpoint |
constant trap_lma_c : std_ulogic_vector(5 downto 0) := "000100"; -- 0.4: load address misaligned |
constant trap_lbe_c : std_ulogic_vector(5 downto 0) := "000101"; -- 0.5: load access fault |
constant trap_sma_c : std_ulogic_vector(5 downto 0) := "000110"; -- 0.6: store address misaligned |
constant trap_sbe_c : std_ulogic_vector(5 downto 0) := "000111"; -- 0.7: store access fault |
constant trap_menv_c : std_ulogic_vector(5 downto 0) := "001011"; -- 0.11: environment call from m-mode |
-- |
constant trap_msi_c : std_ulogic_vector(5 downto 0) := "100011"; -- 1.3: machine software interrupt |
constant trap_mti_c : std_ulogic_vector(5 downto 0) := "100111"; -- 1.7: machine timer interrupt |
constant trap_mei_c : std_ulogic_vector(5 downto 0) := "101011"; -- 1.11: machine external interrupt |
-- custom -- |
constant trap_firq0_c : std_ulogic_vector(5 downto 0) := "110000"; -- 1.16: fast interrupt 0 |
constant trap_firq1_c : std_ulogic_vector(5 downto 0) := "110001"; -- 1.17: fast interrupt 1 |
constant trap_firq2_c : std_ulogic_vector(5 downto 0) := "110010"; -- 1.18: fast interrupt 2 |
constant trap_firq3_c : std_ulogic_vector(5 downto 0) := "110011"; -- 1.19: fast interrupt 3 |
|
-- CPU Control Exception System ----------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
342,12 → 348,18
constant exception_lalign_c : natural := 6; -- load address misaligned |
constant exception_saccess_c : natural := 7; -- store access fault |
constant exception_laccess_c : natural := 8; -- load access fault |
-- |
constant exception_width_c : natural := 9; -- length of this list in bits |
-- interrupt source bits -- |
constant interrupt_msw_irq_c : natural := 0; -- machine software interrupt |
constant interrupt_mtime_irq_c : natural := 1; -- machine timer interrupt |
constant interrupt_mext_irq_c : natural := 2; -- machine external interrupt |
constant interrupt_width_c : natural := 3; -- length of this list in bits |
constant interrupt_firq_0_c : natural := 3; -- fast interrupt channel 0 |
constant interrupt_firq_1_c : natural := 4; -- fast interrupt channel 1 |
constant interrupt_firq_2_c : natural := 5; -- fast interrupt channel 2 |
constant interrupt_firq_3_c : natural := 6; -- fast interrupt channel 3 |
-- |
constant interrupt_width_c : natural := 7; -- length of this list in bits |
|
-- Clock Generator ------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
398,7 → 410,6
IO_TWI_USE : boolean := true; -- implement two-wire interface (TWI)? |
IO_PWM_USE : boolean := true; -- implement pulse-width modulation unit (PWM)? |
IO_WDT_USE : boolean := true; -- implement watch dog timer (WDT)? |
IO_CLIC_USE : boolean := true; -- implement core local interrupt controller (CLIC)? |
IO_TRNG_USE : boolean := false; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
428,7 → 439,7
-- SPI -- |
spi_sck_o : out std_ulogic; -- SPI serial clock |
spi_sdo_o : out std_ulogic; -- controller data out, peripheral data in |
spi_sdi_i : in std_ulogic; -- controller data in, peripheral data out |
spi_sdi_i : in std_ulogic := '0'; -- controller data in, peripheral data out |
spi_csn_o : out std_ulogic_vector(07 downto 0); -- SPI CS |
-- TWI -- |
twi_sda_io : inout std_logic := 'H'; -- twi serial data line |
436,8 → 447,8
-- PWM -- |
pwm_o : out std_ulogic_vector(03 downto 0); -- pwm channels |
-- Interrupts -- |
ext_irq_i : in std_ulogic_vector(01 downto 0) := (others => '0'); -- external interrupt request |
ext_ack_o : out std_ulogic_vector(01 downto 0) -- external interrupt request acknowledge |
msw_irq_i : in std_ulogic := '0'; -- machine software interrupt |
mext_irq_i : in std_ulogic := '0' -- machine external interrupt |
); |
end component; |
|
447,8 → 458,8
generic ( |
-- General -- |
CSR_COUNTERS_USE : boolean := true; -- implement RISC-V perf. counters ([m]instret[h], [m]cycle[h], time[h])? |
HW_THREAD_ID : std_ulogic_vector(31 downto 0):= x"00000000"; -- hardware thread id |
CPU_BOOT_ADDR : std_ulogic_vector(31 downto 0):= x"00000000"; -- cpu boot address |
HW_THREAD_ID : std_ulogic_vector(31 downto 0):= (others => '0'); -- hardware thread id |
CPU_BOOT_ADDR : std_ulogic_vector(31 downto 0):= (others => '0'); -- cpu boot address |
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension? |
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension? |
455,41 → 466,43
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: External memory interface -- |
MEM_EXT_TIMEOUT : natural := 15 -- cycles after which a valid bus access will timeout |
-- Bus Interface -- |
BUS_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 |
clk_i : in std_ulogic := '0'; -- global clock, rising edge |
rstn_i : in std_ulogic := '0'; -- global reset, low-active, async |
-- instruction bus interface -- |
i_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address |
i_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data |
i_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data |
i_bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data |
i_bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable |
i_bus_we_o : out std_ulogic; -- write enable |
i_bus_re_o : out std_ulogic; -- read enable |
i_bus_cancel_o : out std_ulogic; -- cancel current bus transaction |
i_bus_ack_i : in std_ulogic; -- bus transfer acknowledge |
i_bus_err_i : in std_ulogic; -- bus transfer error |
i_bus_ack_i : in std_ulogic := '0'; -- bus transfer acknowledge |
i_bus_err_i : in std_ulogic := '0'; -- bus transfer error |
i_bus_fence_o : out std_ulogic; -- executed FENCEI operation |
-- data bus interface -- |
d_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address |
d_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- bus read data |
d_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data |
d_bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data |
d_bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable |
d_bus_we_o : out std_ulogic; -- write enable |
d_bus_re_o : out std_ulogic; -- read enable |
d_bus_cancel_o : out std_ulogic; -- cancel current bus transaction |
d_bus_ack_i : in std_ulogic; -- bus transfer acknowledge |
d_bus_err_i : in std_ulogic; -- bus transfer error |
d_bus_ack_i : in std_ulogic := '0'; -- bus transfer acknowledge |
d_bus_err_i : in std_ulogic := '0'; -- bus transfer error |
d_bus_fence_o : out std_ulogic; -- executed FENCE operation |
-- system time input from MTIME -- |
time_i : in std_ulogic_vector(63 downto 0); -- current system time |
-- external interrupts -- |
msw_irq_i : in std_ulogic; -- software interrupt |
clic_irq_i : in std_ulogic; -- CLIC interrupt request |
mtime_irq_i : in std_ulogic -- machine timer interrupt |
time_i : in std_ulogic_vector(63 downto 0) := (others => '0'); -- current system time |
-- interrupts (risc-v compliant) -- |
msw_irq_i : in std_ulogic := '0'; -- machine software interrupt |
mext_irq_i : in std_ulogic := '0'; -- machine external interrupt |
mtime_irq_i : in std_ulogic := '0'; -- machine timer interrupt |
-- fast interrupts (custom) -- |
firq_i : in std_ulogic_vector(3 downto 0) := (others => '0') |
); |
end component; |
|
529,10 → 542,12
-- csr interface -- |
csr_wdata_i : in std_ulogic_vector(data_width_c-1 downto 0); -- CSR write data |
csr_rdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- CSR read data |
-- external interrupt -- |
msw_irq_i : in std_ulogic; -- software interrupt |
clic_irq_i : in std_ulogic; -- CLIC interrupt request |
-- interrupts (risc-v compliant) -- |
msw_irq_i : in std_ulogic; -- machine software interrupt |
mext_irq_i : in std_ulogic; -- machine external interrupt |
mtime_irq_i : in std_ulogic; -- machine timer interrupt |
-- fast interrupts (custom) -- |
firq_i : in std_ulogic_vector(3 downto 0); |
-- system time input from MTIME -- |
time_i : in std_ulogic_vector(63 downto 0); -- current system time |
-- bus access exceptions -- |
620,7 → 635,7
component neorv32_cpu_bus |
generic ( |
CPU_EXTENSION_RISCV_C : boolean := true; -- implement compressed extension? |
MEM_EXT_TIMEOUT : natural := 15 -- cycles after which a valid bus access will timeout |
BUS_TIMEOUT : natural := 15 -- cycles after which a valid bus access will timeout |
); |
port ( |
-- global control -- |
821,27 → 836,6
); |
end component; |
|
-- Component: Core Local Interrupt Controller (CLIC) -------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
component neorv32_clic |
port ( |
-- host access -- |
clk_i : in std_ulogic; -- global clock line |
addr_i : in std_ulogic_vector(31 downto 0); -- address |
rden_i : in std_ulogic; -- read enable |
wren_i : in std_ulogic; -- write enable |
ben_i : in std_ulogic_vector(03 downto 0); -- byte write enable |
data_i : in std_ulogic_vector(31 downto 0); -- data in |
data_o : out std_ulogic_vector(31 downto 0); -- data out |
ack_o : out std_ulogic; -- transfer acknowledge |
-- cpu interrupt -- |
cpu_irq_o : out std_ulogic; -- trigger CPU's external IRQ |
-- external interrupt lines -- |
ext_irq_i : in std_ulogic_vector(07 downto 0); -- IRQ, triggering on HIGH level |
ext_ack_o : out std_ulogic_vector(07 downto 0) -- acknowledge |
); |
end component; |
|
-- Component: Watchdog Timer (WDT) -------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
component neorv32_wdt |
1064,7 → 1058,6
IO_TWI_USE : boolean := true; -- implement two-wire interface (TWI)? |
IO_PWM_USE : boolean := true; -- implement pulse-width modulation unit (PWM)? |
IO_WDT_USE : boolean := true; -- implement watch dog timer (WDT)? |
IO_CLIC_USE : boolean := true; -- implement core local interrupt controller (CLIC)? |
IO_TRNG_USE : boolean := true; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
/neorv32/trunk/rtl/core/neorv32_sysinfo.vhd
69,7 → 69,6
IO_TWI_USE : boolean := true; -- implement two-wire interface (TWI)? |
IO_PWM_USE : boolean := true; -- implement pulse-width modulation unit (PWM)? |
IO_WDT_USE : boolean := true; -- implement watch dog timer (WDT)? |
IO_CLIC_USE : boolean := true; -- implement core local interrupt controller (CLIC)? |
IO_TRNG_USE : boolean := true; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
125,6 → 124,7
sysinfo_mem(2)(02) <= bool_to_ulogic_f(MEM_INT_IMEM_USE); -- implement processor-internal instruction memory? |
sysinfo_mem(2)(03) <= bool_to_ulogic_f(MEM_INT_IMEM_ROM); -- implement processor-internal instruction memory as ROM? |
sysinfo_mem(2)(04) <= bool_to_ulogic_f(MEM_INT_DMEM_USE); -- implement processor-internal data memory? |
sysinfo_mem(2)(15 downto 05) <= (others => '0'); -- reserved |
-- IO |
sysinfo_mem(2)(16) <= bool_to_ulogic_f(IO_GPIO_USE); -- implement general purpose input/output port unit (GPIO)? |
sysinfo_mem(2)(17) <= bool_to_ulogic_f(IO_MTIME_USE); -- implement machine system timer (MTIME)? |
133,9 → 133,10
sysinfo_mem(2)(20) <= bool_to_ulogic_f(IO_TWI_USE); -- implement two-wire interface (TWI)? |
sysinfo_mem(2)(21) <= bool_to_ulogic_f(IO_PWM_USE); -- implement pulse-width modulation unit (PWM)? |
sysinfo_mem(2)(22) <= bool_to_ulogic_f(IO_WDT_USE); -- implement watch dog timer (WDT)? |
sysinfo_mem(2)(23) <= bool_to_ulogic_f(IO_CLIC_USE); -- implement core local interrupt controller (CLIC)? |
sysinfo_mem(2)(23) <= '0'; |
sysinfo_mem(2)(24) <= bool_to_ulogic_f(IO_TRNG_USE); -- implement true random number generator (TRNG)? |
sysinfo_mem(2)(25) <= bool_to_ulogic_f(IO_DEVNULL_USE); -- implement dummy device (DEVNULL)? |
sysinfo_mem(2)(31 downto 26) <= (others => '0'); -- reserved |
|
-- SYSINFO(3): reserved -- |
sysinfo_mem(3) <= (others => '0'); -- reserved - maybe for technology-specific configuration options? |
/neorv32/trunk/rtl/core/neorv32_top.vhd
80,7 → 80,6
IO_TWI_USE : boolean := true; -- implement two-wire interface (TWI)? |
IO_PWM_USE : boolean := true; -- implement pulse-width modulation unit (PWM)? |
IO_WDT_USE : boolean := true; -- implement watch dog timer (WDT)? |
IO_CLIC_USE : boolean := true; -- implement core local interrupt controller (CLIC)? |
IO_TRNG_USE : boolean := false; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
110,16 → 109,16
-- SPI (available if IO_SPI_USE = true) -- |
spi_sck_o : out std_ulogic; -- SPI serial clock |
spi_sdo_o : out std_ulogic; -- controller data out, peripheral data in |
spi_sdi_i : in std_ulogic; -- controller data in, peripheral data out |
spi_sdi_i : in std_ulogic := '0'; -- controller data in, peripheral data out |
spi_csn_o : out std_ulogic_vector(07 downto 0); -- SPI CS |
-- TWI (available if IO_TWI_USE = true) -- |
twi_sda_io : inout std_logic := 'H'; -- twi serial data line |
twi_scl_io : inout std_logic := 'H'; -- twi serial clock line |
-- PWM (available if IO_PWM_USE = true) -- |
pwm_o : out std_ulogic_vector(03 downto 0); -- pwm channels |
-- Interrupts (available if IO_CLIC_USE = true) -- |
ext_irq_i : in std_ulogic_vector(01 downto 0) := (others => '0'); -- external interrupt request |
ext_ack_o : out std_ulogic_vector(01 downto 0) -- external interrupt request acknowledge |
pwm_o : out std_ulogic_vector(03 downto 0); -- pwm channels |
-- Interrupts -- |
msw_irq_i : in std_ulogic := '0'; -- machine software interrupt |
mext_irq_i : in std_ulogic := '0' -- machine external interrupt |
); |
end neorv32_top; |
|
191,8 → 190,6
signal pwm_ack : std_ulogic; |
signal wdt_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal wdt_ack : std_ulogic; |
signal clic_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal clic_ack : std_ulogic; |
signal trng_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal trng_ack : std_ulogic; |
signal devnull_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
202,9 → 199,7
|
-- IRQs -- |
signal mtime_irq : std_ulogic; |
signal clic_irq : std_ulogic; |
signal clic_xirq : std_ulogic_vector(7 downto 0); |
signal clic_xack : std_ulogic_vector(7 downto 0); |
signal fast_irq : std_ulogic_vector(3 downto 0); |
signal gpio_irq : std_ulogic; |
signal wdt_irq : std_ulogic; |
signal uart_irq : std_ulogic; |
256,10 → 251,6
if (CPU_EXTENSION_RISCV_Zicsr = false) then |
assert false report "NEORV32 CONFIG WARNING! No exception/interrupt/machine features available when CPU_EXTENSION_RISCV_Zicsr = false." severity warning; |
end if; |
-- core local interrupt controller -- |
if (CPU_EXTENSION_RISCV_Zicsr = false) and (IO_CLIC_USE = true) then |
assert false report "NEORV32 CONFIG ERROR! Core local interrupt controller (CLIC) cannot be used without >Zicsr< CPU extension." severity error; |
end if; |
|
-- memory layout notifier -- |
if (MEM_ISPACE_BASE /= x"00000000") then |
339,8 → 330,8
CPU_EXTENSION_RISCV_M => CPU_EXTENSION_RISCV_M, -- implement muld/div extension? |
CPU_EXTENSION_RISCV_Zicsr => CPU_EXTENSION_RISCV_Zicsr, -- implement CSR system? |
CPU_EXTENSION_RISCV_Zifencei => CPU_EXTENSION_RISCV_Zifencei, -- implement instruction stream sync.? |
-- Memory configuration: External memory interface -- |
MEM_EXT_TIMEOUT => MEM_EXT_TIMEOUT -- cycles after which a valid bus access will timeout |
-- Bus Interface -- |
BUS_TIMEOUT => MEM_EXT_TIMEOUT -- cycles after which a valid bus access will timeout |
) |
port map ( |
-- global control -- |
370,13 → 361,25
d_bus_fence_o => cpu_d.fence, -- executed FENCE operation |
-- system time input from MTIME -- |
time_i => mtime_time, -- current system time |
-- external interrupts -- |
msw_irq_i => '0', -- software interrupt |
clic_irq_i => clic_irq, -- CLIC interrupt request |
mtime_irq_i => mtime_irq -- machine timer interrupt |
-- interrupts (risc-v compliant) -- |
msw_irq_i => msw_irq_i, -- machine software interrupt |
mext_irq_i => mext_irq_i, -- machine external interrupt request |
mtime_irq_i => mtime_irq, -- machine timer interrupt |
-- fast interrupts (custom) -- |
firq_i => fast_irq |
); |
|
-- advanced memory control -- |
fence_o <= cpu_d.fence; -- indicates an executed FENCE operation |
fencei_o <= cpu_i.fence; -- indicates an executed FENCEI operation |
|
-- fast interrupts -- |
fast_irq(0) <= wdt_irq; -- highest priority |
fast_irq(1) <= gpio_irq; |
fast_irq(2) <= uart_irq; |
fast_irq(3) <= spi_irq or twi_irq; -- lowest priority, can be triggered by SPI or TWI |
|
|
-- CPU Crossbar Switch -------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
neorv32_busswitch_inst: neorv32_busswitch |
420,19 → 423,15
p_bus_err_i => p_bus.err -- bus transfer error |
); |
|
-- advanced memory control -- |
fence_o <= cpu_d.fence; -- indicates an executed FENCE operation |
fencei_o <= cpu_i.fence; -- indicates an executed FENCEI operation |
|
-- process bus: CPU data input -- |
-- processor bus: CPU data input -- |
p_bus.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 or sysinfo_rdata); |
spi_rdata or twi_rdata or pwm_rdata or wdt_rdata or trng_rdata or devnull_rdata or sysinfo_rdata); |
|
-- process bus: CPU data ACK input -- |
-- processor bus: CPU data ACK input -- |
p_bus.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 or sysinfo_ack); |
spi_ack or twi_ack or pwm_ack or wdt_ack or trng_ack or devnull_ack or sysinfo_ack); |
|
-- process bus: CPU data bus error input -- |
-- processor bus: CPU data bus error input -- |
p_bus.err <= wishbone_err; |
|
|
615,52 → 614,6
end generate; |
|
|
-- Core-Local Interrupt Controller (CLIC) ------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
neorv32_clic_inst_true: |
if (IO_CLIC_USE = true) generate |
neorv32_clic_inst: neorv32_clic |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
ben_i => p_bus.ben, -- byte write enable |
addr_i => p_bus.addr, -- address |
data_i => p_bus.wdata, -- data in |
data_o => clic_rdata, -- data out |
ack_o => clic_ack, -- transfer acknowledge |
-- cpu interrupt -- |
cpu_irq_o => clic_irq, -- trigger CPU's external IRQ |
-- external interrupt lines -- |
ext_irq_i => clic_xirq, -- IRQ, triggering on HIGH level |
ext_ack_o => clic_xack -- acknowledge |
); |
end generate; |
|
-- CLIC interrupt channels and priority -- |
clic_xirq(0) <= wdt_irq; -- highest priority |
clic_xirq(1) <= '0'; -- reserved |
clic_xirq(2) <= gpio_irq; |
clic_xirq(3) <= uart_irq; |
clic_xirq(4) <= spi_irq; |
clic_xirq(5) <= twi_irq; |
clic_xirq(6) <= ext_irq_i(0); |
clic_xirq(7) <= ext_irq_i(1); -- lowest priority |
|
-- external interrupt request acknowledge -- |
ext_ack_o(0) <= clic_xack(6); |
ext_ack_o(1) <= clic_xack(7); |
|
neorv32_clic_inst_false: |
if (IO_CLIC_USE = false) generate |
clic_rdata <= (others => '0'); |
clic_ack <= '0'; |
clic_irq <= '0'; |
clic_xack <= (others => '0'); |
end generate; |
|
|
-- Watch Dog Timer (WDT) ------------------------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
neorv32_wdt_inst_true: |
952,7 → 905,6
IO_TWI_USE => IO_TWI_USE, -- implement two-wire interface (TWI)? |
IO_PWM_USE => IO_PWM_USE, -- implement pulse-width modulation unit (PWM)? |
IO_WDT_USE => IO_WDT_USE, -- implement watch dog timer (WDT)? |
IO_CLIC_USE => IO_CLIC_USE, -- implement core local interrupt controller (CLIC)? |
IO_TRNG_USE => IO_TRNG_USE, -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE => IO_DEVNULL_USE -- implement dummy device (DEVNULL)? |
) |
/neorv32/trunk/rtl/fpga_specific/lattice_ice40up/neorv32_dmem.ice40up_spram.vhd
90,7 → 90,7
|
-- Access Control ------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
acc_en <= '1' when (addr_i >= DMEM_BASE) and (addr_i < std_ulogic_vector(unsigned(DMEM_BASE) + DMEM_SIZE)) else '0'; |
acc_en <= '1' when (unsigned(addr_i) >= unsigned(DMEM_BASE)) and (unsigned(addr_i) < unsigned(DMEM_BASE) + DMEM_SIZE) else '0'; |
mem_cs <= acc_en and (rden_i or wren_i); |
|
|
/neorv32/trunk/rtl/fpga_specific/lattice_ice40up/neorv32_imem.ice40up_spram.vhd
93,7 → 93,7
|
-- Access Control ------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
acc_en <= '1' when (addr_i >= IMEM_BASE) and (addr_i < std_ulogic_vector(unsigned(IMEM_BASE) + IMEM_SIZE)) else '0'; |
acc_en <= '1' when (unsigned(addr_i) >= unsigned(IMEM_BASE)) and (unsigned(addr_i) < unsigned(IMEM_BASE) + IMEM_SIZE) else '0'; |
mem_cs <= acc_en and (rden_i or wren_i); |
|
|
/neorv32/trunk/rtl/top_templates/neorv32_test_setup.vhd
102,7 → 102,6
IO_TWI_USE => false, -- implement two-wire interface (TWI)? |
IO_PWM_USE => false, -- 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_DEVNULL_USE => true -- implement dummy device (DEVNULL)? |
) |
140,8 → 139,8
-- PWM -- |
pwm_o => open, -- pwm channels |
-- Interrupts -- |
ext_irq_i => (others => '0'), -- external interrupt request |
ext_ack_o => open -- external interrupt request acknowledge |
msw_irq_i => '0', -- machine software interrupt |
mext_irq_i => '0' -- machine external interrupt |
); |
|
-- output -- |
/neorv32/trunk/sim/ghdl/ghdl_sim.sh
37,7 → 37,6
# |
ghdl -a --work=neorv32 $srcdir_core/neorv32_boot_rom.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_busswitch.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_clic.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_alu.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_bus.vhd |
/neorv32/trunk/sim/vivado/neorv32_tb_behav.wcfg
12,15 → 12,15
</db_ref> |
</db_ref_list> |
<zoom_setting> |
<ZoomStartTime time="125360934fs"></ZoomStartTime> |
<ZoomEndTime time="125396735fs"></ZoomEndTime> |
<Cursor1Time time="125479534fs"></Cursor1Time> |
<ZoomStartTime time="1345742867fs"></ZoomStartTime> |
<ZoomEndTime time="1345761168fs"></ZoomEndTime> |
<Cursor1Time time="1345799367fs"></Cursor1Time> |
</zoom_setting> |
<column_width_setting> |
<NameColumnWidth column_width="178"></NameColumnWidth> |
<ValueColumnWidth column_width="120"></ValueColumnWidth> |
<ValueColumnWidth column_width="116"></ValueColumnWidth> |
</column_width_setting> |
<WVObjectSize size="144" /> |
<WVObjectSize size="142" /> |
<wvobject type="divider" fp_name="divider273"> |
<obj_property name="label">CPU: Control.FETCH</obj_property> |
<obj_property name="DisplayName">label</obj_property> |
61,70 → 61,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> |
</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_input" type="array"> |
<obj_property name="ElementShortName">.ci_input[15:0]</obj_property> |
<obj_property name="ObjectShortName">.ci_input[15: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> |
<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_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.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> |
167,10 → 103,6
<obj_property name="ElementShortName">csr_rdata_o[31:0]</obj_property> |
<obj_property name="ObjectShortName">csr_rdata_o[31:0]</obj_property> |
</wvobject> |
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/clic_irq_i" type="logic"> |
<obj_property name="ElementShortName">clic_irq_i</obj_property> |
<obj_property name="ObjectShortName">clic_irq_i</obj_property> |
</wvobject> |
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/mtime_irq_i" type="logic"> |
<obj_property name="ElementShortName">mtime_irq_i</obj_property> |
<obj_property name="ObjectShortName">mtime_irq_i</obj_property> |
239,6 → 171,70
<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">#FFA500</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.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.sleep" type="logic"> |
<obj_property name="ElementShortName">.sleep</obj_property> |
<obj_property name="ObjectShortName">.sleep</obj_property> |
</wvobject> |
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/execute_engine.sleep_nxt" type="logic"> |
<obj_property name="ElementShortName">.sleep_nxt</obj_property> |
<obj_property name="ObjectShortName">.sleep_nxt</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> |
482,10 → 478,6
<obj_property name="ElementShortName">be_store_o</obj_property> |
<obj_property name="ObjectShortName">be_store_o</obj_property> |
</wvobject> |
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_bus_inst/MEM_EXT_TIMEOUT" type="other"> |
<obj_property name="ElementShortName">MEM_EXT_TIMEOUT</obj_property> |
<obj_property name="ObjectShortName">MEM_EXT_TIMEOUT</obj_property> |
</wvobject> |
<wvobject fp_name="/neorv32_tb/neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_bus_inst/i_arbiter" type="array"> |
<obj_property name="ElementShortName">i_arbiter</obj_property> |
<obj_property name="ObjectShortName">i_arbiter</obj_property> |
/neorv32/trunk/sim/neorv32_tb.vhd
159,7 → 159,6
IO_TWI_USE => true, -- implement two-wire interface (TWI)? |
IO_PWM_USE => true, -- implement pulse-width modulation unit (PWM)? |
IO_WDT_USE => true, -- implement watch dog timer (WDT)? |
IO_CLIC_USE => true, -- implement core local interrupt controller (CLIC)? |
IO_TRNG_USE => false, -- CANNOT BE SIMULATED! |
IO_DEVNULL_USE => true -- implement dummy device (DEVNULL)? |
) |
197,8 → 196,7
-- PWM -- |
pwm_o => open, -- pwm channels |
-- Interrupts -- |
ext_irq_i => (others => '0'), -- external interrupt request |
ext_ack_o => open -- external interrupt request acknowledge |
mext_irq_i => '0' -- machine external interrupt |
); |
|
-- TWI termination -- |
/neorv32/trunk/sw/bootloader/bootloader.c
176,7 → 176,6
|
// deactivate unused IO devices |
neorv32_wdt_disable(); |
neorv32_clic_disable(); |
neorv32_pwm_disable(); |
neorv32_spi_disable(); |
neorv32_trng_disable(); |
338,16 → 337,15
while ((UART_CT & (1<<UART_CT_TX_BUSY)) != 0); |
|
// reset performance counters (to benchmark actual application) |
asm volatile ("csrrw zero, mcycle, zero"); // will also clear 'cycle' |
asm volatile ("csrrw zero, mcycleh, zero"); // will also clear 'cycleh' |
asm volatile ("csrrw zero, minstret, zero"); // will also clear 'instret' |
asm volatile ("csrrw zero, minstreth, zero"); // will also clear 'instreth' |
asm volatile ("csrw mcycle, zero"); // will also clear 'cycle' |
asm volatile ("csrw mcycleh, zero"); // will also clear 'cycleh' |
asm volatile ("csrw minstret, zero"); // will also clear 'instret' |
asm volatile ("csrw minstreth, zero"); // will also clear 'instreth' |
|
// start app at instruction space base address |
while (1) { |
register uint32_t app_base = SYSINFO_ISPACE_BASE; |
asm volatile ("jalr zero, %0" : : "r" (app_base)); |
} |
register uint32_t app_base = SYSINFO_ISPACE_BASE; |
asm volatile ("jalr zero, %0" : : "r" (app_base)); |
while (1); |
} |
|
|
359,7 → 357,7
|
// make sure this was caused by MTIME IRQ |
uint32_t cause = neorv32_cpu_csr_read(CSR_MCAUSE); |
if (cause != EXCCODE_MTI) { // raw exception code for MTI |
if (cause != TRAP_CODE_MTI) { // raw exception code for MTI |
neorv32_uart_print("\n\nEXCEPTION: "); |
print_hex_word(cause); |
neorv32_uart_print(" @ 0x"); |
/neorv32/trunk/sw/common/bootloader_crt0.S
41,8 → 41,8
|
|
// SYSINFO |
.set SYSINFO_DSPACE_BASE, 0xFFFFFFF4 |
.set SYSINFO_DSPACE_SIZE, 0xFFFFFFFC |
.equ SYSINFO_DSPACE_BASE, 0xFFFFFFF4 |
.equ SYSINFO_DSPACE_SIZE, 0xFFFFFFFC |
|
|
_start: |
102,25 → 102,42
|
// ********************************************************* |
// dummy trap handler (for exceptions & IRQs) |
// bootloader has to be compiled without any CPU extensions |
// - especially without C extension! |
// tries to move on to next instruction |
// ********************************************************* |
.global __crt0_dummy_trap_handler |
.balign 4 |
__crt0_dummy_trap_handler: |
|
addi sp, sp, -4 |
addi sp, sp, -8 |
sw x8, 0(sp) |
sw x9, 4(sp) |
|
csrr x8, mcause |
blt x8, zero, __crt0_dummy_trap_handler_irq // skip mepc modification if interrupt |
|
__crt0_dummy_trap_handler_compute_return: |
csrr x8, mepc |
addi x8, x8, +4 // move on to next instruction if exception |
|
// is compressed instruction? |
lh x9, 0(x8) // get compressed instruction or lower 16 bits of uncompressed instruction that caused exception |
andi x9, x9, 3 // mask: isolate lowest 2 opcode bits (= 11 for uncompressed instructions) |
|
addi x8, x8, +2 // only this for compressed instructions |
csrw mepc, x8 // set return address when compressed instruction |
|
addi x8, zero, 3 |
bne x8, x9, __crt0_dummy_trap_handler_irq // jump if compressed instruction |
|
// is uncompressed instruction |
csrr x8, mepc |
addi x8, x8, +2 // add another 2 (making +4) for uncompressed instructions |
csrw mepc, x8 |
|
__crt0_dummy_trap_handler_irq: |
|
lw x8, 0(sp) |
addi sp, sp, +4 |
lw x9, 0(sp) |
lw x8, 4(sp) |
addi sp, sp, +8 |
|
mret |
|
/neorv32/trunk/sw/common/crt0.S
43,11 → 43,11
|
|
// IO region |
.set IO_BEGIN, 0xFFFFFF80 // start of processor-internal IO region |
.equ IO_BEGIN, 0xFFFFFF80 // start of processor-internal IO region |
|
// SYSINFO |
.set SYSINFO_DSPACE_BASE, 0xFFFFFFF4 |
.set SYSINFO_DSPACE_SIZE, 0xFFFFFFFC |
.equ SYSINFO_DSPACE_BASE, 0xFFFFFFF4 |
.equ SYSINFO_DSPACE_SIZE, 0xFFFFFFFC |
|
|
_start: |
58,9 → 58,8
// Clear register file |
// ********************************************************* |
__crt0_reg_file_clear: |
addi x0, x0, 0 // hardwired to zero |
//addi x0, x0, 0 // hardwired to zero |
addi x1, x0, 0 |
__crt0_reg_file_init: |
addi x2, x1, 0 |
addi x3, x2, 0 |
addi x4, x3, 0 |
78,7 → 77,7
|
// the following registers do not exist in rv32e |
// "__RISCV_EMBEDDED_CPU__" is automatically defined by the makefiles when |
// compiling for a rv32e architecture |
// compiling for a rv32e* architecture |
#ifndef __RISCV_EMBEDDED_CPU__ |
addi x16, x15, 0 |
addi x17, x16, 0 |
100,7 → 99,7
|
|
// ********************************************************* |
// TEST AREA / DANGER ZONE / IDEA-LAB |
// TEST AREA / DANGER ZONE |
// ********************************************************* |
__crt0_tests: |
nop |
128,23 → 127,13
|
|
// ********************************************************* |
// Init exception vector table (2x16 4-byte entries) with dummy handlers |
// Init trap handler base address |
// ********************************************************* |
__crt0_neorv32_rte_init: |
la x11, __crt0_neorv32_rte |
__crt0_neorv32_trap_init: |
la x11, __crt0_dummy_trap_handler |
csrw mtvec, x11 // set address of first-level exception handler |
|
lw x11, SYSINFO_DSPACE_BASE(zero) // data memory space base address |
la x12, __crt0_neorv32_rte_dummy_hanlder |
li x13, 2*16 // number of entries (16xEXC, 16xIRQ) |
|
__crt0_neorv32_rte_init_loop: |
sw x12, 0(x11) // set dummy handler |
add x11, x11, 4 |
add x13, x13, -1 |
bne zero, x13, __crt0_neorv32_rte_init_loop |
|
|
// ********************************************************* |
// Reset/deactivate IO/peripheral devices |
// Devices, that are not implemented, will cause a store access fault |
216,167 → 205,45
|
|
// ********************************************************* |
// NEORV32 runtime environment: First-level exception/interrupt handler |
// dummy trap handler (for exceptions & IRQs) |
// tries to move on to next instruction |
// ********************************************************* |
.align 4 |
__crt0_neorv32_rte: |
.global __crt0_dummy_trap_handler |
.balign 4 |
__crt0_dummy_trap_handler: |
|
// -------------------------------------------- |
// full context save |
// -------------------------------------------- |
#ifndef __RISCV_EMBEDDED_CPU__ |
addi sp, sp, -120 |
#else |
addi sp, sp, -56 |
#endif |
addi sp, sp, -8 |
sw x8, 0(sp) |
sw x9, 4(sp) |
|
sw ra,0(sp) |
sw gp,4(sp) |
sw tp,8(sp) |
sw t0,12(sp) |
sw t1,16(sp) |
sw t2,20(sp) |
sw s0,24(sp) |
sw s1,28(sp) |
sw a0,32(sp) |
sw a1,36(sp) |
sw a2,40(sp) |
sw a3,44(sp) |
sw a4,48(sp) |
sw a5,52(sp) |
#ifndef __RISCV_EMBEDDED_CPU__ |
sw a6,56(sp) |
sw a7,60(sp) |
sw s2,64(sp) |
sw s3,68(sp) |
sw s4,72(sp) |
sw s5,76(sp) |
sw s6,80(sp) |
sw s7,84(sp) |
sw s8,88(sp) |
sw s9,92(sp) |
sw s10,96(sp) |
sw s11,100(sp) |
sw t3,104(sp) |
sw t4,108(sp) |
sw t5,112(sp) |
sw t6,116(sp) |
#endif |
csrr x8, mcause |
blt x8, zero, __crt0_dummy_trap_handler_irq // skip mepc modification if interrupt |
|
__crt0_dummy_trap_handler_compute_return: |
csrr x8, mepc |
|
// -------------------------------------------- |
// get cause and prepare jump into vector table |
// -------------------------------------------- |
csrr t0, mcause // get cause code |
// is compressed instruction? |
lh x9, 0(x8) // get compressed instruction or lower 16 bits of uncompressed instruction that caused exception |
andi x9, x9, 3 // mask: isolate lowest 2 opcode bits (= 11 for uncompressed instructions) |
|
andi t1, t0, 0x0f // isolate cause ID |
slli t1, t1, 2 // make address offset |
lw ra, SYSINFO_DSPACE_BASE(zero) // data memory space base address |
add t1, t1, ra // get vetor table entry address (EXC vectors) |
addi x8, x8, +2 // only this for compressed instructions |
csrw mepc, x8 // set return address when compressed instruction |
|
csrr ra, mepc // get return address |
|
blt t0, zero, __crt0_neorv32_rte_is_irq // branch if this is an INTERRUPT |
|
|
// -------------------------------------------- |
// compute return address for EXCEPTIONS only |
// -------------------------------------------- |
__crt0_neorv32_rte_is_exc: |
|
// check if faulting instruction is compressed and adjust return address |
|
lh t0, 0(ra) // get compressed instruction or lower 16 bits of uncompressed instruction that caused exception |
addi t2, zero, 3 // mask |
and t0, t0, t2 // isolate lowest 2 opcode bits (= 11 for uncompressed instructions) |
|
addi ra, ra, +2 // only this for compressed instructions |
bne t0, t2, __crt0_neorv32_rte_execute // jump if compressed instruction |
addi x8, zero, 3 |
bne x8, x9, __crt0_dummy_trap_handler_irq // jump if compressed instruction |
|
addi ra, ra, +2 // add another 2 (making +4) for uncompressed instructions |
j __crt0_neorv32_rte_execute |
// is uncompressed instruction |
csrr x8, mepc |
addi x8, x8, +2 // add another 2 (making +4) for uncompressed instructions |
csrw mepc, x8 |
|
__crt0_dummy_trap_handler_irq: |
|
// -------------------------------------------- |
// vector table offset for INTERRUPTS only |
// -------------------------------------------- |
__crt0_neorv32_rte_is_irq: |
addi t1, t1, 16*4 |
lw x9, 0(sp) |
lw x8, 4(sp) |
addi sp, sp, +8 |
|
|
// -------------------------------------------- |
// call handler from vector table |
// -------------------------------------------- |
__crt0_neorv32_rte_execute: |
lw t0, 0(t1) // get base address of second-level handler |
|
// push ra |
addi sp, sp, -4 |
sw ra, 0(sp) |
|
jalr ra, t0 // call second-level handler |
|
// pop ra |
lw ra, 0(sp) |
addi sp, sp, +4 |
|
csrw mepc, ra |
|
|
// -------------------------------------------- |
// full context restore |
// -------------------------------------------- |
lw ra,0(sp) |
lw gp,4(sp) |
lw tp,8(sp) |
lw t0,12(sp) |
lw t1,16(sp) |
lw t2,20(sp) |
lw s0,24(sp) |
lw s1,28(sp) |
lw a0,32(sp) |
lw a1,36(sp) |
lw a2,40(sp) |
lw a3,44(sp) |
lw a4,48(sp) |
lw a5,52(sp) |
#ifndef __RISCV_EMBEDDED_CPU__ |
lw a6,56(sp) |
lw a7,60(sp) |
lw s2,64(sp) |
lw s3,68(sp) |
lw s4,72(sp) |
lw s5,76(sp) |
lw s6,80(sp) |
lw s7,84(sp) |
lw s8,88(sp) |
lw s9,92(sp) |
lw s10,96(sp) |
lw s11,100(sp) |
lw t3,104(sp) |
lw t4,108(sp) |
lw t5,112(sp) |
lw t6,116(sp) |
#endif |
|
#ifndef __RISCV_EMBEDDED_CPU__ |
addi sp, sp, +120 |
#else |
addi sp, sp, +56 |
#endif |
|
|
// -------------------------------------------- |
// this is the ONLY place where MRET should be used! |
// -------------------------------------------- |
mret |
|
|
// ********************************************************* |
// Dummy exception handler: just move on to next instruction |
// ********************************************************* |
__crt0_neorv32_rte_dummy_hanlder: |
ret |
|
.cfi_endproc |
.end |
/neorv32/trunk/sw/common/neorv32.ld
53,9 → 53,8
/* ************************************************* */ |
MEMORY |
{ |
rom (rx) : ORIGIN = 0x00000000, LENGTH = 16*1024 |
ram (rwx) : ORIGIN = 0x80000000 + 2*16*4, LENGTH = 8*1024 |
/* DO NOT REMOVE THE " + 2*16*4"!! */ |
rom (rx) : ORIGIN = 0x00000000, LENGTH = 16*1024 |
ram (rwx) : ORIGIN = 0x80000000, LENGTH = 8*1024 |
} |
/* ************************************************* */ |
|
/neorv32/trunk/sw/example/blink_led/main.c
68,7 → 68,7
|
// capture all exceptions and give debug info via UART |
// this is not required, but keeps us safe |
neorv32_rte_enable_debug_mode(); |
neorv32_rte_setup(); |
|
|
// init UART at default baud rate, no rx interrupt, no tx interrupt |
/neorv32/trunk/sw/example/coremark/core_portme.c
124,7 → 124,7
neorv32_cpu_dint(); |
|
// capture all exceptions and give debug information |
neorv32_rte_enable_debug_mode(); |
neorv32_rte_setup(); |
|
// setup neorv32 UART |
neorv32_uart_setup(BAUD_RATE, 0, 0); |
/neorv32/trunk/sw/example/cpu_test/main.c
109,11 → 109,6
return 0; |
} |
|
// check if CLIC unit is implemented at all |
if (neorv32_clic_available() == 0) { |
return 0; |
} |
|
// check if MTIME unit is implemented at all |
if (neorv32_mtime_available() == 0) { |
return 0; |
141,43 → 136,37
// intro2 |
neorv32_uart_printf("\n\nStarting tests...\n\n"); |
|
// install exception handler functions |
// configure RTE |
neorv32_rte_setup(); // this will install a full-detailed debug handler for all traps |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
int install_err = 0; |
install_err += neorv32_rte_exception_install(EXCID_I_MISALIGNED, global_trap_handler); |
install_err += neorv32_rte_exception_install(EXCID_I_ACCESS, global_trap_handler); |
install_err += neorv32_rte_exception_install(EXCID_I_ILLEGAL, global_trap_handler); |
install_err += neorv32_rte_exception_install(EXCID_BREAKPOINT, global_trap_handler); |
install_err += neorv32_rte_exception_install(EXCID_L_MISALIGNED, global_trap_handler); |
install_err += neorv32_rte_exception_install(EXCID_L_ACCESS, global_trap_handler); |
install_err += neorv32_rte_exception_install(EXCID_S_MISALIGNED, global_trap_handler); |
install_err += neorv32_rte_exception_install(EXCID_S_ACCESS, global_trap_handler); |
install_err += neorv32_rte_exception_install(EXCID_MENV_CALL, global_trap_handler); |
install_err += neorv32_rte_exception_install(EXCID_MTI, global_trap_handler); |
//install_err += neorv32_rte_exception_install(EXCID_MEI, -); done by neorv32_clic_handler_install |
// here we are overriding the default debug handlers |
install_err += neorv32_rte_exception_install(RTE_TRAP_I_MISALIGNED, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_I_ACCESS, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_I_ILLEGAL, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_BREAKPOINT, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_L_MISALIGNED, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_L_ACCESS, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_S_MISALIGNED, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_S_ACCESS, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_MENV_CALL, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_MTI, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_MSI, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_MTI, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_FIRQ_0, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_FIRQ_1, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_FIRQ_2, global_trap_handler); |
install_err += neorv32_rte_exception_install(RTE_TRAP_FIRQ_3, global_trap_handler); |
|
if (install_err) { |
neorv32_uart_printf("RTE install error!\n"); |
neorv32_uart_printf("RTE install error (%i)!\n", install_err); |
return 0; |
} |
#endif |
|
|
// install interrupt handler for clic WDT channel |
install_err += neorv32_clic_handler_install(CLIC_CH_WDT, global_trap_handler); |
|
if (install_err) { |
neorv32_uart_printf("CLIC install error!\n"); |
return 0; |
} |
|
|
#if (DETAILED_EXCEPTION_DEBUG==1) |
// enable debug mode for uninitialized exception/interrupt vectors |
// and overwrite previous exception handler installations |
// -> any exception/interrupt will show a message from the neorv32 runtime environment |
neorv32_rte_enable_debug_mode(); |
#endif |
|
|
// enable global interrupts |
neorv32_cpu_eint(); |
|
197,7 → 186,7
|
while(1) { |
asm volatile ("lb zero, 0(%[input_j])" : : [input_j] "r" (dmem_probe_addr)); |
if (exception_handler_answer == EXCCODE_L_ACCESS) { |
if (exception_handler_answer == TRAP_CODE_L_ACCESS) { |
break; |
} |
dmem_probe_addr++; |
229,7 → 218,7
|
while(1) { |
asm volatile ("lb zero, 0(%[input_j])" : : [input_j] "r" (imem_probe_addr)); |
if (exception_handler_answer == EXCCODE_L_ACCESS) { |
if (exception_handler_answer == TRAP_CODE_L_ACCESS) { |
break; |
} |
imem_probe_addr++; |
291,13 → 280,13
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; |
cpu_systime.uint64 = neorv32_cpu_get_systime(); |
uint64_t mtime_systime = neorv32_mtime_get_time(); |
|
uint64_t mtime_systime = neorv32_mtime_get_time() & 0xFFFFFFFFFFFF0000LL; |
// compute difference |
mtime_systime = mtime_systime - cpu_systime.uint64; |
|
if (cpu_systime.uint64 == mtime_systime) { |
if (mtime_systime < 100) { // diff should be pretty small |
test_ok(); |
} |
else { |
334,7 → 323,7
neorv32_cpu_csr_read(0xfff); // CSR 0xfff not implemented |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_I_ILLEGAL) { |
if (exception_handler_answer == TRAP_CODE_I_ILLEGAL) { |
test_ok(); |
} |
else { |
358,7 → 347,7
((void (*)(void))ADDR_UNALIGNED)(); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_I_MISALIGNED) { |
if (exception_handler_answer == TRAP_CODE_I_MISALIGNED) { |
neorv32_uart_printf("ok\n"); |
cnt_ok++; |
} |
384,7 → 373,7
((void (*)(void))ADDR_UNREACHABLE)(); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_I_ACCESS) { |
if (exception_handler_answer == TRAP_CODE_I_ACCESS) { |
test_ok(); |
} |
else { |
401,8 → 390,8
cnt_test++; |
|
// create test program in RAM |
static const uint32_t dummy_sub_program[2] = { |
0xDEAD007F, // undefined 32-bit opcode -> illegal instruction exception |
static const uint32_t dummy_sub_program[2] __attribute__((aligned(8))) = { |
0xDEAD007F, // undefined 32-bit instruction (invalid opcode) -> illegal instruction exception |
0x00008067 // ret (32-bit) |
}; |
|
410,7 → 399,7
asm volatile ( "jalr ra, %0 " : "=r" (tmp_a) : "r" (tmp_a)); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_I_ILLEGAL) { |
if (exception_handler_answer == TRAP_CODE_I_ILLEGAL) { |
test_ok(); |
} |
else { |
431,7 → 420,7
cnt_test++; |
|
// create test program in RAM |
static const uint32_t dummy_sub_program_ci[2] = { |
static const uint32_t dummy_sub_program_ci[2] __attribute__((aligned(8))) = { |
0x00000001, // 2nd: official_illegal_op | 1st: NOP -> illegal instruction exception |
0x00008067 // ret (32-bit) |
}; |
440,7 → 429,7
asm volatile ( "jalr ra, %0 " : "=r" (tmp_a) : "r" (tmp_a)); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_I_ILLEGAL) { |
if (exception_handler_answer == TRAP_CODE_I_ILLEGAL) { |
test_ok(); |
} |
else { |
463,7 → 452,7
asm volatile("EBREAK"); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_BREAKPOINT) { |
if (exception_handler_answer == TRAP_CODE_BREAKPOINT) { |
test_ok(); |
} |
else { |
483,7 → 472,7
asm volatile ("lw zero, %[input_i](zero)" : : [input_i] "i" (ADDR_UNALIGNED)); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_L_MISALIGNED) { |
if (exception_handler_answer == TRAP_CODE_L_MISALIGNED) { |
test_ok(); |
} |
else { |
503,7 → 492,7
dummy_dst = MMR_UNREACHABLE; |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_L_ACCESS) { |
if (exception_handler_answer == TRAP_CODE_L_ACCESS) { |
test_ok(); |
} |
else { |
523,7 → 512,7
asm volatile ("sw zero, %[input_i](zero)" : : [input_i] "i" (ADDR_UNALIGNED)); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_S_MISALIGNED) { |
if (exception_handler_answer == TRAP_CODE_S_MISALIGNED) { |
test_ok(); |
} |
else { |
543,7 → 532,7
MMR_UNREACHABLE = 0; |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_S_ACCESS) { |
if (exception_handler_answer == TRAP_CODE_S_ACCESS) { |
test_ok(); |
} |
else { |
562,7 → 551,7
asm volatile("ECALL"); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_MENV_CALL) { |
if (exception_handler_answer == TRAP_CODE_MENV_CALL) { |
test_ok(); |
} |
else { |
576,79 → 565,103
// ---------------------------------------------------------- |
exception_handler_answer = 0xFFFFFFFF; |
neorv32_uart_printf("IRQ MTI: "); |
cnt_test++; |
|
// force MTIME IRQ |
neorv32_mtime_set_timecmp(0); |
if (neorv32_mtime_available()) { |
cnt_test++; |
|
// wait some time for the IRQ to arrive the CPU |
asm volatile("nop"); |
asm volatile("nop"); |
asm volatile("nop"); |
asm volatile("nop"); |
// force MTIME IRQ |
neorv32_mtime_set_timecmp(0); |
|
// wait some time for the IRQ to arrive the CPU |
asm volatile("nop"); |
asm volatile("nop"); |
asm volatile("nop"); |
asm volatile("nop"); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_MTI) { |
test_ok(); |
if (exception_handler_answer == TRAP_CODE_MTI) { |
test_ok(); |
} |
else { |
test_fail(); |
} |
#endif |
|
// no more mtime interrupts |
neorv32_mtime_set_timecmp(-1); |
} |
else { |
test_fail(); |
neorv32_uart_printf("skipped (WDT not implemented)\n"); |
} |
#endif |
|
// no more mtime interrupts |
neorv32_mtime_set_timecmp(-1); |
|
|
// ---------------------------------------------------------- |
// Machine external interrupt (via CLIC) |
// Fast interrupt |
// ---------------------------------------------------------- |
exception_handler_answer = 0xFFFFFFFF; |
neorv32_uart_printf("IRQ MEI: "); |
cnt_test++; |
neorv32_uart_printf("FIRQ0 (WDT): "); |
|
// manually trigger CLIC channel (watchdog interrupt) |
neorv32_clic_trigger_irq(CLIC_CH_WDT); |
if (neorv32_wdt_available()) { |
cnt_test++; |
|
// wait some time for the IRQ to arrive the CPU |
asm volatile("nop"); |
asm volatile("nop"); |
asm volatile("nop"); |
asm volatile("nop"); |
// configure WDT |
neorv32_wdt_setup(CLK_PRSC_2, 0); // lowest clock prescaler, trigger IRQ on timeout |
neorv32_wdt_reset(); // reset watchdog |
neorv32_wdt_force(); // force watchdog into action |
|
// wait some time for the IRQ to arrive the CPU |
asm volatile("nop"); |
asm volatile("nop"); |
asm volatile("nop"); |
asm volatile("nop"); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == EXCCODE_MEI) { |
test_ok(); |
if (exception_handler_answer == TRAP_CODE_FIRQ_0) { |
test_ok(); |
} |
else { |
test_fail(); |
} |
#endif |
} |
else { |
test_fail(); |
neorv32_uart_printf("skipped (WDT not implemented)\n"); |
} |
#endif |
|
|
// ---------------------------------------------------------- |
// Test WFI ("sleep") instructions |
// Test WFI ("sleep") instructions, wakeup via MTIME |
// ---------------------------------------------------------- |
exception_handler_answer = 0xFFFFFFFF; |
neorv32_uart_printf("WFI: "); |
cnt_test++; |
|
// program timer to wake up |
neorv32_mtime_set_timecmp(neorv32_mtime_get_time() + 1000); |
if (neorv32_mtime_available()) { |
cnt_test++; |
|
// put CPU into sleep mode |
asm volatile ("wfi"); |
// program timer to wake up |
neorv32_mtime_set_timecmp(neorv32_mtime_get_time() + 1000); |
|
if (exception_handler_answer != EXCCODE_MTI) { |
test_fail(); |
// put CPU into sleep mode |
asm volatile ("wfi"); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer != TRAP_CODE_MTI) { |
test_fail(); |
} |
else { |
test_ok(); |
} |
#endif |
} |
else { |
test_ok(); |
neorv32_uart_printf("skipped (MTIME not implemented)\n"); |
} |
|
|
|
// error report |
// ---------------------------------------------------------- |
// Final test reports |
// ---------------------------------------------------------- |
neorv32_uart_printf("\n\nTests: %i\nOK: %i\nFAIL: %i\n\n", cnt_test, cnt_ok, cnt_fail); |
|
// final result |
/neorv32/trunk/sw/example/demo_pwm/main.c
70,7 → 70,7
|
// capture all exceptions and give debug info via UART |
// this is not required, but keeps us safe |
neorv32_rte_enable_debug_mode(); |
neorv32_rte_setup(); |
|
|
// init UART at default baud rate, no rx interrupt, no tx interrupt |
/neorv32/trunk/sw/example/demo_trng/main.c
76,7 → 76,7
|
// capture all exceptions and give debug info via UART |
// this is not required, but keeps us safe |
neorv32_rte_enable_debug_mode(); |
neorv32_rte_setup(); |
|
|
// init UART at default baud rate, no rx interrupt, no tx interrupt |
/neorv32/trunk/sw/example/demo_twi/main.c
40,6 → 40,7
**************************************************************************/ |
|
#include <neorv32.h> |
#include <string.h> |
|
|
/**********************************************************************//** |
79,7 → 80,7
|
// capture all exceptions and give debug info via UART |
// this is not required, but keeps us safe |
neorv32_rte_enable_debug_mode(); |
neorv32_rte_setup(); |
|
|
// init UART at default baud rate, no rx interrupt, no tx interrupt |
/neorv32/trunk/sw/example/demo_wdt/main.c
73,7 → 73,7
|
// capture all exceptions and give debug info via UART |
// this is not required, but keeps us safe |
neorv32_rte_enable_debug_mode(); |
neorv32_rte_setup(); |
|
|
// init UART at default baud rate, no rx interrupt, no tx interrupt |
/neorv32/trunk/sw/example/game_of_life/main.c
90,7 → 90,7
|
// capture all exceptions and give debug info via UART |
// this is not required, but keeps us safe |
neorv32_rte_enable_debug_mode(); |
neorv32_rte_setup(); |
|
|
// init UART at default baud rate, no rx interrupt, no tx interrupt |
/neorv32/trunk/sw/lib/include/neorv32_clic.h
File deleted
/neorv32/trunk/sw/lib/include/neorv32.h
64,7 → 64,7
|
CSR_MSCRATCH = 0x340, /**< 0x340 - mscratch (r/w): Machine scratch register */ |
CSR_MEPC = 0x341, /**< 0x341 - mepc (r/w): Machine exception program counter */ |
CSR_MCAUSE = 0x342, /**< 0x342 - mcause (r/w): Machine trap cause */ |
CSR_MCAUSE = 0x342, /**< 0x342 - mcause (r/-): Machine trap cause */ |
CSR_MTVAL = 0x343, /**< 0x343 - mtval (r/w): Machine bad address or instruction */ |
CSR_MIP = 0x344, /**< 0x344 - mip (r/w): Machine interrupt pending register */ |
|
101,9 → 101,14
* CPU <b>mie</b> CSR (r/w): Machine interrupt enable (RISC-V spec.) |
**************************************************************************/ |
enum NEORV32_CPU_MIE_enum { |
CPU_MIE_MSIE = 3, /**< CPU mie CSR (3): Machine software interrupt enable (r/w) */ |
CPU_MIE_MTIE = 7, /**< CPU mie CSR (7): Machine timer interrupt (MTIME) enable bit (r/w) */ |
CPU_MIE_MEIE = 11 /**< CPU mie CSR (11): Machine external interrupt (via CLIC) enable bit (r/w) */ |
CPU_MIE_MSIE = 3, /**< CPU mie CSR (3): Machine software interrupt enable (r/w) */ |
CPU_MIE_MTIE = 7, /**< CPU mie CSR (7): Machine timer interrupt enable bit (r/w) */ |
CPU_MIE_MEIE = 11, /**< CPU mie CSR (11): Machine external interrupt enable bit (r/w) */ |
|
CPU_MIE_FIRQ0E = 16, /**< CPU mie CSR (16): Fast interrupt channel 0 enable bit (r/w) */ |
CPU_MIE_FIRQ1E = 17, /**< CPU mie CSR (17): Fast interrupt channel 1 enable bit (r/w) */ |
CPU_MIE_FIRQ2E = 18, /**< CPU mie CSR (18): Fast interrupt channel 2 enable bit (r/w) */ |
CPU_MIE_FIRQ3E = 19 /**< CPU mie CSR (19): Fast interrupt channel 3 enable bit (r/w) */ |
}; |
|
|
111,9 → 116,14
* CPU <b>mip</b> CSR (r/-): Machine interrupt pending (RISC-V spec.) |
**************************************************************************/ |
enum NEORV32_CPU_MIP_enum { |
CPU_MIP_MSIP = 3, /**< CPU mip CSR (3): Machine software interrupt pending (r/-) */ |
CPU_MIP_MTIP = 7, /**< CPU mip CSR (7): Machine timer interrupt (MTIME) pending (r/-) */ |
CPU_MIP_MEIP = 11 /**< CPU mip CSR (11): Machine external interrupt (via CLIC) pending (r/-) */ |
CPU_MIP_MSIP = 3, /**< CPU mip CSR (3): Machine software interrupt pending (r/-) */ |
CPU_MIP_MTIP = 7, /**< CPU mip CSR (7): Machine timer interrupt pending (r/-) */ |
CPU_MIP_MEIP = 11, /**< CPU mip CSR (11): Machine external interrupt pending (r/-) */ |
|
CPU_MIP_FIRQ0P = 16, /**< CPU mip CSR (16): Fast interrupt channel 0 pending (r/-) */ |
CPU_MIP_FIRQ1P = 17, /**< CPU mip CSR (17): Fast interrupt channel 1 pending (r/-) */ |
CPU_MIP_FIRQ2P = 18, /**< CPU mip CSR (18): Fast interrupt channel 2 pending (r/-) */ |
CPU_MIP_FIRQ3P = 19 /**< CPU mip CSR (19): Fast interrupt channel 3 pending (r/-) */ |
}; |
|
|
133,40 → 143,25
|
|
/**********************************************************************//** |
* Exception IDs. |
* Trap codes from mcause CSR. |
**************************************************************************/ |
enum NEORV32_EXCEPTION_IDS_enum { |
EXCID_I_MISALIGNED = 0, /**< 0: Instruction address misaligned */ |
EXCID_I_ACCESS = 1, /**< 1: Instruction (bus) access fault */ |
EXCID_I_ILLEGAL = 2, /**< 2: Illegal instruction */ |
EXCID_BREAKPOINT = 3, /**< 3: Breakpoint (EBREAK instruction) */ |
EXCID_L_MISALIGNED = 4, /**< 4: Load address misaligned */ |
EXCID_L_ACCESS = 5, /**< 5: Load (bus) access fault */ |
EXCID_S_MISALIGNED = 6, /**< 6: Store address misaligned */ |
EXCID_S_ACCESS = 7, /**< 7: Store (bus) access fault */ |
EXCID_MENV_CALL = 11, /**< 11: Environment call from machine mode (ECALL instruction) */ |
EXCID_MSI = 19, /**< 16 + 3: Machine software interrupt */ |
EXCID_MTI = 23, /**< 16 + 7: Machine timer interrupt (via MTIME) */ |
EXCID_MEI = 27 /**< 16 + 11: Machine external interrupt (via CLIC) */ |
}; |
|
|
/**********************************************************************//** |
* Exception codes from mcause CSR. |
**************************************************************************/ |
enum NEORV32_EXCEPTION_CODES_enum { |
EXCCODE_I_MISALIGNED = 0x00000000, /**< 0: Instruction address misaligned */ |
EXCCODE_I_ACCESS = 0x00000001, /**< 1: Instruction (bus) access fault */ |
EXCCODE_I_ILLEGAL = 0x00000002, /**< 2: Illegal instruction */ |
EXCCODE_BREAKPOINT = 0x00000003, /**< 3: Breakpoint (EBREAK instruction) */ |
EXCCODE_L_MISALIGNED = 0x00000004, /**< 4: Load address misaligned */ |
EXCCODE_L_ACCESS = 0x00000005, /**< 5: Load (bus) access fault */ |
EXCCODE_S_MISALIGNED = 0x00000006, /**< 6: Store address misaligned */ |
EXCCODE_S_ACCESS = 0x00000007, /**< 7: Store (bus) access fault */ |
EXCCODE_MENV_CALL = 0x0000000b, /**< 11: Environment call from machine mode (ECALL instruction) */ |
EXCCODE_MSI = 0x80000003, /**< 16 + 3: Machine software interrupt */ |
EXCCODE_MTI = 0x80000007, /**< 16 + 7: Machine timer interrupt (via MTIME) */ |
EXCCODE_MEI = 0x8000000b /**< 16 + 11: Machine external interrupt (via CLIC) */ |
TRAP_CODE_I_MISALIGNED = 0x00000000, /**< 0.0: Instruction address misaligned */ |
TRAP_CODE_I_ACCESS = 0x00000001, /**< 0.1: Instruction (bus) access fault */ |
TRAP_CODE_I_ILLEGAL = 0x00000002, /**< 0.2: Illegal instruction */ |
TRAP_CODE_BREAKPOINT = 0x00000003, /**< 0.3: Breakpoint (EBREAK instruction) */ |
TRAP_CODE_L_MISALIGNED = 0x00000004, /**< 0.4: Load address misaligned */ |
TRAP_CODE_L_ACCESS = 0x00000005, /**< 0.5: Load (bus) access fault */ |
TRAP_CODE_S_MISALIGNED = 0x00000006, /**< 0.6: Store address misaligned */ |
TRAP_CODE_S_ACCESS = 0x00000007, /**< 0.7: Store (bus) access fault */ |
TRAP_CODE_MENV_CALL = 0x0000000b, /**< 0.11: Environment call from machine mode (ECALL instruction) */ |
TRAP_CODE_MSI = 0x80000003, /**< 1.3: Machine software interrupt */ |
TRAP_CODE_MTI = 0x80000007, /**< 1.7: Machine timer interrupt */ |
TRAP_CODE_MEI = 0x8000000b, /**< 1.11: Machine external interrupt */ |
TRAP_CODE_FIRQ_0 = 0x80000010, /**< 1.16: Fast interrupt channel 0 */ |
TRAP_CODE_FIRQ_1 = 0x80000011, /**< 1.17: Fast interrupt channel 1 */ |
TRAP_CODE_FIRQ_2 = 0x80000012, /**< 1.18: Fast interrupt channel 2 */ |
TRAP_CODE_FIRQ_3 = 0x80000013 /**< 1.19: Fast interrupt channel 3 */ |
}; |
|
|
235,53 → 230,6
|
|
/**********************************************************************//** |
* @name IO Device: Core Local Interrupts Controller (CLIC) |
**************************************************************************/ |
/**@{*/ |
/** CLIC control register (r/w) */ |
#define CLIC_CT (*(IO_REG32 0xFFFFFF88UL)) |
|
/** CLIC control register bits */ |
enum NEORV32_CLIC_CT_enum { |
CLIC_CT_SRC0 = 0, /**< CLIC control register(0) (r/-): IRQ source bit 0 */ |
CLIC_CT_SRC1 = 1, /**< CLIC control register(1) (r/-): IRQ source bit 1 */ |
CLIC_CT_SRC2 = 2, /**< CLIC control register(2) (r/-): IRQ source bit 2 */ |
CLIC_CT_ACK = 3, /**< CLIC control register(3) (-/w): Acknowledge current IRQ when set, auto-clears when set */ |
CLIC_CT_EN = 4, /**< CLIC control register(4) (r/w): Unit enable */ |
|
CLIC_CT_IRQ0_EN = 8, /**< CLIC control register(8) (r/w): Enable IRQ channel 0 */ |
CLIC_CT_IRQ1_EN = 9, /**< CLIC control register(9) (r/w): Enable IRQ channel 1 */ |
CLIC_CT_IRQ2_EN = 10, /**< CLIC control register(10) (r/w): Enable IRQ channel 2 */ |
CLIC_CT_IRQ3_EN = 11, /**< CLIC control register(11) (r/w): Enable IRQ channel 3 */ |
CLIC_CT_IRQ4_EN = 12, /**< CLIC control register(12) (r/w): Enable IRQ channel 4 */ |
CLIC_CT_IRQ5_EN = 13, /**< CLIC control register(13) (r/w): Enable IRQ channel 5 */ |
CLIC_CT_IRQ6_EN = 14, /**< CLIC control register(14) (r/w): Enable IRQ channel 6 */ |
CLIC_CT_IRQ7_EN = 15, /**< CLIC control register(15) (r/w): Enable IRQ channel 7 */ |
|
CLIC_CT_SW_IRQ_SRC0 = 16, /**< CLIC control register(16) (-/w): SW IRQ trigger, IRQ select bit 0, auto-clears when set */ |
CLIC_CT_SW_IRQ_SRC1 = 17, /**< CLIC control register(17) (-/w): SW IRQ trigger, IRQ select bit 1, auto-clears when set */ |
CLIC_CT_SW_IRQ_SRC2 = 18, /**< CLIC control register(18) (-/w): SW IRQ trigger, IRQ select bit 2, auto-clears when set */ |
CLIC_CT_SW_IRQ_EN = 19 /**< CLIC control register(19) (-/w): SW IRQ trigger enable, auto-clears when set */ |
}; |
/**@}*/ |
|
|
/**********************************************************************//** |
* Core-local interrupt controller IRQ channel |
**************************************************************************/ |
enum NEORV32_CLIC_CHANNELS_enum { |
CLIC_CH_WDT = 0, /**< CLIC channel 0: Watchdog timer overflow interrupt */ |
CLIC_CH_RES = 1, /**< CLIC channel 1: reserved */ |
CLIC_CH_GPIO = 2, /**< CLIC channel 2: GPIO pin-change interrupt */ |
CLIC_CH_UART = 3, /**< CLIC channel 3: UART RX available or TX done interrupt */ |
CLIC_CH_SPI = 4, /**< CLIC channel 4: SPI transmission done interrupt */ |
CLIC_CH_TWI = 5, /**< CLIC channel 5: TWI transmission done interrupt */ |
CLIC_CH_EXT0 = 6, /**< CLIC channel 6: Processor-external interrupt request 0 */ |
CLIC_CH_EXT1 = 7 /**< CLIC channel 7: Processor-external interrupt request 1 */ |
}; |
|
|
/**********************************************************************//** |
* @name IO Device: Watchdog Timer (WDT) |
**************************************************************************/ |
/**@{*/ |
543,7 → 491,7
SYSINFO_FEATURES_IO_TWI = 20, /**< SYSINFO_FEATURES (20) (r/-): Two-wire interface implemented when 1 (via IO_TWI_USE generic) */ |
SYSINFO_FEATURES_IO_PWM = 21, /**< SYSINFO_FEATURES (21) (r/-): Pulse-width modulation unit implemented when 1 (via IO_PWM_USE generic) */ |
SYSINFO_FEATURES_IO_WDT = 22, /**< SYSINFO_FEATURES (22) (r/-): Watchdog timer implemented when 1 (via IO_WDT_USE generic) */ |
SYSINFO_FEATURES_IO_CLIC = 23, /**< SYSINFO_FEATURES (23) (r/-): Core-local interrupt controller implemented when 1 (via IO_CLIC_USE generic) */ |
|
SYSINFO_FEATURES_IO_TRNG = 24, /**< SYSINFO_FEATURES (24) (r/-): True random number generator implemented when 1 (via IO_TRNG_USE generic) */ |
SYSINFO_FEATURES_IO_DEVNULL = 25 /**< SYSINFO_FEATURES (24) (r/-): Dummy device implemented when 1 (via IO_DEVNULL_USE generic) */ |
}; |
559,7 → 507,6
#include "neorv32_rte.h" |
|
// io/peripheral devices |
#include "neorv32_clic.h" |
#include "neorv32_gpio.h" |
#include "neorv32_mtime.h" |
#include "neorv32_pwm.h" |
/neorv32/trunk/sw/lib/include/neorv32_rte.h
42,10 → 42,32
#ifndef neorv32_rte_h |
#define neorv32_rte_h |
|
/**********************************************************************//** |
* RTE trap IDs. |
**************************************************************************/ |
enum NEORV32_RTE_TRAP_enum { |
RTE_TRAP_I_MISALIGNED = 0, /**< Instruction address misaligned */ |
RTE_TRAP_I_ACCESS = 1, /**< Instruction (bus) access fault */ |
RTE_TRAP_I_ILLEGAL = 2, /**< Illegal instruction */ |
RTE_TRAP_BREAKPOINT = 3, /**< Breakpoint (EBREAK instruction) */ |
RTE_TRAP_L_MISALIGNED = 4, /**< Load address misaligned */ |
RTE_TRAP_L_ACCESS = 5, /**< Load (bus) access fault */ |
RTE_TRAP_S_MISALIGNED = 6, /**< Store address misaligned */ |
RTE_TRAP_S_ACCESS = 7, /**< Store (bus) access fault */ |
RTE_TRAP_MENV_CALL = 8, /**< Environment call from machine mode (ECALL instruction) */ |
RTE_TRAP_MSI = 9, /**< Machine software interrupt */ |
RTE_TRAP_MTI = 10, /**< Machine timer interrupt */ |
RTE_TRAP_MEI = 11, /**< Machine external interrupt */ |
RTE_TRAP_FIRQ_0 = 12, /**< Fast interrupt channel 0 */ |
RTE_TRAP_FIRQ_1 = 13, /**< Fast interrupt channel 1 */ |
RTE_TRAP_FIRQ_2 = 14, /**< Fast interrupt channel 2 */ |
RTE_TRAP_FIRQ_3 = 15 /**< Fast interrupt channel 3 */ |
}; |
|
// prototypes |
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_setup(void); |
int neorv32_rte_exception_install(uint8_t id, void (*handler)(void)); |
int neorv32_rte_exception_uninstall(uint8_t id); |
|
void neorv32_rte_print_hw_config(void); |
void neorv32_rte_print_hw_version(void); |
/neorv32/trunk/sw/lib/source/neorv32_clic.c
File deleted
/neorv32/trunk/sw/lib/source/neorv32_cpu.c
53,7 → 53,8
**************************************************************************/ |
int neorv32_cpu_irq_enable(uint8_t irq_sel) { |
|
if ((irq_sel != CPU_MIE_MSIE) && (irq_sel != CPU_MIE_MTIE) && (irq_sel != CPU_MIE_MEIE)) { |
if ((irq_sel != CPU_MIE_MSIE) && (irq_sel != CPU_MIE_MTIE) && (irq_sel != CPU_MIE_MEIE) && |
(irq_sel != CPU_MIE_FIRQ0E) && (irq_sel != CPU_MIE_FIRQ1E) && (irq_sel != CPU_MIE_FIRQ2E) && (irq_sel != CPU_MIE_FIRQ3E)) { |
return 1; |
} |
|
71,7 → 72,8
**************************************************************************/ |
int neorv32_cpu_irq_disable(uint8_t irq_sel) { |
|
if ((irq_sel != CPU_MIE_MSIE) && (irq_sel != CPU_MIE_MTIE) && (irq_sel != CPU_MIE_MEIE)) { |
if ((irq_sel != CPU_MIE_MSIE) && (irq_sel != CPU_MIE_MTIE) && (irq_sel != CPU_MIE_MEIE) && |
(irq_sel != CPU_MIE_FIRQ0E) && (irq_sel != CPU_MIE_FIRQ1E) && (irq_sel != CPU_MIE_FIRQ2E) && (irq_sel != CPU_MIE_FIRQ3E)) { |
return 1; |
} |
|
/neorv32/trunk/sw/lib/source/neorv32_rte.c
42,30 → 42,34
#include "neorv32.h" |
#include "neorv32_rte.h" |
|
// Privates |
static void __neorv32_rte_dummy_exc_handler(void) __attribute__((unused)); |
/**********************************************************************//** |
* The >private< trap vector look-up table of the NEORV32 RTE. |
**************************************************************************/ |
static uint32_t __neorv32_rte_vector_lut[16] __attribute__((unused)); // trap handler vector table |
|
// private functions |
static void __attribute__((__interrupt__)) __neorv32_rte_core(void) __attribute__((aligned(16))) __attribute__((unused)); |
static void __neorv32_rte_debug_exc_handler(void) __attribute__((unused)); |
static void __neorv32_rte_print_true_false(int state) __attribute__((unused)); |
|
|
/**********************************************************************//** |
* Setup NEORV32 runtime environment in debug mode. |
* Setup NEORV32 runtime environment. |
* |
* @note This function installs a debug handler for ALL exception and interrupt sources, which |
* gives detailed information about the exception/interrupt. Call this function before you |
* install custom handler functions via neorv32_rte_exception_install(uint8_t exc_id, void (*handler)(void)), |
* since this function will override all installed exception handlers. |
* |
* @warning This function should be used for debugging only, since it only shows the uninitialize exception/interrupt, but |
* does not resolve the cause. Hence, it cannot guarantee to resume normal application execution after showing the debug messages. |
* gives detailed information about the exception/interrupt. Actual handler can be installed afterwards |
* via neorv32_rte_exception_install(uint8_t id, void (*handler)(void)). |
**************************************************************************/ |
void neorv32_rte_enable_debug_mode(void) { |
void neorv32_rte_setup(void) { |
|
uint8_t id; |
// configure trap handler base address |
uint32_t mtvec_base = (uint32_t)(&__neorv32_rte_core); |
neorv32_cpu_csr_write(CSR_MTVEC, mtvec_base); |
|
// install debug handler for all sources |
for (id=0; id<32; id++) { |
neorv32_rte_exception_install(id, __neorv32_rte_debug_exc_handler); |
uint8_t id; |
for (id = 0; id < (sizeof(__neorv32_rte_vector_lut)/sizeof(__neorv32_rte_vector_lut[0])); id++) { |
neorv32_rte_exception_uninstall(id); // this will configure the debug handler |
} |
} |
|
74,29 → 78,33
* Install exception handler function to NEORV32 runtime environment. |
* |
* @note This function automatically activates the according CSR.mie bits when installing handlers for |
* the MTIME (MTI), CLIC (MEI) or machine software interrupt (MSI). The global interrupt enable bit mstatus.mie has |
* the MTIME (MTI), CLIC (MEI), machine software interrupt (MSI) or a fast IRQ. The global interrupt enable bit mstatus.mie has |
* to be set by the user via neorv32_cpu_eint(void). |
* |
* @param[in] exc_id Identifier (type) of the targeted exception. See #NEORV32_EXCEPTION_IDS_enum. |
* @param[in] handler The actual handler function for the specified exception (function must be of type "void function(void);"). |
* return 0 if success, 1 if error (invalid exc_id or targeted exception not supported). |
* @param[in] id Identifier (type) of the targeted exception. See #NEORV32_RTE_TRAP_enum. |
* @param[in] handler The actual handler function for the specified exception (function MUST be of type "void function(void);"). |
* return 0 if success, 1 if error (invalid id or targeted exception not supported). |
**************************************************************************/ |
int neorv32_rte_exception_install(uint8_t exc_id, void (*handler)(void)) { |
int neorv32_rte_exception_install(uint8_t id, void (*handler)(void)) { |
|
// id valid? |
if ((exc_id == EXCID_I_MISALIGNED) || (exc_id == EXCID_I_ACCESS) || (exc_id == EXCID_I_ILLEGAL) || |
(exc_id == EXCID_BREAKPOINT) || (exc_id == EXCID_L_MISALIGNED) || (exc_id == EXCID_L_ACCESS) || |
(exc_id == EXCID_S_MISALIGNED) || (exc_id == EXCID_S_ACCESS) || (exc_id == EXCID_MENV_CALL) || |
(exc_id == EXCID_MSI) || (exc_id == EXCID_MTI) || (exc_id == EXCID_MEI)) { |
if ((id == RTE_TRAP_I_MISALIGNED) || (id == RTE_TRAP_I_ACCESS) || (id == RTE_TRAP_I_ILLEGAL) || |
(id == RTE_TRAP_BREAKPOINT) || (id == RTE_TRAP_L_MISALIGNED) || (id == RTE_TRAP_L_ACCESS) || |
(id == RTE_TRAP_S_MISALIGNED) || (id == RTE_TRAP_S_ACCESS) || (id == RTE_TRAP_MENV_CALL) || |
(id == RTE_TRAP_MSI) || (id == RTE_TRAP_MTI) || (id == RTE_TRAP_MEI) || |
(id == RTE_TRAP_FIRQ_0) || (id == RTE_TRAP_FIRQ_1) || (id == RTE_TRAP_FIRQ_2) || (id == RTE_TRAP_FIRQ_3)) { |
|
if (exc_id == EXCID_MSI) { neorv32_cpu_irq_enable(CPU_MIE_MSIE); } // activate software interrupt |
if (exc_id == EXCID_MTI) { neorv32_cpu_irq_enable(CPU_MIE_MTIE); } // activate timer interrupt |
if (exc_id == EXCID_MEI) { neorv32_cpu_irq_enable(CPU_MIE_MEIE); } // activate external interrupt |
|
uint32_t vt_base = SYSINFO_DSPACE_BASE; // base address of vector table |
vt_base = vt_base + (((uint32_t)exc_id) << 2); |
(*(IO_REG32 (vt_base))) = (uint32_t)handler; |
if (id == RTE_TRAP_MSI) { neorv32_cpu_irq_enable(CPU_MIE_MSIE); } // activate software interrupt |
if (id == RTE_TRAP_MTI) { neorv32_cpu_irq_enable(CPU_MIE_MTIE); } // activate timer interrupt |
if (id == RTE_TRAP_MEI) { neorv32_cpu_irq_enable(CPU_MIE_MEIE); } // activate external interrupt |
if (id == RTE_TRAP_FIRQ_0) { neorv32_cpu_irq_enable(CPU_MIE_FIRQ0E); } // activate fast interrupt channel 0 |
if (id == RTE_TRAP_FIRQ_1) { neorv32_cpu_irq_enable(CPU_MIE_FIRQ1E); } // activate fast interrupt channel 1 |
if (id == RTE_TRAP_FIRQ_2) { neorv32_cpu_irq_enable(CPU_MIE_FIRQ2E); } // activate fast interrupt channel 2 |
if (id == RTE_TRAP_FIRQ_3) { neorv32_cpu_irq_enable(CPU_MIE_FIRQ3E); } // activate fast interrupt channel 3 |
|
__neorv32_rte_vector_lut[id] = (uint32_t)handler; // install handler |
|
return 0; |
} |
return 1; |
105,30 → 113,33
|
/**********************************************************************//** |
* Uninstall exception handler function from NEORV32 runtime environment, which was |
* previously installed via neorv32_rte_exception_install(uint8_t exc_id, void (*handler)(void)). |
* previously installed via neorv32_rte_exception_install(uint8_t id, void (*handler)(void)). |
* |
* @note This function automatically clears the according CSR.mie bits when uninstalling handlers for |
* the MTIME (MTI), CLIC (MEI) or machine software interrupt (MSI). The global interrupt enable bit mstatus.mie has |
* the MTIME (MTI), CLIC (MEI), machine software interrupt (MSI) or fast IRQs. The global interrupt enable bit mstatus.mie has |
* to be cleared by the user via neorv32_cpu_dint(void). |
* |
* @param[in] exc_id Identifier (type) of the targeted exception. See #NEORV32_EXCEPTION_IDS_enum. |
* return 0 if success, 1 if error (invalid exc_id or targeted exception not supported). |
* @param[in] id Identifier (type) of the targeted exception. See #NEORV32_RTE_TRAP_enum. |
* return 0 if success, 1 if error (invalid id or targeted exception not supported). |
**************************************************************************/ |
int neorv32_rte_exception_uninstall(uint8_t exc_id) { |
int neorv32_rte_exception_uninstall(uint8_t id) { |
|
// id valid? |
if ((exc_id == EXCID_I_MISALIGNED) || (exc_id == EXCID_I_ACCESS) || (exc_id == EXCID_I_ILLEGAL) || |
(exc_id == EXCID_BREAKPOINT) || (exc_id == EXCID_L_MISALIGNED) || (exc_id == EXCID_L_ACCESS) || |
(exc_id == EXCID_S_MISALIGNED) || (exc_id == EXCID_S_ACCESS) || (exc_id == EXCID_MENV_CALL) || |
(exc_id == EXCID_MSI) || (exc_id == EXCID_MTI) || (exc_id == EXCID_MEI)) { |
if ((id == RTE_TRAP_I_MISALIGNED) || (id == RTE_TRAP_I_ACCESS) || (id == RTE_TRAP_I_ILLEGAL) || |
(id == RTE_TRAP_BREAKPOINT) || (id == RTE_TRAP_L_MISALIGNED) || (id == RTE_TRAP_L_ACCESS) || |
(id == RTE_TRAP_S_MISALIGNED) || (id == RTE_TRAP_S_ACCESS) || (id == RTE_TRAP_MENV_CALL) || |
(id == RTE_TRAP_MSI) || (id == RTE_TRAP_MTI) || (id == RTE_TRAP_MEI) || |
(id == RTE_TRAP_FIRQ_0) || (id == RTE_TRAP_FIRQ_1) || (id == RTE_TRAP_FIRQ_2) || (id == RTE_TRAP_FIRQ_3)) { |
|
if (exc_id == EXCID_MSI) { neorv32_cpu_irq_disable(CPU_MIE_MSIE); } // deactivate software interrupt |
if (exc_id == EXCID_MTI) { neorv32_cpu_irq_disable(CPU_MIE_MTIE); } // deactivate timer interrupt |
if (exc_id == EXCID_MEI) { neorv32_cpu_irq_disable(CPU_MIE_MEIE); } // deactivate external interrupt |
if (id == RTE_TRAP_MSI) { neorv32_cpu_irq_disable(CPU_MIE_MSIE); } // deactivate software interrupt |
if (id == RTE_TRAP_MTI) { neorv32_cpu_irq_disable(CPU_MIE_MTIE); } // deactivate timer interrupt |
if (id == RTE_TRAP_MEI) { neorv32_cpu_irq_disable(CPU_MIE_MEIE); } // deactivate external interrupt |
if (id == RTE_TRAP_FIRQ_0) { neorv32_cpu_irq_disable(CPU_MIE_FIRQ0E); } // deactivate fast interrupt channel 0 |
if (id == RTE_TRAP_FIRQ_1) { neorv32_cpu_irq_disable(CPU_MIE_FIRQ1E); } // deactivate fast interrupt channel 1 |
if (id == RTE_TRAP_FIRQ_2) { neorv32_cpu_irq_disable(CPU_MIE_FIRQ2E); } // deactivate fast interrupt channel 2 |
if (id == RTE_TRAP_FIRQ_3) { neorv32_cpu_irq_disable(CPU_MIE_FIRQ3E); } // deactivate fast interrupt channel 3 |
|
uint32_t vt_base = SYSINFO_DSPACE_BASE; // base address of vector table |
vt_base = vt_base + (((uint32_t)exc_id) << 2); |
(*(IO_REG32 (vt_base))) = (uint32_t)(&__neorv32_rte_dummy_exc_handler); // use dummy handler in case the exception is triggered |
__neorv32_rte_vector_lut[id] = (uint32_t)(&__neorv32_rte_debug_exc_handler); // use dummy handler in case the exception is accidently triggered |
|
return 0; |
} |
137,18 → 148,66
|
|
/**********************************************************************//** |
* NEORV32 runtime environment: Dummy exception handler (does nothing). |
* @note This function is used by neorv32_rte_exception_uninstall(uint8_t exc_id) only. |
* This is the core of the NEORV32 RTE. |
* |
* @note This function must no be explicitly used by the user. |
* @warning When using the the RTE, this function is the ONLY function that can use the 'interrupt' attribute! |
**************************************************************************/ |
static void __neorv32_rte_dummy_exc_handler(void) { |
static void __attribute__((__interrupt__)) __attribute__((aligned(16))) __neorv32_rte_core(void) { |
|
asm volatile("nop"); |
register uint32_t rte_mepc = neorv32_cpu_csr_read(CSR_MEPC); |
register uint32_t rte_mcause = neorv32_cpu_csr_read(CSR_MCAUSE); |
|
// compute return address |
if ((rte_mcause & 0x80000000) == 0) { // modify pc only if exception |
|
// get low half word of faulting instruction |
register uint32_t rte_trap_inst; |
asm volatile ("lh %[result], 0(%[input_i])" : [result] "=r" (rte_trap_inst) : [input_i] "r" (rte_mepc)); |
|
if ((rte_trap_inst & 3) == 3) { // faulting instruction is uncompressed instruction |
rte_mepc += 4; |
} |
else { // faulting instruction is compressed instruction |
rte_mepc += 2; |
} |
|
// store new return address |
neorv32_cpu_csr_write(CSR_MEPC, rte_mepc); |
} |
|
// find according trap handler |
register uint32_t rte_handler = (uint32_t)(&__neorv32_rte_debug_exc_handler); |
switch (rte_mcause) { |
case TRAP_CODE_I_MISALIGNED: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_I_MISALIGNED]; break; |
case TRAP_CODE_I_ACCESS: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_I_ACCESS]; break; |
case TRAP_CODE_I_ILLEGAL: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_I_ILLEGAL]; break; |
case TRAP_CODE_BREAKPOINT: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_BREAKPOINT]; break; |
case TRAP_CODE_L_MISALIGNED: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_L_MISALIGNED]; break; |
case TRAP_CODE_L_ACCESS: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_L_ACCESS]; break; |
case TRAP_CODE_S_MISALIGNED: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_S_MISALIGNED]; break; |
case TRAP_CODE_S_ACCESS: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_S_ACCESS]; break; |
case TRAP_CODE_MENV_CALL: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_MENV_CALL]; break; |
case TRAP_CODE_MSI: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_MSI]; break; |
case TRAP_CODE_MTI: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_MTI]; break; |
case TRAP_CODE_MEI: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_MEI]; break; |
case TRAP_CODE_FIRQ_0: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_FIRQ_0]; break; |
case TRAP_CODE_FIRQ_1: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_FIRQ_1]; break; |
case TRAP_CODE_FIRQ_2: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_FIRQ_2]; break; |
case TRAP_CODE_FIRQ_3: rte_handler = __neorv32_rte_vector_lut[RTE_TRAP_FIRQ_3]; break; |
default: break; |
} |
|
// execute handler |
void (*handler_pnt)(void); |
handler_pnt = (void*)rte_handler; |
(*handler_pnt)(); |
} |
|
|
/**********************************************************************//** |
* NEORV32 runtime environment: Debug exception handler, printing various exception/interrupt information via UART. |
* @note This function is used by neorv32_rte_enable_debug_mode(void) only. |
* @note This function is used by neorv32_rte_exception_uninstall(void) only. |
**************************************************************************/ |
static void __neorv32_rte_debug_exc_handler(void) { |
|
179,29 → 238,34
|
neorv32_uart_printf("Cause: "); |
switch (trap_cause) { |
case 0x00000000: neorv32_uart_printf("Instruction address misaligned"); break; |
case 0x00000001: neorv32_uart_printf("Instruction access fault"); break; |
case 0x00000002: neorv32_uart_printf("Illegal instruction"); break; |
case 0x00000003: neorv32_uart_printf("Breakpoint (EBREAK)"); break; |
case 0x00000004: neorv32_uart_printf("Load address misaligned"); break; |
case 0x00000005: neorv32_uart_printf("Load access fault"); break; |
case 0x00000006: neorv32_uart_printf("Store address misaligned"); break; |
case 0x00000007: neorv32_uart_printf("Store access fault"); break; |
case 0x0000000B: neorv32_uart_printf("Environment call (ECALL)"); break; |
case 0x80000003: neorv32_uart_printf("Machine software interrupt"); break; |
case 0x80000007: neorv32_uart_printf("Machine timer interrupt (via MTIME)"); break; |
case 0x8000000B: neorv32_uart_printf("Machine external interrupt (via CLIC)"); break; |
default: neorv32_uart_printf("Unknown (0x%x)", trap_cause); break; |
case TRAP_CODE_I_MISALIGNED: neorv32_uart_printf("Instruction address misaligned"); break; |
case TRAP_CODE_I_ACCESS: neorv32_uart_printf("Instruction access fault"); break; |
case TRAP_CODE_I_ILLEGAL: neorv32_uart_printf("Illegal instruction"); break; |
case TRAP_CODE_BREAKPOINT: neorv32_uart_printf("Breakpoint (EBREAK)"); break; |
case TRAP_CODE_L_MISALIGNED: neorv32_uart_printf("Load address misaligned"); break; |
case TRAP_CODE_L_ACCESS: neorv32_uart_printf("Load access fault"); break; |
case TRAP_CODE_S_MISALIGNED: neorv32_uart_printf("Store address misaligned"); break; |
case TRAP_CODE_S_ACCESS: neorv32_uart_printf("Store access fault"); break; |
case TRAP_CODE_MENV_CALL: neorv32_uart_printf("Environment call from M-mode"); break; |
case TRAP_CODE_MSI: neorv32_uart_printf("Machine software interrupt"); break; |
case TRAP_CODE_MTI: neorv32_uart_printf("Machine timer interrupt"); break; |
case TRAP_CODE_MEI: neorv32_uart_printf("Machine external interrupt"); break; |
case TRAP_CODE_FIRQ_0: neorv32_uart_printf("Fast interrupt channel 0"); break; |
case TRAP_CODE_FIRQ_1: neorv32_uart_printf("Fast interrupt channel 1"); break; |
case TRAP_CODE_FIRQ_2: neorv32_uart_printf("Fast interrupt channel 2"); break; |
case TRAP_CODE_FIRQ_3: neorv32_uart_printf("Fast interrupt channel 3"); break; |
default: neorv32_uart_printf("Unknown (0x%x)", trap_cause); break; |
} |
|
// fault address |
neorv32_uart_printf("\nFaulting instruction (low): 0x%x\n", trap_inst); |
neorv32_uart_printf("MTVAL: 0x%x\n", neorv32_cpu_csr_read(CSR_MTVAL)); |
neorv32_uart_printf("\nFaulting instruction (low half word): 0x%x", trap_inst); |
|
if ((trap_inst & 3) != 3) { |
neorv32_uart_printf("(decompressed)\n"); |
neorv32_uart_printf(" (decompressed)\n"); |
} |
|
neorv32_uart_printf("\nMTVAL: 0x%x\n", neorv32_cpu_csr_read(CSR_MTVAL)); |
|
neorv32_uart_printf("Trying to resume application @ 0x%x...", neorv32_cpu_csr_read(CSR_MEPC)); |
|
neorv32_uart_printf("\n<</NEORV32 Runtime Environment >>\n\n"); |
313,9 → 377,6
neorv32_uart_printf("WDT: "); |
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_WDT)); |
|
neorv32_uart_printf("CLIC: "); |
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_CLIC)); |
|
neorv32_uart_printf("TRNG: "); |
__neorv32_rte_print_true_false(tmp & (1 << SYSINFO_FEATURES_IO_TRNG)); |
|
/neorv32/trunk/README.md
20,24 → 20,28
|
## Introduction |
|
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.2** and a subset of the **Privileged Architecture Specification Version 1.12-draft**. |
The **NEORV32 processor** is a customizable full-scale mikrocontroller-like processor system based on the RISC-V-compliant |
`rv32i` NEORV32 CPU with optional `M`, `E`, `C` and `Zicsr` and `Zifencei` extensions. The CPU was built from scratch and |
is compliant to the *Unprivileged ISA Specification Version 2.2* 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** 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 with common peripherals like GPIO, serial interfaces for |
UART, I²C and SPI, timers, external bus interface and embedded memories. All optional features beyond the |
base CPU can be enabled and configured via VHDL generics. |
|
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. |
Alternatively, you can use the **NEORV32 CPU** as stand-alone central processing unit and build your own microcontroller |
or processor system around it. |
|
This project comes with a complete software ecosystem that features core libraries for high-level usage of the |
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). |
This project comes with a complete software ecosystem that features core libraries for high-level |
usage of the provided functions and peripherals, application makefiles, a runtime environment and |
several example programs. All software source files provide a doxygen-based documentary. |
|
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 toolchains](https://github.com/stnolting/riscv_gcc_prebuilt) for Linux. |
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 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). |
|
60,19 → 64,24
|
| 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-built 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) | | |
| [NEORV32 processor](https://github.com/stnolting/neorv32) | [![Build Status](https://travis-ci.com/stnolting/neorv32.svg?branch=master)](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-built toolchain](https://github.com/stnolting/riscv_gcc_prebuilt) | [![Build Status](https://travis-ci.com/stnolting/riscv_gcc_prebuilt.svg?branch=master)](https://travis-ci.com/stnolting/riscv_gcc_prebuilt) | | |
| [RISC-V compliance test](https://github.com/stnolting/neorv32_riscv_compliance) | [![Build Status](https://travis-ci.com/stnolting/neorv32_riscv_compliance.svg?branch=master)](https://travis-ci.com/stnolting/neorv32_riscv_compliance) | | |
|
|
### Non RISC-V-Compliant Issues |
|
* No exception is triggered in `E` mode when using registers above `x15` (*needs fixing*) |
* No exception is triggered for the `E` CPU extension when using registers above `x15` (*needs fixing*) |
* `misa` CSR is read-only - no dynamic enabling/disabling of implemented CPU extensions during runtime |
* Machine software interrupt `msi` is implemented, but there is no mechanism available to trigger it |
* `mcause` CSR is read-only |
* The `[m]cycleh` and `[m]instreth` CSR counters are only 20-bit wide (in contrast to original 32-bit) |
|
|
### Custom CPU Extensions |
|
* Four *fast interrupt* request channels with according control/status bits in `mie` and `mip` and custom exception codes in `mcause` |
|
|
### To-Do / Wish List |
|
- Add instructions how to use the NEORV32 CPU without the processor surroundings |
93,7 → 102,7
|
![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 |
- RISC-V-compliant `rv32i` 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 on [GitHub pages](https://stnolting.github.io/neorv32/files.html) |
113,7 → 122,6
- _Optional_ watchdog timer (WDT) |
- _Optional_ PWM controller with 4 channels and 8-bit duty cycle resolution (PWM) |
- _Optional_ GARO-based true random number generator (TRNG) |
- _Optional_ core-local interrupt controller with 8 channels (CLIC) |
- _Optional_ dummy device (DEVNULL) (can be used for *fast* simulation console output) |
- System configuration information memory to check hardware configuration by software (SYSINFO) |
|
159,7 → 167,7
* CSR access instructions: `CSRRW` `CSRRS` `CSRRC` `CSRRWI` `CSRRSI` `CSRRCI` |
* System instructions: `MRET` `WFI` |
* Counter CSRs: `[m]cycle[h]` `[m]instret[h]` `time[h]` |
* Machine CSRs: `mstatus` `misa`(read-only!) `mie` `mtvec` `mscratch` `mepc` `mcause` `mtval` `mip` `mvendorid` `marchid` `mimpid` `mhartid` |
* Machine CSRs: `mstatus` `misa`(read-only!) `mie` `mtvec` `mscratch` `mepc` `mcause`(read-only!) `mtval` `mip` `mvendorid` `marchid` `mimpid` `mhartid` |
* Supported exceptions and interrupts: |
* Misaligned instruction address |
* Instruction access fault |
186,35 → 194,36
|
### CPU |
|
Results generated for hardware version: `1.2.0.0` |
Results generated for hardware version: `1.3.0.0` |
|
| CPU Configuration | LEs | FFs | Memory bits | DSPs | f_max | |
|:---------------------------------|:----------:|:--------:|:-----------:|:----:|:-------:| |
| `rv32i` | 1065 | 477 | 2048 | 0 | 112 MHz | |
| `rv32i` + `Zicsr` + `Zifencei` | 1914 | 837 | 2048 | 0 | 100 MHz | |
| `rv32im` + `Zicsr` + `Zifencei` | 2542 | 1085 | 2048 | 0 | 100 MHz | |
| `rv32imc` + `Zicsr` + `Zifencei` | 2806 | 1102 | 2048 | 0 | 100 MHz | |
| `rv32emc` + `Zicsr` + `Zifencei` | 2783 | 1102 | 1024 | 0 | 100 MHz | |
| `rv32i` | 1122 | 481 | 2048 | 0 | 110 MHz | |
| `rv32i` + `Zicsr` + `Zifencei` | 1891 | 819 | 2048 | 0 | 100 MHz | |
| `rv32im` + `Zicsr` + `Zifencei` | 2496 | 1067 | 2048 | 0 | 100 MHz | |
| `rv32imc` + `Zicsr` + `Zifencei` | 2734 | 1066 | 2048 | 0 | 100 MHz | |
| `rv32emc` + `Zicsr` + `Zifencei` | 2722 | 1066 | 1024 | 0 | 100 MHz | |
|
### Processor-Internal Peripherals and Memories |
|
Results generated for hardware version: `1.2.0.0` |
Results generated for hardware version: `1.3.0.0` |
|
| Module | Description | LEs | FFs | Memory bits | DSPs | |
|:---------|:------------------------------------------------|:---:|:---:|:-----------:|:----:| |
| BOOT ROM | Bootloader ROM (4kB) | 3 | 1 | 32 768 | 0 | |
| DEVNULL | Dummy device | 3 | 1 | 0 | 0 | |
| 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 | 269 | 166 | 0 | 0 | |
| PWM | Pulse-width modulation controller | 76 | 69 | 0 | 0 | |
| SPI | Serial peripheral interface | 206 | 125 | 0 | 0 | |
| SYSINFO | System configuration information memory | 7 | 7 | 0 | 0 | |
| TRNG | True random number generator | 104 | 93 | 0 | 0 | |
| TWI | Two-wire interface | 78 | 44 | 0 | 0 | |
| UART | Universal asynchronous receiver/transmitter | 151 | 108 | 0 | 0 | |
| WDT | Watchdog timer | 57 | 45 | 0 | 0 | |
| Module | Description | LEs | FFs | Memory bits | DSPs | |
|:----------|:------------------------------------------------|:---:|:---:|:-----------:|:----:| |
| BOOT ROM | Bootloader ROM (4kB) | 4 | 1 | 32 768 | 0 | |
| BUSSWITCH | Mux for CPU I & D interfaces | 62 | 8 | 0 | 0 | |
| DEVNULL | Dummy device | 3 | 1 | 0 | 0 | |
| DMEM | Processor-internal data memory (8kB) | 12 | 2 | 65 536 | 0 | |
| GPIO | General purpose input/output ports | 40 | 33 | 0 | 0 | |
| IMEM | Processor-internal instruction memory (16kb) | 7 | 2 | 131 072 | 0 | |
| MTIME | Machine system timer | 266 | 166 | 0 | 0 | |
| PWM | Pulse-width modulation controller | 72 | 69 | 0 | 0 | |
| SPI | Serial peripheral interface | 198 | 125 | 0 | 0 | |
| SYSINFO | System configuration information memory | 10 | 9 | 0 | 0 | |
| TRNG | True random number generator | 105 | 93 | 0 | 0 | |
| TWI | Two-wire interface | 75 | 44 | 0 | 0 | |
| UART | Universal asynchronous receiver/transmitter | 153 | 108 | 0 | 0 | |
| WDT | Watchdog timer | 59 | 45 | 0 | 0 | |
|
|
### Exemplary FPGA Setups |
224,13 → 233,13
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 interrupt signals. |
|
Results generated for hardware version: `1.2.0.6` |
Results generated for hardware version: `1.3.0.0` |
|
| Vendor | FPGA | Board | Toolchain | Impl. strategy |CPU | LUT / LE | FF / REG | DSP | Memory Bits | BRAM / EBR | SPRAM | Frequency | |
|:--------|:----------------------------------|:-----------------|:------------------------|:---------------|:---------------------------------|:-----------|:-----------|:-------|:-------------|:-----------|:---------|-------------:| |
| Intel | Cyclone IV `EP4CE22F17C6N` | Terasic DE0-Nano | Quartus Prime Lite 19.1 | balanced | `rv32imc` + `Zicsr` + `Zifencei` | 4035 (18%) | 1860 (8%) | 0 (0%) | 231424 (38%) | - | - | 101 MHz | |
| Lattice | iCE40 UltraPlus `iCE40UP5K-SG48I` | Upduino v2.0 | Radiant 2.1 (LSE) | timing | `rv32ic` + `Zicsr` + `Zifencei` | 5001 (95%) | 1694 (32%) | 0 (0%) | - | 12 (40%) | 4 (100%) | c 22.5 MHz | |
| Xilinx | Artix-7 `XC7A35TICSG324-1L` | Arty A7-35T | Vivado 2019.2 | default | `rv32imc` + `Zicsr` + `Zifencei` | 2509 (12%) | 1914 (5%) | 0 (0%) | - | 8 (16%) | - | c 100 MHz | |
| Vendor | FPGA | Board | Toolchain | Impl. strategy |CPU | LUT / LE | FF / REG | DSP | Memory Bits | BRAM / EBR | SPRAM | Frequency | |
|:--------|:----------------------------------|:-----------------|:------------------------|:---------------|:---------------------------------|:-----------|:-----------|:-------|:-------------|:-----------|:---------|---------------:| |
| Intel | Cyclone IV `EP4CE22F17C6N` | Terasic DE0-Nano | Quartus Prime Lite 19.1 | balanced | `rv32imc` + `Zicsr` + `Zifencei` | 3934 (18%) | 1799 (8%) | 0 (0%) | 231424 (38%) | - | - | 100 MHz | |
| Lattice | iCE40 UltraPlus `iCE40UP5K-SG48I` | Upduino v2.0 | Radiant 2.1 (LSE) | timing | `rv32ic` + `Zicsr` + `Zifencei` | 4895 (92%) | 1636 (31%) | 0 (0%) | - | 12 (40%) | 4 (100%) | *c* 22.875 MHz | |
| Xilinx | Artix-7 `XC7A35TICSG324-1L` | Arty A7-35T | Vivado 2019.2 | default | `rv32imc` + `Zicsr` + `Zifencei` | 2432 (12%) | 1852 (4%) | 0 (0%) | - | 8 (16%) | - | *c* 100 MHz | |
|
**Notes** |
* The Lattice iCE40 UltraPlus setup uses the FPGA's SPRAM memory primitives for the internal IMEM and DEMEM (each 64kb). |
247,21 → 256,21
[sw/example/coremark](https://github.com/stnolting/neorv32/blob/master/sw/example/coremark) project folder. This benchmark |
tests the capabilities of a CPU itself rather than the functions provided by the whole system / SoC. |
|
Results generated for hardware version: `1.2.0.0` |
Results generated for hardware version: `1.3.0.0` |
|
~~~ |
**Configuration** |
Hardware: 32kB IMEM, 16kB DMEM, 100MHz clock |
CoreMark: 2000 iterations, MEM_METHOD is MEM_STACK |
Compiler: RISCV32-GCC 9.2.0 |
Compiler: RISCV32-GCC 10.1.0 |
Peripherals: UART for printing the results |
~~~ |
|
| CPU | Optimization | CoreMark Score | CoreMarks/MHz | |
|:---------------------------------|:------------:|:--------------:|:-------------:| |
| `rv32i` + `Zicsr` + `Zifencei` | `-O2` | 25.97 | 0.2597 | |
| `rv32im` + `Zicsr` + `Zifencei` | `-O2` | 55.55 | 0.5555 | |
| `rv32imc` + `Zicsr` + `Zifencei` | `-O2` | 54.05 | 0.5405 | |
| CPU | Executable Size | Optimization | CoreMark Score | CoreMarks/MHz | |
|:---------------------------------|:---------------:|:------------:|:--------------:|:-------------:| |
| `rv32i` + `Zicsr` + `Zifencei` | 21 600 bytes | `-O2` | 27.02 | 0.2702 | |
| `rv32im` + `Zicsr` + `Zifencei` | 20 976 bytes | `-O2` | 57.14 | 0.5714 | |
| `rv32imc` + `Zicsr` + `Zifencei` | 16 348 bytes | `-O2` | 57.14 | 0.5714 | |
|
|
### Instruction Cycles |
279,25 → 288,31
dividing the total number of required clock cycles (only the timed core to avoid distortion due to IO wait cycles; sampled via the `cycle[h]` CSRs) |
by the number of executed instructions (`instret[h]` CSRs). The executables were generated using optimization `-O2`. |
|
Results generated for hardware version: `1.2.0.0` |
Results generated for hardware version: `1.3.0.0` |
|
| CPU | Required Clock Cycles | Executed Instructions | Average CPI | |
|:---------------------------------|----------------------:|----------------------:|:-----------:| |
| `rv32i` + `Zicsr` + `Zifencei` | 7 754 927 850 | 1 492 843 669 | 5.2 | |
| `rv32im` + `Zicsr` + `Zifencei` | 3 684 015 850 | 626 274 115 | 5.9 | |
| `rv32imc` + `Zicsr` + `Zifencei` | 3 788 220 853 | 626 274 115 | 6.0 | |
| `rv32i` + `Zicsr` + `Zifencei` | 7 433 933 906 | 1 494 298 800 | 4.97 | |
| `rv32im` + `Zicsr` + `Zifencei` | 3 589 861 906 | 628 281 454 | 5.71 | |
| `rv32imc` + `Zicsr` + `Zifencei` | 3 587 131 226 | 628 282 016 | 5.70 | |
|
|
|
## Top Entity |
## Top Entities |
|
The top entity of the processor is [**neorv32_top.vhd**](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_top.vhd) (from the `rtl/core` folder). |
The top entity of the **processor** is [**neorv32_top.vhd**](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_top.vhd) (from the `rtl/core` folder). |
Just instantiate this file in your project and you are ready to go! All signals of this top entity are of type *std_ulogic* or *std_ulogic_vector*, respectively |
(except for the TWI signals, which are of type *std_logic*). |
|
Use the generics to configure the processor according to your needs. Each generic is initilized with the default configuration. |
The top entity of the **CPU** is [**neorv32_cpu.vhd**](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_cpu.vhd) (from the `rtl/core` folder). |
|
Use the generics to configure the processor/CPU according to your needs. Each generic is initilized with the default configuration. |
Detailed information regarding the signals and configuration generics can be found in the [NEORV32 documentary](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf). |
|
Alternative top entities can be found in [`rtl/top_templates`](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates) folder. |
|
### Processor |
|
```vhdl |
entity neorv32_top is |
generic ( |
307,17 → 322,17
CSR_COUNTERS_USE : boolean := true; -- implement RISC-V perf. counters ([m]instret[h], [m]cycle[h], time[h])? |
USER_CODE : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom user code |
-- 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 -- |
MEM_ISPACE_BASE : std_ulogic_vector(31 downto 0) := x"00000000"; -- base address of instruction memory space |
MEM_ISPACE_SIZE : natural := 16*1024; -- total size of instruction memory space in byte |
MEM_INT_IMEM_USE : boolean := true; -- implement processor-internal instruction memory |
MEM_INT_IMEM_USE : boolean := true; -- implement processor-internal instruction memory |
MEM_INT_IMEM_SIZE : natural := 16*1024; -- size of processor-internal instruction memory in bytes |
MEM_INT_IMEM_ROM : boolean := false; -- implement processor-internal instruction memory as ROM |
MEM_INT_IMEM_ROM : boolean := false; -- implement processor-internal instruction memory as ROM |
-- Memory configuration: Data memory -- |
MEM_DSPACE_BASE : std_ulogic_vector(31 downto 0) := x"80000000"; -- base address of data memory space |
MEM_DSPACE_SIZE : natural := 8*1024; -- total size of data memory space in byte |
326,7 → 341,7
-- Memory configuration: External memory interface -- |
MEM_EXT_USE : boolean := false; -- implement external memory bus interface? |
MEM_EXT_REG_STAGES : natural := 2; -- number of interface register stages (0,1,2) |
MEM_EXT_TIMEOUT : natural := 15; -- cycles after which a valid bus access will timeout (>=1) |
MEM_EXT_TIMEOUT : natural := 15; -- cycles after which a valid bus access will timeout |
-- Processor peripherals -- |
IO_GPIO_USE : boolean := true; -- implement general purpose input/output port unit (GPIO)? |
IO_MTIME_USE : boolean := true; -- implement machine system timer (MTIME)? |
335,52 → 350,107
IO_TWI_USE : boolean := true; -- implement two-wire interface (TWI)? |
IO_PWM_USE : boolean := true; -- implement pulse-width modulation unit (PWM)? |
IO_WDT_USE : boolean := true; -- implement watch dog timer (WDT)? |
IO_CLIC_USE : boolean := true; -- implement core local interrupt controller (CLIC)? |
IO_TRNG_USE : boolean := false; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
port ( |
-- Global control -- |
clk_i : in std_ulogic := '0'; -- global clock, rising edge |
rstn_i : in std_ulogic := '0'; -- global reset, low-active, async |
clk_i : in std_ulogic := '0'; -- global clock, rising edge |
rstn_i : in std_ulogic := '0'; -- global reset, low-active, async |
-- Wishbone bus interface (available if MEM_EXT_USE = true) -- |
wb_adr_o : out std_ulogic_vector(31 downto 0); -- address |
wb_dat_i : in std_ulogic_vector(31 downto 0) := (others => '0'); -- read data |
wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data |
wb_we_o : out std_ulogic; -- read/write |
wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable |
wb_stb_o : out std_ulogic; -- strobe |
wb_cyc_o : out std_ulogic; -- valid cycle |
wb_ack_i : in std_ulogic := '0'; -- transfer acknowledge |
wb_err_i : in std_ulogic := '0'; -- transfer error |
wb_adr_o : out std_ulogic_vector(31 downto 0); -- address |
wb_dat_i : in std_ulogic_vector(31 downto 0) := (others => '0'); -- read data |
wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data |
wb_we_o : out std_ulogic; -- read/write |
wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable |
wb_stb_o : out std_ulogic; -- strobe |
wb_cyc_o : out std_ulogic; -- valid cycle |
wb_ack_i : in std_ulogic := '0'; -- transfer acknowledge |
wb_err_i : in std_ulogic := '0'; -- transfer error |
-- Advanced memory control signals (available if MEM_EXT_USE = true) -- |
fence_o : out std_ulogic; -- indicates an executed FENCE operation |
fencei_o : out std_ulogic; -- indicates an executed FENCEI operation |
fence_o : out std_ulogic; -- indicates an executed FENCE operation |
fencei_o : out std_ulogic; -- indicates an executed FENCEI operation |
-- GPIO (available if IO_GPIO_USE = true) -- |
gpio_o : out std_ulogic_vector(15 downto 0); -- parallel output |
gpio_i : in std_ulogic_vector(15 downto 0) := (others => '0'); -- parallel input |
gpio_o : out std_ulogic_vector(15 downto 0); -- parallel output |
gpio_i : in std_ulogic_vector(15 downto 0) := (others => '0'); -- parallel input |
-- UART (available if IO_UART_USE = true) -- |
uart_txd_o : out std_ulogic; -- UART send data |
uart_rxd_i : in std_ulogic := '0'; -- UART receive data |
uart_txd_o : out std_ulogic; -- UART send data |
uart_rxd_i : in std_ulogic := '0'; -- UART receive data |
-- SPI (available if IO_SPI_USE = true) -- |
spi_sck_o : out std_ulogic; -- serial clock line |
spi_sdo_o : out std_ulogic; -- serial data line out |
spi_sdi_i : in std_ulogic := '0'; -- serial data line in |
spi_csn_o : out std_ulogic_vector(07 downto 0); -- SPI CS |
spi_sck_o : out std_ulogic; -- SPI serial clock |
spi_sdo_o : out std_ulogic; -- controller data out, peripheral data in |
spi_sdi_i : in std_ulogic := '0'; -- controller data in, peripheral data out |
spi_csn_o : out std_ulogic_vector(07 downto 0); -- SPI CS |
-- TWI (available if IO_TWI_USE = true) -- |
twi_sda_io : inout std_logic := 'H'; -- twi serial data line |
twi_scl_io : inout std_logic := 'H'; -- twi serial clock line |
twi_sda_io : inout std_logic := 'H'; -- twi serial data line |
twi_scl_io : inout std_logic := 'H'; -- twi serial clock line |
-- PWM (available if IO_PWM_USE = true) -- |
pwm_o : out std_ulogic_vector(03 downto 0); -- pwm channels |
-- Interrupts (available if IO_CLIC_USE = true) -- |
ext_irq_i : in std_ulogic_vector(01 downto 0) := (others => '0'); -- external interrupt request |
ext_ack_o : out std_ulogic_vector(01 downto 0) -- external interrupt request acknowledge |
pwm_o : out std_ulogic_vector(03 downto 0); -- pwm channels |
-- Interrupts -- |
msw_irq_i : in std_ulogic := '0'; -- machine software interrupt |
mext_irq_i : in std_ulogic := '0' -- machine external interrupt |
); |
end neorv32_top; |
``` |
|
### CPU |
|
```vhdl |
entity neorv32_cpu is |
generic ( |
-- General -- |
CSR_COUNTERS_USE : boolean := true; -- implement RISC-V perf. counters ([m]instret[h], [m]cycle[h], time[h])? |
HW_THREAD_ID : std_ulogic_vector(31 downto 0):= (others => '0'); -- hardware thread id |
CPU_BOOT_ADDR : std_ulogic_vector(31 downto 0):= (others => '0'); -- cpu boot address |
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension? |
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension? |
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension? |
CPU_EXTENSION_RISCV_Zicsr : boolean := true; -- implement CSR system? |
CPU_EXTENSION_RISCV_Zifencei : boolean := true; -- implement instruction stream sync.? |
-- Bus Interface -- |
BUS_TIMEOUT : natural := 15 -- cycles after which a valid bus access will timeout |
); |
port ( |
-- global control -- |
clk_i : in std_ulogic := '0'; -- global clock, rising edge |
rstn_i : in std_ulogic := '0'; -- global reset, low-active, async |
-- instruction bus interface -- |
i_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address |
i_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data |
i_bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data |
i_bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable |
i_bus_we_o : out std_ulogic; -- write enable |
i_bus_re_o : out std_ulogic; -- read enable |
i_bus_cancel_o : out std_ulogic; -- cancel current bus transaction |
i_bus_ack_i : in std_ulogic := '0'; -- bus transfer acknowledge |
i_bus_err_i : in std_ulogic := '0'; -- bus transfer error |
i_bus_fence_o : out std_ulogic; -- executed FENCEI operation |
-- data bus interface -- |
d_bus_addr_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address |
d_bus_rdata_i : in std_ulogic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data |
d_bus_wdata_o : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data |
d_bus_ben_o : out std_ulogic_vector(03 downto 0); -- byte enable |
d_bus_we_o : out std_ulogic; -- write enable |
d_bus_re_o : out std_ulogic; -- read enable |
d_bus_cancel_o : out std_ulogic; -- cancel current bus transaction |
d_bus_ack_i : in std_ulogic := '0'; -- bus transfer acknowledge |
d_bus_err_i : in std_ulogic := '0'; -- bus transfer error |
d_bus_fence_o : out std_ulogic; -- executed FENCE operation |
-- system time input from MTIME -- |
time_i : in std_ulogic_vector(63 downto 0) := (others => '0'); -- current system time |
-- interrupts (risc-v compliant) -- |
msw_irq_i : in std_ulogic := '0'; -- machine software interrupt |
mext_irq_i : in std_ulogic := '0'; -- machine external interrupt |
mtime_irq_i : in std_ulogic := '0'; -- machine timer interrupt |
-- fast interrupts (custom) -- |
firq_i : in std_ulogic_vector(3 downto 0) := (others => '0') |
); |
end neorv32_cpu; |
``` |
|
|
|
## Getting Started |
|
This overview is just a short excerpt from the *Let's Get It Started* section of the NEORV32 documentary: |
388,36 → 458,20
[![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) |
|
|
### Building the Toolchain |
### Toolchain |
|
At first you need the **RISC-V GCC toolchain**. You can either [download the sources](https://github.com/riscv/riscv-gnu-toolchain) |
and build the toolchain by yourself, or you can download a prebuilt one and install it. |
|
To build the toolchain by yourself, get the sources from the official [RISCV-GNU-TOOLCHAIN](https://github.com/riscv/riscv-gnu-toolchain) github page: |
:warning: Keep in mind that – for instance – a `rv32imc` toolchain only provides library code compiled with compressed and |
`mul`/`div` instructions! Hence, this code cannot be executed (without emulation) on an architecture without these extensions! |
|
$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain |
To build the toolchain by yourself, follow the official [build instructions](https://github.com/riscv/riscv-gnu-toolchain. |
Make sure to use the `ilp32` or `ilp32e` ABI. |
|
Download and install the prerequisite standard packages: |
Alternatively, you can download a prebuilt toolchain. I have uploaded the toolchain(s) I am using to GitHub. This toolchain |
has been compiled on a 64-bit x86 Ubuntu (Ubuntu on Windows, actually). Download the toolchain of choice: |
|
$ sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev |
|
To build the Linux cross-compiler, pick an install path. If you choose, say, `/opt/riscv`, then add `/opt/riscv/bin` to your `PATH` environment variable. |
|
$ export PATH:$PATH:/opt/riscv/bin |
|
Then, simply run the following commands in the RISC-V GNU toolchain source folder (for the `rv32i` toolchain): |
|
riscv-gnu-toolchain$ ./configure --prefix=/opt/riscv --with-arch=rv32i –with-abi=ilp32 |
riscv-gnu-toolchain$ make |
|
After a while (hours!) you will get `riscv32-unknown-elf-gcc` and all of its friends in your `/opt/riscv/bin` folder. |
|
|
### Using a Prebuilt Toolchain |
|
Alternatively, you can download a prebuilt toolchain. I have uploaded the toolchain I am using to GitHub. This toolchain |
has been compiled on a 64-bit x86 Ubuntu (Ubuntu on Windows). Download the toolchain of choice: |
|
[https://github.com/stnolting/riscv_gcc_prebuilt](https://github.com/stnolting/riscv_gcc_prebuilt) |
|
|
599,6 → 653,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. |