URL
https://opencores.org/ocsvn/neorv32/neorv32/trunk
Subversion Repositories neorv32
Compare Revisions
- This comparison shows the changes necessary to convert path
/neorv32/trunk
- from Rev 2 to Rev 3
- ↔ Reverse comparison
Rev 2 → Rev 3
/.ci/hw_check.sh
16,6 → 16,8
ghdl -v |
|
# List files |
echo "" |
echo "Simulation source files:" |
ls -al $srcdir_core |
ls -al $srcdir_top_templates |
ls -al $srcdir_sim |
34,6 → 36,7
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_cp_muldiv.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_decompressor.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_regfile.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_devnull.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_dmem.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_gpio.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_imem.vhd |
51,17 → 54,21
# |
ghdl -a --work=neorv32 $srcdir_sim/*.vhd |
|
# Prepare UART tx output log file and run simulation |
touch neorv32.sim_uart.out |
chmod 777 neorv32.sim_uart.out |
# Prepare simulation output files |
touch neorv32.testbench_uart.out |
chmod 777 neorv32.testbench_uart.out |
touch neorv32.devnull.out |
chmod 777 neorv32.devnull.out |
|
# Run simulation |
ghdl -e --work=neorv32 neorv32_tb |
ghdl -r --work=neorv32 neorv32_tb --stop-time=100ms --ieee-asserts=disable-at-0 --assert-level=error |
ghdl -r --work=neorv32 neorv32_tb --stop-time=5ms --ieee-asserts=disable --assert-level=error |
|
# Check output |
echo "Checking UART output. Should contain:"; cat $homedir/reference.out |
echo "Checking NEORV32.DEVNULL output. Should contain:"; cat $homedir/check_reference.out |
echo "" |
echo "Checking UART output. UART output is:" |
cat neorv32.sim_uart.out |
echo "Checking NEORV32.DEVNULL output. NEORV32.DEVNULL output is:" |
cat neorv32.devnull.out |
|
# Compare output with reference |
grep -qf $homedir/reference.out neorv32.sim_uart.out |
# Check if reference can be found in output |
grep -qf $homedir/check_reference.out neorv32.devnull.out |
/.ci/sw_check.sh
20,16 → 20,17
make -C $test_app_dir check |
|
# Compile all example projects |
make -C $srcdir_examples clean_all info compile |
make -C $srcdir_examples clean_all compile |
|
# Compile and install bootloader |
make -C $srcdir_bootloader clean_all info bootloader |
|
# Compile and install test application |
# Redirect UART TX to DEVNULL.simulation_output via <DEVNULL_UART_OVERRIDE> user flag |
echo "Installing test application" |
make -C $test_app_dir clean_all MARCH=-march=rv32imc info all |
make -C $test_app_dir clean_all USER_FLAGS+=-DDEVNULL_UART_OVERRIDE MARCH=-march=rv32imc info all |
|
# Verification reference string |
touch $homedir/reference.out |
chmod 777 $homedir/reference.out |
echo "TEST OK!" > $homedir/reference.out |
touch $homedir/check_reference.out |
chmod 777 $homedir/check_reference.out |
echo "TEST OK!" > $homedir/check_reference.out |
/docs/NEORV32.pdf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/rtl/core/neorv32_application_image.vhd
1,5 → 1,5
-- The NEORV32 Processor by Stephan Nolting, https://github.com/stnolting/neorv32 |
-- Auto-generated memory init file (for APPLICATION) from source file <blink_led/main.bin> |
-- Auto-generated memory init file (for APPLICATION) from source file <test_exceptions/main.bin> |
|
library ieee; |
use ieee.std_logic_1164.all; |
8,883 → 8,718
|
type application_init_image_t is array (0 to 65535) of std_ulogic_vector(31 downto 0); |
constant application_init_image : application_init_image_t := ( |
00000000 => x"00000013", |
00000001 => x"00000093", |
00000002 => x"00008113", |
00000003 => x"00010193", |
00000004 => x"00018213", |
00000005 => x"00020293", |
00000006 => x"00028313", |
00000007 => x"00030393", |
00000008 => x"00038413", |
00000009 => x"00040493", |
00000010 => x"00048513", |
00000011 => x"00050593", |
00000012 => x"00058613", |
00000013 => x"00060693", |
00000014 => x"00068713", |
00000015 => x"00070793", |
00000016 => x"00078813", |
00000017 => x"00080893", |
00000018 => x"00088913", |
00000019 => x"00090993", |
00000020 => x"00098a13", |
00000021 => x"000a0a93", |
00000022 => x"000a8b13", |
00000023 => x"000b0b93", |
00000024 => x"000b8c13", |
00000025 => x"000c0c93", |
00000026 => x"000c8d13", |
00000027 => x"000d0d93", |
00000028 => x"000d8e13", |
00000029 => x"000e0e93", |
00000030 => x"000e8f13", |
00000031 => x"000f0f93", |
00000032 => x"00000013", |
00000033 => x"fc5015f3", |
00000034 => x"fc701673", |
00000035 => x"00c58133", |
00000036 => x"ffc10113", |
00000037 => x"00010413", |
00000038 => x"80000197", |
00000039 => x"7e818193", |
00000040 => x"00000597", |
00000041 => x"0b458593", |
00000042 => x"30559073", |
00000043 => x"fc5015f3", |
00000044 => x"00000617", |
00000045 => x"1f460613", |
00000046 => x"02000693", |
00000047 => x"00c5a023", |
00000048 => x"00458593", |
00000049 => x"fff68693", |
00000050 => x"fed01ae3", |
00000051 => x"f8000593", |
00000052 => x"0005a023", |
00000053 => x"00458593", |
00000054 => x"feb01ce3", |
00000055 => x"fff00593", |
00000056 => x"f8b02c23", |
00000057 => x"f8b02e23", |
00000058 => x"80000597", |
00000059 => x"f9858593", |
00000060 => x"80000617", |
00000061 => x"f9060613", |
00000062 => x"00c5d863", |
00000063 => x"00058023", |
00000064 => x"00158593", |
00000065 => x"ff5ff06f", |
00000066 => x"00001597", |
00000067 => x"cac58593", |
00000068 => x"80000617", |
00000069 => x"f7060613", |
00000070 => x"80000697", |
00000071 => x"f6868693", |
00000072 => x"00d65c63", |
00000073 => x"00058703", |
00000074 => x"00e60023", |
00000075 => x"00158593", |
00000076 => x"00160613", |
00000077 => x"fedff06f", |
00000078 => x"00000513", |
00000079 => x"00000593", |
00000080 => x"168000ef", |
00000081 => x"10500073", |
00000082 => x"30047073", |
00000083 => x"10500073", |
00000084 => x"0000006f", |
00000085 => x"f8810113", |
00000086 => x"00112023", |
00000087 => x"00312223", |
00000088 => x"00412423", |
00000089 => x"00512623", |
00000090 => x"00612823", |
00000091 => x"00712a23", |
00000092 => x"00812c23", |
00000093 => x"00912e23", |
00000094 => x"02a12023", |
00000095 => x"02b12223", |
00000096 => x"02c12423", |
00000097 => x"02d12623", |
00000098 => x"02e12823", |
00000099 => x"02f12a23", |
00000100 => x"03012c23", |
00000101 => x"03112e23", |
00000102 => x"05212023", |
00000103 => x"05312223", |
00000104 => x"05412423", |
00000105 => x"05512623", |
00000106 => x"05612823", |
00000107 => x"05712a23", |
00000108 => x"05812c23", |
00000109 => x"05912e23", |
00000110 => x"07a12023", |
00000111 => x"07b12223", |
00000112 => x"07c12423", |
00000113 => x"07d12623", |
00000114 => x"07e12823", |
00000115 => x"07f12a23", |
00000116 => x"342012f3", |
00000117 => x"00f2f313", |
00000118 => x"00231313", |
00000119 => x"fc5010f3", |
00000120 => x"00130333", |
00000121 => x"341010f3", |
00000122 => x"0002cc63", |
00000123 => x"34a012f3", |
00000124 => x"0022f293", |
00000125 => x"00208093", |
00000126 => x"005080b3", |
00000127 => x"0080006f", |
00000128 => x"04030313", |
00000129 => x"00032283", |
00000130 => x"ffc10113", |
00000131 => x"00112023", |
00000132 => x"34009073", |
00000133 => x"000280e7", |
00000134 => x"00012083", |
00000135 => x"00410113", |
00000136 => x"34109073", |
00000137 => x"00012083", |
00000138 => x"00412183", |
00000139 => x"00812203", |
00000140 => x"00c12283", |
00000141 => x"01012303", |
00000142 => x"01412383", |
00000143 => x"01812403", |
00000144 => x"01c12483", |
00000145 => x"02012503", |
00000146 => x"02412583", |
00000147 => x"02812603", |
00000148 => x"02c12683", |
00000149 => x"03012703", |
00000150 => x"03412783", |
00000151 => x"03812803", |
00000152 => x"03c12883", |
00000153 => x"04012903", |
00000154 => x"04412983", |
00000155 => x"04812a03", |
00000156 => x"04c12a83", |
00000157 => x"05012b03", |
00000158 => x"05412b83", |
00000159 => x"05812c03", |
00000160 => x"05c12c83", |
00000161 => x"06012d03", |
00000162 => x"06412d83", |
00000163 => x"06812e03", |
00000164 => x"06c12e83", |
00000165 => x"07012f03", |
00000166 => x"07412f83", |
00000167 => x"07810113", |
00000168 => x"30200073", |
00000169 => x"00008067", |
00000170 => x"ff010113", |
00000171 => x"00112623", |
00000172 => x"00812423", |
00000173 => x"6ac000ef", |
00000174 => x"04050663", |
00000175 => x"2a8000ef", |
00000176 => x"00005537", |
00000177 => x"00000613", |
00000178 => x"00000593", |
00000179 => x"b0050513", |
00000180 => x"3e8000ef", |
00000181 => x"00001537", |
00000182 => x"ac050513", |
00000183 => x"478000ef", |
00000184 => x"00000513", |
00000185 => x"68c000ef", |
00000186 => x"00000413", |
00000187 => x"0ff47513", |
00000188 => x"680000ef", |
00000189 => x"0c800513", |
00000190 => x"6b0000ef", |
00000191 => x"00140413", |
00000192 => x"fedff06f", |
00000193 => x"00c12083", |
00000194 => x"00812403", |
00000195 => x"01010113", |
00000196 => x"00008067", |
00000197 => x"00001537", |
00000198 => x"ff010113", |
00000199 => x"adc50513", |
00000200 => x"00112623", |
00000201 => x"00812423", |
00000202 => x"484000ef", |
00000203 => x"c81015f3", |
00000204 => x"c0101673", |
00000205 => x"00001537", |
00000206 => x"b0450513", |
00000207 => x"470000ef", |
00000208 => x"34201473", |
00000209 => x"04045663", |
00000210 => x"00001537", |
00000211 => x"b1c50513", |
00000212 => x"45c000ef", |
00000213 => x"341015f3", |
00000214 => x"00001537", |
00000215 => x"b3450513", |
00000216 => x"44c000ef", |
00000217 => x"00001537", |
00000218 => x"b5450513", |
00000219 => x"440000ef", |
00000220 => x"00b00793", |
00000221 => x"0287e463", |
00000222 => x"00001737", |
00000223 => x"00241793", |
00000224 => x"d6870713", |
00000225 => x"00e787b3", |
00000226 => x"0007a783", |
00000227 => x"00078067", |
00000228 => x"00001537", |
00000229 => x"b2850513", |
00000230 => x"fb9ff06f", |
00000231 => x"800007b7", |
00000232 => x"00778713", |
00000233 => x"10e40c63", |
00000234 => x"00b78713", |
00000235 => x"10e40e63", |
00000236 => x"00378793", |
00000237 => x"0ef40e63", |
00000238 => x"00001537", |
00000239 => x"00040593", |
00000240 => x"cb850513", |
00000241 => x"3e8000ef", |
00000242 => x"0100006f", |
00000243 => x"00001537", |
00000244 => x"b5c50513", |
00000245 => x"3d8000ef", |
00000246 => x"00001537", |
00000247 => x"d5450513", |
00000248 => x"0240006f", |
00000249 => x"00001537", |
00000250 => x"b7c50513", |
00000251 => x"fe9ff06f", |
00000252 => x"00001537", |
00000253 => x"b9850513", |
00000254 => x"3b4000ef", |
00000255 => x"00001537", |
00000256 => x"bac50513", |
00000257 => x"3a8000ef", |
00000258 => x"343015f3", |
00000259 => x"00001537", |
00000260 => x"cc850513", |
00000261 => x"398000ef", |
00000262 => x"34a01473", |
00000263 => x"00001537", |
00000264 => x"00040593", |
00000265 => x"cd050513", |
00000266 => x"00247413", |
00000267 => x"380000ef", |
00000268 => x"0a040263", |
00000269 => x"00001537", |
00000270 => x"cec50513", |
00000271 => x"370000ef", |
00000272 => x"340015f3", |
00000273 => x"00001537", |
00000274 => x"d0450513", |
00000275 => x"360000ef", |
00000276 => x"00812403", |
00000277 => x"00c12083", |
00000278 => x"00001537", |
00000279 => x"d2c50513", |
00000280 => x"01010113", |
00000281 => x"3480006f", |
00000282 => x"00001537", |
00000283 => x"bc450513", |
00000284 => x"f65ff06f", |
00000285 => x"00001537", |
00000286 => x"bd850513", |
00000287 => x"f59ff06f", |
00000288 => x"00001537", |
00000289 => x"bf050513", |
00000290 => x"f4dff06f", |
00000291 => x"00001537", |
00000292 => x"c0450513", |
00000293 => x"f41ff06f", |
00000294 => x"00001537", |
00000295 => x"c2050513", |
00000296 => x"f35ff06f", |
00000297 => x"00001537", |
00000298 => x"c3450513", |
00000299 => x"f29ff06f", |
00000300 => x"00001537", |
00000301 => x"c5050513", |
00000302 => x"f1dff06f", |
00000303 => x"00001537", |
00000304 => x"c6c50513", |
00000305 => x"f11ff06f", |
00000306 => x"00001537", |
00000307 => x"c9050513", |
00000308 => x"f05ff06f", |
00000309 => x"00001537", |
00000310 => x"cf850513", |
00000311 => x"f61ff06f", |
00000312 => x"ff010113", |
00000313 => x"00812423", |
00000314 => x"00912223", |
00000315 => x"00112623", |
00000316 => x"00700793", |
00000317 => x"00050413", |
00000318 => x"00058493", |
00000319 => x"02a7fc63", |
00000320 => x"00b00793", |
00000321 => x"02f50863", |
00000322 => x"01300793", |
00000323 => x"02f50063", |
00000324 => x"01700793", |
00000325 => x"04f50463", |
00000326 => x"01b00793", |
00000327 => x"00100513", |
00000328 => x"02f41463", |
00000329 => x"00b00513", |
00000330 => x"0080006f", |
00000331 => x"00300513", |
00000332 => x"448000ef", |
00000333 => x"fc501573", |
00000334 => x"00241413", |
00000335 => x"00a40433", |
00000336 => x"00942023", |
00000337 => x"00000513", |
00000338 => x"00c12083", |
00000339 => x"00812403", |
00000340 => x"00412483", |
00000341 => x"01010113", |
00000342 => x"00008067", |
00000343 => x"00700513", |
00000344 => x"fd1ff06f", |
00000345 => x"ff010113", |
00000346 => x"00812423", |
00000347 => x"00912223", |
00000348 => x"01212023", |
00000349 => x"00112623", |
00000350 => x"00000413", |
00000351 => x"02000493", |
00000352 => x"00040513", |
00000353 => x"00140413", |
00000354 => x"31400593", |
00000355 => x"0ff47413", |
00000356 => x"f51ff0ef", |
00000357 => x"fe9416e3", |
00000358 => x"00c12083", |
00000359 => x"00812403", |
00000360 => x"00412483", |
00000361 => x"00012903", |
00000362 => x"01010113", |
00000363 => x"00008067", |
00000364 => x"fd010113", |
00000365 => x"02812423", |
00000366 => x"02912223", |
00000367 => x"03212023", |
00000368 => x"01312e23", |
00000369 => x"01412c23", |
00000370 => x"02112623", |
00000371 => x"01512a23", |
00000372 => x"00001a37", |
00000373 => x"00050493", |
00000374 => x"00058413", |
00000375 => x"00058523", |
00000376 => x"00000993", |
00000377 => x"00410913", |
00000378 => x"d98a0a13", |
00000379 => x"00a00593", |
00000380 => x"00048513", |
00000381 => x"468000ef", |
00000382 => x"00aa0533", |
00000383 => x"00054783", |
00000384 => x"01390ab3", |
00000385 => x"00048513", |
00000386 => x"00fa8023", |
00000387 => x"00a00593", |
00000388 => x"404000ef", |
00000389 => x"00198993", |
00000390 => x"00a00793", |
00000391 => x"00050493", |
00000392 => x"fcf996e3", |
00000393 => x"00090693", |
00000394 => x"00900713", |
00000395 => x"03000613", |
00000396 => x"0096c583", |
00000397 => x"00070793", |
00000398 => x"fff70713", |
00000399 => x"01071713", |
00000400 => x"01075713", |
00000401 => x"00c59a63", |
00000402 => x"000684a3", |
00000403 => x"fff68693", |
00000404 => x"fe0710e3", |
00000405 => x"00000793", |
00000406 => x"00f907b3", |
00000407 => x"00000593", |
00000408 => x"0007c703", |
00000409 => x"00070c63", |
00000410 => x"00158693", |
00000411 => x"00b405b3", |
00000412 => x"00e58023", |
00000413 => x"01069593", |
00000414 => x"0105d593", |
00000415 => x"fff78713", |
00000416 => x"02f91863", |
00000417 => x"00b40433", |
00000418 => x"00040023", |
00000419 => x"02c12083", |
00000420 => x"02812403", |
00000421 => x"02412483", |
00000422 => x"02012903", |
00000423 => x"01c12983", |
00000424 => x"01812a03", |
00000425 => x"01412a83", |
00000426 => x"03010113", |
00000427 => x"00008067", |
00000428 => x"00070793", |
00000429 => x"fadff06f", |
00000430 => x"fa002023", |
00000431 => x"fc1016f3", |
00000432 => x"00000713", |
00000433 => x"00151513", |
00000434 => x"04a6f263", |
00000435 => x"000016b7", |
00000436 => x"00000793", |
00000437 => x"ffe68693", |
00000438 => x"04e6e463", |
00000439 => x"00167613", |
00000440 => x"0015f593", |
00000441 => x"01879793", |
00000442 => x"01e61613", |
00000443 => x"00c7e7b3", |
00000444 => x"01d59593", |
00000445 => x"00b7e7b3", |
00000446 => x"00e7e7b3", |
00000447 => x"10000737", |
00000448 => x"00e7e7b3", |
00000449 => x"faf02023", |
00000450 => x"00008067", |
00000451 => x"00170793", |
00000452 => x"01079713", |
00000453 => x"40a686b3", |
00000454 => x"01075713", |
00000455 => x"fadff06f", |
00000456 => x"ffe78513", |
00000457 => x"0fd57513", |
00000458 => x"00051a63", |
00000459 => x"00375713", |
00000460 => x"00178793", |
00000461 => x"0ff7f793", |
00000462 => x"fa1ff06f", |
00000463 => x"00175713", |
00000464 => x"ff1ff06f", |
00000465 => x"fa002783", |
00000466 => x"fe07cee3", |
00000467 => x"faa02223", |
00000468 => x"00008067", |
00000469 => x"ff010113", |
00000470 => x"00812423", |
00000471 => x"01212023", |
00000472 => x"00112623", |
00000473 => x"00912223", |
00000474 => x"00050413", |
00000475 => x"00a00913", |
00000476 => x"00044483", |
00000477 => x"00140413", |
00000478 => x"00049e63", |
00000479 => x"00c12083", |
00000480 => x"00812403", |
00000481 => x"00412483", |
00000482 => x"00012903", |
00000483 => x"01010113", |
00000484 => x"00008067", |
00000485 => x"01249663", |
00000486 => x"00d00513", |
00000487 => x"fa9ff0ef", |
00000488 => x"00048513", |
00000489 => x"fa1ff0ef", |
00000490 => x"fc9ff06f", |
00000491 => x"fa010113", |
00000492 => x"02912a23", |
00000493 => x"04f12a23", |
00000494 => x"000014b7", |
00000495 => x"04410793", |
00000496 => x"02812c23", |
00000497 => x"03212823", |
00000498 => x"03412423", |
00000499 => x"03512223", |
00000500 => x"03612023", |
00000501 => x"01712e23", |
00000502 => x"02112e23", |
00000503 => x"03312623", |
00000504 => x"01812c23", |
00000505 => x"00050413", |
00000506 => x"04b12223", |
00000507 => x"04c12423", |
00000508 => x"04d12623", |
00000509 => x"04e12823", |
00000510 => x"05012c23", |
00000511 => x"05112e23", |
00000512 => x"00f12023", |
00000513 => x"02500a13", |
00000514 => x"00a00a93", |
00000515 => x"07300913", |
00000516 => x"07500b13", |
00000517 => x"07800b93", |
00000518 => x"da448493", |
00000519 => x"00044c03", |
00000520 => x"020c0463", |
00000521 => x"134c1263", |
00000522 => x"00144783", |
00000523 => x"00240993", |
00000524 => x"09278c63", |
00000525 => x"04f96263", |
00000526 => x"06300713", |
00000527 => x"0ae78463", |
00000528 => x"06900713", |
00000529 => x"0ae78c63", |
00000530 => x"03c12083", |
00000531 => x"03812403", |
00000532 => x"03412483", |
00000533 => x"03012903", |
00000534 => x"02c12983", |
00000535 => x"02812a03", |
00000536 => x"02412a83", |
00000537 => x"02012b03", |
00000538 => x"01c12b83", |
00000539 => x"01812c03", |
00000540 => x"06010113", |
00000541 => x"00008067", |
00000542 => x"0b678c63", |
00000543 => x"fd7796e3", |
00000544 => x"00012783", |
00000545 => x"00410693", |
00000546 => x"00068513", |
00000547 => x"0007a583", |
00000000 => x"00930001", |
00000001 => x"81130000", |
00000002 => x"01930000", |
00000003 => x"82130001", |
00000004 => x"02930001", |
00000005 => x"83130002", |
00000006 => x"03930002", |
00000007 => x"84130003", |
00000008 => x"04930003", |
00000009 => x"85130004", |
00000010 => x"05930004", |
00000011 => x"86130005", |
00000012 => x"06930005", |
00000013 => x"87130006", |
00000014 => x"07930006", |
00000015 => x"88130007", |
00000016 => x"08930007", |
00000017 => x"89130008", |
00000018 => x"09930008", |
00000019 => x"8a130009", |
00000020 => x"0a930009", |
00000021 => x"8b13000a", |
00000022 => x"0b93000a", |
00000023 => x"8c13000b", |
00000024 => x"0c93000b", |
00000025 => x"8d13000c", |
00000026 => x"0d93000c", |
00000027 => x"8e13000d", |
00000028 => x"0e93000d", |
00000029 => x"8f13000e", |
00000030 => x"0f93000e", |
00000031 => x"0001000f", |
00000032 => x"fc5015f3", |
00000033 => x"fc701673", |
00000034 => x"00c58133", |
00000035 => x"04131171", |
00000036 => x"01970001", |
00000037 => x"81938000", |
00000038 => x"05977ee1", |
00000039 => x"85930000", |
00000040 => x"90730925", |
00000041 => x"15f33055", |
00000042 => x"0617fc50", |
00000043 => x"06130000", |
00000044 => x"06931486", |
00000045 => x"c1900200", |
00000046 => x"16fd0591", |
00000047 => x"fed01de3", |
00000048 => x"f8000593", |
00000049 => x"0005a023", |
00000050 => x"1de30591", |
00000051 => x"55fdfeb0", |
00000052 => x"f8b02c23", |
00000053 => x"f8b02e23", |
00000054 => x"80818593", |
00000055 => x"82c18613", |
00000056 => x"00c5d663", |
00000057 => x"00058023", |
00000058 => x"bfdd0585", |
00000059 => x"00001597", |
00000060 => x"a2c58593", |
00000061 => x"80000617", |
00000062 => x"f8c60613", |
00000063 => x"80818693", |
00000064 => x"00d65963", |
00000065 => x"00058703", |
00000066 => x"00e60023", |
00000067 => x"06050585", |
00000068 => x"0513bfc5", |
00000069 => x"05930000", |
00000070 => x"00ef0000", |
00000071 => x"00730dc0", |
00000072 => x"70731050", |
00000073 => x"00733004", |
00000074 => x"a0011050", |
00000075 => x"f8810113", |
00000076 => x"c20ec006", |
00000077 => x"c616c412", |
00000078 => x"ca1ec81a", |
00000079 => x"ce26cc22", |
00000080 => x"d22ed02a", |
00000081 => x"d636d432", |
00000082 => x"da3ed83a", |
00000083 => x"de46dc42", |
00000084 => x"c2cec0ca", |
00000085 => x"c6d6c4d2", |
00000086 => x"cadec8da", |
00000087 => x"cee6cce2", |
00000088 => x"d2eed0ea", |
00000089 => x"d6f6d4f2", |
00000090 => x"dafed8fa", |
00000091 => x"342012f3", |
00000092 => x"00f2f313", |
00000093 => x"10f3030a", |
00000094 => x"9306fc50", |
00000095 => x"341010f3", |
00000096 => x"0002c963", |
00000097 => x"34a012f3", |
00000098 => x"0022f293", |
00000099 => x"90960089", |
00000100 => x"0313a019", |
00000101 => x"22830403", |
00000102 => x"11710003", |
00000103 => x"9073c006", |
00000104 => x"80e73400", |
00000105 => x"40820002", |
00000106 => x"90730111", |
00000107 => x"40823410", |
00000108 => x"42224192", |
00000109 => x"434242b2", |
00000110 => x"446243d2", |
00000111 => x"550244f2", |
00000112 => x"56225592", |
00000113 => x"574256b2", |
00000114 => x"586257d2", |
00000115 => x"490658f2", |
00000116 => x"4a264996", |
00000117 => x"4b464ab6", |
00000118 => x"4c664bd6", |
00000119 => x"5d064cf6", |
00000120 => x"5e265d96", |
00000121 => x"5f465eb6", |
00000122 => x"01135fd6", |
00000123 => x"00730781", |
00000124 => x"80823020", |
00000125 => x"11010000", |
00000126 => x"cc22ce06", |
00000127 => x"c84aca26", |
00000128 => x"06632b0d", |
00000129 => x"00ef0a05", |
00000130 => x"02637100", |
00000131 => x"21710a05", |
00000132 => x"08050f63", |
00000133 => x"46016515", |
00000134 => x"05134581", |
00000135 => x"2b39b005", |
00000136 => x"557d55fd", |
00000137 => x"65052141", |
00000138 => x"99450513", |
00000139 => x"05932361", |
00000140 => x"45015a00", |
00000141 => x"842a2921", |
00000142 => x"5ae00593", |
00000143 => x"21394505", |
00000144 => x"0593942a", |
00000145 => x"45095bc0", |
00000146 => x"942a2111", |
00000147 => x"5ca00593", |
00000148 => x"2eed450d", |
00000149 => x"0593942a", |
00000150 => x"45115d80", |
00000151 => x"942a2ec5", |
00000152 => x"5e600593", |
00000153 => x"26dd4515", |
00000154 => x"0593942a", |
00000155 => x"45195f40", |
00000156 => x"45812ef1", |
00000157 => x"0593942a", |
00000158 => x"451d6020", |
00000159 => x"45812ec1", |
00000160 => x"0593942a", |
00000161 => x"452d6100", |
00000162 => x"458126d1", |
00000163 => x"0593942a", |
00000164 => x"454d61e0", |
00000165 => x"45812e65", |
00000166 => x"0593942a", |
00000167 => x"455d63a0", |
00000168 => x"942a2675", |
00000169 => x"6505cc01", |
00000170 => x"9c850513", |
00000171 => x"40f22321", |
00000172 => x"44d24462", |
00000173 => x"45014942", |
00000174 => x"80826105", |
00000175 => x"05934581", |
00000176 => x"450162c0", |
00000177 => x"65c000ef", |
00000178 => x"c509842a", |
00000179 => x"05136505", |
00000180 => x"bfe99d85", |
00000181 => x"5f6000ef", |
00000182 => x"05136505", |
00000183 => x"a4239f05", |
00000184 => x"29c98201", |
00000185 => x"97824785", |
00000186 => x"8281a703", |
00000187 => x"123457b7", |
00000188 => x"67878793", |
00000189 => x"20f71963", |
00000190 => x"05136505", |
00000191 => x"295da005", |
00000192 => x"65054905", |
00000193 => x"a0c50513", |
00000194 => x"8201a423", |
00000195 => x"07932165", |
00000196 => x"9782f000", |
00000197 => x"8281a703", |
00000198 => x"aabb17b7", |
00000199 => x"13378793", |
00000200 => x"1ef71a63", |
00000201 => x"05136505", |
00000202 => x"2169a005", |
00000203 => x"65050905", |
00000204 => x"a1c50513", |
00000205 => x"8201a423", |
00000206 => x"07b729b5", |
00000207 => x"87938000", |
00000208 => x"80e70807", |
00000209 => x"a7030007", |
00000210 => x"27b78281", |
00000211 => x"87930199", |
00000212 => x"176303b7", |
00000213 => x"65051cf7", |
00000214 => x"a0050513", |
00000215 => x"090529a1", |
00000216 => x"05136505", |
00000217 => x"a423a2c5", |
00000218 => x"21a98201", |
00000219 => x"a7039002", |
00000220 => x"27b78281", |
00000221 => x"87931232", |
00000222 => x"19633307", |
00000223 => x"65051af7", |
00000224 => x"a0050513", |
00000225 => x"09052905", |
00000226 => x"05136505", |
00000227 => x"a423a3c5", |
00000228 => x"210d8201", |
00000229 => x"00101003", |
00000230 => x"8281a703", |
00000231 => x"babcd7b7", |
00000232 => x"ccc78793", |
00000233 => x"18f71a63", |
00000234 => x"05136505", |
00000235 => x"2119a005", |
00000236 => x"65050905", |
00000237 => x"a4c50513", |
00000238 => x"8201a423", |
00000239 => x"27832ee5", |
00000240 => x"c63ef000", |
00000241 => x"8281a703", |
00000242 => x"def737b7", |
00000243 => x"8aa78793", |
00000244 => x"16f71a63", |
00000245 => x"05136505", |
00000246 => x"2ee9a005", |
00000247 => x"65050905", |
00000248 => x"a5c50513", |
00000249 => x"8201a423", |
00000250 => x"10a326f1", |
00000251 => x"a7030000", |
00000252 => x"27b78281", |
00000253 => x"8793ff09", |
00000254 => x"1b637dd7", |
00000255 => x"650514f7", |
00000256 => x"a0050513", |
00000257 => x"09052e45", |
00000258 => x"05136505", |
00000259 => x"a423a6c5", |
00000260 => x"264d8201", |
00000261 => x"f0002023", |
00000262 => x"8281a703", |
00000263 => x"200917b7", |
00000264 => x"77778793", |
00000265 => x"12f71c63", |
00000266 => x"05136505", |
00000267 => x"2659a005", |
00000268 => x"65050905", |
00000269 => x"a7c50513", |
00000270 => x"8201a423", |
00000271 => x"00732ea5", |
00000272 => x"a7030000", |
00000273 => x"27b78281", |
00000274 => x"87935566", |
00000275 => x"1d632447", |
00000276 => x"650510f7", |
00000277 => x"a0050513", |
00000278 => x"09052eb1", |
00000279 => x"05136505", |
00000280 => x"a423a8c5", |
00000281 => x"26b98201", |
00000282 => x"a7032169", |
00000283 => x"e7b78281", |
00000284 => x"8793cdec", |
00000285 => x"1f63ea97", |
00000286 => x"65050ef7", |
00000287 => x"a0050513", |
00000288 => x"09052e15", |
00000289 => x"05136505", |
00000290 => x"a423a9c5", |
00000291 => x"261d8201", |
00000292 => x"45814501", |
00000293 => x"00012c01", |
00000294 => x"00010001", |
00000295 => x"a7030001", |
00000296 => x"07b78281", |
00000297 => x"87930013", |
00000298 => x"1b63a537", |
00000299 => x"65050cf7", |
00000300 => x"a0050513", |
00000301 => x"09052601", |
00000302 => x"05136505", |
00000303 => x"a423aac5", |
00000304 => x"2ccd8201", |
00000305 => x"21754501", |
00000306 => x"00010001", |
00000307 => x"00010001", |
00000308 => x"8281a703", |
00000309 => x"eef337b7", |
00000310 => x"08878793", |
00000311 => x"0af71863", |
00000312 => x"05136505", |
00000313 => x"24f9a005", |
00000314 => x"65050905", |
00000315 => x"864a86a2", |
00000316 => x"051345b1", |
00000317 => x"a423abc5", |
00000318 => x"2c6d8201", |
00000319 => x"6505ec51", |
00000320 => x"ae050513", |
00000321 => x"6505b365", |
00000322 => x"a0450513", |
00000323 => x"49012465", |
00000324 => x"bbc54405", |
00000325 => x"05136505", |
00000326 => x"2c69a045", |
00000327 => x"bd010405", |
00000328 => x"05136505", |
00000329 => x"2479a045", |
00000330 => x"bd1d0405", |
00000331 => x"05136505", |
00000332 => x"2449a045", |
00000333 => x"bd890405", |
00000334 => x"05136505", |
00000335 => x"2c9da045", |
00000336 => x"bd850405", |
00000337 => x"05136505", |
00000338 => x"24ada045", |
00000339 => x"bd410405", |
00000340 => x"05136505", |
00000341 => x"2cb9a045", |
00000342 => x"b57d0405", |
00000343 => x"05136505", |
00000344 => x"2c89a045", |
00000345 => x"b5f10405", |
00000346 => x"05136505", |
00000347 => x"2499a045", |
00000348 => x"b5ed0405", |
00000349 => x"05136505", |
00000350 => x"2c2da045", |
00000351 => x"b7190405", |
00000352 => x"05136505", |
00000353 => x"243da045", |
00000354 => x"b73d0405", |
00000355 => x"05136505", |
00000356 => x"240da045", |
00000357 => x"bf910405", |
00000358 => x"05136505", |
00000359 => x"b339aec5", |
00000360 => x"123457b7", |
00000361 => x"67878793", |
00000362 => x"82f1a423", |
00000363 => x"17b78082", |
00000364 => x"8793aabb", |
00000365 => x"a4231337", |
00000366 => x"808282f1", |
00000367 => x"019927b7", |
00000368 => x"03b78793", |
00000369 => x"82f1a423", |
00000370 => x"27b78082", |
00000371 => x"87931232", |
00000372 => x"a4233307", |
00000373 => x"808282f1", |
00000374 => x"babcd7b7", |
00000375 => x"ccc78793", |
00000376 => x"82f1a423", |
00000377 => x"37b78082", |
00000378 => x"8793def7", |
00000379 => x"a4238aa7", |
00000380 => x"808282f1", |
00000381 => x"ff0927b7", |
00000382 => x"7dd78793", |
00000383 => x"82f1a423", |
00000384 => x"17b78082", |
00000385 => x"87932009", |
00000386 => x"a4237777", |
00000387 => x"808282f1", |
00000388 => x"556627b7", |
00000389 => x"24478793", |
00000390 => x"82f1a423", |
00000391 => x"e7b78082", |
00000392 => x"8793cdec", |
00000393 => x"a423ea97", |
00000394 => x"808282f1", |
00000395 => x"eef337b7", |
00000396 => x"08878793", |
00000397 => x"82f1a423", |
00000398 => x"07b78082", |
00000399 => x"87930013", |
00000400 => x"557da537", |
00000401 => x"a42355fd", |
00000402 => x"a8a982f1", |
00000403 => x"c4221141", |
00000404 => x"c606c226", |
00000405 => x"842a479d", |
00000406 => x"f36384ae", |
00000407 => x"47ad02a7", |
00000408 => x"02f50063", |
00000409 => x"0b6347cd", |
00000410 => x"47dd00f5", |
00000411 => x"02f50563", |
00000412 => x"450547ed", |
00000413 => x"00f41c63", |
00000414 => x"a011452d", |
00000415 => x"2c89450d", |
00000416 => x"fc501573", |
00000417 => x"942a040a", |
00000418 => x"4501c004", |
00000419 => x"442240b2", |
00000420 => x"01414492", |
00000421 => x"451d8082", |
00000422 => x"1573b7dd", |
00000423 => x"8145fc00", |
00000424 => x"80828905", |
00000425 => x"f9800693", |
00000426 => x"c290567d", |
00000427 => x"c2ccc288", |
00000428 => x"11418082", |
00000429 => x"85236805", |
00000430 => x"47810005", |
00000431 => x"08130054", |
00000432 => x"4729afc8", |
00000433 => x"02e57633", |
00000434 => x"00f688b3", |
00000435 => x"96420785", |
00000436 => x"00064603", |
00000437 => x"02e55533", |
00000438 => x"00c88023", |
00000439 => x"fee794e3", |
00000440 => x"47258636", |
00000441 => x"03000513", |
00000442 => x"00964803", |
00000443 => x"177d87ba", |
00000444 => x"83410742", |
00000445 => x"00a81763", |
00000446 => x"000604a3", |
00000447 => x"f76d167d", |
00000448 => x"97b64781", |
00000449 => x"c6034701", |
00000450 => x"ca090007", |
00000451 => x"00170513", |
00000452 => x"0023972e", |
00000453 => x"171300c7", |
00000454 => x"83410105", |
00000455 => x"fff78613", |
00000456 => x"00f69763", |
00000457 => x"802395ba", |
00000458 => x"01410005", |
00000459 => x"87b28082", |
00000460 => x"1573bfd9", |
00000461 => x"8149fc00", |
00000462 => x"80828905", |
00000463 => x"fa002023", |
00000464 => x"fc1016f3", |
00000465 => x"05064701", |
00000466 => x"02a6f563", |
00000467 => x"47816685", |
00000468 => x"e76316f9", |
00000469 => x"8a0502e6", |
00000470 => x"07e28985", |
00000471 => x"8fd1067a", |
00000472 => x"8fcd05f6", |
00000473 => x"07378fd9", |
00000474 => x"8fd91000", |
00000475 => x"faf02023", |
00000476 => x"07938082", |
00000477 => x"97130017", |
00000478 => x"8e890107", |
00000479 => x"b7e98341", |
00000480 => x"ffe78513", |
00000481 => x"0fd57513", |
00000482 => x"830de511", |
00000483 => x"f7930785", |
00000484 => x"b7c10ff7", |
00000485 => x"bfdd8305", |
00000486 => x"46b54729", |
00000487 => x"00054783", |
00000488 => x"e3910505", |
00000489 => x"94638082", |
00000490 => x"2e2300e7", |
00000491 => x"2e23fed0", |
00000492 => x"b7edfef0", |
00000493 => x"d422715d", |
00000494 => x"6405c2be", |
00000495 => x"d226185c", |
00000496 => x"cc52ce4e", |
00000497 => x"c85aca56", |
00000498 => x"d04ad606", |
00000499 => x"dc32da2e", |
00000500 => x"c0bade36", |
00000501 => x"c6c6c4c2", |
00000502 => x"0993c03e", |
00000503 => x"4a290250", |
00000504 => x"04934ab5", |
00000505 => x"0b130730", |
00000506 => x"04130750", |
00000507 => x"4783b084", |
00000508 => x"c39d0005", |
00000509 => x"0d379463", |
00000510 => x"00154783", |
00000511 => x"00250913", |
00000512 => x"06978563", |
00000513 => x"02f4e463", |
00000514 => x"06300713", |
00000515 => x"06e78763", |
00000516 => x"06900713", |
00000517 => x"06e78c63", |
00000518 => x"542250b2", |
00000519 => x"59025492", |
00000520 => x"4a6249f2", |
00000521 => x"4b424ad2", |
00000522 => x"80826161", |
00000523 => x"09678163", |
00000524 => x"07800713", |
00000525 => x"fee792e3", |
00000526 => x"00544782", |
00000527 => x"438c8536", |
00000528 => x"00478713", |
00000529 => x"0613c03a", |
00000530 => x"47010200", |
00000531 => x"00e5d7b3", |
00000532 => x"97a28bbd", |
00000533 => x"0007c783", |
00000534 => x"16fd0711", |
00000535 => x"00f68423", |
00000536 => x"fec716e3", |
00000537 => x"00010623", |
00000538 => x"4782a031", |
00000539 => x"87134388", |
00000540 => x"c03a0047", |
00000541 => x"854a3715", |
00000542 => x"4782bf9d", |
00000543 => x"00478713", |
00000544 => x"0007c783", |
00000545 => x"2e23c03a", |
00000546 => x"b7f5fef0", |
00000547 => x"43884782", |
00000548 => x"00478713", |
00000549 => x"00e12023", |
00000550 => x"02000613", |
00000551 => x"00000713", |
00000552 => x"00e5d7b3", |
00000553 => x"00f7f793", |
00000554 => x"00f487b3", |
00000555 => x"0007c783", |
00000556 => x"00470713", |
00000557 => x"fff68693", |
00000558 => x"00f68423", |
00000559 => x"fec712e3", |
00000560 => x"00010623", |
00000561 => x"0140006f", |
00000562 => x"00012783", |
00000563 => x"0007a503", |
00000564 => x"00478713", |
00000565 => x"00e12023", |
00000566 => x"e7dff0ef", |
00000567 => x"00098413", |
00000568 => x"f3dff06f", |
00000569 => x"00012783", |
00000570 => x"0007c503", |
00000571 => x"00478713", |
00000572 => x"00e12023", |
00000573 => x"e51ff0ef", |
00000574 => x"fe5ff06f", |
00000575 => x"00012783", |
00000576 => x"0007a403", |
00000577 => x"00478713", |
00000578 => x"00e12023", |
00000579 => x"00045863", |
00000580 => x"02d00513", |
00000581 => x"40800433", |
00000582 => x"e2dff0ef", |
00000583 => x"00410593", |
00000584 => x"00040513", |
00000585 => x"c8dff0ef", |
00000586 => x"00410513", |
00000587 => x"fadff06f", |
00000588 => x"00012783", |
00000589 => x"00410593", |
00000590 => x"00478713", |
00000591 => x"0007a503", |
00000592 => x"00e12023", |
00000593 => x"fe1ff06f", |
00000594 => x"015c1663", |
00000595 => x"00d00513", |
00000596 => x"df5ff0ef", |
00000597 => x"00140993", |
00000598 => x"000c0513", |
00000599 => x"f99ff06f", |
00000600 => x"fc001573", |
00000601 => x"01055513", |
00000602 => x"00157513", |
00000603 => x"00008067", |
00000604 => x"f8a02223", |
00000605 => x"00008067", |
00000606 => x"0fb57693", |
00000607 => x"00300713", |
00000608 => x"00050793", |
00000609 => x"00e68863", |
00000610 => x"00b00713", |
00000611 => x"00100513", |
00000612 => x"00e79a63", |
00000613 => x"00100513", |
00000614 => x"00f517b3", |
00000615 => x"3047a073", |
00000616 => x"00000513", |
00000617 => x"00008067", |
00000618 => x"ff010113", |
00000619 => x"00112623", |
00000620 => x"00050593", |
00000621 => x"fc101573", |
00000622 => x"00f55513", |
00000623 => x"02c000ef", |
00000624 => x"00051863", |
00000625 => x"00c12083", |
00000626 => x"01010113", |
00000627 => x"00008067", |
00000628 => x"00000013", |
00000629 => x"00000013", |
00000630 => x"00000013", |
00000631 => x"00000013", |
00000632 => x"fff50513", |
00000633 => x"fddff06f", |
00000634 => x"00050613", |
00000635 => x"00000513", |
00000636 => x"0015f693", |
00000637 => x"00068463", |
00000638 => x"00c50533", |
00000639 => x"0015d593", |
00000640 => x"00161613", |
00000641 => x"fe0596e3", |
00000642 => x"00008067", |
00000643 => x"06054063", |
00000644 => x"0605c663", |
00000645 => x"00058613", |
00000646 => x"00050593", |
00000647 => x"fff00513", |
00000648 => x"02060c63", |
00000649 => x"00100693", |
00000650 => x"00b67a63", |
00000651 => x"00c05863", |
00000652 => x"00161613", |
00000653 => x"00169693", |
00000654 => x"feb66ae3", |
00000655 => x"00000513", |
00000656 => x"00c5e663", |
00000657 => x"40c585b3", |
00000658 => x"00d56533", |
00000659 => x"0016d693", |
00000660 => x"00165613", |
00000661 => x"fe0696e3", |
00000662 => x"00008067", |
00000663 => x"00008293", |
00000664 => x"fb5ff0ef", |
00000665 => x"00058513", |
00000666 => x"00028067", |
00000667 => x"40a00533", |
00000668 => x"0005d863", |
00000669 => x"40b005b3", |
00000670 => x"f9dff06f", |
00000671 => x"40b005b3", |
00000672 => x"00008293", |
00000673 => x"f91ff0ef", |
00000674 => x"40a00533", |
00000675 => x"00028067", |
00000676 => x"00008293", |
00000677 => x"0005ca63", |
00000678 => x"00054c63", |
00000679 => x"f79ff0ef", |
00000680 => x"00058513", |
00000681 => x"00028067", |
00000682 => x"40b005b3", |
00000683 => x"fe0558e3", |
00000684 => x"40a00533", |
00000685 => x"f61ff0ef", |
00000686 => x"40b00533", |
00000687 => x"00028067", |
00000688 => x"6e696c42", |
00000689 => x"676e696b", |
00000690 => x"44454c20", |
00000691 => x"6d656420", |
00000692 => x"7270206f", |
00000693 => x"6172676f", |
00000694 => x"00000a6d", |
00000695 => x"3c0a0a0a", |
00000696 => x"4e203c3c", |
00000697 => x"56524f45", |
00000698 => x"52203233", |
00000699 => x"69746e75", |
00000700 => x"4520656d", |
00000701 => x"7269766e", |
00000702 => x"656d6e6f", |
00000703 => x"3e20746e", |
00000704 => x"000a3e3e", |
00000705 => x"74737953", |
00000706 => x"74206d65", |
00000707 => x"3a656d69", |
00000708 => x"25783020", |
00000709 => x"78255f78", |
00000710 => x"0000000a", |
00000711 => x"45544e49", |
00000712 => x"50555252", |
00000713 => x"00000054", |
00000714 => x"45435845", |
00000715 => x"4f495450", |
00000716 => x"0000004e", |
00000717 => x"20746120", |
00000718 => x"74736e69", |
00000719 => x"74637572", |
00000720 => x"206e6f69", |
00000721 => x"72646461", |
00000722 => x"3a737365", |
00000723 => x"25783020", |
00000724 => x"00000a78", |
00000725 => x"73756143", |
00000726 => x"00203a65", |
00000727 => x"74736e49", |
00000728 => x"74637572", |
00000729 => x"206e6f69", |
00000730 => x"72646461", |
00000731 => x"20737365", |
00000732 => x"6173696d", |
00000733 => x"6e67696c", |
00000734 => x"00006465", |
00000735 => x"74736e49", |
00000736 => x"74637572", |
00000737 => x"206e6f69", |
00000738 => x"65636361", |
00000739 => x"66207373", |
00000740 => x"746c7561", |
00000741 => x"00000000", |
00000742 => x"656c6c49", |
00000743 => x"206c6167", |
00000744 => x"74736e69", |
00000745 => x"74637572", |
00000746 => x"006e6f69", |
00000747 => x"7561460a", |
00000748 => x"6e69746c", |
00000749 => x"6e692067", |
00000750 => x"75727473", |
00000751 => x"6f697463", |
00000752 => x"0000006e", |
00000753 => x"61657242", |
00000754 => x"696f706b", |
00000755 => x"2820746e", |
00000756 => x"45524245", |
00000757 => x"00294b41", |
00000758 => x"64616f4c", |
00000759 => x"64646120", |
00000760 => x"73736572", |
00000761 => x"73696d20", |
00000762 => x"67696c61", |
00000763 => x"0064656e", |
00000764 => x"64616f4c", |
00000765 => x"63636120", |
00000766 => x"20737365", |
00000767 => x"6c756166", |
00000768 => x"00000074", |
00000769 => x"726f7453", |
00000770 => x"64612065", |
00000771 => x"73657264", |
00000772 => x"696d2073", |
00000773 => x"696c6173", |
00000774 => x"64656e67", |
00000775 => x"00000000", |
00000776 => x"726f7453", |
00000777 => x"63612065", |
00000778 => x"73736563", |
00000779 => x"75616620", |
00000780 => x"0000746c", |
00000781 => x"69766e45", |
00000782 => x"6d6e6f72", |
00000783 => x"20746e65", |
00000784 => x"6c6c6163", |
00000785 => x"43452820", |
00000786 => x"294c4c41", |
00000787 => x"00000000", |
00000788 => x"6863614d", |
00000789 => x"20656e69", |
00000790 => x"74666f73", |
00000791 => x"65726177", |
00000792 => x"746e6920", |
00000793 => x"75727265", |
00000794 => x"00007470", |
00000795 => x"6863614d", |
00000796 => x"20656e69", |
00000797 => x"656d6974", |
00000798 => x"6e692072", |
00000799 => x"72726574", |
00000800 => x"20747075", |
00000801 => x"61697628", |
00000802 => x"49544d20", |
00000803 => x"0029454d", |
00000804 => x"6863614d", |
00000805 => x"20656e69", |
00000806 => x"65747865", |
00000807 => x"6c616e72", |
00000808 => x"746e6920", |
00000809 => x"75727265", |
00000810 => x"28207470", |
00000811 => x"20616976", |
00000812 => x"43494c43", |
00000813 => x"00000029", |
00000814 => x"6e6b6e55", |
00000815 => x"206e776f", |
00000816 => x"25783028", |
00000817 => x"00002978", |
00000818 => x"7830203a", |
00000819 => x"000a7825", |
00000820 => x"6e617254", |
00000821 => x"202e6673", |
00000822 => x"74736e69", |
00000823 => x"74637572", |
00000824 => x"3a6e6f69", |
00000825 => x"25783020", |
00000826 => x"00002078", |
00000827 => x"636e7528", |
00000828 => x"72706d6f", |
00000829 => x"000a292e", |
00000830 => x"6d6f6328", |
00000831 => x"292e7270", |
00000832 => x"0000000a", |
00000833 => x"69797254", |
00000834 => x"7420676e", |
00000835 => x"6572206f", |
00000836 => x"656d7573", |
00000837 => x"70706120", |
00000838 => x"6163696c", |
00000839 => x"6e6f6974", |
00000840 => x"30204020", |
00000841 => x"2e782578", |
00000842 => x"00002e2e", |
00000843 => x"3c3c3c0a", |
00000844 => x"4f454e2f", |
00000845 => x"32335652", |
00000846 => x"6e755220", |
00000847 => x"656d6974", |
00000848 => x"766e4520", |
00000849 => x"6e6f7269", |
00000850 => x"746e656d", |
00000851 => x"3e3e3e20", |
00000852 => x"000a0a0a", |
00000853 => x"7561460a", |
00000854 => x"6e69746c", |
00000855 => x"64612067", |
00000856 => x"73657264", |
00000857 => x"00000073", |
00000858 => x"000003cc", |
00000859 => x"000003e4", |
00000860 => x"000003f0", |
00000861 => x"00000468", |
00000862 => x"00000474", |
00000863 => x"00000480", |
00000864 => x"0000048c", |
00000865 => x"00000498", |
00000866 => x"000003b8", |
00000867 => x"000003b8", |
00000868 => x"000003b8", |
00000869 => x"000004a4", |
00000870 => x"33323130", |
00000871 => x"37363534", |
00000872 => x"00003938", |
00000873 => x"33323130", |
00000874 => x"37363534", |
00000875 => x"62613938", |
00000876 => x"66656463", |
00000549 => x"5863c03a", |
00000550 => x"07930005", |
00000551 => x"053302d0", |
00000552 => x"2e2340a0", |
00000553 => x"004cfef0", |
00000554 => x"00483529", |
00000555 => x"4782b7e1", |
00000556 => x"8713004c", |
00000557 => x"43880047", |
00000558 => x"b7fdc03a", |
00000559 => x"01479463", |
00000560 => x"ff502e23", |
00000561 => x"00150913", |
00000562 => x"6073bf7d", |
00000563 => x"80823004", |
00000564 => x"0fb57693", |
00000565 => x"87aa470d", |
00000566 => x"00e68663", |
00000567 => x"4505472d", |
00000568 => x"00e79863", |
00000569 => x"17b34505", |
00000570 => x"a07300f5", |
00000571 => x"45013047", |
00000572 => x"47a18082", |
00000573 => x"3447a073", |
00000574 => x"07138082", |
00000575 => x"431cf880", |
00000576 => x"0087e693", |
00000577 => x"8b8dc314", |
00000578 => x"8713078a", |
00000579 => x"97ba8081", |
00000580 => x"0007a303", |
00000581 => x"15738302", |
00000582 => x"815dfc00", |
00000583 => x"80828905", |
00000584 => x"fa63479d", |
00000585 => x"450500a7", |
00000586 => x"45058082", |
00000587 => x"442240b2", |
00000588 => x"01414492", |
00000589 => x"11418082", |
00000590 => x"84aec226", |
00000591 => x"c4226585", |
00000592 => x"8fa58593", |
00000593 => x"456d842a", |
00000594 => x"3309c606", |
00000595 => x"1713fd79", |
00000596 => x"87930024", |
00000597 => x"97ba8081", |
00000598 => x"2703c384", |
00000599 => x"0421f880", |
00000600 => x"97b34785", |
00000601 => x"8fd90087", |
00000602 => x"0107e793", |
00000603 => x"f8f02423", |
00000604 => x"479dbf75", |
00000605 => x"00a7ed63", |
00000606 => x"f8802783", |
00000607 => x"8d5d0542", |
00000608 => x"000807b7", |
00000609 => x"24238d5d", |
00000610 => x"4501f8a0", |
00000611 => x"45058082", |
00000612 => x"00008082", |
00000613 => x"4f454e0a", |
00000614 => x"32335652", |
00000615 => x"63786520", |
00000616 => x"69747065", |
00000617 => x"20736e6f", |
00000618 => x"20646e61", |
00000619 => x"65746e69", |
00000620 => x"70757272", |
00000621 => x"74207374", |
00000622 => x"20747365", |
00000623 => x"676f7270", |
00000624 => x"0a6d6172", |
00000625 => x"0000000a", |
00000626 => x"74736e69", |
00000627 => x"206c6c61", |
00000628 => x"6f727265", |
00000629 => x"000a2172", |
00000630 => x"43494c43", |
00000631 => x"736e6920", |
00000632 => x"6c6c6174", |
00000633 => x"72726520", |
00000634 => x"0a21726f", |
00000635 => x"00000000", |
00000636 => x"20435845", |
00000637 => x"4c415f49", |
00000638 => x"3a4e4749", |
00000639 => x"00000020", |
00000640 => x"000a6b6f", |
00000641 => x"6c696166", |
00000642 => x"0000000a", |
00000643 => x"20435845", |
00000644 => x"43415f49", |
00000645 => x"20203a43", |
00000646 => x"00000020", |
00000647 => x"20435845", |
00000648 => x"4c495f49", |
00000649 => x"3a47454c", |
00000650 => x"00000020", |
00000651 => x"20435845", |
00000652 => x"41455242", |
00000653 => x"20203a4b", |
00000654 => x"00000020", |
00000655 => x"20435845", |
00000656 => x"4c415f4c", |
00000657 => x"3a4e4749", |
00000658 => x"00000020", |
00000659 => x"20435845", |
00000660 => x"43415f4c", |
00000661 => x"20203a43", |
00000662 => x"00000020", |
00000663 => x"20435845", |
00000664 => x"4c415f53", |
00000665 => x"3a4e4749", |
00000666 => x"00000020", |
00000667 => x"20435845", |
00000668 => x"43415f53", |
00000669 => x"20203a43", |
00000670 => x"00000020", |
00000671 => x"20435845", |
00000672 => x"43564e45", |
00000673 => x"3a4c4c41", |
00000674 => x"00000020", |
00000675 => x"20515249", |
00000676 => x"3a49534d", |
00000677 => x"20202020", |
00000678 => x"00000020", |
00000679 => x"20515249", |
00000680 => x"3a49544d", |
00000681 => x"20202020", |
00000682 => x"00000020", |
00000683 => x"20515249", |
00000684 => x"3a49454d", |
00000685 => x"20202020", |
00000686 => x"00000020", |
00000687 => x"65540a0a", |
00000688 => x"3a737473", |
00000689 => x"0a692520", |
00000690 => x"203a4b4f", |
00000691 => x"25202020", |
00000692 => x"41460a69", |
00000693 => x"203a4c49", |
00000694 => x"0a692520", |
00000695 => x"0000000a", |
00000696 => x"54534554", |
00000697 => x"214b4f20", |
00000698 => x"0000000a", |
00000699 => x"54534554", |
00000700 => x"49414620", |
00000701 => x"2144454c", |
00000702 => x"0000000a", |
00000703 => x"33323130", |
00000704 => x"37363534", |
00000705 => x"00003938", |
00000706 => x"33323130", |
00000707 => x"37363534", |
00000708 => x"62613938", |
00000709 => x"66656463", |
00000710 => x"0000007f", |
00000711 => x"00008067", |
others => x"00000000" |
); |
|
/rtl/core/neorv32_bootloader_image.vhd
982,7 → 982,7
00000971 => x"4c420a0a", |
00000972 => x"203a5644", |
00000973 => x"206e754a", |
00000974 => x"32203432", |
00000974 => x"32203532", |
00000975 => x"0a303230", |
00000976 => x"3a565748", |
00000977 => x"00002020", |
/rtl/core/neorv32_cpu.vhd
81,7 → 81,8
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_TRNG_USE : boolean := true; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
port ( |
-- global control -- |
168,7 → 169,8
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_TRNG_USE => IO_TRNG_USE, -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE => IO_DEVNULL_USE -- implement dummy device (DEVNULL)? |
) |
port map ( |
-- global control -- |
/rtl/core/neorv32_cpu_alu.vhd
165,7 → 165,7
shifter_unit: process(rstn_i, clk_i) |
begin |
if (rstn_i = '0') then |
shift_sreg <= (others => '-'); |
shift_sreg <= (others => '0'); |
shift_cnt <= (others => '0'); |
shift_cmd_ff <= '0'; |
elsif rising_edge(clk_i) then |
241,7 → 241,7
when alu_cmd_and_c => alu_res <= opa and opb; |
when alu_cmd_shift_c => alu_res <= shift_sreg; |
when alu_cmd_slt_c => alu_res <= (others => '0'); alu_res(0) <= cmp_less; |
when others => alu_res <= (others => '-'); -- undefined |
when others => alu_res <= (others => '0'); -- undefined |
end case; |
end process alu_function_mux; |
|
/rtl/core/neorv32_cpu_control.vhd
75,7 → 75,8
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_TRNG_USE : boolean := true; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
port ( |
-- global control -- |
388,7 → 389,7
when funct3_sr_c => alu_operation_v := alu_cmd_shift_c; -- SRL(I) / SRA(I) |
when funct3_or_c => alu_operation_v := alu_cmd_or_c; -- OR(I) |
when funct3_and_c => alu_operation_v := alu_cmd_and_c; -- AND(I) |
when others => alu_operation_v := (others => '-'); -- undefined |
when others => alu_operation_v := (others => '0'); -- undefined |
end case; |
|
-- is rs1 = r0? -- |
903,10 → 904,10
irq_buf <= (others => '0'); |
exc_ack <= (others => '0'); |
irq_ack <= (others => '0'); |
exc_src <= (others => '-'); |
exc_src <= (others => '0'); |
exc_cpu_start <= '0'; |
exc_cause <= (others => '0'); |
mtinst <= (others => '-'); |
mtinst <= (others => '0'); |
elsif rising_edge(clk_i) then |
if (CPU_EXTENSION_RISCV_Zicsr = true) then |
-- exception buffer: misaligned load/store/instruction address |
1092,10 → 1093,10
mie_msie <= '0'; |
mie_meie <= '0'; |
mie_mtie <= '0'; |
mtvec <= (others => '-'); |
mtval <= (others => '-'); |
mepc <= (others => '-'); |
mip_msip <= '-'; |
mtvec <= (others => '0'); |
mtval <= (others => '0'); |
mepc <= (others => '0'); |
mip_msip <= '0'; |
elsif rising_edge(clk_i) then |
if (CPU_EXTENSION_RISCV_Zicsr = true) then |
mip_msip <= '0'; |
1134,7 → 1135,7
if (exc_cpu_ack = '1') then -- exception start? |
if (exc_cause(exc_cause_nxt'left) = '1') then -- for INTERRUPTs: mepc = address of next (unclompeted) instruction |
mepc <= pc_reg; |
mtval <= (others => '-'); -- not specified |
mtval <= (others => '0'); -- not specified |
else -- for EXCEPTIONs: mepc = address of next (unclompeted) instruction |
mepc <= pc_backup2_reg; |
if ((exc_src(exception_iaccess_c) or exc_src(exception_ialign_c)) = '1') then -- instruction access error OR misaligned instruction |
1243,15 → 1244,16
csr_rdata_o(03) <= bool_to_ulogic_f(MEM_INT_IMEM_ROM); -- implement processor-internal instruction memory as ROM |
csr_rdata_o(04) <= bool_to_ulogic_f(MEM_INT_DMEM_USE); -- implement processor-internal data memory |
-- |
csr_rdata_o(16) <= bool_to_ulogic_f(IO_GPIO_USE); -- implement general purpose input/output port unit (GPIO)? |
csr_rdata_o(17) <= bool_to_ulogic_f(IO_MTIME_USE); -- implement machine system timer (MTIME)? |
csr_rdata_o(18) <= bool_to_ulogic_f(IO_UART_USE); -- implement universal asynchronous receiver/transmitter (UART)? |
csr_rdata_o(19) <= bool_to_ulogic_f(IO_SPI_USE); -- implement serial peripheral interface (SPI)? |
csr_rdata_o(20) <= bool_to_ulogic_f(IO_TWI_USE); -- implement two-wire interface (TWI)? |
csr_rdata_o(21) <= bool_to_ulogic_f(IO_PWM_USE); -- implement pulse-width modulation unit (PWM)? |
csr_rdata_o(22) <= bool_to_ulogic_f(IO_WDT_USE); -- implement watch dog timer (WDT)? |
csr_rdata_o(23) <= bool_to_ulogic_f(IO_CLIC_USE); -- implement core local interrupt controller (CLIC)? |
csr_rdata_o(24) <= bool_to_ulogic_f(IO_TRNG_USE); -- implement true random number generator (TRNG)? |
csr_rdata_o(16) <= bool_to_ulogic_f(IO_GPIO_USE); -- implement general purpose input/output port unit (GPIO)? |
csr_rdata_o(17) <= bool_to_ulogic_f(IO_MTIME_USE); -- implement machine system timer (MTIME)? |
csr_rdata_o(18) <= bool_to_ulogic_f(IO_UART_USE); -- implement universal asynchronous receiver/transmitter (UART)? |
csr_rdata_o(19) <= bool_to_ulogic_f(IO_SPI_USE); -- implement serial peripheral interface (SPI)? |
csr_rdata_o(20) <= bool_to_ulogic_f(IO_TWI_USE); -- implement two-wire interface (TWI)? |
csr_rdata_o(21) <= bool_to_ulogic_f(IO_PWM_USE); -- implement pulse-width modulation unit (PWM)? |
csr_rdata_o(22) <= bool_to_ulogic_f(IO_WDT_USE); -- implement watch dog timer (WDT)? |
csr_rdata_o(23) <= bool_to_ulogic_f(IO_CLIC_USE); -- implement core local interrupt controller (CLIC)? |
csr_rdata_o(24) <= bool_to_ulogic_f(IO_TRNG_USE); -- implement true random number generator (TRNG)? |
csr_rdata_o(25) <= bool_to_ulogic_f(IO_DEVNULL_USE); -- implement dummy device (DEVNULL)? |
when x"fc1" => -- R/-: mclock - processor clock speed |
csr_rdata_o <= std_ulogic_vector(to_unsigned(CLOCK_FREQUENCY, 32)); |
when x"fc4" => -- R/-: mispacebase - Base address of instruction memory space |
/rtl/core/neorv32_cpu_cp_muldiv.vhd
95,12 → 95,12
if (rstn_i = '0') then |
state <= IDLE; |
cp_op <= (others => '0'); |
opx <= (others => '-'); |
opy <= (others => '-'); |
cnt <= (others => '-'); |
start <= '-'; |
opx <= (others => '0'); |
opy <= (others => '0'); |
cnt <= (others => '0'); |
start <= '0'; |
valid_o <= '0'; |
div_res_corr <= '-'; |
div_res_corr <= '0'; |
elsif rising_edge(clk_i) then |
-- defaults -- |
start <= '0'; |
254,7 → 254,7
when cp_op_remu_c => |
res_o <= remainder; |
when others => -- undefined |
res_o <= (others => '-'); |
res_o <= (others => '0'); |
end case; |
end if; |
end process operation_result; |
/rtl/core/neorv32_devnull.vhd
0,0 → 1,115
-- ################################################################################################# |
-- # << NEORV32 - /DEV/NULL (DEVNULL) Dummy Device with Simulation Output >> # |
-- # ********************************************************************************************* # |
-- # In simulation: This unit will output the lowest 8 bit of the written data as ASCII chars # |
-- # to the simulator console and to a text file ("neorv32.devnull.out"). # |
-- # In real hardware: This unit implements a "/dev/null" device. # |
-- # ********************************************************************************************* # |
-- # BSD 3-Clause License # |
-- # # |
-- # Copyright (c) 2020, Stephan Nolting. All rights reserved. # |
-- # # |
-- # Redistribution and use in source and binary forms, with or without modification, are # |
-- # permitted provided that the following conditions are met: # |
-- # # |
-- # 1. Redistributions of source code must retain the above copyright notice, this list of # |
-- # conditions and the following disclaimer. # |
-- # # |
-- # 2. Redistributions in binary form must reproduce the above copyright notice, this list of # |
-- # conditions and the following disclaimer in the documentation and/or other materials # |
-- # provided with the distribution. # |
-- # # |
-- # 3. Neither the name of the copyright holder nor the names of its contributors may be used to # |
-- # endorse or promote products derived from this software without specific prior written # |
-- # permission. # |
-- # # |
-- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS # |
-- # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # |
-- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # |
-- # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # |
-- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # |
-- # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # |
-- # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # |
-- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # |
-- # OF THE POSSIBILITY OF SUCH DAMAGE. # |
-- # ********************************************************************************************* # |
-- # The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting # |
-- ################################################################################################# |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
library neorv32; |
use neorv32.neorv32_package.all; |
use std.textio.all; |
|
entity neorv32_devnull is |
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 |
); |
end neorv32_devnull; |
|
architecture neorv32_devnull_rtl of neorv32_devnull is |
|
-- configuration -- |
constant sim_output_en_c : boolean := true; -- output lowest byte as char to simulator |
|
-- text.io -- |
file file_devnull_out : text open write_mode is "neorv32.devnull.out"; |
|
-- IO space: module base address -- |
constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit |
constant lo_abb_c : natural := index_size_f(devnull_size_c); -- low address boundary bit |
|
-- access control -- |
signal acc_en : std_ulogic; -- module access enable |
|
begin |
|
-- Access Control ------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
acc_en <= '1' when (addr_i(hi_abb_c downto lo_abb_c) = devnull_base_c(hi_abb_c downto lo_abb_c)) else '0'; |
|
|
-- Read/Write Access ---------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
rw_access: process(clk_i) |
variable i : integer; |
variable la, lb : line; -- we need to variables here since "writeline" seems to flush the source variable |
begin |
if rising_edge(clk_i) then |
ack_o <= acc_en and (wren_i or rden_i); |
if ((acc_en and wren_i and ben_i(0)) = '1') then |
-- print lowest byte as ASCII to console -- |
if (sim_output_en_c = true) then |
i := to_integer(unsigned(data_i(7 downto 0))); |
if (i >= 128) then -- out of range? |
i := 0; |
end if; |
if (i /= 10) and (i /= 13) then -- skip linebreaks |
write(la, character'val(i)); |
write(lb, character'val(i)); |
end if; |
if (i = 10) then -- line break: write to screen and file |
writeline(output, la); |
writeline(file_devnull_out, lb); |
end if; |
end if; |
end if; |
end if; |
end process rw_access; |
|
-- output -- |
data_o <= (others => '0'); |
|
|
end neorv32_devnull_rtl; |
/rtl/core/neorv32_package.vhd
41,7 → 41,7
-- Architecture Constants ----------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
constant data_width_c : natural := 32; -- data width - FIXED! |
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"00000203"; -- no touchy! |
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"00000204"; -- no touchy! |
|
-- Internal Functions --------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
125,8 → 125,13
|
-- RESERVED -- |
--constant ???_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"FFFFFFC8"; -- base address, fixed! |
--constant ???_size_c : natural := 14*4; -- bytes, fixed! |
--constant ???_size_c : natural := 13*4; -- bytes, fixed! |
|
-- Dummy Device (with SIM output) (DEVNULL) -- |
constant devnull_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"FFFFFFFC"; -- base address, fixed! |
constant devnull_size_c : natural := 1*4; -- bytes, fixed! |
constant devnull_data_addr_c : std_ulogic_vector(31 downto 0) := std_ulogic_vector(unsigned(devnull_base_c) + x"00000000"); |
|
-- Main Control Bus ----------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
-- register file -- |
361,7 → 366,8
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_TRNG_USE : boolean := false; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
port ( |
-- Global control -- |
434,7 → 440,8
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_TRNG_USE : boolean := true; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
port ( |
-- global control -- |
631,7 → 638,8
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_TRNG_USE : boolean := true; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
port ( |
-- global control -- |
941,6 → 949,22
); |
end component; |
|
-- Component: Dummy Device with SIM Output (DEVNULL) ------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
component neorv32_devnull |
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 |
); |
end component; |
|
end neorv32_package; |
|
package body neorv32_package is |
/rtl/core/neorv32_top.vhd
79,7 → 79,8
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_TRNG_USE : boolean := false; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
port ( |
-- Global control -- |
181,6 → 182,8
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); |
signal devnull_ack : std_ulogic; |
|
-- IRQs -- |
signal mtime_irq : std_ulogic; |
340,7 → 343,8
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_TRNG_USE => IO_TRNG_USE, -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE => IO_DEVNULL_USE -- implement dummy device (DEVNULL)? |
) |
port map ( |
-- global control -- |
362,11 → 366,11
|
-- CPU data input -- |
cpu_rdata <= (imem_rdata or dmem_rdata or bootrom_rdata) or wishbone_rdata or (gpio_rdata or mtime_rdata or |
uart_rdata or spi_rdata or twi_rdata or pwm_rdata or wdt_rdata or clic_rdata or trng_rdata); |
uart_rdata or spi_rdata or twi_rdata or pwm_rdata or wdt_rdata or clic_rdata or trng_rdata or devnull_rdata); |
|
-- CPU ACK input -- |
cpu_ack <= (imem_ack or dmem_ack or bootrom_ack) or wishbone_ack or (gpio_ack or mtime_ack or |
uart_ack or spi_ack or twi_ack or pwm_ack or wdt_ack or clic_ack or trng_ack); |
uart_ack or spi_ack or twi_ack or pwm_ack or wdt_ack or clic_ack or trng_ack or devnull_ack); |
|
-- CPU bus error input -- |
cpu_err <= wishbone_err; |
827,4 → 831,29
end generate; |
|
|
-- Dummy Device (DEVNULL) ----------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
neorv32_devnull_inst_true: |
if (IO_DEVNULL_USE = true) generate |
neorv32_devnull_inst: neorv32_devnull |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
addr_i => cpu_addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
ben_i => cpu_ben, -- byte write enable |
data_i => cpu_wdata, -- data in |
data_o => devnull_rdata, -- data out |
ack_o => devnull_ack -- transfer acknowledge |
); |
end generate; |
|
neorv32_devnull_inst_false: |
if (IO_DEVNULL_USE = false) generate |
devnull_rdata <= (others => '0'); |
devnull_ack <= '0'; |
end generate; |
|
|
end neorv32_top_rtl; |
/rtl/core/neorv32_trng.vhd
250,7 → 250,7
case tmp_v is |
when "101" => db_enable <= '1'; db_data <= '1'; -- rising edge -> '1' |
when "110" => db_enable <= '1'; db_data <= '0'; -- falling edge -> '0' |
when others => db_enable <= '0'; db_data <= '-'; -- invalid |
when others => db_enable <= '0'; db_data <= '0'; -- invalid |
end case; |
end process debiasing; |
|
/rtl/top_templates/neorv32_test_setup.vhd
101,7 → 101,8
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_TRNG_USE => false, -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE => true -- implement dummy device (DEVNULL)? |
) |
port map ( |
-- Global control -- |
/sim/ghdl/ghdl_sim.sh
0,0 → 1,60
#!/bin/bash |
|
# Abort if any command returns != 0 |
set -e |
|
# Project home folder |
homedir="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" |
homedir=$homedir/../.. |
|
# The directories of the hw source files |
srcdir_core=$homedir/rtl/core |
srcdir_sim=$homedir/sim |
|
# Show GHDL version |
ghdl -v |
|
# List files |
echo "Simulation source files:" |
ls -al $srcdir_core |
ls -al $srcdir_sim |
|
# Analyse sources; libs and images at first! |
ghdl -a --work=neorv32 $srcdir_core/neorv32_package.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_application_image.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_bootloader_image.vhd |
# |
ghdl -a --work=neorv32 $srcdir_core/neorv32_boot_rom.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 |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_control.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_cp_muldiv.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_decompressor.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_regfile.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_devnull.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_dmem.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_gpio.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_imem.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_mtime.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_pwm.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_spi.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_top.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_trng.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_twi.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_uart.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_wdt.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_wishbone.vhd |
# |
ghdl -a --work=neorv32 $srcdir_sim/*.vhd |
|
# Prepare simulation output files |
touch neorv32.testbench_uart.out |
chmod 777 neorv32.testbench_uart.out |
touch neorv32.devnull.out |
chmod 777 neorv32.devnull.out |
|
# Run simulation |
ghdl -e --work=neorv32 neorv32_tb |
ghdl -r --work=neorv32 neorv32_tb --stop-time=4ms --ieee-asserts=disable --assert-level=error |
/sim/neorv32_tb.vhd
1,6 → 1,11
-- ################################################################################################# |
-- # << NEORV32 - Simple Testbench with UART-to-Console module >> # |
-- # << NEORV32 - Simple Testbench >> # |
-- # ********************************************************************************************* # |
-- # This testbench provides a virtual UART receiver connected to the processor's uart_txd_o # |
-- # signals. The received chars are shown in the simulator console and also written to a file # |
-- # ("neorv32.testbench_uart.out"). # |
-- # Futhermore, this testbench provides a simple RAM connected to the external Wishbone bus. # |
-- # ********************************************************************************************* # |
-- # BSD 3-Clause License # |
-- # # |
-- # Copyright (c) 2020, Stephan Nolting. All rights reserved. # |
52,25 → 57,17
constant f_clock_c : real := 100000000.0; -- main clock in Hz |
constant f_clock_nat_c : natural := 100000000; -- main clock in Hz |
constant baud_rate_c : real := 19200.0; -- standard UART baudrate |
constant wb_mem_base_addr_c : std_ulogic_vector(31 downto 0) := x"F0000000"; -- wishbone memory base address |
constant wb_mem_size_c : natural := 256; -- wishbone memory size in bytes |
constant wb_mem_base_addr_c : std_ulogic_vector(31 downto 0) := x"F0000000"; -- wishbone memory base address |
-- ------------------------------------------------------------------------------------------- |
|
-- textio -- |
file file_uart_tx_out : text open write_mode is "neorv32.sim_uart.out"; |
-- text.io -- |
file file_uart_tx_out : text open write_mode is "neorv32.testbench_uart.out"; |
|
-- internal configuration -- |
constant baud_val_c : real := f_clock_c / baud_rate_c; |
constant f_clk_c : natural := natural(f_clock_c); |
|
-- reduced ASCII table -- |
type ascii_t is array (0 to 94) of character; |
constant ascii_lut : ascii_t := (' ', '!', '"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', |
'.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', |
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', |
'V', 'W', 'X', 'Y', 'Z', '[', '\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', |
'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~'); |
|
-- generators -- |
signal clk_gen, rst_gen : std_ulogic := '0'; |
|
106,12 → 103,14
signal wb_cpu : wishbone_t; |
|
|
-- Wishbone memory -- |
-- Wishbone memory, SimCom -- |
type wb_mem_file_t is array (0 to wb_mem_size_c/4-1) of std_ulogic_vector(31 downto 0); |
signal wb_mem_file : wb_mem_file_t := (others => (others => '0')); |
signal rb_en : std_ulogic; |
signal r_data : std_ulogic_vector(31 downto 0); |
signal wb_acc_en : std_ulogic; |
signal wb_mem_file : wb_mem_file_t := (others => (others => '0')); |
signal rb_en : std_ulogic; |
signal r_data : std_ulogic_vector(31 downto 0); |
signal wb_acc_en : std_ulogic; |
signal wb_mem_rdata : std_ulogic_vector(31 downto 0); |
signal wb_mem_ack : std_ulogic; |
|
begin |
|
158,7 → 157,8
IO_PWM_USE => true, -- implement pulse-width modulation unit (PWM)? |
IO_WDT_USE => true, -- implement watch dog timer (WDT)? |
IO_CLIC_USE => true, -- implement core local interrupt controller (CLIC)? |
IO_TRNG_USE => false -- implement true random number generator (TRNG)? |
IO_TRNG_USE => false, -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE => true -- implement dummy device (DEVNULL)? |
) |
port map ( |
-- Global control -- |
195,18 → 195,22
ext_ack_o => open -- external interrupt request acknowledge |
); |
|
-- twi termination -- |
-- TWI termination -- |
twi_scl <= 'H'; |
twi_sda <= 'H'; |
|
-- Wishbone read-back -- |
wb_cpu.rdata <= wb_mem_rdata; |
wb_cpu.ack <= wb_mem_ack; |
wb_cpu.err <= '0'; |
|
|
-- Console UART Receiver ------------------------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
uart_rx_console: process(clk_gen) |
variable i, j : integer; |
variable line_tmp : line; |
variable i : integer; |
variable l : line; |
begin |
|
-- "UART" -- |
if rising_edge(clk_gen) then |
-- synchronizer -- |
221,7 → 225,6
end if; |
else |
if (uart_rx_baud_cnt = 0.0) then |
-- adapt to the inter-frame pause - which is not implemented in the neo430 uart ;) |
if (uart_rx_bitcnt = 1) then |
uart_rx_baud_cnt <= round(0.5 * baud_val_c); |
else |
230,21 → 233,17
if (uart_rx_bitcnt = 0) then |
uart_rx_busy <= '0'; -- done |
i := to_integer(unsigned(uart_rx_sreg(8 downto 1))); |
j := i - 32; |
if (j < 0) or (j > 95) then |
j := 0; -- undefined = SPACE |
end if; |
|
if (i < 32) or (j > 32+95) then |
report "UART TX: (" & integer'image(i) & ")"; -- print code |
if (i < 32) or (i > 32+95) then -- printable char? |
report "SIM_UART TX: (" & integer'image(i) & ")"; -- print code |
else |
report "UART TX: " & ascii_lut(j); -- print ASCII |
report "SIM_UART TX: " & character'val(i); -- print ASCII |
end if; |
|
if (i = 10) then -- Linux line break |
writeline(file_uart_tx_out, line_tmp); |
writeline(file_uart_tx_out, l); |
elsif (i /= 13) then -- Remove additional carriage return |
write(line_tmp, ascii_lut(j)); |
write(l, character'val(i)); |
end if; |
else |
uart_rx_sreg <= uart_rx_sync(4) & uart_rx_sreg(8 downto 1); |
264,7 → 263,7
begin |
if rising_edge(clk_gen) then |
rb_en <= wb_cpu.cyc and wb_cpu.stb and wb_acc_en and (not wb_cpu.we); -- read-back control |
wb_cpu.ack <= wb_cpu.cyc and wb_cpu.stb and wb_acc_en; -- wishbone acknowledge |
wb_mem_ack <= wb_cpu.cyc and wb_cpu.stb and wb_acc_en; -- wishbone acknowledge |
if ((wb_cpu.cyc and wb_cpu.stb and wb_acc_en and wb_cpu.we) = '1') then -- valid write access |
for i in 0 to 3 loop |
if (wb_cpu.sel(i) = '1') then |
280,7 → 279,7
wb_acc_en <= '1' when (wb_cpu.addr >= wb_mem_base_addr_c) and (wb_cpu.addr < std_ulogic_vector(unsigned(wb_mem_base_addr_c) + wb_mem_size_c)) else '0'; |
|
-- output gate -- |
wb_cpu.rdata <= r_data when (rb_en = '1') else (others=> '0'); |
wb_cpu.err <= '0'; |
wb_mem_rdata <= r_data when (rb_en = '1') else (others=> '0'); |
|
|
end neorv32_tb_rtl; |
/sw/common/crt0.S
84,6 → 84,8
addi x15, x14, 0 |
|
// the following registers do not exist in rv32e |
// "__RISCV_EMBEDDED_CPU__" is automatically defined by the makefiles when |
// compiling for a rv32e architecture |
#ifndef __RISCV_EMBEDDED_CPU__ |
addi x16, x15, 0 |
addi x17, x16, 0 |
/sw/example/hw_analysis/main.c
150,33 → 150,36
neorv32_uart_printf("\n-- Peripherals --\n"); |
tmp = neorv32_cpu_csr_read(CSR_MFEATURES); |
|
neorv32_uart_printf("GPIO: "); |
neorv32_uart_printf("GPIO: "); |
print_true_false(tmp & (1 << CPU_MFEATURES_IO_GPIO)); |
|
neorv32_uart_printf("MTIME: "); |
neorv32_uart_printf("MTIME: "); |
print_true_false(tmp & (1 << CPU_MFEATURES_IO_MTIME)); |
|
neorv32_uart_printf("UART: "); |
neorv32_uart_printf("UART: "); |
print_true_false(tmp & (1 << CPU_MFEATURES_IO_UART)); |
|
neorv32_uart_printf("SPI: "); |
neorv32_uart_printf("SPI: "); |
print_true_false(tmp & (1 << CPU_MFEATURES_IO_SPI)); |
|
neorv32_uart_printf("TWI: "); |
neorv32_uart_printf("TWI: "); |
print_true_false(tmp & (1 << CPU_MFEATURES_IO_TWI)); |
|
neorv32_uart_printf("PWM: "); |
neorv32_uart_printf("PWM: "); |
print_true_false(tmp & (1 << CPU_MFEATURES_IO_PWM)); |
|
neorv32_uart_printf("WDT: "); |
neorv32_uart_printf("WDT: "); |
print_true_false(tmp & (1 << CPU_MFEATURES_IO_WDT)); |
|
neorv32_uart_printf("CLIC: "); |
neorv32_uart_printf("CLIC: "); |
print_true_false(tmp & (1 << CPU_MFEATURES_IO_CLIC)); |
|
neorv32_uart_printf("TRNG: "); |
neorv32_uart_printf("TRNG: "); |
print_true_false(tmp & (1 << CPU_MFEATURES_IO_TRNG)); |
|
neorv32_uart_printf("DEVNULL: "); |
print_true_false(tmp & (1 << CPU_MFEATURES_IO_DEVNULL)); |
|
return 0; |
} |
|
/sw/example/test_exceptions/main.c
143,13 → 143,11
uint64_t mtime_cmp_max = 0xFFFFFFFFFFFFFFFFL; |
neorv32_mtime_set_timecmp(mtime_cmp_max); |
|
#if (DETAILED_EXCEPTION_DEBUG==1) |
// detailed intro |
neorv32_uart_printf("NEORV32 exceptions and interrupts test program: "); |
#endif |
neorv32_uart_printf("NEORV32 EXC TESTS\n"); |
|
// intro |
neorv32_uart_printf("\nNEORV32 exceptions and interrupts test program\n\n"); |
|
|
// install exception handler functions |
int install_err = 0; |
install_err += neorv32_rte_exception_install(EXCID_I_MISALIGNED, exc_handler_i_misalign); |
197,7 → 195,7
// ---------------------------------------------------------- |
// Unaligned instruction address |
// ---------------------------------------------------------- |
neorv32_uart_printf("I_ALIGN: "); |
neorv32_uart_printf("EXC I_ALIGN: "); |
cnt_test++; |
|
// call unaligned address |
219,7 → 217,7
// ---------------------------------------------------------- |
// Instruction access fault |
// ---------------------------------------------------------- |
neorv32_uart_printf("I_ACC: "); |
neorv32_uart_printf("EXC I_ACC: "); |
cnt_test++; |
|
// call unreachable aligned address |
241,7 → 239,7
// ---------------------------------------------------------- |
// Illegal instruction |
// ---------------------------------------------------------- |
neorv32_uart_printf("I_ILLEG: "); |
neorv32_uart_printf("EXC I_ILLEG: "); |
cnt_test++; |
|
// create mini program in RAM |
269,7 → 267,7
// ---------------------------------------------------------- |
// Breakpoint instruction |
// ---------------------------------------------------------- |
neorv32_uart_printf("BREAK: "); |
neorv32_uart_printf("EXC BREAK: "); |
cnt_test++; |
|
asm volatile("EBREAK"); |
290,7 → 288,7
// ---------------------------------------------------------- |
// Unaligned load address |
// ---------------------------------------------------------- |
neorv32_uart_printf("L_ALIGN: "); |
neorv32_uart_printf("EXC L_ALIGN: "); |
cnt_test++; |
|
// load from unaligned address |
312,7 → 310,7
// ---------------------------------------------------------- |
// Load access fault |
// ---------------------------------------------------------- |
neorv32_uart_printf("L_ACC: "); |
neorv32_uart_printf("EXC L_ACC: "); |
cnt_test++; |
|
// load from unreachable aligned address |
334,7 → 332,7
// ---------------------------------------------------------- |
// Unaligned store address |
// ---------------------------------------------------------- |
neorv32_uart_printf("S_ALIGN: "); |
neorv32_uart_printf("EXC S_ALIGN: "); |
cnt_test++; |
|
// store to unaligned address |
356,7 → 354,7
// ---------------------------------------------------------- |
// Store access fault |
// ---------------------------------------------------------- |
neorv32_uart_printf("S_ACC: "); |
neorv32_uart_printf("EXC S_ACC: "); |
cnt_test++; |
|
// store to unreachable aligned address |
378,7 → 376,7
// ---------------------------------------------------------- |
// Environment call |
// ---------------------------------------------------------- |
neorv32_uart_printf("ENVCALL: "); |
neorv32_uart_printf("EXC ENVCALL: "); |
cnt_test++; |
|
asm volatile("ECALL"); |
399,7 → 397,7
// ---------------------------------------------------------- |
// Machine software interrupt |
// ---------------------------------------------------------- |
neorv32_uart_printf("MSI: "); |
neorv32_uart_printf("IRQ MSI: "); |
cnt_test++; |
|
// trigger machine software interrupt |
421,7 → 419,7
// ---------------------------------------------------------- |
// Machine timer interrupt (MTIME) |
// ---------------------------------------------------------- |
neorv32_uart_printf("MTI: "); |
neorv32_uart_printf("IRQ MTI: "); |
cnt_test++; |
|
// force MTIME IRQ |
449,7 → 447,7
// ---------------------------------------------------------- |
// Machine external interrupt (via CLIC) |
// ---------------------------------------------------------- |
neorv32_uart_printf("MEI: "); |
neorv32_uart_printf("IRQ MEI: "); |
cnt_test++; |
|
// manually trigger CLIC channel (watchdog interrupt) |
474,10 → 472,8
#endif |
|
|
#if (DETAILED_EXCEPTION_DEBUG==1) |
// error report |
neorv32_uart_printf("\n\nTests: %i\nOK: %i\nFAIL: %i\n\n", cnt_test, cnt_ok, cnt_fail); |
#endif |
|
// final result |
if (cnt_fail == 0) { |
/sw/lib/include/neorv32.h
144,7 → 144,8
CPU_MFEATURES_IO_PWM = 21, /**< CPU mfeatures CSR (21) (r/-): Pulse-width modulation unit implemented when 1 (via IO_PWM_USE generic) */ |
CPU_MFEATURES_IO_WDT = 22, /**< CPU mfeatures CSR (22) (r/-): Watchdog timer implemented when 1 (via IO_WDT_USE generic) */ |
CPU_MFEATURES_IO_CLIC = 23, /**< CPU mfeatures CSR (23) (r/-): Core-local interrupt controller implemented when 1 (via IO_CLIC_USE generic) */ |
CPU_MFEATURES_IO_TRNG = 24 /**< CPU mfeatures CSR (24) (r/-): True random number generator implemented when 1 (via IO_TRNG_USE generic) */ |
CPU_MFEATURES_IO_TRNG = 24, /**< CPU mfeatures CSR (24) (r/-): True random number generator implemented when 1 (via IO_TRNG_USE generic) */ |
CPU_MFEATURES_IO_DEVNULL = 25 /**< CPU mfeatures CSR (24) (r/-): Dummy device implemented when 1 (via IO_DEVNULL_USE generic) */ |
}; |
|
|
491,6 → 492,15
/**@}*/ |
|
|
/**********************************************************************//** |
* @name IO Device: Dummy Device (DEVNULL) |
**************************************************************************/ |
/**@{*/ |
/** TRNG data register (r/w) */ |
#define DEVNULL_DATA (*(IO_REG32 0xFFFFFFFC)) |
/**@}*/ |
|
|
// ---------------------------------------------------------------------------- |
// Include all IO driver headers |
// ---------------------------------------------------------------------------- |
/sw/lib/source/neorv32_uart.c
130,14 → 130,21
* Send single char via UART. |
* |
* @note This function is blocking. |
* @warning The 'SIMCOM_UART_OVERRIDE' compiler user flag will forward all UART TX data to the SIMCOM simulation console output. |
* |
* @param[in] c Char to be send. |
**************************************************************************/ |
void neorv32_uart_putc(char c) { |
|
#ifdef DEVNULL_UART_OVERRIDE |
#warning UART OVERRIDE! Sending all UART.TX data to DEVNULL simulation output instead of UART transmitter. Use this for simulations only! |
DEVNULL_DATA = (uint32_t)c; |
#else |
// wait for previous transfer to finish |
while ((UART_CT & (1<<UART_CT_TX_BUSY)) != 0); |
UART_DATA = ((uint32_t)c) << UART_DATA_LSB; |
#endif |
|
} |
|
|
/.gitignore
10,6 → 10,7
|
# no executables |
sw/image_gen/image_gen |
sw/image_gen/image_gen.exe |
|
# no temp/legacy files/folders |
~* |
/CODE_OF_CONDUCT.md
0,0 → 1,76
# Contributor Covenant Code of Conduct |
|
## Our Pledge |
|
In the interest of fostering an open and welcoming environment, we as |
contributors and maintainers pledge to making participation in our project and |
our community a harassment-free experience for everyone, regardless of age, body |
size, disability, ethnicity, sex characteristics, gender identity and expression, |
level of experience, education, socio-economic status, nationality, personal |
appearance, race, religion, or sexual identity and orientation. |
|
## Our Standards |
|
Examples of behavior that contributes to creating a positive environment |
include: |
|
* Using welcoming and inclusive language |
* Being respectful of differing viewpoints and experiences |
* Gracefully accepting constructive criticism |
* Focusing on what is best for the community |
* Showing empathy towards other community members |
|
Examples of unacceptable behavior by participants include: |
|
* The use of sexualized language or imagery and unwelcome sexual attention or |
advances |
* Trolling, insulting/derogatory comments, and personal or political attacks |
* Public or private harassment |
* Publishing others' private information, such as a physical or electronic |
address, without explicit permission |
* Other conduct which could reasonably be considered inappropriate in a |
professional setting |
|
## Our Responsibilities |
|
Project maintainers are responsible for clarifying the standards of acceptable |
behavior and are expected to take appropriate and fair corrective action in |
response to any instances of unacceptable behavior. |
|
Project maintainers have the right and responsibility to remove, edit, or |
reject comments, commits, code, wiki edits, issues, and other contributions |
that are not aligned to this Code of Conduct, or to ban temporarily or |
permanently any contributor for other behaviors that they deem inappropriate, |
threatening, offensive, or harmful. |
|
## Scope |
|
This Code of Conduct applies both within project spaces and in public spaces |
when an individual is representing the project or its community. Examples of |
representing a project or community include using an official project e-mail |
address, posting via an official social media account, or acting as an appointed |
representative at an online or offline event. Representation of a project may be |
further defined and clarified by project maintainers. |
|
## Enforcement |
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be |
reported by contacting the project team at stnolting@gmail.com. All |
complaints will be reviewed and investigated and will result in a response that |
is deemed necessary and appropriate to the circumstances. The project team is |
obligated to maintain confidentiality with regard to the reporter of an incident. |
Further details of specific enforcement policies may be posted separately. |
|
Project maintainers who do not follow or enforce the Code of Conduct in good |
faith may face temporary or permanent repercussions as determined by other |
members of the project's leadership. |
|
## Attribution |
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, |
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html |
|
[homepage]: https://www.contributor-covenant.org |
|
For answers to common questions about this code of conduct, see |
https://www.contributor-covenant.org/faq |
/README.md
27,7 → 27,7
|
The NEORV32 is a customizable mikrocontroller-like processor system based on a RISC-V `rv32i` or `rv32e` CPU with optional |
`M`, `C` and `Zicsr` extensions. The CPU was built from scratch and is compliant to the **Unprivileged |
ISA Specification Version 2.1** and the **Privileged Architecture Specification Version 1.12**. The NEORV32 is intended |
ISA Specification Version 2.1** and a subset of the **Privileged Architecture Specification Version 1.12**. The NEORV32 is intended |
as auxiliary processor within a larger SoC designs or as stand-alone custom microcontroller. |
|
The processor provides common peripherals and interfaces like input and output ports, serial interfaces for UART, I²C and SPI, |
55,8 → 55,10
|
|
### Status |
|
![processor status](https://img.shields.io/badge/processor%20status-beta-orange) |
|
The processor is synthesizable (tested with Intel Quartus Prime and Lattice Radiant/Synplify) and can successfully execute all the [provided example programs](https://github.com/stnolting/neorv32/tree/master/sw/example). |
|
## Features |
|
66,8 → 68,8
|
- RISC-V-compliant `rv32i` or `rv32e` CPU with optional `C`, `E`, `M` and `Zicsr` 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/doygen_makefile_sw) documentation of the software framework |
- 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 |
- Completely described in behavioral, platform-independent VHDL – no primitives, macros, etc. |
- Fully synchronous design, no latches, no gated clocks |
- Small hardware footprint and high operating frequency |
84,6 → 86,7
- 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) |
|
|
### CPU Features |
91,26 → 94,26
The CPU is compliant to the [official RISC-V specifications](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/riscv-spec.pdf) including a subset of the |
[RISC-V privileged architecture specifications](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/riscv-spec.pdf). |
|
RV32I base instruction set (**`I` extension**): |
**RV32I base instruction set** (`I` extension): |
* ALU instructions: `LUI` `AUIPC` `ADDI` `SLTI` `SLTIU` `XORI` `ORI` `ANDI` `SLLI` `SRLI` `SRAI` `ADD` `SUB` `SLL` `SLT` `SLTU` `XOR` `SRL` `SRA` `OR` `AND` |
* Branches instructions: `JAL` `JALR` `BEQ` `BNE` `BLT` `BGE` `BLTU` `BGEU` |
* Memory instructions: `LB` `LH` `LW` `LBU` `LHU` `SB` `SH` `SW` |
|
Compressed instructions (**`C` extension**): |
**Compressed instructions** (`C` extension): |
* ALU instructions: `C.ADDI4SPN` `C.ADDI` `C.ADD` `C.ADDI16SP` `C.LI` `C.LUI` `C.SLLI` `C.SRLI` `C.SRAI` `C.ANDI` `C.SUB` `C.XOR` `C.OR` `C.AND` `C.MV` `C.NOP` |
* Branches instructions: `C.J` `C.JAL` `C.JR` `C.JALR` `C.BEQZ` `C.BNEZ` |
* Memory instructions: `C.LW` `C.SW` `C.LWSP` `C.SWSP` |
* Misc instructions: `C.EBREAK` (only with `Zicsr` extension) |
|
Embedded CPU version (**`E` extension**): |
**Embedded CPU version** (`E` extension): |
* Reduced register file (only the 16 lowest registers) |
* No performance counter CSRs |
|
Integer multiplication and division hardware (**`M` extension**): |
**Integer multiplication and division hardware** (`M` extension): |
* Multiplication instructions: `MUL` `MULH` `MULHSU` `MULHU` |
* Division instructions: `DIV` `DIVU` `REM` `REMU` |
|
Privileged architecture (**`Zicsr` extension**): |
**Privileged architecture** (`Zicsr` extension): |
* Privilege levels: `M-mode` (Machine mode) |
* CSR access instructions: `CSRRW` `CSRRS` `CSRRC` `CSRRWI` `CSRRSI` `CSRRCI` |
* System instructions: `ECALL` `EBREAK` `MRET` `WFI` |
131,7 → 134,7
* Machine timer interrupt (from MTIME) |
* Machine external interrupt (via CLIC) |
|
General: |
**General**: |
* No hardware support of unaligned accesses (except for instructions in `C` extension that still have to be aligned on 16-bit boundaries) |
* Multi-cycle in-order instruction execution |
|
179,6 → 182,7
| Module | Description | LEs | FFs | Memory bits | DSPs | |
|:---------|:------------------------------------------------|:---:|:---:|:-----------:|:----:| |
| Boot ROM | Bootloader ROM (4kB) | 3 | 1 | 32 768 | 0 | |
| DEVNULL | Dummy device | 2 | 1 | 0 | 0 | |
| DMEM | Processor-internal data memory (8kB) | 12 | 2 | 65 536 | 0 | |
| GPIO | General purpose input/output ports | 37 | 33 | 0 | 0 | |
| IMEM | Processor-internal instruction memory (16kb) | 7 | 2 | 131 072 | 0 | |
317,7 → 321,8
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_TRNG_USE : boolean := false; -- implement true random number generator (TRNG)? |
IO_DEVNULL_USE : boolean := true -- implement dummy device (DEVNULL)? |
); |
port ( |
-- Global control -- |
487,7 → 492,7
|
## Contact |
|
If you have any questions, bug reports, ideas or if you are facing problems with the NEORV32 or want to give some kinf of feedback, open a |
If you have any questions, bug reports, ideas or if you are facing problems with the NEORV32 or want to give some kind of feedback, open a |
[new issue](https://github.com/stnolting/neorv32/issues) or directly drop me a line: |
|
stnolting@gmail.com |