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 36 to Rev 37
- ↔ Reverse comparison
Rev 36 → Rev 37
/.ci/hw_check.sh
10,11 → 10,5
# Run simulation |
sh $homedir/sim/ghdl/ghdl_sim.sh --stop-time=6ms |
|
# Check output |
echo "Checking NEORV32.UART_SIM_MODE text output. Should contain:"; cat $homedir/check_reference.out |
echo "" |
echo "Checking NEORV32.UART_SIM_MODE text output. NEORV32.UART_SIM_MODE text output is:" |
cat neorv32.uart.sim_mode.text.out |
|
# Check if reference can be found in output |
grep -qf $homedir/check_reference.out neorv32.uart.sim_mode.text.out && echo "Hardware test completed successfully!" |
/.ci/sw_check.sh
20,7 → 20,7
make -C $test_app_dir check |
|
# Generate executables for all example projects |
make -C $srcdir_examples clean_all exe |
make -C $srcdir_examples MARCH=-march=rv32imc clean_all exe |
|
# Compile and install bootloader |
make -C $srcdir_bootloader clean_all info bootloader |
/docs/figures/neorv32_logo_inverse_black_bg.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
docs/figures/neorv32_logo_inverse_black_bg.png
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: docs/figures/neorv32_logo_inverse_transparent_bg.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: docs/figures/neorv32_logo_inverse_transparent_bg.png
===================================================================
--- docs/figures/neorv32_logo_inverse_transparent_bg.png (nonexistent)
+++ docs/figures/neorv32_logo_inverse_transparent_bg.png (revision 37)
docs/figures/neorv32_logo_inverse_transparent_bg.png
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: docs/figures/neorv32_logo_transparent_bg.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: docs/figures/neorv32_logo_transparent_bg.png
===================================================================
--- docs/figures/neorv32_logo_transparent_bg.png (nonexistent)
+++ docs/figures/neorv32_logo_transparent_bg.png (revision 37)
docs/figures/neorv32_logo_transparent_bg.png
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: docs/figures/neorv32_logo_white_bg.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: docs/figures/neorv32_logo_white_bg.png
===================================================================
--- docs/figures/neorv32_logo_white_bg.png (nonexistent)
+++ docs/figures/neorv32_logo_white_bg.png (revision 37)
docs/figures/neorv32_logo_white_bg.png
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: docs/NEORV32.pdf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: rtl/core/neorv32_bootloader_image.vhd
===================================================================
--- rtl/core/neorv32_bootloader_image.vhd (revision 36)
+++ rtl/core/neorv32_bootloader_image.vhd (revision 37)
@@ -6,7 +6,7 @@
package neorv32_bootloader_image is
- type bootloader_init_image_t is array (0 to 1018) of std_ulogic_vector(31 downto 0);
+ type bootloader_init_image_t is array (0 to 973) of std_ulogic_vector(31 downto 0);
constant bootloader_init_image : bootloader_init_image_t := (
00000000 => x"00000093",
00000001 => x"00000113",
@@ -44,7 +44,7 @@
00000033 => x"00158593",
00000034 => x"ff5ff06f",
00000035 => x"00001597",
- 00000036 => x"f5c58593",
+ 00000036 => x"ea858593",
00000037 => x"80010617",
00000038 => x"f6c60613",
00000039 => x"80010697",
@@ -100,932 +100,887 @@
00000089 => x"00200513",
00000090 => x"0087f463",
00000091 => x"00400513",
- 00000092 => x"3b5000ef",
+ 00000092 => x"301000ef",
00000093 => x"00005537",
00000094 => x"00000613",
00000095 => x"00000593",
00000096 => x"b0050513",
- 00000097 => x"291000ef",
- 00000098 => x"249000ef",
+ 00000097 => x"1dd000ef",
+ 00000098 => x"195000ef",
00000099 => x"00245793",
00000100 => x"00a78533",
00000101 => x"00f537b3",
00000102 => x"00b785b3",
- 00000103 => x"261000ef",
+ 00000103 => x"1ad000ef",
00000104 => x"ffff07b7",
- 00000105 => x"49078793",
+ 00000105 => x"49478793",
00000106 => x"30579073",
00000107 => x"08000793",
00000108 => x"30479073",
00000109 => x"30046073",
00000110 => x"00100513",
- 00000111 => x"41d000ef",
+ 00000111 => x"369000ef",
00000112 => x"ffff1537",
00000113 => x"800007b7",
- 00000114 => x"f0450513",
+ 00000114 => x"e5050513",
00000115 => x"0007a023",
- 00000116 => x"2fd000ef",
- 00000117 => x"159000ef",
- 00000118 => x"ffff1537",
- 00000119 => x"f3c50513",
- 00000120 => x"2ed000ef",
- 00000121 => x"fe002503",
- 00000122 => x"238000ef",
- 00000123 => x"ffff1537",
- 00000124 => x"f4450513",
- 00000125 => x"2d9000ef",
- 00000126 => x"fe402503",
- 00000127 => x"224000ef",
- 00000128 => x"ffff1537",
- 00000129 => x"f5050513",
- 00000130 => x"2c5000ef",
- 00000131 => x"30102573",
- 00000132 => x"210000ef",
- 00000133 => x"ffff1537",
- 00000134 => x"f5850513",
- 00000135 => x"2b1000ef",
- 00000136 => x"fe802503",
- 00000137 => x"ffff14b7",
- 00000138 => x"00341413",
- 00000139 => x"1f4000ef",
- 00000140 => x"ffff1537",
- 00000141 => x"f6050513",
- 00000142 => x"295000ef",
- 00000143 => x"ff802503",
- 00000144 => x"1e0000ef",
- 00000145 => x"f6848513",
- 00000146 => x"285000ef",
- 00000147 => x"ff002503",
- 00000148 => x"1d0000ef",
- 00000149 => x"ffff1537",
- 00000150 => x"f7450513",
- 00000151 => x"271000ef",
- 00000152 => x"ffc02503",
- 00000153 => x"1bc000ef",
- 00000154 => x"f6848513",
- 00000155 => x"261000ef",
- 00000156 => x"ff402503",
- 00000157 => x"1ac000ef",
- 00000158 => x"ffff1537",
- 00000159 => x"f7c50513",
- 00000160 => x"24d000ef",
- 00000161 => x"14d000ef",
- 00000162 => x"00a404b3",
- 00000163 => x"0084b433",
- 00000164 => x"00b40433",
- 00000165 => x"fa402783",
- 00000166 => x"0207d263",
- 00000167 => x"ffff1537",
- 00000168 => x"fa450513",
- 00000169 => x"229000ef",
- 00000170 => x"219000ef",
- 00000171 => x"02300793",
- 00000172 => x"02f51263",
- 00000173 => x"00000513",
- 00000174 => x"0180006f",
- 00000175 => x"115000ef",
- 00000176 => x"fc85eae3",
- 00000177 => x"00b41463",
- 00000178 => x"fc9566e3",
- 00000179 => x"00100513",
- 00000180 => x"5b4000ef",
- 00000181 => x"0b4000ef",
- 00000182 => x"ffff1937",
- 00000183 => x"ffff19b7",
- 00000184 => x"02300a13",
- 00000185 => x"07200a93",
- 00000186 => x"06800b13",
- 00000187 => x"07500b93",
- 00000188 => x"ffff14b7",
- 00000189 => x"ffff1c37",
- 00000190 => x"fb090513",
- 00000191 => x"1d1000ef",
- 00000192 => x"1b1000ef",
- 00000193 => x"00050413",
- 00000194 => x"199000ef",
- 00000195 => x"ebc98513",
- 00000196 => x"1bd000ef",
- 00000197 => x"fb4400e3",
- 00000198 => x"01541863",
- 00000199 => x"ffff02b7",
- 00000200 => x"00028067",
- 00000201 => x"fd5ff06f",
- 00000202 => x"01641663",
- 00000203 => x"05c000ef",
- 00000204 => x"fc9ff06f",
- 00000205 => x"00000513",
- 00000206 => x"03740063",
- 00000207 => x"07300793",
- 00000208 => x"00f41663",
- 00000209 => x"66c000ef",
- 00000210 => x"fb1ff06f",
- 00000211 => x"06c00793",
- 00000212 => x"00f41863",
- 00000213 => x"00100513",
- 00000214 => x"3f0000ef",
- 00000215 => x"f9dff06f",
- 00000216 => x"06500793",
- 00000217 => x"00f41663",
- 00000218 => x"02c000ef",
- 00000219 => x"f8dff06f",
- 00000220 => x"03f00793",
- 00000221 => x"fb8c0513",
- 00000222 => x"00f40463",
- 00000223 => x"fcc48513",
- 00000224 => x"14d000ef",
- 00000225 => x"f75ff06f",
- 00000226 => x"ffff1537",
- 00000227 => x"de050513",
- 00000228 => x"13d0006f",
- 00000229 => x"800007b7",
- 00000230 => x"0007a783",
- 00000231 => x"00079863",
- 00000232 => x"ffff1537",
- 00000233 => x"e4450513",
- 00000234 => x"1250006f",
- 00000235 => x"ff010113",
- 00000236 => x"00112623",
- 00000237 => x"30047073",
- 00000238 => x"ffff1537",
- 00000239 => x"e6050513",
- 00000240 => x"10d000ef",
- 00000241 => x"fa002783",
- 00000242 => x"fe07cee3",
- 00000243 => x"b0001073",
- 00000244 => x"b8001073",
- 00000245 => x"b0201073",
- 00000246 => x"b8201073",
- 00000247 => x"ff002783",
- 00000248 => x"00078067",
- 00000249 => x"0000006f",
- 00000250 => x"ff010113",
- 00000251 => x"00812423",
- 00000252 => x"00050413",
- 00000253 => x"ffff1537",
- 00000254 => x"e7050513",
- 00000255 => x"00112623",
- 00000256 => x"0cd000ef",
- 00000257 => x"03040513",
- 00000258 => x"0ff57513",
- 00000259 => x"095000ef",
- 00000260 => x"30047073",
- 00000261 => x"00100513",
- 00000262 => x"1c1000ef",
- 00000263 => x"0000006f",
- 00000264 => x"fe010113",
- 00000265 => x"01212823",
- 00000266 => x"00050913",
- 00000267 => x"ffff1537",
- 00000268 => x"00912a23",
- 00000269 => x"e8850513",
- 00000270 => x"ffff14b7",
- 00000271 => x"00812c23",
- 00000272 => x"01312623",
- 00000273 => x"00112e23",
- 00000274 => x"01c00413",
- 00000275 => x"081000ef",
- 00000276 => x"fd848493",
- 00000277 => x"ffc00993",
- 00000278 => x"008957b3",
- 00000279 => x"00f7f793",
- 00000280 => x"00f487b3",
- 00000281 => x"0007c503",
- 00000282 => x"ffc40413",
- 00000283 => x"035000ef",
- 00000284 => x"ff3414e3",
- 00000285 => x"01c12083",
- 00000286 => x"01812403",
- 00000287 => x"01412483",
- 00000288 => x"01012903",
- 00000289 => x"00c12983",
- 00000290 => x"02010113",
- 00000291 => x"00008067",
- 00000292 => x"fb010113",
- 00000293 => x"04112623",
- 00000294 => x"04512423",
- 00000295 => x"04612223",
- 00000296 => x"04712023",
- 00000297 => x"02812e23",
- 00000298 => x"02a12c23",
- 00000299 => x"02b12a23",
- 00000300 => x"02c12823",
- 00000301 => x"02d12623",
- 00000302 => x"02e12423",
- 00000303 => x"02f12223",
- 00000304 => x"03012023",
- 00000305 => x"01112e23",
- 00000306 => x"01c12c23",
- 00000307 => x"01d12a23",
- 00000308 => x"01e12823",
- 00000309 => x"01f12623",
- 00000310 => x"34202473",
- 00000311 => x"800007b7",
- 00000312 => x"00778793",
- 00000313 => x"06f41a63",
- 00000314 => x"00000513",
- 00000315 => x"0d1000ef",
- 00000316 => x"6e0000ef",
- 00000317 => x"fe002783",
- 00000318 => x"0027d793",
- 00000319 => x"00a78533",
- 00000320 => x"00f537b3",
- 00000321 => x"00b785b3",
- 00000322 => x"6f4000ef",
- 00000323 => x"03c12403",
- 00000324 => x"04c12083",
- 00000325 => x"04812283",
- 00000326 => x"04412303",
- 00000327 => x"04012383",
- 00000328 => x"03812503",
- 00000329 => x"03412583",
- 00000330 => x"03012603",
- 00000331 => x"02c12683",
- 00000332 => x"02812703",
- 00000333 => x"02412783",
- 00000334 => x"02012803",
- 00000335 => x"01c12883",
- 00000336 => x"01812e03",
- 00000337 => x"01412e83",
- 00000338 => x"01012f03",
- 00000339 => x"00c12f83",
- 00000340 => x"05010113",
- 00000341 => x"30200073",
- 00000342 => x"00700793",
- 00000343 => x"00100513",
- 00000344 => x"02f40863",
- 00000345 => x"ffff1537",
- 00000346 => x"e7c50513",
- 00000347 => x"760000ef",
- 00000348 => x"00040513",
- 00000349 => x"eadff0ef",
- 00000350 => x"ffff1537",
- 00000351 => x"e8450513",
- 00000352 => x"74c000ef",
- 00000353 => x"34102573",
- 00000354 => x"e99ff0ef",
- 00000355 => x"00500513",
- 00000356 => x"e59ff0ef",
- 00000357 => x"ff010113",
- 00000358 => x"00000513",
- 00000359 => x"00112623",
- 00000360 => x"00812423",
- 00000361 => x"7c0000ef",
- 00000362 => x"00500513",
- 00000363 => x"7fc000ef",
- 00000364 => x"00000513",
- 00000365 => x"7f4000ef",
- 00000366 => x"00050413",
- 00000367 => x"00000513",
- 00000368 => x"7c4000ef",
- 00000369 => x"00c12083",
- 00000370 => x"0ff47513",
- 00000371 => x"00812403",
- 00000372 => x"01010113",
- 00000373 => x"00008067",
- 00000374 => x"ff010113",
- 00000375 => x"00000513",
+ 00000116 => x"249000ef",
+ 00000117 => x"f1302573",
+ 00000118 => x"24c000ef",
+ 00000119 => x"ffff1537",
+ 00000120 => x"e8850513",
+ 00000121 => x"235000ef",
+ 00000122 => x"fe002503",
+ 00000123 => x"238000ef",
+ 00000124 => x"ffff1537",
+ 00000125 => x"e9050513",
+ 00000126 => x"221000ef",
+ 00000127 => x"fe402503",
+ 00000128 => x"224000ef",
+ 00000129 => x"ffff1537",
+ 00000130 => x"e9c50513",
+ 00000131 => x"20d000ef",
+ 00000132 => x"30102573",
+ 00000133 => x"210000ef",
+ 00000134 => x"ffff1537",
+ 00000135 => x"ea450513",
+ 00000136 => x"1f9000ef",
+ 00000137 => x"fe802503",
+ 00000138 => x"ffff14b7",
+ 00000139 => x"00341413",
+ 00000140 => x"1f4000ef",
+ 00000141 => x"ffff1537",
+ 00000142 => x"eac50513",
+ 00000143 => x"1dd000ef",
+ 00000144 => x"ff802503",
+ 00000145 => x"1e0000ef",
+ 00000146 => x"eb448513",
+ 00000147 => x"1cd000ef",
+ 00000148 => x"ff002503",
+ 00000149 => x"1d0000ef",
+ 00000150 => x"ffff1537",
+ 00000151 => x"ec050513",
+ 00000152 => x"1b9000ef",
+ 00000153 => x"ffc02503",
+ 00000154 => x"1bc000ef",
+ 00000155 => x"eb448513",
+ 00000156 => x"1a9000ef",
+ 00000157 => x"ff402503",
+ 00000158 => x"1ac000ef",
+ 00000159 => x"ffff1537",
+ 00000160 => x"ec850513",
+ 00000161 => x"195000ef",
+ 00000162 => x"095000ef",
+ 00000163 => x"00a404b3",
+ 00000164 => x"0084b433",
+ 00000165 => x"00b40433",
+ 00000166 => x"fa402783",
+ 00000167 => x"0207d263",
+ 00000168 => x"ffff1537",
+ 00000169 => x"ef050513",
+ 00000170 => x"171000ef",
+ 00000171 => x"161000ef",
+ 00000172 => x"02300793",
+ 00000173 => x"02f51263",
+ 00000174 => x"00000513",
+ 00000175 => x"0180006f",
+ 00000176 => x"05d000ef",
+ 00000177 => x"fc85eae3",
+ 00000178 => x"00b41463",
+ 00000179 => x"fc9566e3",
+ 00000180 => x"00100513",
+ 00000181 => x"5b8000ef",
+ 00000182 => x"0b4000ef",
+ 00000183 => x"ffff1937",
+ 00000184 => x"ffff19b7",
+ 00000185 => x"02300a13",
+ 00000186 => x"07200a93",
+ 00000187 => x"06800b13",
+ 00000188 => x"07500b93",
+ 00000189 => x"ffff14b7",
+ 00000190 => x"ffff1c37",
+ 00000191 => x"efc90513",
+ 00000192 => x"119000ef",
+ 00000193 => x"0f9000ef",
+ 00000194 => x"00050413",
+ 00000195 => x"0e1000ef",
+ 00000196 => x"e0898513",
+ 00000197 => x"105000ef",
+ 00000198 => x"fb4400e3",
+ 00000199 => x"01541863",
+ 00000200 => x"ffff02b7",
+ 00000201 => x"00028067",
+ 00000202 => x"fd5ff06f",
+ 00000203 => x"01641663",
+ 00000204 => x"05c000ef",
+ 00000205 => x"fc9ff06f",
+ 00000206 => x"00000513",
+ 00000207 => x"03740063",
+ 00000208 => x"07300793",
+ 00000209 => x"00f41663",
+ 00000210 => x"658000ef",
+ 00000211 => x"fb1ff06f",
+ 00000212 => x"06c00793",
+ 00000213 => x"00f41863",
+ 00000214 => x"00100513",
+ 00000215 => x"3f4000ef",
+ 00000216 => x"f9dff06f",
+ 00000217 => x"06500793",
+ 00000218 => x"00f41663",
+ 00000219 => x"02c000ef",
+ 00000220 => x"f8dff06f",
+ 00000221 => x"03f00793",
+ 00000222 => x"f04c0513",
+ 00000223 => x"00f40463",
+ 00000224 => x"f1848513",
+ 00000225 => x"095000ef",
+ 00000226 => x"f75ff06f",
+ 00000227 => x"ffff1537",
+ 00000228 => x"d2c50513",
+ 00000229 => x"0850006f",
+ 00000230 => x"800007b7",
+ 00000231 => x"0007a783",
+ 00000232 => x"00079863",
+ 00000233 => x"ffff1537",
+ 00000234 => x"d9050513",
+ 00000235 => x"06d0006f",
+ 00000236 => x"ff010113",
+ 00000237 => x"00112623",
+ 00000238 => x"30047073",
+ 00000239 => x"ffff1537",
+ 00000240 => x"dac50513",
+ 00000241 => x"055000ef",
+ 00000242 => x"fa002783",
+ 00000243 => x"fe07cee3",
+ 00000244 => x"b0001073",
+ 00000245 => x"b8001073",
+ 00000246 => x"b0201073",
+ 00000247 => x"b8201073",
+ 00000248 => x"ff002783",
+ 00000249 => x"00078067",
+ 00000250 => x"0000006f",
+ 00000251 => x"ff010113",
+ 00000252 => x"00812423",
+ 00000253 => x"00050413",
+ 00000254 => x"ffff1537",
+ 00000255 => x"dbc50513",
+ 00000256 => x"00112623",
+ 00000257 => x"015000ef",
+ 00000258 => x"03040513",
+ 00000259 => x"0ff57513",
+ 00000260 => x"7dc000ef",
+ 00000261 => x"30047073",
+ 00000262 => x"00100513",
+ 00000263 => x"109000ef",
+ 00000264 => x"0000006f",
+ 00000265 => x"fe010113",
+ 00000266 => x"01212823",
+ 00000267 => x"00050913",
+ 00000268 => x"ffff1537",
+ 00000269 => x"00912a23",
+ 00000270 => x"dd450513",
+ 00000271 => x"ffff14b7",
+ 00000272 => x"00812c23",
+ 00000273 => x"01312623",
+ 00000274 => x"00112e23",
+ 00000275 => x"01c00413",
+ 00000276 => x"7c8000ef",
+ 00000277 => x"f2448493",
+ 00000278 => x"ffc00993",
+ 00000279 => x"008957b3",
+ 00000280 => x"00f7f793",
+ 00000281 => x"00f487b3",
+ 00000282 => x"0007c503",
+ 00000283 => x"ffc40413",
+ 00000284 => x"77c000ef",
+ 00000285 => x"ff3414e3",
+ 00000286 => x"01c12083",
+ 00000287 => x"01812403",
+ 00000288 => x"01412483",
+ 00000289 => x"01012903",
+ 00000290 => x"00c12983",
+ 00000291 => x"02010113",
+ 00000292 => x"00008067",
+ 00000293 => x"fb010113",
+ 00000294 => x"04112623",
+ 00000295 => x"04512423",
+ 00000296 => x"04612223",
+ 00000297 => x"04712023",
+ 00000298 => x"02812e23",
+ 00000299 => x"02a12c23",
+ 00000300 => x"02b12a23",
+ 00000301 => x"02c12823",
+ 00000302 => x"02d12623",
+ 00000303 => x"02e12423",
+ 00000304 => x"02f12223",
+ 00000305 => x"03012023",
+ 00000306 => x"01112e23",
+ 00000307 => x"01c12c23",
+ 00000308 => x"01d12a23",
+ 00000309 => x"01e12823",
+ 00000310 => x"01f12623",
+ 00000311 => x"34202473",
+ 00000312 => x"800007b7",
+ 00000313 => x"00778793",
+ 00000314 => x"06f41a63",
+ 00000315 => x"00000513",
+ 00000316 => x"019000ef",
+ 00000317 => x"628000ef",
+ 00000318 => x"fe002783",
+ 00000319 => x"0027d793",
+ 00000320 => x"00a78533",
+ 00000321 => x"00f537b3",
+ 00000322 => x"00b785b3",
+ 00000323 => x"63c000ef",
+ 00000324 => x"03c12403",
+ 00000325 => x"04c12083",
+ 00000326 => x"04812283",
+ 00000327 => x"04412303",
+ 00000328 => x"04012383",
+ 00000329 => x"03812503",
+ 00000330 => x"03412583",
+ 00000331 => x"03012603",
+ 00000332 => x"02c12683",
+ 00000333 => x"02812703",
+ 00000334 => x"02412783",
+ 00000335 => x"02012803",
+ 00000336 => x"01c12883",
+ 00000337 => x"01812e03",
+ 00000338 => x"01412e83",
+ 00000339 => x"01012f03",
+ 00000340 => x"00c12f83",
+ 00000341 => x"05010113",
+ 00000342 => x"30200073",
+ 00000343 => x"00700793",
+ 00000344 => x"00100513",
+ 00000345 => x"02f40863",
+ 00000346 => x"ffff1537",
+ 00000347 => x"dc850513",
+ 00000348 => x"6a8000ef",
+ 00000349 => x"00040513",
+ 00000350 => x"eadff0ef",
+ 00000351 => x"ffff1537",
+ 00000352 => x"dd050513",
+ 00000353 => x"694000ef",
+ 00000354 => x"34102573",
+ 00000355 => x"e99ff0ef",
+ 00000356 => x"00500513",
+ 00000357 => x"e59ff0ef",
+ 00000358 => x"ff010113",
+ 00000359 => x"00000513",
+ 00000360 => x"00112623",
+ 00000361 => x"00812423",
+ 00000362 => x"708000ef",
+ 00000363 => x"09e00513",
+ 00000364 => x"744000ef",
+ 00000365 => x"00000513",
+ 00000366 => x"73c000ef",
+ 00000367 => x"00050413",
+ 00000368 => x"00000513",
+ 00000369 => x"70c000ef",
+ 00000370 => x"00c12083",
+ 00000371 => x"0ff47513",
+ 00000372 => x"00812403",
+ 00000373 => x"01010113",
+ 00000374 => x"00008067",
+ 00000375 => x"ff010113",
00000376 => x"00112623",
00000377 => x"00812423",
- 00000378 => x"77c000ef",
- 00000379 => x"09e00513",
- 00000380 => x"7b8000ef",
- 00000381 => x"00000513",
- 00000382 => x"7b0000ef",
- 00000383 => x"00050413",
- 00000384 => x"00000513",
- 00000385 => x"780000ef",
- 00000386 => x"00c12083",
- 00000387 => x"0ff47513",
- 00000388 => x"00812403",
- 00000389 => x"01010113",
- 00000390 => x"00008067",
- 00000391 => x"ff010113",
- 00000392 => x"00000513",
- 00000393 => x"00112623",
- 00000394 => x"73c000ef",
- 00000395 => x"00600513",
- 00000396 => x"778000ef",
- 00000397 => x"00c12083",
- 00000398 => x"00000513",
- 00000399 => x"01010113",
- 00000400 => x"7440006f",
- 00000401 => x"ff010113",
- 00000402 => x"00812423",
- 00000403 => x"00050413",
- 00000404 => x"01055513",
- 00000405 => x"0ff57513",
- 00000406 => x"00112623",
- 00000407 => x"74c000ef",
- 00000408 => x"00845513",
- 00000409 => x"0ff57513",
- 00000410 => x"740000ef",
- 00000411 => x"0ff47513",
- 00000412 => x"00812403",
- 00000413 => x"00c12083",
- 00000414 => x"01010113",
- 00000415 => x"72c0006f",
- 00000416 => x"ff010113",
- 00000417 => x"00812423",
- 00000418 => x"00050413",
- 00000419 => x"00000513",
- 00000420 => x"00112623",
- 00000421 => x"6d0000ef",
- 00000422 => x"00300513",
- 00000423 => x"70c000ef",
- 00000424 => x"00040513",
- 00000425 => x"fa1ff0ef",
- 00000426 => x"00000513",
- 00000427 => x"6fc000ef",
- 00000428 => x"00050413",
- 00000429 => x"00000513",
- 00000430 => x"6cc000ef",
- 00000431 => x"00c12083",
- 00000432 => x"0ff47513",
- 00000433 => x"00812403",
- 00000434 => x"01010113",
- 00000435 => x"00008067",
- 00000436 => x"fd010113",
- 00000437 => x"02812423",
- 00000438 => x"02912223",
- 00000439 => x"03212023",
- 00000440 => x"01312e23",
- 00000441 => x"01412c23",
- 00000442 => x"02112623",
- 00000443 => x"00050913",
- 00000444 => x"00058993",
- 00000445 => x"00c10493",
- 00000446 => x"00000413",
- 00000447 => x"00400a13",
- 00000448 => x"02091e63",
- 00000449 => x"5ac000ef",
- 00000450 => x"00a481a3",
- 00000451 => x"00140413",
- 00000452 => x"fff48493",
- 00000453 => x"ff4416e3",
- 00000454 => x"02c12083",
- 00000455 => x"02812403",
- 00000456 => x"00c12503",
- 00000457 => x"02412483",
- 00000458 => x"02012903",
- 00000459 => x"01c12983",
- 00000460 => x"01812a03",
- 00000461 => x"03010113",
- 00000462 => x"00008067",
- 00000463 => x"00898533",
- 00000464 => x"f41ff0ef",
- 00000465 => x"fc5ff06f",
- 00000466 => x"fe802783",
- 00000467 => x"fd010113",
- 00000468 => x"02812423",
- 00000469 => x"02112623",
- 00000470 => x"02912223",
- 00000471 => x"03212023",
- 00000472 => x"01312e23",
- 00000473 => x"01412c23",
- 00000474 => x"01512a23",
- 00000475 => x"01612823",
- 00000476 => x"01712623",
- 00000477 => x"0087f793",
- 00000478 => x"00050413",
- 00000479 => x"00078a63",
- 00000480 => x"fe802783",
- 00000481 => x"00400513",
- 00000482 => x"0047f793",
- 00000483 => x"04079663",
- 00000484 => x"02041863",
- 00000485 => x"ffff1537",
- 00000486 => x"e8c50513",
- 00000487 => x"530000ef",
- 00000488 => x"008005b7",
- 00000489 => x"00040513",
- 00000490 => x"f29ff0ef",
- 00000491 => x"4788d7b7",
- 00000492 => x"afe78793",
- 00000493 => x"02f50463",
- 00000494 => x"00000513",
- 00000495 => x"01c0006f",
- 00000496 => x"ffff1537",
- 00000497 => x"eac50513",
- 00000498 => x"504000ef",
- 00000499 => x"e0dff0ef",
- 00000500 => x"fc0518e3",
- 00000501 => x"00300513",
- 00000502 => x"c11ff0ef",
- 00000503 => x"008009b7",
- 00000504 => x"00498593",
- 00000505 => x"00040513",
- 00000506 => x"ee9ff0ef",
- 00000507 => x"00050a13",
- 00000508 => x"00898593",
- 00000509 => x"00040513",
- 00000510 => x"ed9ff0ef",
- 00000511 => x"ff002b83",
- 00000512 => x"00050a93",
- 00000513 => x"ffca7b13",
- 00000514 => x"00000913",
- 00000515 => x"00000493",
- 00000516 => x"00c98993",
- 00000517 => x"013905b3",
- 00000518 => x"052b1863",
- 00000519 => x"015484b3",
- 00000520 => x"00200513",
- 00000521 => x"fa049ae3",
- 00000522 => x"ffff1537",
- 00000523 => x"eb850513",
- 00000524 => x"49c000ef",
- 00000525 => x"02c12083",
- 00000526 => x"02812403",
- 00000527 => x"800007b7",
- 00000528 => x"0147a023",
- 00000529 => x"02412483",
- 00000530 => x"02012903",
- 00000531 => x"01c12983",
- 00000532 => x"01812a03",
- 00000533 => x"01412a83",
- 00000534 => x"01012b03",
- 00000535 => x"00c12b83",
- 00000536 => x"03010113",
- 00000537 => x"00008067",
- 00000538 => x"00040513",
- 00000539 => x"e65ff0ef",
- 00000540 => x"012b87b3",
- 00000541 => x"00a484b3",
- 00000542 => x"00a7a023",
- 00000543 => x"00490913",
- 00000544 => x"f95ff06f",
- 00000545 => x"ff010113",
- 00000546 => x"00112623",
- 00000547 => x"ebdff0ef",
- 00000548 => x"ffff1537",
- 00000549 => x"ebc50513",
- 00000550 => x"434000ef",
- 00000551 => x"af9ff0ef",
- 00000552 => x"0000006f",
- 00000553 => x"ff010113",
- 00000554 => x"00112623",
- 00000555 => x"00812423",
- 00000556 => x"00912223",
- 00000557 => x"00058413",
- 00000558 => x"00050493",
- 00000559 => x"d61ff0ef",
- 00000560 => x"00000513",
- 00000561 => x"4a0000ef",
- 00000562 => x"00200513",
- 00000563 => x"4dc000ef",
- 00000564 => x"00048513",
- 00000565 => x"d71ff0ef",
- 00000566 => x"00040513",
- 00000567 => x"4cc000ef",
- 00000568 => x"00000513",
- 00000569 => x"4a0000ef",
- 00000570 => x"cadff0ef",
- 00000571 => x"00157513",
- 00000572 => x"fe051ce3",
+ 00000378 => x"00000513",
+ 00000379 => x"6c4000ef",
+ 00000380 => x"00500513",
+ 00000381 => x"700000ef",
+ 00000382 => x"00000513",
+ 00000383 => x"6f8000ef",
+ 00000384 => x"00050413",
+ 00000385 => x"00147413",
+ 00000386 => x"00000513",
+ 00000387 => x"6c4000ef",
+ 00000388 => x"fc041ce3",
+ 00000389 => x"00c12083",
+ 00000390 => x"00812403",
+ 00000391 => x"01010113",
+ 00000392 => x"00008067",
+ 00000393 => x"ff010113",
+ 00000394 => x"00000513",
+ 00000395 => x"00112623",
+ 00000396 => x"680000ef",
+ 00000397 => x"00600513",
+ 00000398 => x"6bc000ef",
+ 00000399 => x"00c12083",
+ 00000400 => x"00000513",
+ 00000401 => x"01010113",
+ 00000402 => x"6880006f",
+ 00000403 => x"ff010113",
+ 00000404 => x"00812423",
+ 00000405 => x"00050413",
+ 00000406 => x"01055513",
+ 00000407 => x"0ff57513",
+ 00000408 => x"00112623",
+ 00000409 => x"690000ef",
+ 00000410 => x"00845513",
+ 00000411 => x"0ff57513",
+ 00000412 => x"684000ef",
+ 00000413 => x"0ff47513",
+ 00000414 => x"00812403",
+ 00000415 => x"00c12083",
+ 00000416 => x"01010113",
+ 00000417 => x"6700006f",
+ 00000418 => x"ff010113",
+ 00000419 => x"00812423",
+ 00000420 => x"00050413",
+ 00000421 => x"00000513",
+ 00000422 => x"00112623",
+ 00000423 => x"614000ef",
+ 00000424 => x"00300513",
+ 00000425 => x"650000ef",
+ 00000426 => x"00040513",
+ 00000427 => x"fa1ff0ef",
+ 00000428 => x"00000513",
+ 00000429 => x"640000ef",
+ 00000430 => x"00050413",
+ 00000431 => x"00000513",
+ 00000432 => x"610000ef",
+ 00000433 => x"00c12083",
+ 00000434 => x"0ff47513",
+ 00000435 => x"00812403",
+ 00000436 => x"01010113",
+ 00000437 => x"00008067",
+ 00000438 => x"fd010113",
+ 00000439 => x"02812423",
+ 00000440 => x"02912223",
+ 00000441 => x"03212023",
+ 00000442 => x"01312e23",
+ 00000443 => x"01412c23",
+ 00000444 => x"02112623",
+ 00000445 => x"00050913",
+ 00000446 => x"00058993",
+ 00000447 => x"00c10493",
+ 00000448 => x"00000413",
+ 00000449 => x"00400a13",
+ 00000450 => x"02091e63",
+ 00000451 => x"4f0000ef",
+ 00000452 => x"00a481a3",
+ 00000453 => x"00140413",
+ 00000454 => x"fff48493",
+ 00000455 => x"ff4416e3",
+ 00000456 => x"02c12083",
+ 00000457 => x"02812403",
+ 00000458 => x"00c12503",
+ 00000459 => x"02412483",
+ 00000460 => x"02012903",
+ 00000461 => x"01c12983",
+ 00000462 => x"01812a03",
+ 00000463 => x"03010113",
+ 00000464 => x"00008067",
+ 00000465 => x"00898533",
+ 00000466 => x"f41ff0ef",
+ 00000467 => x"fc5ff06f",
+ 00000468 => x"fe802783",
+ 00000469 => x"fd010113",
+ 00000470 => x"02812423",
+ 00000471 => x"02112623",
+ 00000472 => x"02912223",
+ 00000473 => x"03212023",
+ 00000474 => x"01312e23",
+ 00000475 => x"01412c23",
+ 00000476 => x"01512a23",
+ 00000477 => x"01612823",
+ 00000478 => x"01712623",
+ 00000479 => x"0087f793",
+ 00000480 => x"00050413",
+ 00000481 => x"00078a63",
+ 00000482 => x"fe802783",
+ 00000483 => x"00400513",
+ 00000484 => x"0047f793",
+ 00000485 => x"04079663",
+ 00000486 => x"02041863",
+ 00000487 => x"ffff1537",
+ 00000488 => x"dd850513",
+ 00000489 => x"474000ef",
+ 00000490 => x"008005b7",
+ 00000491 => x"00040513",
+ 00000492 => x"f29ff0ef",
+ 00000493 => x"4788d7b7",
+ 00000494 => x"afe78793",
+ 00000495 => x"02f50463",
+ 00000496 => x"00000513",
+ 00000497 => x"01c0006f",
+ 00000498 => x"ffff1537",
+ 00000499 => x"df850513",
+ 00000500 => x"448000ef",
+ 00000501 => x"dc5ff0ef",
+ 00000502 => x"fc0518e3",
+ 00000503 => x"00300513",
+ 00000504 => x"c0dff0ef",
+ 00000505 => x"008009b7",
+ 00000506 => x"00498593",
+ 00000507 => x"00040513",
+ 00000508 => x"ee9ff0ef",
+ 00000509 => x"00050a13",
+ 00000510 => x"00898593",
+ 00000511 => x"00040513",
+ 00000512 => x"ed9ff0ef",
+ 00000513 => x"ff002b83",
+ 00000514 => x"00050a93",
+ 00000515 => x"ffca7b13",
+ 00000516 => x"00000913",
+ 00000517 => x"00000493",
+ 00000518 => x"00c98993",
+ 00000519 => x"013905b3",
+ 00000520 => x"052b1863",
+ 00000521 => x"015484b3",
+ 00000522 => x"00200513",
+ 00000523 => x"fa049ae3",
+ 00000524 => x"ffff1537",
+ 00000525 => x"e0450513",
+ 00000526 => x"3e0000ef",
+ 00000527 => x"02c12083",
+ 00000528 => x"02812403",
+ 00000529 => x"800007b7",
+ 00000530 => x"0147a023",
+ 00000531 => x"02412483",
+ 00000532 => x"02012903",
+ 00000533 => x"01c12983",
+ 00000534 => x"01812a03",
+ 00000535 => x"01412a83",
+ 00000536 => x"01012b03",
+ 00000537 => x"00c12b83",
+ 00000538 => x"03010113",
+ 00000539 => x"00008067",
+ 00000540 => x"00040513",
+ 00000541 => x"e65ff0ef",
+ 00000542 => x"012b87b3",
+ 00000543 => x"00a484b3",
+ 00000544 => x"00a7a023",
+ 00000545 => x"00490913",
+ 00000546 => x"f95ff06f",
+ 00000547 => x"ff010113",
+ 00000548 => x"00112623",
+ 00000549 => x"ebdff0ef",
+ 00000550 => x"ffff1537",
+ 00000551 => x"e0850513",
+ 00000552 => x"378000ef",
+ 00000553 => x"af5ff0ef",
+ 00000554 => x"0000006f",
+ 00000555 => x"ff010113",
+ 00000556 => x"00112623",
+ 00000557 => x"00812423",
+ 00000558 => x"00912223",
+ 00000559 => x"00058413",
+ 00000560 => x"00050493",
+ 00000561 => x"d61ff0ef",
+ 00000562 => x"00000513",
+ 00000563 => x"3e4000ef",
+ 00000564 => x"00200513",
+ 00000565 => x"420000ef",
+ 00000566 => x"00048513",
+ 00000567 => x"d71ff0ef",
+ 00000568 => x"00040513",
+ 00000569 => x"410000ef",
+ 00000570 => x"00000513",
+ 00000571 => x"3e4000ef",
+ 00000572 => x"00812403",
00000573 => x"00c12083",
- 00000574 => x"00812403",
- 00000575 => x"00412483",
- 00000576 => x"01010113",
- 00000577 => x"00008067",
- 00000578 => x"fe010113",
- 00000579 => x"00812c23",
- 00000580 => x"00912a23",
- 00000581 => x"01212823",
- 00000582 => x"00112e23",
- 00000583 => x"00b12623",
- 00000584 => x"00300413",
- 00000585 => x"00350493",
- 00000586 => x"fff00913",
- 00000587 => x"00c10793",
- 00000588 => x"008787b3",
- 00000589 => x"0007c583",
- 00000590 => x"40848533",
- 00000591 => x"fff40413",
- 00000592 => x"f65ff0ef",
- 00000593 => x"ff2414e3",
- 00000594 => x"01c12083",
- 00000595 => x"01812403",
- 00000596 => x"01412483",
- 00000597 => x"01012903",
- 00000598 => x"02010113",
- 00000599 => x"00008067",
- 00000600 => x"ff010113",
- 00000601 => x"00112623",
- 00000602 => x"00812423",
- 00000603 => x"00050413",
- 00000604 => x"cadff0ef",
- 00000605 => x"00000513",
- 00000606 => x"3ec000ef",
- 00000607 => x"0d800513",
- 00000608 => x"428000ef",
- 00000609 => x"00040513",
- 00000610 => x"cbdff0ef",
- 00000611 => x"00000513",
- 00000612 => x"3f4000ef",
- 00000613 => x"c01ff0ef",
- 00000614 => x"00157513",
- 00000615 => x"fe051ce3",
- 00000616 => x"00c12083",
- 00000617 => x"00812403",
- 00000618 => x"01010113",
- 00000619 => x"00008067",
- 00000620 => x"fe010113",
- 00000621 => x"800007b7",
- 00000622 => x"00812c23",
- 00000623 => x"0007a403",
- 00000624 => x"00112e23",
- 00000625 => x"00912a23",
- 00000626 => x"01212823",
- 00000627 => x"01312623",
- 00000628 => x"01412423",
- 00000629 => x"01512223",
- 00000630 => x"02041863",
- 00000631 => x"ffff1537",
- 00000632 => x"e4450513",
- 00000633 => x"01812403",
- 00000634 => x"01c12083",
- 00000635 => x"01412483",
- 00000636 => x"01012903",
- 00000637 => x"00c12983",
- 00000638 => x"00812a03",
- 00000639 => x"00412a83",
- 00000640 => x"02010113",
- 00000641 => x"2c80006f",
- 00000642 => x"ffff1537",
- 00000643 => x"ec050513",
- 00000644 => x"2bc000ef",
- 00000645 => x"00040513",
- 00000646 => x"a09ff0ef",
- 00000647 => x"ffff1537",
- 00000648 => x"ecc50513",
- 00000649 => x"2a8000ef",
- 00000650 => x"00800537",
- 00000651 => x"9f5ff0ef",
- 00000652 => x"ffff1537",
- 00000653 => x"ee850513",
- 00000654 => x"294000ef",
- 00000655 => x"274000ef",
- 00000656 => x"00050493",
- 00000657 => x"25c000ef",
- 00000658 => x"07900793",
- 00000659 => x"0af49e63",
- 00000660 => x"b89ff0ef",
- 00000661 => x"00051663",
- 00000662 => x"00300513",
- 00000663 => x"98dff0ef",
- 00000664 => x"ffff1537",
- 00000665 => x"ef450513",
- 00000666 => x"01045493",
- 00000667 => x"260000ef",
- 00000668 => x"00148493",
- 00000669 => x"00800937",
- 00000670 => x"fff00993",
- 00000671 => x"00010a37",
- 00000672 => x"fff48493",
- 00000673 => x"07349063",
- 00000674 => x"4788d5b7",
- 00000675 => x"afe58593",
- 00000676 => x"00800537",
- 00000677 => x"e75ff0ef",
- 00000678 => x"00800537",
- 00000679 => x"00040593",
- 00000680 => x"00450513",
- 00000681 => x"e65ff0ef",
- 00000682 => x"ff002a03",
- 00000683 => x"008009b7",
- 00000684 => x"ffc47413",
- 00000685 => x"00000493",
- 00000686 => x"00000913",
- 00000687 => x"00c98a93",
- 00000688 => x"01548533",
- 00000689 => x"009a07b3",
- 00000690 => x"02849663",
- 00000691 => x"00898513",
- 00000692 => x"412005b3",
- 00000693 => x"e35ff0ef",
- 00000694 => x"ffff1537",
- 00000695 => x"eb850513",
- 00000696 => x"f05ff06f",
- 00000697 => x"00090513",
- 00000698 => x"e79ff0ef",
- 00000699 => x"01490933",
- 00000700 => x"f91ff06f",
- 00000701 => x"0007a583",
- 00000702 => x"00448493",
- 00000703 => x"00b90933",
- 00000704 => x"e09ff0ef",
- 00000705 => x"fbdff06f",
- 00000706 => x"01c12083",
- 00000707 => x"01812403",
- 00000708 => x"01412483",
- 00000709 => x"01012903",
- 00000710 => x"00c12983",
- 00000711 => x"00812a03",
- 00000712 => x"00412a83",
- 00000713 => x"02010113",
- 00000714 => x"00008067",
- 00000715 => x"fe010113",
- 00000716 => x"00912a23",
- 00000717 => x"01312623",
- 00000718 => x"01412423",
- 00000719 => x"00112e23",
- 00000720 => x"00812c23",
- 00000721 => x"01212823",
- 00000722 => x"00000493",
- 00000723 => x"00300a13",
- 00000724 => x"00400993",
- 00000725 => x"f13027f3",
- 00000726 => x"40900733",
- 00000727 => x"00371713",
- 00000728 => x"01870713",
- 00000729 => x"00e7d7b3",
- 00000730 => x"0ff7f793",
- 00000731 => x"0047d513",
- 00000732 => x"40a00933",
- 00000733 => x"00491913",
- 00000734 => x"03078793",
- 00000735 => x"0ff97913",
- 00000736 => x"0ff7f413",
- 00000737 => x"00050663",
- 00000738 => x"03050513",
- 00000739 => x"114000ef",
- 00000740 => x"01240533",
- 00000741 => x"0ff57513",
- 00000742 => x"108000ef",
- 00000743 => x"01448663",
- 00000744 => x"02e00513",
- 00000745 => x"0fc000ef",
- 00000746 => x"00148493",
- 00000747 => x"fb3494e3",
- 00000748 => x"01c12083",
- 00000749 => x"01812403",
- 00000750 => x"01412483",
- 00000751 => x"01012903",
- 00000752 => x"00c12983",
- 00000753 => x"00812a03",
- 00000754 => x"02010113",
- 00000755 => x"00008067",
- 00000756 => x"ff010113",
- 00000757 => x"f9402783",
- 00000758 => x"f9002703",
- 00000759 => x"f9402683",
- 00000760 => x"fed79ae3",
- 00000761 => x"00e12023",
- 00000762 => x"00f12223",
- 00000763 => x"00012503",
- 00000764 => x"00412583",
- 00000765 => x"01010113",
+ 00000574 => x"00412483",
+ 00000575 => x"01010113",
+ 00000576 => x"cddff06f",
+ 00000577 => x"fe010113",
+ 00000578 => x"00812c23",
+ 00000579 => x"00912a23",
+ 00000580 => x"01212823",
+ 00000581 => x"00112e23",
+ 00000582 => x"00b12623",
+ 00000583 => x"00300413",
+ 00000584 => x"00350493",
+ 00000585 => x"fff00913",
+ 00000586 => x"00c10793",
+ 00000587 => x"008787b3",
+ 00000588 => x"0007c583",
+ 00000589 => x"40848533",
+ 00000590 => x"fff40413",
+ 00000591 => x"f71ff0ef",
+ 00000592 => x"ff2414e3",
+ 00000593 => x"01c12083",
+ 00000594 => x"01812403",
+ 00000595 => x"01412483",
+ 00000596 => x"01012903",
+ 00000597 => x"02010113",
+ 00000598 => x"00008067",
+ 00000599 => x"ff010113",
+ 00000600 => x"00112623",
+ 00000601 => x"00812423",
+ 00000602 => x"00050413",
+ 00000603 => x"cb9ff0ef",
+ 00000604 => x"00000513",
+ 00000605 => x"33c000ef",
+ 00000606 => x"0d800513",
+ 00000607 => x"378000ef",
+ 00000608 => x"00040513",
+ 00000609 => x"cc9ff0ef",
+ 00000610 => x"00000513",
+ 00000611 => x"344000ef",
+ 00000612 => x"00812403",
+ 00000613 => x"00c12083",
+ 00000614 => x"01010113",
+ 00000615 => x"c41ff06f",
+ 00000616 => x"fe010113",
+ 00000617 => x"800007b7",
+ 00000618 => x"00812c23",
+ 00000619 => x"0007a403",
+ 00000620 => x"00112e23",
+ 00000621 => x"00912a23",
+ 00000622 => x"01212823",
+ 00000623 => x"01312623",
+ 00000624 => x"01412423",
+ 00000625 => x"01512223",
+ 00000626 => x"02041863",
+ 00000627 => x"ffff1537",
+ 00000628 => x"d9050513",
+ 00000629 => x"01812403",
+ 00000630 => x"01c12083",
+ 00000631 => x"01412483",
+ 00000632 => x"01012903",
+ 00000633 => x"00c12983",
+ 00000634 => x"00812a03",
+ 00000635 => x"00412a83",
+ 00000636 => x"02010113",
+ 00000637 => x"2240006f",
+ 00000638 => x"ffff1537",
+ 00000639 => x"e0c50513",
+ 00000640 => x"218000ef",
+ 00000641 => x"00040513",
+ 00000642 => x"a1dff0ef",
+ 00000643 => x"ffff1537",
+ 00000644 => x"e1850513",
+ 00000645 => x"204000ef",
+ 00000646 => x"00800537",
+ 00000647 => x"a09ff0ef",
+ 00000648 => x"ffff1537",
+ 00000649 => x"e3450513",
+ 00000650 => x"1f0000ef",
+ 00000651 => x"1d0000ef",
+ 00000652 => x"00050493",
+ 00000653 => x"1b8000ef",
+ 00000654 => x"07900793",
+ 00000655 => x"0af49e63",
+ 00000656 => x"b59ff0ef",
+ 00000657 => x"00051663",
+ 00000658 => x"00300513",
+ 00000659 => x"9a1ff0ef",
+ 00000660 => x"ffff1537",
+ 00000661 => x"e4050513",
+ 00000662 => x"01045493",
+ 00000663 => x"1bc000ef",
+ 00000664 => x"00148493",
+ 00000665 => x"00800937",
+ 00000666 => x"fff00993",
+ 00000667 => x"00010a37",
+ 00000668 => x"fff48493",
+ 00000669 => x"07349063",
+ 00000670 => x"4788d5b7",
+ 00000671 => x"afe58593",
+ 00000672 => x"00800537",
+ 00000673 => x"e81ff0ef",
+ 00000674 => x"00800537",
+ 00000675 => x"00040593",
+ 00000676 => x"00450513",
+ 00000677 => x"e71ff0ef",
+ 00000678 => x"ff002a03",
+ 00000679 => x"008009b7",
+ 00000680 => x"ffc47413",
+ 00000681 => x"00000493",
+ 00000682 => x"00000913",
+ 00000683 => x"00c98a93",
+ 00000684 => x"01548533",
+ 00000685 => x"009a07b3",
+ 00000686 => x"02849663",
+ 00000687 => x"00898513",
+ 00000688 => x"412005b3",
+ 00000689 => x"e41ff0ef",
+ 00000690 => x"ffff1537",
+ 00000691 => x"e0450513",
+ 00000692 => x"f05ff06f",
+ 00000693 => x"00090513",
+ 00000694 => x"e85ff0ef",
+ 00000695 => x"01490933",
+ 00000696 => x"f91ff06f",
+ 00000697 => x"0007a583",
+ 00000698 => x"00448493",
+ 00000699 => x"00b90933",
+ 00000700 => x"e15ff0ef",
+ 00000701 => x"fbdff06f",
+ 00000702 => x"01c12083",
+ 00000703 => x"01812403",
+ 00000704 => x"01412483",
+ 00000705 => x"01012903",
+ 00000706 => x"00c12983",
+ 00000707 => x"00812a03",
+ 00000708 => x"00412a83",
+ 00000709 => x"02010113",
+ 00000710 => x"00008067",
+ 00000711 => x"ff010113",
+ 00000712 => x"f9402783",
+ 00000713 => x"f9002703",
+ 00000714 => x"f9402683",
+ 00000715 => x"fed79ae3",
+ 00000716 => x"00e12023",
+ 00000717 => x"00f12223",
+ 00000718 => x"00012503",
+ 00000719 => x"00412583",
+ 00000720 => x"01010113",
+ 00000721 => x"00008067",
+ 00000722 => x"f9800693",
+ 00000723 => x"fff00613",
+ 00000724 => x"00c6a023",
+ 00000725 => x"00a6a023",
+ 00000726 => x"00b6a223",
+ 00000727 => x"00008067",
+ 00000728 => x"fa002023",
+ 00000729 => x"fe002683",
+ 00000730 => x"00151513",
+ 00000731 => x"00000713",
+ 00000732 => x"04a6f263",
+ 00000733 => x"000016b7",
+ 00000734 => x"00000793",
+ 00000735 => x"ffe68693",
+ 00000736 => x"04e6e463",
+ 00000737 => x"00167613",
+ 00000738 => x"0015f593",
+ 00000739 => x"01879793",
+ 00000740 => x"01e61613",
+ 00000741 => x"00c7e7b3",
+ 00000742 => x"01d59593",
+ 00000743 => x"00b7e7b3",
+ 00000744 => x"00e7e7b3",
+ 00000745 => x"10000737",
+ 00000746 => x"00e7e7b3",
+ 00000747 => x"faf02023",
+ 00000748 => x"00008067",
+ 00000749 => x"00170793",
+ 00000750 => x"01079713",
+ 00000751 => x"40a686b3",
+ 00000752 => x"01075713",
+ 00000753 => x"fadff06f",
+ 00000754 => x"ffe78513",
+ 00000755 => x"0fd57513",
+ 00000756 => x"00051a63",
+ 00000757 => x"00375713",
+ 00000758 => x"00178793",
+ 00000759 => x"0ff7f793",
+ 00000760 => x"fa1ff06f",
+ 00000761 => x"00175713",
+ 00000762 => x"ff1ff06f",
+ 00000763 => x"fa002783",
+ 00000764 => x"fe07cee3",
+ 00000765 => x"faa02223",
00000766 => x"00008067",
- 00000767 => x"f9800693",
- 00000768 => x"fff00613",
- 00000769 => x"00c6a023",
- 00000770 => x"00a6a023",
- 00000771 => x"00b6a223",
- 00000772 => x"00008067",
- 00000773 => x"fa002023",
- 00000774 => x"fe002683",
- 00000775 => x"00151513",
- 00000776 => x"00000713",
- 00000777 => x"04a6f263",
- 00000778 => x"000016b7",
- 00000779 => x"00000793",
- 00000780 => x"ffe68693",
- 00000781 => x"04e6e463",
- 00000782 => x"00167613",
- 00000783 => x"0015f593",
- 00000784 => x"01879793",
- 00000785 => x"01e61613",
- 00000786 => x"00c7e7b3",
- 00000787 => x"01d59593",
- 00000788 => x"00b7e7b3",
- 00000789 => x"00e7e7b3",
- 00000790 => x"10000737",
- 00000791 => x"00e7e7b3",
- 00000792 => x"faf02023",
- 00000793 => x"00008067",
- 00000794 => x"00170793",
- 00000795 => x"01079713",
- 00000796 => x"40a686b3",
- 00000797 => x"01075713",
- 00000798 => x"fadff06f",
- 00000799 => x"ffe78513",
- 00000800 => x"0fd57513",
- 00000801 => x"00051a63",
- 00000802 => x"00375713",
- 00000803 => x"00178793",
- 00000804 => x"0ff7f793",
- 00000805 => x"fa1ff06f",
- 00000806 => x"00175713",
- 00000807 => x"ff1ff06f",
- 00000808 => x"fa002783",
- 00000809 => x"fe07cee3",
- 00000810 => x"faa02223",
+ 00000767 => x"fa402503",
+ 00000768 => x"fe055ee3",
+ 00000769 => x"0ff57513",
+ 00000770 => x"00008067",
+ 00000771 => x"fa402503",
+ 00000772 => x"0ff57513",
+ 00000773 => x"00008067",
+ 00000774 => x"ff010113",
+ 00000775 => x"00812423",
+ 00000776 => x"01212023",
+ 00000777 => x"00112623",
+ 00000778 => x"00912223",
+ 00000779 => x"00050413",
+ 00000780 => x"00a00913",
+ 00000781 => x"00044483",
+ 00000782 => x"00140413",
+ 00000783 => x"00049e63",
+ 00000784 => x"00c12083",
+ 00000785 => x"00812403",
+ 00000786 => x"00412483",
+ 00000787 => x"00012903",
+ 00000788 => x"01010113",
+ 00000789 => x"00008067",
+ 00000790 => x"01249663",
+ 00000791 => x"00d00513",
+ 00000792 => x"f8dff0ef",
+ 00000793 => x"00048513",
+ 00000794 => x"f85ff0ef",
+ 00000795 => x"fc9ff06f",
+ 00000796 => x"00757513",
+ 00000797 => x"0016f793",
+ 00000798 => x"00367613",
+ 00000799 => x"00a51513",
+ 00000800 => x"00f79793",
+ 00000801 => x"0015f593",
+ 00000802 => x"00f567b3",
+ 00000803 => x"00d61613",
+ 00000804 => x"00c7e7b3",
+ 00000805 => x"00959593",
+ 00000806 => x"fa800713",
+ 00000807 => x"00b7e7b3",
+ 00000808 => x"00072023",
+ 00000809 => x"1007e793",
+ 00000810 => x"00f72023",
00000811 => x"00008067",
- 00000812 => x"fa402503",
- 00000813 => x"fe055ee3",
- 00000814 => x"0ff57513",
- 00000815 => x"00008067",
- 00000816 => x"fa402503",
- 00000817 => x"0ff57513",
- 00000818 => x"00008067",
- 00000819 => x"ff010113",
- 00000820 => x"00812423",
- 00000821 => x"01212023",
- 00000822 => x"00112623",
- 00000823 => x"00912223",
- 00000824 => x"00050413",
- 00000825 => x"00a00913",
- 00000826 => x"00044483",
- 00000827 => x"00140413",
- 00000828 => x"00049e63",
- 00000829 => x"00c12083",
- 00000830 => x"00812403",
- 00000831 => x"00412483",
- 00000832 => x"00012903",
- 00000833 => x"01010113",
- 00000834 => x"00008067",
- 00000835 => x"01249663",
- 00000836 => x"00d00513",
- 00000837 => x"f8dff0ef",
- 00000838 => x"00048513",
- 00000839 => x"f85ff0ef",
- 00000840 => x"fc9ff06f",
- 00000841 => x"00757513",
- 00000842 => x"0016f793",
- 00000843 => x"00367613",
- 00000844 => x"00a51513",
- 00000845 => x"00f79793",
- 00000846 => x"0015f593",
- 00000847 => x"00f567b3",
- 00000848 => x"00d61613",
- 00000849 => x"00c7e7b3",
- 00000850 => x"00959593",
- 00000851 => x"fa800713",
- 00000852 => x"00b7e7b3",
- 00000853 => x"00072023",
- 00000854 => x"1007e793",
- 00000855 => x"00f72023",
- 00000856 => x"00008067",
- 00000857 => x"fa800713",
- 00000858 => x"00072683",
- 00000859 => x"00757793",
- 00000860 => x"00100513",
- 00000861 => x"00f51533",
- 00000862 => x"00d56533",
- 00000863 => x"00a72023",
- 00000864 => x"00008067",
- 00000865 => x"fa800713",
- 00000866 => x"00072683",
- 00000867 => x"00757513",
- 00000868 => x"00100793",
- 00000869 => x"00a797b3",
- 00000870 => x"fff7c793",
- 00000871 => x"00d7f7b3",
- 00000872 => x"00f72023",
- 00000873 => x"00008067",
- 00000874 => x"faa02623",
- 00000875 => x"fa802783",
- 00000876 => x"fe07cee3",
- 00000877 => x"fac02503",
- 00000878 => x"00008067",
- 00000879 => x"f8400713",
- 00000880 => x"00072683",
- 00000881 => x"00100793",
- 00000882 => x"00a797b3",
- 00000883 => x"00d7c7b3",
- 00000884 => x"00f72023",
- 00000885 => x"00008067",
- 00000886 => x"f8a02223",
- 00000887 => x"00008067",
- 00000888 => x"69617641",
- 00000889 => x"6c62616c",
- 00000890 => x"4d432065",
- 00000891 => x"0a3a7344",
- 00000892 => x"203a6820",
- 00000893 => x"706c6548",
- 00000894 => x"3a72200a",
- 00000895 => x"73655220",
- 00000896 => x"74726174",
- 00000897 => x"3a75200a",
- 00000898 => x"6c705520",
- 00000899 => x"0a64616f",
- 00000900 => x"203a7320",
- 00000901 => x"726f7453",
- 00000902 => x"6f742065",
- 00000903 => x"616c6620",
- 00000904 => x"200a6873",
- 00000905 => x"4c203a6c",
- 00000906 => x"2064616f",
- 00000907 => x"6d6f7266",
- 00000908 => x"616c6620",
- 00000909 => x"200a6873",
- 00000910 => x"45203a65",
- 00000911 => x"75636578",
- 00000912 => x"00006574",
- 00000913 => x"65206f4e",
- 00000914 => x"75636578",
- 00000915 => x"6c626174",
- 00000916 => x"76612065",
- 00000917 => x"616c6961",
- 00000918 => x"2e656c62",
- 00000919 => x"00000000",
- 00000920 => x"746f6f42",
- 00000921 => x"2e676e69",
- 00000922 => x"0a0a2e2e",
- 00000923 => x"00000000",
- 00000924 => x"52450a07",
- 00000925 => x"5f524f52",
- 00000926 => x"00000000",
- 00000927 => x"58450a0a",
- 00000928 => x"00282043",
- 00000929 => x"20402029",
- 00000930 => x"00007830",
- 00000931 => x"69617741",
- 00000932 => x"676e6974",
- 00000933 => x"6f656e20",
- 00000934 => x"32337672",
- 00000935 => x"6578655f",
- 00000936 => x"6e69622e",
- 00000937 => x"202e2e2e",
- 00000938 => x"00000000",
- 00000939 => x"64616f4c",
- 00000940 => x"2e676e69",
- 00000941 => x"00202e2e",
- 00000942 => x"00004b4f",
- 00000943 => x"0000000a",
- 00000944 => x"74697257",
- 00000945 => x"78302065",
- 00000946 => x"00000000",
- 00000947 => x"74796220",
- 00000948 => x"74207365",
- 00000949 => x"5053206f",
- 00000950 => x"6c662049",
- 00000951 => x"20687361",
- 00000952 => x"78302040",
- 00000953 => x"00000000",
- 00000954 => x"7928203f",
- 00000955 => x"20296e2f",
- 00000956 => x"00000000",
- 00000957 => x"616c460a",
- 00000958 => x"6e696873",
- 00000959 => x"2e2e2e67",
- 00000960 => x"00000020",
- 00000961 => x"0a0a0a0a",
- 00000962 => x"4e203c3c",
- 00000963 => x"56524f45",
- 00000964 => x"42203233",
- 00000965 => x"6c746f6f",
- 00000966 => x"6564616f",
- 00000967 => x"3e3e2072",
- 00000968 => x"4c420a0a",
- 00000969 => x"203a5644",
- 00000970 => x"20766f4e",
- 00000971 => x"32203320",
- 00000972 => x"0a303230",
- 00000973 => x"3a565748",
- 00000974 => x"00002020",
- 00000975 => x"4b4c430a",
- 00000976 => x"0020203a",
- 00000977 => x"0a7a4820",
- 00000978 => x"52455355",
- 00000979 => x"0000203a",
- 00000980 => x"53494d0a",
- 00000981 => x"00203a41",
- 00000982 => x"4f52500a",
- 00000983 => x"00203a43",
- 00000984 => x"454d490a",
- 00000985 => x"00203a4d",
- 00000986 => x"74796220",
- 00000987 => x"40207365",
- 00000988 => x"00000020",
- 00000989 => x"454d440a",
- 00000990 => x"00203a4d",
- 00000991 => x"75410a0a",
- 00000992 => x"6f626f74",
- 00000993 => x"6920746f",
- 00000994 => x"7338206e",
- 00000995 => x"7250202e",
- 00000996 => x"20737365",
- 00000997 => x"2079656b",
- 00000998 => x"61206f74",
- 00000999 => x"74726f62",
- 00001000 => x"00000a2e",
- 00001001 => x"726f6241",
- 00001002 => x"2e646574",
- 00001003 => x"00000a0a",
- 00001004 => x"444d430a",
- 00001005 => x"00203e3a",
- 00001006 => x"53207962",
- 00001007 => x"68706574",
- 00001008 => x"4e206e61",
- 00001009 => x"69746c6f",
- 00001010 => x"0000676e",
- 00001011 => x"61766e49",
- 00001012 => x"2064696c",
- 00001013 => x"00444d43",
- 00001014 => x"33323130",
- 00001015 => x"37363534",
- 00001016 => x"42413938",
- 00001017 => x"46454443",
+ 00000812 => x"fa800713",
+ 00000813 => x"00072683",
+ 00000814 => x"00757793",
+ 00000815 => x"00100513",
+ 00000816 => x"00f51533",
+ 00000817 => x"00d56533",
+ 00000818 => x"00a72023",
+ 00000819 => x"00008067",
+ 00000820 => x"fa800713",
+ 00000821 => x"00072683",
+ 00000822 => x"00757513",
+ 00000823 => x"00100793",
+ 00000824 => x"00a797b3",
+ 00000825 => x"fff7c793",
+ 00000826 => x"00d7f7b3",
+ 00000827 => x"00f72023",
+ 00000828 => x"00008067",
+ 00000829 => x"faa02623",
+ 00000830 => x"fa802783",
+ 00000831 => x"fe07cee3",
+ 00000832 => x"fac02503",
+ 00000833 => x"00008067",
+ 00000834 => x"f8400713",
+ 00000835 => x"00072683",
+ 00000836 => x"00100793",
+ 00000837 => x"00a797b3",
+ 00000838 => x"00d7c7b3",
+ 00000839 => x"00f72023",
+ 00000840 => x"00008067",
+ 00000841 => x"f8a02223",
+ 00000842 => x"00008067",
+ 00000843 => x"69617641",
+ 00000844 => x"6c62616c",
+ 00000845 => x"4d432065",
+ 00000846 => x"0a3a7344",
+ 00000847 => x"203a6820",
+ 00000848 => x"706c6548",
+ 00000849 => x"3a72200a",
+ 00000850 => x"73655220",
+ 00000851 => x"74726174",
+ 00000852 => x"3a75200a",
+ 00000853 => x"6c705520",
+ 00000854 => x"0a64616f",
+ 00000855 => x"203a7320",
+ 00000856 => x"726f7453",
+ 00000857 => x"6f742065",
+ 00000858 => x"616c6620",
+ 00000859 => x"200a6873",
+ 00000860 => x"4c203a6c",
+ 00000861 => x"2064616f",
+ 00000862 => x"6d6f7266",
+ 00000863 => x"616c6620",
+ 00000864 => x"200a6873",
+ 00000865 => x"45203a65",
+ 00000866 => x"75636578",
+ 00000867 => x"00006574",
+ 00000868 => x"65206f4e",
+ 00000869 => x"75636578",
+ 00000870 => x"6c626174",
+ 00000871 => x"76612065",
+ 00000872 => x"616c6961",
+ 00000873 => x"2e656c62",
+ 00000874 => x"00000000",
+ 00000875 => x"746f6f42",
+ 00000876 => x"2e676e69",
+ 00000877 => x"0a0a2e2e",
+ 00000878 => x"00000000",
+ 00000879 => x"52450a07",
+ 00000880 => x"5f524f52",
+ 00000881 => x"00000000",
+ 00000882 => x"58450a0a",
+ 00000883 => x"00282043",
+ 00000884 => x"20402029",
+ 00000885 => x"00007830",
+ 00000886 => x"69617741",
+ 00000887 => x"676e6974",
+ 00000888 => x"6f656e20",
+ 00000889 => x"32337672",
+ 00000890 => x"6578655f",
+ 00000891 => x"6e69622e",
+ 00000892 => x"202e2e2e",
+ 00000893 => x"00000000",
+ 00000894 => x"64616f4c",
+ 00000895 => x"2e676e69",
+ 00000896 => x"00202e2e",
+ 00000897 => x"00004b4f",
+ 00000898 => x"0000000a",
+ 00000899 => x"74697257",
+ 00000900 => x"78302065",
+ 00000901 => x"00000000",
+ 00000902 => x"74796220",
+ 00000903 => x"74207365",
+ 00000904 => x"5053206f",
+ 00000905 => x"6c662049",
+ 00000906 => x"20687361",
+ 00000907 => x"78302040",
+ 00000908 => x"00000000",
+ 00000909 => x"7928203f",
+ 00000910 => x"20296e2f",
+ 00000911 => x"00000000",
+ 00000912 => x"616c460a",
+ 00000913 => x"6e696873",
+ 00000914 => x"2e2e2e67",
+ 00000915 => x"00000020",
+ 00000916 => x"0a0a0a0a",
+ 00000917 => x"4e203c3c",
+ 00000918 => x"56524f45",
+ 00000919 => x"42203233",
+ 00000920 => x"6c746f6f",
+ 00000921 => x"6564616f",
+ 00000922 => x"3e3e2072",
+ 00000923 => x"4c420a0a",
+ 00000924 => x"203a5644",
+ 00000925 => x"20766f4e",
+ 00000926 => x"32203720",
+ 00000927 => x"0a303230",
+ 00000928 => x"3a565748",
+ 00000929 => x"00002020",
+ 00000930 => x"4b4c430a",
+ 00000931 => x"0020203a",
+ 00000932 => x"0a7a4820",
+ 00000933 => x"52455355",
+ 00000934 => x"0000203a",
+ 00000935 => x"53494d0a",
+ 00000936 => x"00203a41",
+ 00000937 => x"4f52500a",
+ 00000938 => x"00203a43",
+ 00000939 => x"454d490a",
+ 00000940 => x"00203a4d",
+ 00000941 => x"74796220",
+ 00000942 => x"40207365",
+ 00000943 => x"00000020",
+ 00000944 => x"454d440a",
+ 00000945 => x"00203a4d",
+ 00000946 => x"75410a0a",
+ 00000947 => x"6f626f74",
+ 00000948 => x"6920746f",
+ 00000949 => x"7338206e",
+ 00000950 => x"7250202e",
+ 00000951 => x"20737365",
+ 00000952 => x"2079656b",
+ 00000953 => x"61206f74",
+ 00000954 => x"74726f62",
+ 00000955 => x"00000a2e",
+ 00000956 => x"726f6241",
+ 00000957 => x"2e646574",
+ 00000958 => x"00000a0a",
+ 00000959 => x"444d430a",
+ 00000960 => x"00203e3a",
+ 00000961 => x"53207962",
+ 00000962 => x"68706574",
+ 00000963 => x"4e206e61",
+ 00000964 => x"69746c6f",
+ 00000965 => x"0000676e",
+ 00000966 => x"61766e49",
+ 00000967 => x"2064696c",
+ 00000968 => x"00444d43",
+ 00000969 => x"33323130",
+ 00000970 => x"37363534",
+ 00000971 => x"42413938",
+ 00000972 => x"46454443",
others => x"00000000"
);
/rtl/core/neorv32_cpu_control.vhd
156,18 → 156,12
end record; |
signal issue_engine : issue_engine_t; |
|
-- instruction buffer ("FIFO" with just one entry) -- |
type i_buf_t is record |
wdata : std_ulogic_vector(35 downto 0); -- 4-bit status + 32-bit instruction |
rdata : std_ulogic_vector(35 downto 0); -- 4-bit status + 32-bit instruction |
status : std_ulogic; |
clear : std_ulogic; |
we : std_ulogic; |
re : std_ulogic; |
free : std_ulogic; |
avail : std_ulogic; |
-- instruction issue interface -- |
type cmd_issue_t is record |
data : std_ulogic_vector(35 downto 0); -- 4-bit status + 32-bit instruction |
valid : std_ulogic; -- data word is valid when set |
end record; |
signal i_buf : i_buf_t; |
signal cmd_issue : cmd_issue_t; |
|
-- instruction execution engine -- |
type execute_engine_state_t is (SYS_WAIT, DISPATCH, TRAP, EXECUTE, ALU_WAIT, BRANCH, LOADSTORE_0, LOADSTORE_1, LOADSTORE_2, CSR_ACCESS); |
197,8 → 191,6
end record; |
signal execute_engine : execute_engine_t; |
|
signal next_pc_tmp : std_ulogic_vector(data_width_c-1 downto 0); |
|
-- trap controller -- |
type trap_ctrl_t is record |
exc_buf : std_ulogic_vector(exception_width_c-1 downto 0); |
369,7 → 361,7
elsif (ipb.we = '1') then |
ipb.w_pnt <= std_ulogic_vector(unsigned(ipb.w_pnt) + 1); |
end if; |
if (ipb.we = '1') then -- write port |
if (ipb.we = '1') then -- write data |
ipb.data(to_integer(unsigned(ipb.w_pnt(ipb.w_pnt'left-1 downto 0)))) <= ipb.wdata; |
end if; |
-- read port -- |
430,7 → 422,7
|
-- Issue Engine FSM Comb ------------------------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
issue_engine_fsm_comb: process(issue_engine, ipb, i_buf, execute_engine, ci_illegal, ci_instr32) |
issue_engine_fsm_comb: process(issue_engine, ipb, execute_engine, ci_illegal, ci_instr32) |
begin |
-- arbiter defaults -- |
issue_engine.state_nxt <= issue_engine.state; |
440,10 → 432,10
-- instruction prefetch buffer interface defaults -- |
ipb.re <= '0'; |
|
-- instruction buffer interface defaults -- |
i_buf.we <= '0'; |
-- i_buf = <illegal_compressed_instruction> & <bus_error & alignment_error> & <is_compressed_instrucion> & <32-bit_instruction_word> |
i_buf.wdata <= '0' & ipb.rdata(33 downto 32) & '0' & ipb.rdata(31 downto 0); |
-- instruction issue interface defaults -- |
-- cmd_issue.data = <illegal_compressed_instruction> & <bus_error & alignment_error> & <is_compressed_instrucion> & <32-bit_instruction_word> |
cmd_issue.data <= '0' & ipb.rdata(33 downto 32) & '0' & ipb.rdata(31 downto 0); |
cmd_issue.valid <= '0'; |
|
-- state machine -- |
case issue_engine.state is |
453,29 → 445,29
if (ipb.avail = '1') then -- instructions available? |
|
if (issue_engine.align = '0') or (CPU_EXTENSION_RISCV_C = false) then -- begin check in LOW instruction half-word |
if (i_buf.free = '1') then |
i_buf.we <= '1'; |
if (execute_engine.state = DISPATCH) then |
cmd_issue.valid <= '1'; |
issue_engine.buf_nxt <= ipb.rdata(33 downto 32) & ipb.rdata(31 downto 16); -- store high half-word - we might need it for an unaligned uncompressed instruction |
if (ipb.rdata(1 downto 0) = "11") or (CPU_EXTENSION_RISCV_C = false) then -- uncompressed and "aligned" |
ipb.re <= '1'; |
i_buf.wdata <= '0' & ipb.rdata(33 downto 32) & '0' & ipb.rdata(31 downto 0); |
ipb.re <= '1'; |
cmd_issue.data <= '0' & ipb.rdata(33 downto 32) & '0' & ipb.rdata(31 downto 0); |
else -- compressed |
ipb.re <= '1'; |
i_buf.wdata <= ci_illegal & ipb.rdata(33 downto 32) & '1' & ci_instr32; |
ipb.re <= '1'; |
cmd_issue.data <= ci_illegal & ipb.rdata(33 downto 32) & '1' & ci_instr32; |
issue_engine.align_nxt <= '1'; |
end if; |
end if; |
|
else -- begin check in HIGH instruction half-word |
if (i_buf.free = '1') then |
i_buf.we <= '1'; |
if (execute_engine.state = DISPATCH) then |
cmd_issue.valid <= '1'; |
issue_engine.buf_nxt <= ipb.rdata(33 downto 32) & ipb.rdata(31 downto 16); -- store high half-word - we might need it for an unaligned uncompressed instruction |
if (issue_engine.buf(1 downto 0) = "11") then -- uncompressed and "unaligned" |
ipb.re <= '1'; |
i_buf.wdata <= '0' & issue_engine.buf(17 downto 16) & '0' & (ipb.rdata(15 downto 0) & issue_engine.buf(15 downto 0)); |
ipb.re <= '1'; |
cmd_issue.data <= '0' & issue_engine.buf(17 downto 16) & '0' & (ipb.rdata(15 downto 0) & issue_engine.buf(15 downto 0)); |
else -- compressed |
-- do not read from ipb here! |
i_buf.wdata <= ci_illegal & ipb.rdata(33 downto 32) & '1' & ci_instr32; |
cmd_issue.data <= ci_illegal & ipb.rdata(33 downto 32) & '1' & ci_instr32; |
issue_engine.align_nxt <= '0'; |
end if; |
end if; |
522,32 → 514,6
end generate; |
|
|
-- Instruction Buffer --------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
instruction_buffer: process(clk_i) |
begin |
if rising_edge(clk_i) then |
if (i_buf.clear = '1') then |
i_buf.status <= '0'; |
elsif (i_buf.we = '1') then |
i_buf.status <= '1'; |
elsif (i_buf.re = '1') then |
i_buf.status <= '0'; |
end if; |
if (i_buf.we = '1') then |
i_buf.rdata <= i_buf.wdata; |
end if; |
end if; |
end process instruction_buffer; |
|
-- status -- |
i_buf.free <= not i_buf.status; |
i_buf.avail <= i_buf.status; |
|
-- clear i_buf when clearing ipb -- |
i_buf.clear <= ipb.clear; |
|
|
-- **************************************************************************************************************************** |
-- Instruction Execution |
-- **************************************************************************************************************************** |
556,9 → 522,11
-- Immediate Generator -------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
imm_gen: process(clk_i) |
variable opcode_v : std_ulogic_vector(6 downto 0); |
begin |
if rising_edge(clk_i) then |
case execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c) is |
opcode_v := execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c+2) & "11"; |
case opcode_v is -- save some bits here, LSBs are always 11 for rv32 |
when opcode_store_c => -- S-immediate |
imm_o(31 downto 11) <= (others => execute_engine.i_reg(31)); -- sign extension |
imm_o(10 downto 05) <= execute_engine.i_reg(30 downto 25); |
644,18 → 612,20
if (execute_engine.state = EXECUTE) then |
execute_engine.i_reg_last <= execute_engine.i_reg; |
end if; |
-- next PC -- |
if (execute_engine.is_ci = '1') then -- compressed instruction? |
execute_engine.next_pc <= std_ulogic_vector(unsigned(execute_engine.pc) + 2); |
else |
execute_engine.next_pc <= std_ulogic_vector(unsigned(execute_engine.pc) + 4); |
end if; |
-- |
ctrl <= ctrl_nxt; |
end if; |
end process execute_engine_fsm_sync; |
|
-- next PC -- |
next_pc_tmp <= std_ulogic_vector(unsigned(execute_engine.pc) + 2) when (execute_engine.is_ci = '1') else std_ulogic_vector(unsigned(execute_engine.pc) + 4); |
execute_engine.next_pc <= next_pc_tmp(data_width_c-1 downto 1) & '0'; |
|
-- PC output -- |
curr_pc_o <= execute_engine.pc(data_width_c-1 downto 1) & '0'; |
next_pc_o <= next_pc_tmp(data_width_c-1 downto 1) & '0'; |
next_pc_o <= execute_engine.next_pc(data_width_c-1 downto 1) & '0'; |
|
|
-- CPU Control Bus Output ----------------------------------------------------------------- |
683,7 → 653,7
|
-- Execute Engine FSM Comb ---------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
execute_engine_fsm_comb: process(execute_engine, fetch_engine, i_buf, trap_ctrl, csr, ctrl, csr_acc_valid, |
execute_engine_fsm_comb: process(execute_engine, fetch_engine, cmd_issue, trap_ctrl, csr, ctrl, csr_acc_valid, |
alu_add_i, alu_wait_i, bus_d_wait_i, ma_load_i, be_load_i, ma_store_i, be_store_i) |
variable alu_immediate_v : std_ulogic; |
variable rs1_is_r0_v : std_ulogic; |
701,23 → 671,22
execute_engine.if_rst_nxt <= execute_engine.if_rst; |
|
-- instruction dispatch -- |
fetch_engine.reset <= '0'; |
i_buf.re <= '0'; |
fetch_engine.reset <= '0'; |
|
-- trap environment control -- |
trap_ctrl.env_start_ack <= '0'; |
trap_ctrl.env_end <= '0'; |
trap_ctrl.env_start_ack <= '0'; |
trap_ctrl.env_end <= '0'; |
|
-- exception trigger -- |
trap_ctrl.instr_be <= '0'; |
trap_ctrl.instr_ma <= '0'; |
trap_ctrl.env_call <= '0'; |
trap_ctrl.break_point <= '0'; |
illegal_compressed <= '0'; |
trap_ctrl.instr_be <= '0'; |
trap_ctrl.instr_ma <= '0'; |
trap_ctrl.env_call <= '0'; |
trap_ctrl.break_point <= '0'; |
illegal_compressed <= '0'; |
|
-- CSR access -- |
csr.we_nxt <= '0'; |
csr.re_nxt <= '0'; |
csr.we_nxt <= '0'; |
csr.re_nxt <= '0'; |
|
-- control defaults -- |
ctrl_nxt <= (others => '0'); -- default: all off |
747,30 → 716,28
-- ------------------------------------------------------------ |
-- set reg_file's r0 to zero -- |
if (rf_r0_is_reg_c = true) then -- is r0 implemented as physical register, which has to be set to zero? |
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "11"; -- RF input = CSR output (hacky! results zero since there is no valid CSR_read request) |
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "11"; -- RF input = CSR output (hacky! results zero since there is no valid CSR_read) |
ctrl_nxt(ctrl_rf_r0_we_c) <= '1'; -- force RF write access and force rd=r0 |
end if; |
-- |
execute_engine.state_nxt <= DISPATCH; |
|
when DISPATCH => -- Get new command from instruction buffer (i_buf) |
when DISPATCH => -- Get new command from instruction issue engine |
-- ------------------------------------------------------------ |
if (i_buf.avail = '1') then -- instruction available? |
i_buf.re <= '1'; |
-- |
execute_engine.is_ci_nxt <= i_buf.rdata(32); -- flag to indicate this is a de-compressed instruction beeing executed |
execute_engine.i_reg_nxt <= i_buf.rdata(31 downto 0); |
trap_ctrl.instr_ma <= i_buf.rdata(33); -- misaligned instruction fetch address |
trap_ctrl.instr_be <= i_buf.rdata(34); -- bus access fault during instrucion fetch |
illegal_compressed <= i_buf.rdata(35); -- invalid decompressed instruction |
-- |
if (cmd_issue.valid = '1') then -- instruction available? |
-- IR update -- |
execute_engine.is_ci_nxt <= cmd_issue.data(32); -- flag to indicate this is a de-compressed instruction beeing executed |
execute_engine.i_reg_nxt <= cmd_issue.data(31 downto 0); |
trap_ctrl.instr_ma <= cmd_issue.data(33); -- misaligned instruction fetch address |
trap_ctrl.instr_be <= cmd_issue.data(34); -- bus access fault during instrucion fetch |
illegal_compressed <= cmd_issue.data(35); -- invalid decompressed instruction |
-- PC update -- |
execute_engine.if_rst_nxt <= '0'; |
if (execute_engine.if_rst = '0') then -- if there was NO non-linear PC modification |
execute_engine.pc_nxt <= execute_engine.next_pc; |
execute_engine.pc_nxt <= execute_engine.next_pc(data_width_c-1 downto 1) & '0'; |
end if; |
-- |
-- any reason to go FAST to trap state? -- |
if (execute_engine.sleep = '1') or (trap_ctrl.env_start = '1') or (trap_ctrl.exc_fire = '1') or ((i_buf.rdata(33) or i_buf.rdata(34)) = '1') then |
-- any reason to go to trap state FAST? -- |
if (execute_engine.sleep = '1') or (trap_ctrl.env_start = '1') or (trap_ctrl.exc_fire = '1') or ((cmd_issue.data(33) or cmd_issue.data(34)) = '1') then |
execute_engine.state_nxt <= TRAP; |
else |
execute_engine.state_nxt <= EXECUTE; |
885,7 → 852,7
-- for simplicity: internally, fence and fence.i perform the same operations (clear and reload instruction prefetch buffer) |
-- FENCE.I -- |
if (CPU_EXTENSION_RISCV_Zifencei = true) then |
execute_engine.pc_nxt <= execute_engine.next_pc; -- "refetch" next instruction |
execute_engine.pc_nxt <= execute_engine.next_pc(data_width_c-1 downto 1) & '0'; -- "refetch" next instruction |
execute_engine.if_rst_nxt <= '1'; -- this is a non-linear PC modification |
fetch_engine.reset <= '1'; |
if (execute_engine.i_reg(instr_funct3_lsb_c) = funct3_fencei_c(0)) then |
987,8 → 954,8
-- ------------------------------------------------------------ |
ctrl_nxt(ctrl_bus_mdi_we_c) <= '1'; -- keep writing input data to MDI (only relevant for LOAD) |
ctrl_nxt(ctrl_rf_in_mux_msb_c downto ctrl_rf_in_mux_lsb_c) <= "01"; -- RF input = memory input (only relevant for LOAD) |
if (ma_load_i = '1') or (be_load_i = '1') or (ma_store_i = '1') or (be_store_i = '1') then -- abort if exception |
execute_engine.state_nxt <= SYS_WAIT; |
if ((ma_load_i or be_load_i or ma_store_i or be_store_i) = '1') then -- abort if exception |
execute_engine.state_nxt <= DISPATCH; |
elsif (bus_d_wait_i = '0') then -- wait for bus to finish transaction |
if (execute_engine.i_reg(instr_opcode_msb_c-1) = '0') then -- LOAD |
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back (keep writing back all the time) |
1751,7 → 1718,7
csr.rdata(18) <= trap_ctrl.irq_buf(interrupt_firq_2_c); |
csr.rdata(19) <= trap_ctrl.irq_buf(interrupt_firq_3_c); |
|
-- physical memory protection -- |
-- physical memory protection - configuration -- |
when csr_pmpcfg0_c => -- R/W: pmpcfg0 - physical memory protection configuration register 0 |
if (PMP_USE = true) then |
if (PMP_NUM_REGIONS >= 1) then |
1783,6 → 1750,7
end if; |
end if; |
|
-- physical memory protection - addresses -- |
when csr_pmpaddr0_c => -- R/W: pmpaddr0 - physical memory protection address register 0 |
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 1) then |
csr.rdata <= csr.pmpaddr(0); |
/rtl/core/neorv32_package.vhd
50,7 → 50,7
-- Architecture Constants ----------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
constant data_width_c : natural := 32; -- data width - do not change! |
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01040606"; -- no touchy! |
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01040700"; -- no touchy! |
constant pmp_max_r_c : natural := 8; -- max PMP regions - FIXED! |
constant archid_c : natural := 19; -- official NEORV32 architecture ID - hands off! |
|
367,7 → 367,7
constant csr_mimpid_c : std_ulogic_vector(11 downto 0) := x"f13"; -- mimpid |
constant csr_mhartid_c : std_ulogic_vector(11 downto 0) := x"f14"; -- mhartid |
-- |
constant csr_mzext_c : std_ulogic_vector(11 downto 0) := x"fc0"; -- mzext (custom) |
constant csr_mzext_c : std_ulogic_vector(11 downto 0) := x"fc0"; -- mzext (neorv32-custom) |
|
-- Co-Processor Operations ---------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
/sw/bootloader/bootloader.c
165,13 → 165,13
void system_error(uint8_t err_code); |
void print_hex_word(uint32_t num); |
|
// SPI flash access |
// SPI flash driver functions |
uint8_t spi_flash_read_byte(uint32_t addr); |
void spi_flash_write_byte(uint32_t addr, uint8_t wdata); |
void spi_flash_write_word(uint32_t addr, uint32_t wdata); |
void spi_flash_erase_sector(uint32_t addr); |
uint8_t spi_flash_read_status(void); |
uint8_t spi_flash_read_1st_id(void); |
void spi_flash_write_wait(void); |
void spi_flash_write_enable(void); |
void spi_flash_write_addr(uint32_t addr); |
|
223,7 → 223,7
// ------------------------------------------------ |
neorv32_uart_print("\n\n\n\n<< NEORV32 Bootloader >>\n\n" |
"BLDV: "__DATE__"\nHWV: "); |
neorv32_rte_print_hw_version(); |
print_hex_word(neorv32_cpu_csr_read(CSR_MIMPID)); |
neorv32_uart_print("\nCLK: "); |
print_hex_word(SYSINFO_CLK); |
neorv32_uart_print(" Hz\nUSER: "); |
608,7 → 608,7
|
|
// ------------------------------------------------------------------------------------- |
// SPI flash functions |
// SPI flash driver functions |
// ------------------------------------------------------------------------------------- |
|
/**********************************************************************//** |
649,12 → 649,7
|
neorv32_spi_cs_dis(SPI_FLASH_CS); |
|
while (1) { |
uint8_t tmp = spi_flash_read_status(); |
if ((tmp & 0x01) == 0) { // write in progress flag cleared? |
break; |
} |
} |
spi_flash_write_wait(); // wait for write operation to finish |
} |
|
|
696,50 → 691,48
|
neorv32_spi_cs_dis(SPI_FLASH_CS); |
|
while (1) { |
uint8_t tmp = spi_flash_read_status(); |
if ((tmp & 0x01) == 0) { // write in progress flag cleared? |
break; |
} |
} |
spi_flash_write_wait(); // wait for write operation to finish |
} |
|
|
/**********************************************************************//** |
* Read status register. |
* Read first byte of ID (manufacturer ID), should be != 0x00. |
* |
* @return Status register. |
* @note The first bit of the manufacturer ID is used to detect if a Flash is connected at all. |
* |
* @return First byte of ID. |
**************************************************************************/ |
uint8_t spi_flash_read_status(void) { |
uint8_t spi_flash_read_1st_id(void) { |
|
neorv32_spi_cs_en(SPI_FLASH_CS); |
|
neorv32_spi_trans(SPI_FLASH_CMD_READ_STATUS); |
uint8_t status = (uint8_t)neorv32_spi_trans(0); |
neorv32_spi_trans(SPI_FLASH_CMD_READ_ID); |
uint8_t id = (uint8_t)neorv32_spi_trans(0); |
|
neorv32_spi_cs_dis(SPI_FLASH_CS); |
|
return status; |
return id; |
} |
|
|
/**********************************************************************//** |
* Read first byte of ID (manufacturer ID), should be != 0x00. |
* |
* @note The first bit of the manufacturer ID is used to detect if a Flash is connected at all. |
* |
* @return First byte of ID. |
* Wait for flash write operation to finisch. |
**************************************************************************/ |
uint8_t spi_flash_read_1st_id(void) { |
void spi_flash_write_wait(void) { |
|
neorv32_spi_cs_en(SPI_FLASH_CS); |
while(1) { |
|
neorv32_spi_trans(SPI_FLASH_CMD_READ_ID); |
uint8_t id = (uint8_t)neorv32_spi_trans(0); |
neorv32_spi_cs_en(SPI_FLASH_CS); |
|
neorv32_spi_cs_dis(SPI_FLASH_CS); |
neorv32_spi_trans(SPI_FLASH_CMD_READ_STATUS); |
uint8_t status = (uint8_t)neorv32_spi_trans(0); |
|
return id; |
neorv32_spi_cs_dis(SPI_FLASH_CS); |
|
if ((status & 0x01) == 0) { // write in progress flag cleared? |
break; |
} |
} |
} |
|
|
772,4 → 765,3
neorv32_spi_trans(address.uint8[1]); |
neorv32_spi_trans(address.uint8[0]); |
} |
|
/sw/example/blink_led/main.c
48,17 → 48,22
/**@{*/ |
/** UART BAUD rate */ |
#define BAUD_RATE 19200 |
/** Use the custom ASM version for blinking the LEDs if != 0 */ |
#define USE_ASM_VERSION 0 |
/** Use the custom ASM version for blinking the LEDs defined (= uncommented) */ |
//#define USE_ASM_VERSION |
/**@}*/ |
|
|
/**********************************************************************//** |
* ASM function to blink LEDs (if enabled) |
* ASM function to blink LEDs |
**************************************************************************/ |
extern void blink_led_asm(uint32_t gpio_out_addr); |
|
/**********************************************************************//** |
* C function to blink LEDs |
**************************************************************************/ |
void blink_led_c(void); |
|
|
/**********************************************************************//** |
* Main function; shows an incrementing 8-bit counter on GPIO.output(7:0). |
* |
85,9 → 90,26
neorv32_uart_print("Blinking LED demo program\n"); |
|
|
// use ASM version of LED blinking (file: blink_led_in_asm.S) |
#ifdef USE_ASM_VERSION |
|
blink_led_asm((uint32_t)(&GPIO_OUTPUT)); |
|
// use C version of LED blinking |
#if (USE_ASM_VERSION == 0) |
#else |
|
blink_led_c(); |
|
#endif |
return 0; |
} |
|
|
/**********************************************************************//** |
* C-version of blinky LED counter |
**************************************************************************/ |
void blink_led_c(void) { |
|
neorv32_gpio_port_set(0); // clear gpio output put |
|
int cnt = 0; |
96,12 → 118,4
neorv32_gpio_port_set(cnt++ & 0xFF); // increment counter and mask for lowest 8 bit |
neorv32_cpu_delay_ms(200); // wait 200ms using busy wait |
} |
|
// use ASM version of LED blinking (file: blink_led_in_asm.S) |
#else |
|
blink_led_asm((uint32_t)(&GPIO_OUTPUT)); |
|
#endif |
return 0; |
} |
/sw/example/cpu_test/main.c
107,11 → 107,13
uint64_t mtime_cmp_max = 0xFFFFFFFFFFFFFFFFUL; |
neorv32_mtime_set_timecmp(mtime_cmp_max); |
|
|
// intro |
neorv32_uart_printf("\n\n--- PROCESSOR/CPU TEST ---\n"); |
neorv32_uart_printf("build: "__DATE__" "__TIME__"\n"); |
neorv32_uart_printf("This test suite is intended to verify the default NEORV32 processor setup using the default testbench.\n\n"); |
// ----------------------------------------------- |
|
// logo |
neorv32_rte_print_logo(); |
|
// show project credits |
neorv32_rte_print_credits(); |
|
149,13 → 151,13
} |
|
// enable interrupt sources |
install_err = neorv32_cpu_irq_enable(CPU_MIE_MSIE); // activate software interrupt |
install_err += neorv32_cpu_irq_enable(CPU_MIE_MTIE); // activate timer interrupt |
install_err += neorv32_cpu_irq_enable(CPU_MIE_MEIE); // activate external interrupt |
install_err += neorv32_cpu_irq_enable(CPU_MIE_FIRQ0E);// activate fast interrupt channel 0 |
install_err += neorv32_cpu_irq_enable(CPU_MIE_FIRQ1E);// activate fast interrupt channel 1 |
install_err += neorv32_cpu_irq_enable(CPU_MIE_FIRQ2E);// activate fast interrupt channel 2 |
install_err += neorv32_cpu_irq_enable(CPU_MIE_FIRQ3E);// activate fast interrupt channel 3 |
install_err = neorv32_cpu_irq_enable(CPU_MIE_MSIE); // activate software interrupt |
install_err += neorv32_cpu_irq_enable(CPU_MIE_MTIE); // activate timer interrupt |
install_err += neorv32_cpu_irq_enable(CPU_MIE_MEIE); // activate external interrupt |
install_err += neorv32_cpu_irq_enable(CPU_MIE_FIRQ0E); // activate fast interrupt channel 0 |
install_err += neorv32_cpu_irq_enable(CPU_MIE_FIRQ1E); // activate fast interrupt channel 1 |
install_err += neorv32_cpu_irq_enable(CPU_MIE_FIRQ2E); // activate fast interrupt channel 2 |
install_err += neorv32_cpu_irq_enable(CPU_MIE_FIRQ3E); // activate fast interrupt channel 3 |
|
if (install_err) { |
neorv32_uart_printf("IRQ enable error (%i)!\n", install_err); |
162,8 → 164,11
return 0; |
} |
|
// intro2 |
neorv32_uart_printf("\n\nStarting tests...\n\n"); |
// test intro |
neorv32_uart_printf("\n--- PROCESSOR/CPU TEST ---\n"); |
neorv32_uart_printf("build: "__DATE__" "__TIME__"\n"); |
neorv32_uart_printf("This test suite is intended to verify the default NEORV32 processor setup using the default testbench.\n\n"); |
neorv32_uart_printf("Starting tests...\n\n"); |
|
// enable global interrupts |
neorv32_cpu_eint(); |
/sw/example/hello_world/main.c
0,0 → 1,79
// ################################################################################################# |
// # << NEORV32 - "Hello World" Demo Program >> # |
// # ********************************************************************************************* # |
// # BSD 3-Clause License # |
// # # |
// # Copyright (c) 2020, Stephan Nolting. All rights reserved. # |
// # # |
// # Redistribution and use in source and binary forms, with or without modification, are # |
// # permitted provided that the following conditions are met: # |
// # # |
// # 1. Redistributions of source code must retain the above copyright notice, this list of # |
// # conditions and the following disclaimer. # |
// # # |
// # 2. Redistributions in binary form must reproduce the above copyright notice, this list of # |
// # conditions and the following disclaimer in the documentation and/or other materials # |
// # provided with the distribution. # |
// # # |
// # 3. Neither the name of the copyright holder nor the names of its contributors may be used to # |
// # endorse or promote products derived from this software without specific prior written # |
// # permission. # |
// # # |
// # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS # |
// # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # |
// # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # |
// # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # |
// # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # |
// # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # |
// # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # |
// # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # |
// # OF THE POSSIBILITY OF SUCH DAMAGE. # |
// # ********************************************************************************************* # |
// # The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting # |
// ################################################################################################# |
|
|
/**********************************************************************//** |
* @file hello_world/main.c |
* @author Stephan Nolting |
* @brief Classic 'hello world' demo program. |
**************************************************************************/ |
|
#include <neorv32.h> |
|
|
/**********************************************************************//** |
* @name User configuration |
**************************************************************************/ |
/**@{*/ |
/** UART BAUD rate */ |
#define BAUD_RATE 19200 |
/**@}*/ |
|
|
|
/**********************************************************************//** |
* Main function; prints some fancy stuff via UART. |
* |
* @note This program requires the UART interface to be synthesized. |
* |
* @return Irrelevant. |
**************************************************************************/ |
int main() { |
|
// init UART at default baud rate, no rx interrupt, no tx interrupt |
neorv32_uart_setup(BAUD_RATE, 0, 0); |
|
// capture all exceptions and give debug info via UART |
// this is not required, but keeps us safe |
neorv32_rte_setup(); |
|
// print project logo via UART |
neorv32_rte_print_logo(); |
|
// say hello |
neorv32_uart_print("Hello world! :)\n"); |
|
|
return 0; |
} |
/sw/example/hello_world/makefile
0,0 → 1,338
################################################################################################# |
# << NEORV32 - Application Makefile >> # |
# ********************************************************************************************* # |
# Make sure to add the riscv GCC compiler's bin folder to your PATH environment variable. # |
# ********************************************************************************************* # |
# BSD 3-Clause License # |
# # |
# Copyright (c) 2020, Stephan Nolting. All rights reserved. # |
# # |
# Redistribution and use in source and binary forms, with or without modification, are # |
# permitted provided that the following conditions are met: # |
# # |
# 1. Redistributions of source code must retain the above copyright notice, this list of # |
# conditions and the following disclaimer. # |
# # |
# 2. Redistributions in binary form must reproduce the above copyright notice, this list of # |
# conditions and the following disclaimer in the documentation and/or other materials # |
# provided with the distribution. # |
# # |
# 3. Neither the name of the copyright holder nor the names of its contributors may be used to # |
# endorse or promote products derived from this software without specific prior written # |
# permission. # |
# # |
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS # |
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # |
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # |
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # |
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # |
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # |
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # |
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # |
# OF THE POSSIBILITY OF SUCH DAMAGE. # |
# ********************************************************************************************* # |
# The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting # |
################################################################################################# |
|
|
# ***************************************************************************** |
# USER CONFIGURATION |
# ***************************************************************************** |
# User's application sources (*.c, *.cpp, *.s, *.S); add additional files here |
APP_SRC ?= $(wildcard ./*.c) $(wildcard ./*.s) $(wildcard ./*.cpp) $(wildcard ./*.S) |
|
# User's application include folders (don't forget the '-I' before each entry) |
APP_INC ?= -I . |
# User's application include folders - for assembly files only (don't forget the '-I' before each entry) |
ASM_INC ?= -I . |
|
# Optimization |
EFFORT ?= -Os |
|
# Compiler toolchain |
RISCV_TOOLCHAIN ?= riscv32-unknown-elf |
|
# CPU architecture and ABI |
MARCH ?= -march=rv32i |
MABI ?= -mabi=ilp32 |
|
# User flags for additional configuration (will be added to compiler flags) |
USER_FLAGS ?= |
|
# Serial port for executable upload via bootloer |
COM_PORT ?= /dev/ttyUSB0 |
|
# Relative or absolute path to the NEORV32 home folder |
NEORV32_HOME ?= ../../.. |
# ***************************************************************************** |
|
|
|
# ----------------------------------------------------------------------------- |
# NEORV32 framework |
# ----------------------------------------------------------------------------- |
# Path to NEORV32 linker script and startup file |
NEORV32_COM_PATH = $(NEORV32_HOME)/sw/common |
# Path to main NEORV32 library include files |
NEORV32_INC_PATH = $(NEORV32_HOME)/sw/lib/include |
# Path to main NEORV32 library source files |
NEORV32_SRC_PATH = $(NEORV32_HOME)/sw/lib/source |
# Path to NEORV32 executable generator |
NEORV32_EXG_PATH = $(NEORV32_HOME)/sw/image_gen |
# Path to NEORV32 core rtl folder |
NEORV32_RTL_PATH = $(NEORV32_HOME)/rtl/core |
# Marker file to check for NEORV32 home folder |
NEORV32_HOME_MARKER = $(NEORV32_INC_PATH)/neorv32.h |
|
# Core libraries (peripheral and CPU drivers) |
CORE_SRC = $(wildcard $(NEORV32_SRC_PATH)/*.c) |
# Application start-up code |
CORE_SRC += $(NEORV32_COM_PATH)/crt0.S |
|
# Linker script |
LD_SCRIPT = $(NEORV32_COM_PATH)/neorv32.ld |
|
# Main output files |
APP_EXE = neorv32_exe.bin |
APP_ASM = main.asm |
APP_IMG = neorv32_application_image.vhd |
BOOT_IMG = neorv32_bootloader_image.vhd |
|
|
# ----------------------------------------------------------------------------- |
# Sources and objects |
# ----------------------------------------------------------------------------- |
# Define all sources |
SRC = $(APP_SRC) |
SRC += $(CORE_SRC) |
|
# Define all object files |
OBJ = $(SRC:%=%.o) |
|
|
# ----------------------------------------------------------------------------- |
# Tools and flags |
# ----------------------------------------------------------------------------- |
# Compiler tools |
CC = $(RISCV_TOOLCHAIN)-gcc |
OBJDUMP = $(RISCV_TOOLCHAIN)-objdump |
OBJCOPY = $(RISCV_TOOLCHAIN)-objcopy |
SIZE = $(RISCV_TOOLCHAIN)-size |
|
# Host native compiler |
CC_X86 = gcc -Wall -O -g |
|
# NEORV32 executable image generator |
IMAGE_GEN = $(NEORV32_EXG_PATH)/image_gen |
|
# Compiler & linker flags |
CC_OPTS = $(MARCH) $(MABI) $(EFFORT) -Wall -ffunction-sections -fdata-sections -nostartfiles |
CC_OPTS += -Wl,--gc-sections -lm -lc -lgcc -lc |
# This accelerates instruction fetch after branches when C extension is enabled (irrelevant when C extension is disabled) |
CC_OPTS += -falign-functions=4 -falign-labels=4 -falign-loops=4 -falign-jumps=4 |
CC_OPTS += $(USER_FLAGS) |
|
|
# ----------------------------------------------------------------------------- |
# Application output definitions |
# ----------------------------------------------------------------------------- |
.PHONY: check info help elf_info clean clean_all bootloader |
.DEFAULT_GOAL := help |
|
# 'compile' is still here for compatibility |
exe: $(APP_ASM) $(APP_EXE) |
compile: $(APP_ASM) $(APP_EXE) |
install: $(APP_ASM) $(APP_IMG) |
all: $(APP_ASM) $(APP_EXE) $(APP_IMG) |
|
# Check if making bootloader |
# Use different base address and legth for instruction memory/"rom" (BOOTMEM instead of IMEM) |
# Also define "make_bootloader" for crt0.S |
target bootloader: CC_OPTS += -Wl,--defsym=make_bootloader=1 -Dmake_bootloader |
|
|
# ----------------------------------------------------------------------------- |
# Image generator targets |
# ----------------------------------------------------------------------------- |
# install/compile tools |
$(IMAGE_GEN): $(NEORV32_EXG_PATH)/image_gen.cpp |
@echo Compiling $(IMAGE_GEN) |
@$(CC_X86) $< -o $(IMAGE_GEN) |
|
|
# ----------------------------------------------------------------------------- |
# General targets: Assemble, compile, link, dump |
# ----------------------------------------------------------------------------- |
# Compile app *.s sources (assembly) |
%.s.o: %.s |
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(ASM_INC) $< -o $@ |
|
# Compile app *.S sources (assembly + C pre-processor) |
%.S.o: %.S |
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(ASM_INC) $< -o $@ |
|
# Compile app *.c sources |
%.c.o: %.c |
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(APP_INC) $< -o $@ |
|
# Compile app *.cpp sources |
%.cpp.o: %.cpp |
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(APP_INC) $< -o $@ |
|
# Link object files and show memory utilization |
main.elf: $(OBJ) |
@$(CC) $(CC_OPTS) -T $(LD_SCRIPT) $(OBJ) -o $@ |
@echo "Memory utilization:" |
@$(SIZE) main.elf |
|
# Assembly listing file (for debugging) |
$(APP_ASM): main.elf |
@$(OBJDUMP) -d -S -z $< > $@ |
|
# Generate final executable from .text + .rodata + .data (in THIS order!) |
main.bin: main.elf $(APP_ASM) |
@$(OBJCOPY) -I elf32-little $< -j .text -O binary text.bin |
@$(OBJCOPY) -I elf32-little $< -j .rodata -O binary rodata.bin |
@$(OBJCOPY) -I elf32-little $< -j .data -O binary data.bin |
@cat text.bin rodata.bin data.bin > $@ |
@rm -f text.bin rodata.bin data.bin |
|
|
# ----------------------------------------------------------------------------- |
# Application targets: Generate binary executable, install (as VHDL file) |
# ----------------------------------------------------------------------------- |
# Generate NEORV32 executable image for upload via bootloader |
$(APP_EXE): main.bin $(IMAGE_GEN) |
@set -e |
@$(IMAGE_GEN) -app_bin $< $@ $(shell basename $(CURDIR)) |
@echo "Executable ($(APP_EXE)) size in bytes:" |
@wc -c < $(APP_EXE) |
|
# Generate NEORV32 executable VHDL boot image |
$(APP_IMG): main.bin $(IMAGE_GEN) |
@set -e |
@$(IMAGE_GEN) -app_img $< $@ $(shell basename $(CURDIR)) |
@echo "Installing application image to $(NEORV32_RTL_PATH)/$(APP_IMG)" |
@cp $(APP_IMG) $(NEORV32_RTL_PATH)/. |
|
|
# ----------------------------------------------------------------------------- |
# Bootloader targets |
# ----------------------------------------------------------------------------- |
# Create and install bootloader VHDL init image |
$(BOOT_IMG): main.bin $(IMAGE_GEN) |
@set -e |
@$(IMAGE_GEN) -bld_img $< $(BOOT_IMG) $(shell basename $(CURDIR)) |
@echo "Installing bootloader image to $(NEORV32_RTL_PATH)/$(BOOT_IMG)" |
@cp $(BOOT_IMG) $(NEORV32_RTL_PATH)/. |
|
# Just an alias that |
bootloader: $(BOOT_IMG) |
|
|
# ----------------------------------------------------------------------------- |
# Check toolchain |
# ----------------------------------------------------------------------------- |
check: $(IMAGE_GEN) |
@echo "---------------- Check: NEORV32_HOME folder ----------------" |
ifneq ($(shell [ -e $(NEORV32_HOME_MARKER) ] && echo 1 || echo 0 ), 1) |
$(error NEORV32_HOME folder not found!) |
endif |
@echo "NEORV32_HOME: $(NEORV32_HOME)" |
@echo "---------------- Check: $(CC) ----------------" |
@$(CC) -v |
@echo "---------------- Check: $(OBJDUMP) ----------------" |
@$(OBJDUMP) -V |
@echo "---------------- Check: $(OBJCOPY) ----------------" |
@$(OBJCOPY) -V |
@echo "---------------- Check: $(SIZE) ----------------" |
@$(SIZE) -V |
@echo "---------------- Check: NEORV32 image_gen ----------------" |
@$(IMAGE_GEN) -help |
@echo "---------------- Check: Native GCC ----------------" |
@$(CC_X86) -v |
@echo |
@echo "Toolchain check OK" |
|
|
# ----------------------------------------------------------------------------- |
# Upload executable via serial port to bootloader |
# ----------------------------------------------------------------------------- |
upload: $(APP_EXE) |
@sh $(NEORV32_EXG_PATH)/uart_upload.sh $(COM_PORT) $(APP_EXE) |
|
|
# ----------------------------------------------------------------------------- |
# Show configuration |
# ----------------------------------------------------------------------------- |
info: |
@echo "---------------- Info: Project ----------------" |
@echo "Project folder: $(shell basename $(CURDIR))" |
@echo "Source files: $(APP_SRC)" |
@echo "Include folder(s): $(APP_INC)" |
@echo "ASM include folder(s): $(ASM_INC)" |
@echo "---------------- Info: NEORV32 ----------------" |
@echo "NEORV32 home folder (NEORV32_HOME): $(NEORV32_HOME)" |
@echo "IMAGE_GEN: $(IMAGE_GEN)" |
@echo "Core source files:" |
@echo "$(CORE_SRC)" |
@echo "Core include folder:" |
@echo "$(NEORV32_INC_PATH)" |
@echo "---------------- Info: Objects ----------------" |
@echo "Project object files:" |
@echo "$(OBJ)" |
@echo "---------------- Info: RISC-V CPU ----------------" |
@echo "MARCH: $(MARCH)" |
@echo "MABI: $(MABI)" |
@echo "---------------- Info: Toolchain ----------------" |
@echo "Toolchain: $(RISCV_TOLLCHAIN)" |
@echo "CC: $(CC)" |
@echo "OBJDUMP: $(OBJDUMP)" |
@echo "OBJCOPY: $(OBJCOPY)" |
@echo "SIZE: $(SIZE)" |
@echo "---------------- Info: Compiler Libraries ----------------" |
@echo "LIBGCC:" |
@$(CC) -print-libgcc-file-name |
@echo "SEARCH-DIRS:" |
@$(CC) -print-search-dirs |
@echo "---------------- Info: Flags ----------------" |
@echo "USER_FLAGS: $(USER_FLAGS)" |
@echo "CC_OPTS: $(CC_OPTS)" |
@echo "---------------- Info: Host Native GCC Flags ----------------" |
@echo "CC_X86: $(CC_X86)" |
|
|
# ----------------------------------------------------------------------------- |
# Show final ELF details (just for debugging) |
# ----------------------------------------------------------------------------- |
elf_info: main.elf |
@$(OBJDUMP) -x main.elf |
|
|
# ----------------------------------------------------------------------------- |
# Help |
# ----------------------------------------------------------------------------- |
help: |
@echo "<<< NEORV32 Application Makefile >>>" |
@echo "Make sure to add the bin folder of RISC-V GCC to your PATH variable." |
@echo "Targets:" |
@echo " help - show this text" |
@echo " check - check toolchain" |
@echo " info - show makefile/toolchain configuration" |
@echo " exe - compile and generate <neorv32_exe.bin> executable for upload via bootloader" |
@echo " install - compile, generate and install VHDL IMEM boot image (for application)" |
@echo " all - compile and generate <neorv32_exe.bin> executable for upload via bootloader and generate and install VHDL IMEM boot image (for application)" |
@echo " clean - clean up project" |
@echo " clean_all - clean up project, core libraries and image generator" |
@echo " bootloader - compile, generate and install VHDL BOOTROM boot image (for bootloader only!)" |
@echo " upload - upload <neorv32_exe.bin> executable via serial port <COM_PORT> to bootloader" |
|
|
# ----------------------------------------------------------------------------- |
# Clean up |
# ----------------------------------------------------------------------------- |
clean: |
@rm -f *.elf *.o *.bin *.out *.asm *.vhd |
|
clean_all: clean |
@rm -f $(OBJ) $(IMAGE_GEN) |
/sw/lib/include/neorv32_rte.h
72,6 → 72,7
void neorv32_rte_print_hw_config(void); |
void neorv32_rte_print_hw_version(void); |
void neorv32_rte_print_credits(void); |
void neorv32_rte_print_logo(void); |
void neorv32_rte_print_license(void); |
|
#endif // neorv32_rte_h |
/sw/lib/source/neorv32_rte.c
506,14 → 506,35
**************************************************************************/ |
void neorv32_rte_print_credits(void) { |
|
neorv32_uart_print("\n\nThe NEORV32 Processor Project\n" |
"by Stephan Nolting\n" |
neorv32_uart_print("\nThe NEORV32 Processor Project, by Stephan Nolting\n" |
"https://github.com/stnolting/neorv32\n" |
"made in Hannover, Germany\n\n"); |
"made in Hannover, Germany EU\n\n"); |
} |
|
|
/**********************************************************************//** |
* NEORV32 runtime environment: Print project credits |
**************************************************************************/ |
void neorv32_rte_print_logo(void) { |
|
neorv32_uart_print( |
"\n" |
" ##\n" |
" ## ## ## ##\n" |
" ## ## ######### ######## ######## ## ## ######## ######## ## ###############\n" |
"#### ## ## ## ## ## ## ## ## ## ## ## ## ## #### ####\n" |
"## ## ## ## ## ## ## ## ## ## ## ## ## ## ##### ##\n" |
"## ## ## ######### ## ## ######### ## ## ##### ## ## #### ##### ####\n" |
"## ## ## ## ## ## ## ## ## ## ## ## ## ## ##### ##\n" |
"## #### ## ## ## ## ## ## ## ## ## ## ## #### ####\n" |
"## ## ######### ######## ## ## ## ######## ########## ## ###############\n" |
" ## ## ## ##\n" |
" ##\n" |
"\n"); |
} |
|
|
/**********************************************************************//** |
* NEORV32 runtime environment: Print project license |
**************************************************************************/ |
void neorv32_rte_print_license(void) { |
520,7 → 541,6
|
neorv32_uart_print( |
"\n" |
"\n" |
"BSD 3-Clause License\n" |
"\n" |
"Copyright (c) 2020, Stephan Nolting. All rights reserved.\n" |
549,9 → 569,7
"NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n" |
"OF THE POSSIBILITY OF SUCH DAMAGE.\n" |
"\n" |
"The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting\n" |
"\n" |
"\n" |
); |
} |
|
/CHANGELOG.md
14,6 → 14,8
|
| Date (*dd.mm.yyyy*) | Version | Comment | |
|:----------:|:-------:|:--------| |
| 11.11.2020 | 1.4.7.0 | Further optimized pipeline front-end: Jumps and branches are one cycle faster (+5% coremark performance); updated synthesis results; updated performance results; added `hello_world` example program | |
| 07.11.2020 | 1.4.6.7 | Updated bootloader (size optimization) and changed processor version output; added project logo; minor data sheet edits | |
| 03.11.2020 | 1.4.6.6 | Removed SPI module's *buggy* "LSB-first mode", SPI module now always sends data MSB-first; removed SPI.CTRL `SPI_CT_DIR` bit; modfied bit order in SPI CTRL register; updated SPI SW library | |
| 02.11.2020 | 1.4.6.5 | :warning: Fixed bug in CPU's illegal instruction detection logic; CPU rtl code optimizations - further reduced hardware footprint; rtl code clean-ups | |
| 01.11.2020 | 1.4.6.4 | :warning: Fixed bug in `[m]instret[h]` and `[m]cycle[h]` carry logic; CPU hardware optimizations (area reduction, shortend critical path) | |
/README.md
1,5 → 1,7
# [The NEORV32 Processor](https://github.com/stnolting/neorv32) (RISC-V) |
[![NEORV32](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_logo_white_bg.png)](https://github.com/stnolting/neorv32) |
|
# The NEORV32 RISC-V Processor |
|
[![Build Status](https://travis-ci.com/stnolting/neorv32.svg?branch=master)](https://travis-ci.com/stnolting/neorv32) |
[![license](https://img.shields.io/github/license/stnolting/neorv32)](https://github.com/stnolting/neorv32/blob/master/LICENSE) |
[![release](https://img.shields.io/github/v/release/stnolting/neorv32)](https://github.com/stnolting/neorv32/releases) |
20,14 → 22,14
|
The NEORV32 Processor is a customizable microcontroller-like system on chip (SoC) that is based |
on the RISC-V-compliant NEORV32 CPU. The processor is intended as *ready-to-go* auxiliary processor within a larger SoC |
designs or as stand-alone custom microcontroller. Its top entity can be directly synthesized for *any* target technology without modifications. |
designs or as stand-alone custom microcontroller. |
|
|
### Key Features |
|
* RISC-V-[compliant](#Status) 32-bit `rv32i` [**NEORV32 CPU**](#NEORV32-CPU-Features) |
* Compliant to *Unprivileged ISA Specification* [(Version 2.2)](https://github.com/stnolting/neorv32/blob/master/docs/riscv-privileged.pdf) |
* Compliant to *Privileged Architecture Specification* [(Version 1.12-draft)](https://github.com/stnolting/neorv32/blob/master/docs/riscv-spec.pdf) |
* RISC-V-[compliant](#Status) 32-bit `rv32i` [**NEORV32 CPU**](#NEORV32-CPU-Features), compliant to |
* Subset of the *Unprivileged ISA Specification* [(Version 2.2)](https://github.com/stnolting/neorv32/blob/master/docs/riscv-privileged.pdf) |
* Subset of the *Privileged Architecture Specification* [(Version 1.12-draft)](https://github.com/stnolting/neorv32/blob/master/docs/riscv-spec.pdf) |
* Optional CPU extensions |
* `C` - compressed instructions (16-bit) |
* `E` - embedded CPU (reduced register file) |
36,20 → 38,24
* `Zicsr` - control and status register access instructions (+ exception/irq system) |
* `Zifencei` - instruction stream synchronization |
* `PMP` - physical memory protection |
* Full-scale RISC-V microcontroller system (**SoC**) [**NEORV32 Processor**](#NEORV32-Processor-Features) with optional submodules |
* optional embedded memories (instruction/data/bootloader, RAM/ROM) |
* timers (watch dog, RISC-V-compliant machine timer) |
* serial interfaces (SPI, TWI, UART) |
* external bus interface (Wishbone / [AXI4](#AXI4-Connectivity)) |
* [more ...](#NEORV32-Processor-Features) |
* Software framework |
* Core libraries for high-level usage of the provided functions and peripherals |
* Application compilation based on [GNU makefiles](https://github.com/stnolting/neorv32/blob/master/sw/example/blink_led/makefile) |
* core libraries for high-level usage of the provided functions and peripherals |
* application compilation based on [GNU makefiles](https://github.com/stnolting/neorv32/blob/master/sw/example/blink_led/makefile) |
* GCC-based toolchain ([pre-compiled toolchains available](https://github.com/stnolting/riscv_gcc_prebuilt)) |
* runtime environment |
* several example programs |
* [Doxygen-based](https://github.com/stnolting/neorv32/blob/master/docs/doxygen_makefile_sw) documentation of the software framework: available on [GitHub pages](https://stnolting.github.io/neorv32/files.html) |
* [doxygen-based](https://github.com/stnolting/neorv32/blob/master/docs/doxygen_makefile_sw) documentation: available on [GitHub pages](https://stnolting.github.io/neorv32/files.html) |
* [FreeRTOS port](https://github.com/stnolting/neorv32/blob/master/sw/example/demo_freeRTOS) available |
* [**Full-blown data sheet**](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf) (pdf) |
* Completely described in behavioral, platform-independent VHDL - no primitives, macros, etc. |
* Fully synchronous design, no latches, no gated clocks |
* Small hardware footprint and high operating frequency |
* Full-scale RISC-V microcontroller system (**SoC**): [**NEORV32 Processor**](#NEORV32-Processor-Features) |
* Optional embedded memories, timers, serial interfaces, external interfaces (Wishbone or [AXI4-Lite](#AXI4-Connectivity)) ... |
|
The project’s change log is available in the [CHANGELOG.md](https://github.com/stnolting/neorv32/blob/master/CHANGELOG.md) file in the root directory of this repository. |
To see the changes between releases visit the project's [release page](https://github.com/stnolting/neorv32/releases). |
83,6 → 89,7
### To-Do / Wish List / [Help Wanted](#Contribute) |
|
* Use LaTeX for data sheet |
* More support for FreeRTOS |
* Further size and performance optimization |
* Add a cache for the external memory interface |
* Synthesis results (+ wrappers?) for more/specific platforms |
105,22 → 112,22
![neorv32 Overview](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_processor.png) |
|
The NEORV32 Processor provides a full-scale microcontroller-like SoC based on the NEORV32 CPU. The setup |
is highly customizable via the processor's top generics. |
is highly customizable via the processor's top generics and already provides the following *optional* modules: |
|
* Optional processor-internal data and instruction memories (**DMEM** / **IMEM**) |
* Optional internal **Bootloader** with UART console and automatic application boot from SPI flash option |
* Optional machine system timer (**MTIME**), RISC-V-compliant |
* Optional universal asynchronous receiver and transmitter (**UART**) with simulation output option via text.io |
* Optional 8/16/24/32-bit serial peripheral interface controller (**SPI**) with 8 dedicated chip select lines |
* Optional two wire serial interface controller (**TWI**), with optional clock-stretching, compatible to the I²C standard |
* Optional general purpose parallel IO port (**GPIO**), 32xOut & 32xIn, with pin-change interrupt |
* Optional 32-bit external bus interface, Wishbone b4 compliant (**WISHBONE**), *standard* or *pipelined* handshake/transactions mode |
* Optional wrapper for **AXI4-Lite Master Interface** (see [AXI Connectivity](#AXI4-Connectivity)), compatibility verified with Xilinx Vivado Block Desginer |
* Optional watchdog timer (**WDT**) |
* Optional PWM controller with 4 channels and 8-bit duty cycle resolution (**PWM**) |
* Optional GARO-based true random number generator (**TRNG**) |
* Optional custom functions units (**CFU0** and **CFU1**) for tightly-coupled custom co-processors |
* System configuration information memory to check hardware configuration by software (**SYSINFO**) |
* processor-internal data and instruction memories (**DMEM** / **IMEM**) |
* internal **Bootloader** with UART console and automatic application boot from SPI flash option |
* machine system timer (**MTIME**), RISC-V-compliant |
* watchdog timer (**WDT**) |
* universal asynchronous receiver and transmitter (**UART**) with simulation output option via text.io |
* 8/16/24/32-bit serial peripheral interface controller (**SPI**) with 8 dedicated chip select lines |
* two wire serial interface controller (**TWI**), with optional clock-stretching, compatible to the I²C standard |
* general purpose parallel IO port (**GPIO**), 32xOut & 32xIn, with pin-change interrupt |
* 32-bit external bus interface, Wishbone b4 compliant (**WISHBONE**), *standard* or *pipelined* handshake/transactions mode |
* wrapper for **AXI4-Lite Master Interface** (see [AXI Connectivity](#AXI4-Connectivity)) |
* PWM controller with 4 channels and 8-bit duty cycle resolution (**PWM**) |
* GARO-based true random number generator (**TRNG**) |
* custom functions units (**CFU0** and **CFU1**) for tightly-coupled custom co-processors |
* system configuration information memory to check hardware configuration by software (**SYSINFO**, mandatory - not *optional*) |
|
### NEORV32 CPU Features |
|
216,41 → 223,41
### NEORV32 CPU |
|
This chapter shows exemplary implementation results of the NEORV32 CPU for an **Intel Cyclone IV EP4CE22F17C6N FPGA** on |
a DE0-nano board. The design was synthesized using **Intel Quartus Prime Lite 19.1** ("balanced implementation"). The timing |
a DE0-nano board. The design was synthesized using **Intel Quartus Prime Lite 20.1** ("balanced implementation"). The timing |
information is derived from the Timing Analyzer / Slow 1200mV 0C Model. If not otherwise specified, the default configuration |
of the CPU's generics is assumed (for example no PMP). No constraints were used at all. |
|
Results generated for hardware version `1.4.4.8`. |
Results generated for hardware version `1.4.7.0`. |
|
| CPU Configuration | LEs | FFs | Memory bits | DSPs | f_max | |
|:---------------------------------------|:----------:|:--------:|:-----------:|:----:|:--------:| |
| `rv32i` | 983 | 438 | 2048 | 0 | ~120 MHz | |
| `rv32i` + `u` + `Zicsr` + `Zifencei` | 1877 | 802 | 2048 | 0 | ~112 MHz | |
| `rv32im` + `u` + `Zicsr` + `Zifencei` | 2374 | 1048 | 2048 | 0 | ~110 MHz | |
| `rv32imc` + `u` + `Zicsr` + `Zifencei` | 2650 | 1064 | 2048 | 0 | ~110 MHz | |
| `rv32emc` + `u` + `Zicsr` + `Zifencei` | 2680 | 1061 | 1024 | 0 | ~110 MHz | |
| `rv32i` | 932 | 413 | 2048 | 0 | ~120 MHz | |
| `rv32i` + `u` + `Zicsr` + `Zifencei` | 1800 | 815 | 2048 | 0 | ~118 MHz | |
| `rv32im` + `u` + `Zicsr` + `Zifencei` | 2368 | 1058 | 2048 | 0 | ~117 MHz | |
| `rv32imc` + `u` + `Zicsr` + `Zifencei` | 2604 | 1073 | 2048 | 0 | ~113 MHz | |
| `rv32emc` + `u` + `Zicsr` + `Zifencei` | 2613 | 1073 | 1024 | 0 | ~113 MHz | |
|
|
### NEORV32 Processor-Internal Peripherals and Memories |
|
Results generated for hardware version `1.4.4.8`. |
Results generated for hardware version `1.4.7.0`. |
|
| Module | Description | LEs | FFs | Memory bits | DSPs | |
|:----------|:-----------------------------------------------------|----:|----:|------------:|-----:| |
| BOOT ROM | Bootloader ROM (default 4kB) | 4 | 1 | 32 768 | 0 | |
| BUSSWITCH | Mux for CPU I & D interfaces | 62 | 8 | 0 | 0 | |
| BOOT ROM | Bootloader ROM (default 4kB) | 3 | 1 | 32 768 | 0 | |
| BUSSWITCH | Mux for CPU I & D interfaces | 63 | 8 | 0 | 0 | |
| CFU0 | Custom functions unit 0 | - | - | - | - | |
| CFU1 | Custom functions unit 1 | - | - | - | - | |
| DMEM | Processor-internal data memory (default 8kB) | 13 | 2 | 65 536 | 0 | |
| DMEM | Processor-internal data memory (default 8kB) | 12 | 2 | 65 536 | 0 | |
| GPIO | General purpose input/output ports | 66 | 65 | 0 | 0 | |
| IMEM | Processor-internal instruction memory (default 16kb) | 7 | 2 | 131 072 | 0 | |
| MTIME | Machine system timer | 268 | 166 | 0 | 0 | |
| MTIME | Machine system timer | 272 | 166 | 0 | 0 | |
| PWM | Pulse-width modulation controller | 72 | 69 | 0 | 0 | |
| SPI | Serial peripheral interface | 184 | 125 | 0 | 0 | |
| SPI | Serial peripheral interface | 142 | 124 | 0 | 0 | |
| SYSINFO | System configuration information memory | 11 | 9 | 0 | 0 | |
| TRNG | True random number generator | 132 | 105 | 0 | 0 | |
| TWI | Two-wire interface | 74 | 44 | 0 | 0 | |
| UART | Universal asynchronous receiver/transmitter | 175 | 132 | 0 | 0 | |
| TWI | Two-wire interface | 77 | 44 | 0 | 0 | |
| UART | Universal asynchronous receiver/transmitter | 173 | 132 | 0 | 0 | |
| WDT | Watchdog timer | 58 | 45 | 0 | 0 | |
| WISHBONE | External memory interface | 106 | 104 | 0 | 0 | |
|
262,13 → 269,13
processor's [top entity](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_top.vhd) signals |
to FPGA pins - except for the Wishbone bus and the interrupt signals. |
|
Results generated for hardware version `1.4.4.8`. |
Results generated for hardware version `1.4.7.0`. |
|
| Vendor | FPGA | Board | Toolchain | Strategy | CPU Configuration | LUT / LE | FF / REG | DSP | Memory Bits | BRAM / EBR | SPRAM | Frequency | |
|:--------|:----------------------------------|:-----------------|:---------------------------|:-------- |:-----------------------------------------------|:-----------|:-----------|:-------|:-------------|:-----------|:---------|--------------:| |
| Intel | Cyclone IV `EP4CE22F17C6N` | Terasic DE0-Nano | Quartus Prime Lite 19.1 | balanced | `rv32imc` + `u` + `Zicsr` + `Zifencei` + `PMP` | 4008 (18%) | 1849 (9%) | 0 (0%) | 231424 (38%) | - | - | 105 MHz | |
| Lattice | iCE40 UltraPlus `iCE40UP5K-SG48I` | Upduino v2.0 | Radiant 2.1 (Synplify Pro) | default | `rv32ic` + `u` + `Zicsr` + `Zifencei` | 4296 (81%) | 1611 (30%) | 0 (0%) | - | 12 (40%) | 4 (100%) | *c* 22.5 MHz | |
| Xilinx | Artix-7 `XC7A35TICSG324-1L` | Arty A7-35T | Vivado 2019.2 | default | `rv32imc` + `u` + `Zicsr` + `Zifencei` + `PMP` | 2390 (11%) | 1888 (5%) | 0 (0%) | - | 8 (16%) | - | *c* 100 MHz | |
| Intel | Cyclone IV `EP4CE22F17C6N` | Terasic DE0-Nano | Quartus Prime Lite 20.1 | balanced | `rv32imc` + `u` + `Zicsr` + `Zifencei` + `PMP` | 3892 (17%) | 1859 (8%) | 0 (0%) | 231424 (38%) | - | - | 113 MHz | |
| Lattice | iCE40 UltraPlus `iCE40UP5K-SG48I` | Upduino v2.0 | Radiant 2.1 (Synplify Pro) | default | `rv32ic` + `u` + `Zicsr` + `Zifencei` | 4331 (82%) | 1673 (31%) | 0 (0%) | - | 12 (40%) | 4 (100%) | *c* 22.5 MHz | |
| Xilinx | Artix-7 `XC7A35TICSG324-1L` | Arty A7-35T | Vivado 2019.2 | default | `rv32imc` + `u` + `Zicsr` + `Zifencei` + `PMP` | 2416 (12%) | 1900 (5%) | 0 (0%) | - | 8 (16%) | - | *c* 100 MHz | |
|
**_Notes_** |
* The Lattice iCE40 UltraPlus setup uses the FPGA's SPRAM memory primitives for the internal IMEM and DMEM (each 64kb). |
288,7 → 295,7
[sw/example/coremark](https://github.com/stnolting/neorv32/blob/master/sw/example/coremark) project folder. This benchmark |
tests the capabilities of a CPU itself rather than the functions provided by the whole system / SoC. |
|
Results generated for hardware version `1.4.5.4`. |
Results generated for hardware version `1.4.7.0`. |
|
~~~ |
**Configuration** |
301,11 → 308,11
|
| CPU | Executable Size | Optimization | CoreMark Score | CoreMarks/MHz | |
|:--------------------------------------------|:---------------:|:------------:|:--------------:|:-------------:| |
| `rv32i` | 26 940 bytes | `-O3` | 33.89 | **0.3389** | |
| `rv32im` | 25 772 bytes | `-O3` | 64.51 | **0.6451** | |
| `rv32imc` | 20 524 bytes | `-O3` | 64.51 | **0.6451** | |
| `rv32imc` + `FAST_MUL_EN` | 20 524 bytes | `-O3` | 80.00 | **0.8000** | |
| `rv32imc` + `FAST_MUL_EN` + `FAST_SHIFT_EN` | 20 524 bytes | `-O3` | 83.33 | **0.8333** | |
| `rv32i` | 27 424 bytes | `-O3` | 35.71 | **0.3571** | |
| `rv32im` | 26 232 bytes | `-O3` | 66.66 | **0.6666** | |
| `rv32imc` | 20 876 bytes | `-O3` | 66.66 | **0.6666** | |
| `rv32imc` + `FAST_MUL_EN` | 20 876 bytes | `-O3` | 83.33 | **0.8333** | |
| `rv32imc` + `FAST_MUL_EN` + `FAST_SHIFT_EN` | 20 876 bytes | `-O3` | 86.96 | **0.8696** | |
|
The `FAST_MUL_EN` configuration uses DSPs for the multiplier of the `M` extension (enabled via the `FAST_MUL_EN` generic). The `FAST_SHIFT_EN` configuration |
uses a barrel shifter for CPU shift operations (enabled via the `FAST_SHIFT_EN` generic). |
328,15 → 335,15
dividing the total number of required clock cycles (only the timed core to avoid distortion due to IO wait cycles; sampled via the `cycle[h]` CSRs) |
by the number of executed instructions (`instret[h]` CSRs). The executables were generated using optimization `-O3`. |
|
Results generated for hardware version `1.4.5.4`. |
Results generated for hardware version `1.4.7.0`. |
|
| CPU | Required Clock Cycles | Executed Instructions | Average CPI | |
|:--------------------------------------------|----------------------:|----------------------:|:-----------:| |
| `rv32i` | 5 945 938 586 | 1 469 587 406 | **4.05** | |
| `rv32im` | 3 110 282 586 | 602 225 760 | **5.16** | |
| `rv32imc` | 3 172 969 968 | 615 388 890 | **5.16** | |
| `rv32imc` + `FAST_MUL_EN` | 2 590 417 968 | 615 388 890 | **4.21** | |
| `rv32imc` + `FAST_MUL_EN` + `FAST_SHIFT_EN` | 2 456 318 408 | 615 388 890 | **3.99** | |
| `rv32i` | 5 648 997 774 | 1 469 233 238 | **3.84** | |
| `rv32im` | 3 036 749 774 | 601 871 338 | **5.05** | |
| `rv32imc` | 3 036 959 882 | 615 034 616 | **4.94** | |
| `rv32imc` + `FAST_MUL_EN` | 2 454 407 882 | 615 034 588 | **3.99** | |
| `rv32imc` + `FAST_MUL_EN` + `FAST_SHIFT_EN` | 2 320 308 322 | 615 034 676 | **3.77** | |
|
|
The `FAST_MUL_EN` configuration uses DSPs for the multiplier of the `M` extension (enabled via the `FAST_MUL_EN` generic). The `FAST_SHIFT_EN` configuration |
500,8 → 507,8
``` |
<< NEORV32 Bootloader >> |
|
BLDV: Jul 6 2020 |
HWV: 1.0.1.0 |
BLDV: Nov 7 2020 |
HWV: 0x01040606 |
CLK: 0x0134FD90 Hz |
USER: 0x0001CE40 |
MISA: 0x42801104 |
550,7 → 557,7
This project is released under the BSD 3-Clause license. No copyright infringement intended. |
Other implied or used projects might have different licensing - see their documentation to get more information. |
|
#### Citation |
#### Citing |
|
If you are using the NEORV32 or some parts of the project in some kind of publication, please cite it as follows: |
|
623,6 → 630,6
|
-------- |
|
This repository was created on June 23th, 2020. |
This repository was created on June 23rd, 2020. |
|
Made with :coffee: in Hannover, Germany :eu: |