12. Traps
In RISC-V terminology, a trap is the mechanism that handles interrupts and exceptions. The difference between an exception and an interrupt is that an exception is synchronous: For example, it can be by an invalid instruction executed by the core. On the other hand, an interrupt is caused by an external event. For example, an interrupt can be activated by a timer.
Upon a trap, the following things happen:
- The reason for the trap is stored in the
mcauseCSR - The address of the instruction that was interrupted by the trap is stored in the
mepcCSR - If there is extra information for the specific trap, it is stored in
mtval, else it is set to0 - The
MPIEfield ofmstatusis set toMIE - The
MIEfield ofmstatusis set to0 - The
pcis set tomtvec(in direct mode or for exceptions) or tomtvec + 4 * causeif the mode is vectored and the cause is an interrupt
The privileged part of the RISC-V docs also define some instructions. One of them is MRET, which return from a trap handler and does the following:
- It resets
mstatus.MIEtomstatus.MPIE - It sets
mstatus.MPIEto1 - It sets
pctomepc
The other instruction that is defined in the privileged part of the ISA is the WFI (wait for interrupt). It should halt the processor until an interrupt occurs. However, this instruction is only meant to save power; a legal implemention is a NOP.
Let's do the easy work first and implement WFI as a NOP for now.
|
@@ -343,6 +343,8 @@ begin
|
|
| 343 |
else
|
| 344 |
v_decode_output.is_invalid := '1';
|
| 345 |
end if;
|
|
|
|
|
|
|
| 346 |
elsif opcode = "1111111" and funct3 = "000" then
|
| 347 |
-- LED (custom instruction): set the LEDs to the 8 least significant bits of rs1
|
| 348 |
v_decode_output.operation := OP_LED;
|
|
|
|
| 343 |
else
|
| 344 |
v_decode_output.is_invalid := '1';
|
| 345 |
end if;
|
| 346 |
+
elsif funct7 = "0001000" and rs2 = "00101" and opcode = "1110011" then
|
| 347 |
+
-- WFI (implemented as NOP)
|
| 348 |
elsif opcode = "1111111" and funct3 = "000" then
|
| 349 |
-- LED (custom instruction): set the LEDs to the 8 least significant bits of rs1
|
| 350 |
v_decode_output.operation := OP_LED;
|
Now let's implement MRET, which is also quite easy.
|
@@ -300,6 +300,9 @@ begin
|
|
| 300 |
-- ECALL
|
| 301 |
elsif i_imm = "000000000001" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
|
| 302 |
-- EBREAK
|
|
|
|
|
|
|
|
|
|
| 303 |
elsif opcode = "1110011" then
|
| 304 |
v_decode_output.operand2 := "00000000000000000000" & i_imm; -- store CSR register in operand 2
|
| 305 |
v_decode_output.destination_reg := rd;
|
|
|
|
| 300 |
-- ECALL
|
| 301 |
elsif i_imm = "000000000001" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
|
| 302 |
-- EBREAK
|
| 303 |
+
elsif funct7 = "0011000" and rs2 = "00010" and rs1 = "00000" and rd = "00000" and opcode = "1110011" then
|
| 304 |
+
-- MRET
|
| 305 |
+
v_decode_output.operation := OP_MRET;
|
| 306 |
elsif opcode = "1110011" then
|
| 307 |
v_decode_output.operand2 := "00000000000000000000" & i_imm; -- store CSR register in operand 2
|
| 308 |
v_decode_output.destination_reg := rd;
|
|
@@ -310,6 +310,11 @@ begin
|
|
| 310 |
else
|
| 311 |
-- TODO: exception; trying to write to non-existent or read-only CSR
|
| 312 |
end if;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 313 |
elsif input.operation = OP_LED then
|
| 314 |
led <= input.operand1(7 downto 0);
|
| 315 |
else
|
|
|
|
| 310 |
else
|
| 311 |
-- TODO: exception; trying to write to non-existent or read-only CSR
|
| 312 |
end if;
|
| 313 |
+
elsif input.operation = OP_MRET then
|
| 314 |
+
mstatus_mie <= mstatus_mpie;
|
| 315 |
+
mstatus_mpie <= '1';
|
| 316 |
+
v_jump := '1';
|
| 317 |
+
v_jump_address := mepc & "00";
|
| 318 |
elsif input.operation = OP_LED then
|
| 319 |
led <= input.operand1(7 downto 0);
|
| 320 |
else
|
|
@@ -32,6 +32,7 @@ package core_types is
|
|
| 32 |
OP_CSRRW,
|
| 33 |
OP_CSRRS,
|
| 34 |
OP_CSRRC,
|
|
|
|
| 35 |
OP_LED
|
| 36 |
);
|
| 37 |
|
|
|
|
| 32 |
OP_CSRRW,
|
| 33 |
OP_CSRRS,
|
| 34 |
OP_CSRRC,
|
| 35 |
+
OP_MRET,
|
| 36 |
OP_LED
|
| 37 |
);
|
| 38 |
|
Now we'll consider exceptions. The following exceptions are defined: 0. Instruction address misaligned: generated on a taken branch or unconditional jump when the target address is not aligned
- Instruction access fault: generated when the instruction fetch tries to fetch from a memory region that is not accessible
- Illegal instruction: when decoding an instruction fails
- Breakpoint: TODO
- Load address misaligned
- Load access fault
- Store address misaligned
- Store access fault ...
- Environment call from M-mode
There are a lot more exceptions defined, but they are not applicable. Regarding interrupts, there are 3 that are potentionally interesting:
- Machine system interrupt
- Machine timer interrupt
- Machine external interrupt
The machine system interrupt is caused by other cores. Since our implementation only has one core, it is not applicable. The machine external interrupt is caused by peripherals, but at this point we don't have them, so we can ignore this interrupt as well. So only the machine timer interrupt is left, and I will postpone the implementation of this to a later lesson.
First, I'll set up the basic structure of how traps work.
|
@@ -8,3 +8,6 @@ cpu.ip_user_files/
|
|
| 8 |
cpu.sim/
|
| 9 |
cpu.runs/
|
| 10 |
cpu.srcs/
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
cpu.sim/
|
| 9 |
cpu.runs/
|
| 10 |
cpu.srcs/
|
| 11 |
+
toolchain/resources/output.elf
|
| 12 |
+
toolchain/resources/output.bin
|
| 13 |
+
|
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.section .text
|
| 2 |
+
.globl _start
|
| 3 |
+
|
| 4 |
+
_start:
|
| 5 |
+
/* Clear mscratch (swap with zero) */
|
| 6 |
+
li t0, 0
|
| 7 |
+
csrrw t1, mscratch, t0 /* t1 = old mstatus, mstatus = 0 */
|
| 8 |
+
|
| 9 |
+
/* Set some bits using register variant */
|
| 10 |
+
li t0, 0x8 /* example: set MIE bit */
|
| 11 |
+
csrrs t2, mscratch, t0 /* set bits, t2 = old mstatus */
|
| 12 |
+
|
| 13 |
+
/* Clear some bits using register variant */
|
| 14 |
+
li t0, 0x8
|
| 15 |
+
csrrc t3, mscratch, t0 /* clear MIE bit, t3 = old mstatus */
|
| 16 |
+
|
| 17 |
+
/* Set bits using immediate variant */
|
| 18 |
+
csrsi mscratch, 0x8 /* set MIE bit */
|
| 19 |
+
|
| 20 |
+
/* Clear bits using immediate variant */
|
| 21 |
+
csrci mscratch, 0x8 /* clear MIE bit */
|
| 22 |
+
|
| 23 |
+
/* Read CSR using register variant (no side effects) */
|
| 24 |
+
csrrs t4, mscratch, x0 /* t4 = mstatus */
|
| 25 |
+
|
| 26 |
+
/* Read CSR using immediate variant (no side effects) */
|
| 27 |
+
csrrsi t5, mscratch, 0 /* t5 = mstatus */
|
| 28 |
+
|
| 29 |
+
/* Swap CSR and register again */
|
| 30 |
+
li t0, 0x1800 /* example: set MPP=11 */
|
| 31 |
+
csrrw t6, mscratch, t0 /* t6 = old mstatus */
|
| 32 |
+
|
| 33 |
+
hang:
|
| 34 |
+
j hang
|
| 35 |
+
|
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.section .text
|
| 2 |
+
.global _start
|
| 3 |
+
|
| 4 |
+
_start:
|
| 5 |
+
csrr x1, mvendorid
|
| 6 |
+
|
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/env bash
|
| 2 |
+
|
| 3 |
+
# exit if any command fails
|
| 4 |
+
set -e
|
| 5 |
+
|
| 6 |
+
# make a temporary directory
|
| 7 |
+
tmp=$(mktemp -d)
|
| 8 |
+
|
| 9 |
+
# assemble
|
| 10 |
+
riscv-elf-as "$1" -o "$tmp/output.o"
|
| 11 |
+
|
| 12 |
+
# link
|
| 13 |
+
riscv-elf-ld "$tmp/output.o" -T resources/linker.ld -o resources/output.elf
|
| 14 |
+
|
| 15 |
+
# extract binary
|
| 16 |
+
riscv-elf-objcopy -O binary resources/output.elf resources/output.bin
|
|
@@ -1,5 +1,5 @@
|
|
| 1 |
#include <stdint.h>
|
| 2 |
-
#include <stdio.h>
|
| 3 |
|
| 4 |
#define LENGTH 4484
|
| 5 |
int16_t input[LENGTH] = { 17, 28, 8, -25, 33, -48, 2, 42, 39, -10, 29, -26, 24, 44, -37, -1, -4, 2, -43, -6, -44, 29, 47, -48, 13, -18, 18, 30, -44, 35, 18, 2, -38, 50, -28, 18, 21, 32, -8, 18, -33, 24, 46, -6, -9, 39, 7, 48, 41, -26, -52, 1, -1, -40, -60, 18, -18, -87, 73, -86, -45, 69, -24, -31, -69, -12, -79, 84, 83, 24, 70, -75, -81, -38, 24, 26, -26, -48, -52, -10, -90, 4, 54, -88, 31, -3, 91, -67, 65, -61, -32, 63, 83, -50, -90, 75, -26, -23, -26, -61, -89, -65, 250, 60, 652, -47, 88, 50, -61, -113, 36, 823, 26, -849, -46, 27, 58, 41, 68, -48, -42, 15, -22, 49, 78, 322, 28, -28, -95, -33, 56, -28, 37, 63, 13, -8, -57, 52, -64, -36, -8, -28, -313, 49, -87, -13, 24, 911, -35, -117, 60, -65, 34, -3, 52, 54, 85, -371, -67, -8, 668, -22, 96, 51, 8, -55, 69, 31, 83, -49, -734, 165, 35, 85, -45, 60, 332, 32, 36, -31, -22, 233, -702, 80, -23, 865, -6, -94, 57, 18, 225, 955, 34, -47, 55, -97, -9, 4, 63, 43, -1, 18, 7, 75, -224, -76, 10, 79, -898, -91, -47, -3, -74, 19, 50, -45, 46, 54, 36, 28, 8, -27, 55, 41, -41, 540, 60, 58, 76, -3, -831, -45, -78, -77, -2, -50, 24, -572, 3, -94, -509, -53, -35, 559, 21, -292, 10, 16, -98, 812, -40, 10, 74, 16, 255, 92, 670, -73, 56, -59, -41, -938, -62, -84, -5, 89, -23, 423, 62, -162, -57, -698, -80, 47, -413, -899, -69, 92, 322, -145, 59, 41, 39, -39, 9, -34, -28, -58, 559, -59, -89, -19, -13, 94, 34, 77, -2, -91, -86, -94, -67, -63, 430, -5, 5, 70, 30, -67, 67, -30, -39, -131, -21, 19, 98, -96, 36, 610, 54, -72, -90, -49, 11, -77, -93, -30, -5, 79, 67, 59, -29, 63, 66, -54, -546, -101, -28, 4, -6, 96, -1, 323, 435, -22, -74, -80, 54, 658, 88, -46, 21, -23, -89, -84, 72, 3, 60, 40, 48, -49, 1, -5, -195, 46, -20, 686, 88, -80, 50, 81, -31, -67, 15, -398, -269, -1, -722, -978, 53, -153, 39, 61, 7, 517, -24, -19, 19, 45, 135, 70, 950, 67, -267, -672, 41, 896, -65, -33, 35, 883, -72, -27, -86, -81, 81, -87, 13, 88, -48, 52, -47, -52, 117, -653, -36, -88, 12, -71, 25, 64, 751, -7, -33, 598, -98, 54, 30, 766, 15, -60, 695, -1, -56, 39, 16, -98, 101, 99, -277, -564, 41, -21, -79, -23, 777, 246, 37, 563, 40, 784, -80, 56, -69, -31, 3, 23, -331, -95, -563, 63, -5, -84, -48, 16, 84, -63, 78, -17, -61, -30, 3, 301, 26, 128, -988, -13, -14, 87, 15, 85, -61, 48, -587, 65, 72, 63, -754, 733, -79, 584, -81, 597, -94, -40, -66, -94, 94, 15, -15, 24, 67, 807, 82, 86, -66, 20, -41, 95, 26, 70, 430, -3, 3, -47, 31, -890, 513, -7, 61, 39, -75, 886, -97, 86, 60, 140, -87, 49, 46, 23, -4, 10, -276, -61, 24, 76, -59, -42, -530, -8, 56, -696, -83, -38, -290, 57, -39, 99, 71, 55, -381, 28, -75, -26, 22, 77, -4, -94, 68, -68, -246, 11, -65, -54, -46, -58, 56, -98, 94, -94, -429, 29, 867, 133, 41, 17, -58, -9, 920, -12, 1, -28, -72, 769, 31, 18, 82, 33, 518, -375, -78, -98, 92, -16, -44, 31, -51, 65, 40, -17, 52, -879, 3, 14, 382, 28, 38, 23, 539, 869, -46, -23, -87, -3, 790, 878, 563, -41, -67, 50, 20, 55, 42, -47, -44, -78, -675, 44, -578, -22, -821, 21, 28, 18, -682, 42, 52, 8, -66, -986, -80, -67, 6, -38, -80, -38, -85, -32, -17, 95, -3, 25, -19, 19, -56, 178, -22, 55, -355, -966, 810, -8, -388, -56, 485, 51, -28, -50, -79, -64, -32, -52, -323, 61, -322, -579, -37, 477, 508, 46, 972, -607, -919, -85, -521, 25, 49, 32, 23, 477, 71, 92, -54, -468, 59, -5, 294, -274, 20, 65, 287, 13, -856, -71, -344, 71, 77, -56, 90, 333, 56, -79, 4, 286, 89, -78, 20, 58, -313, 822, -5, 5, 92, 82, 17, 41, -38, 50, -71, -882, -75, 75, 298, -43, 45, 5, 21, 74, -55, 58, -36, 633, 57, 43, 15, -8, 93, 376, -781, 50, 55, -68, 56, -17, -71, 52, 435, 73, 69, -70, 97, 850, 44, -50, -8, 62, 18, -272, 15, 85, -14, 214, 46, -46, -51, 751, 37, 363, -18, -82, 288, -68, -94, -3, 2, 82, -21, 32, 82, -37, 37, -33, 81, 52, 51, 74, 75, -51, -44, 52, 43, 547, 753, 185, 78, 83, 54, -22, 25, -71, -32, -47, 60, 46, 80, -81, -35, 894, 14, 69, -54, 74, -24, -6, 5, -565, -30, -93, -7, 28, -85, -39, -63, 59, -30, -345, -674, 75, -354, -908, 622, 10, 4, -48, 55, -2, 99, -3, -1, -31, -54, 60, 3, 84, 40, 228, 92, -95, -177, -50, -71, 60, -38, 27, 75, 47, -126, 12, 287, 71, 95, -39, -9, 441, -92, -158, 36, 5, 49, 51, 877, -503, 241, -38, 74, 975, 49, -17, 19, -53, 53, 26, -41, -85, 22, 260, -7, -19, -70, -48, 270, 9, 71, -88, -87, 87, 2, 14, 84, -67, -33, -38, 75, -37, 13, -13, 43, -1, 51, 7, 63, -29, 15, -563, 58, -19, 50, -275, -10, 71, 42, -83, -20, -62, 88, -26, -99, -1, 93, -95, -36, -62, 29, -61, 43, 89, -10, 65, 781, 64, 84, 16, 76, 19, 98, -730, -63, 921, 83, -4, -16, -84, 77, -57, 91, 46, 89, -546, 17, 55, 51, -31, -92, -63, 47, 16, 20, 23, -43, 18, 20, -35, 97, 662, 28, 26, -16, -18, 88, 4, 29, -3, -53, 132, 21, -36, -59, 95, 15, -70, -80, 35, 66, -66, 63, 27, -358, 68, -23, 423, 62, -25, 63, -212, 12, 50, -27, 16, 23, 36, -98, -13, 85, 52, -302, 78, 398, -198, 96, -50, -46, 82, -129, -80, -13, 5, -73, -89, -58, -335, 25, 88, -164, -15, 61, 95, 69, 1, 30, 272, -221, -79, 165, 28, 43, 6, -96, 82, 82, -582, 18, 82, -637, -70, -93, -471, -633, -41, 97, -252, 59, 63, -38, 16, -41, 61, 80, 337, 94, 69, -58, 36, 15, 83, 924, 62, -48, -14, -40, -43, 46, 67, -33, -20, 23, 28, -737, 9, 77, -77, 53, 34, -87, -70, 70, 67, -49, 979, -87, -94, 45, -701, -18, 58, 59, -40, 81, 76, 243, 77, 540, -5, 869, 12, 901, 87, 40, -640, 3, -522, -134, -47, 54, -54, 884, -19, -265, 14, 143, 43, -629, 19, 86, 78, -47, -7, -59, 55, 11, -402, -29, 265, -90, -62, 11, 99, 101, -852, -48, 92, 81, -73, -41, 1, 55, -64, -20, -31, -169, -192, 65, 96, 532, 90, 15, 33, 236, 16, 94, 63, 2, 19, 949, 51, 20, 6, -71, 45, 840, -2, 92, 670, -26, 426, 18, -55, 63, -802, 89, 91, -65, 60, 1, -95, -97, -8, 15, -19, 58, 78, -32, -89, 27, -48, 68, -91, -673, 207, -2, -999, -2, -998, -66, 66, 22, 30, -35, 83, -93, -150, 5, -39, -23, -88, -28, 87, -471, 68, -468, -83, -17, -85, -39, 71, -947, 83, -33, 36, 89, 25, 897, -57, -40, 67, 733, -19, -756, 81, 849, 53, -89, -50, 35, -226, 618, -68, -82, -946, -742, -4, -58, -98, 13, 70, -81, 85, 15, -10, -41, 43, 968, 194, 46, 578, 22, -58, -763, 99, 53, -10, -21, 14, 386, 26, -25, -1, -270, -89, -20, 79, 66, -85, 236, -1, 84, -45, 68, -23, 54, -54, -9, 63, -54, 574, 6, 190, -70, 186, 81, -67, -202, 121, 781, -94, 94, -727, -280, -80, 87, 97, 82, -66, 87, 461, -761, -37, -648, 43, -120, 60, 95, 83, -43, 48, -6, 25, -9, -73, -738, -80, 17, -17, -16, 2, -11, -61, 945, -59, -402, 72, 519, -90, -37, 859, -26, 92, 13, -59, -270, 713, -84, 65, 35, -54, 54, 81, -201, -236, 89, -33, 18, 82, -13, 321, -8, -192, -8, 75, 25, 56, 44, -5, 880, 404, 17, 4, -49, -51, 10, -10, 72, 50, -3, -139, -80, 974, 59, 698, 41, 90, -891, -53, -18, 85, -79, 13, -619, -546, 71, 806, 69, -20, -80, -86, 5, 81, -64, 64, 12, 88, -331, 17, -3, 33, 279, 21, -659, -7, -25, 75, 732, 75, 493, 9, -639, 114, -84, 82, 518, -135, -82, 90, 482, -724, 7, -31, -46, -12, 92, 33, -40, 189, 77, -746, 34, 412, -9, 954, -945, -3, -40, 43, 20, 80, -81, 6, 16, -432, -9, -6, -94, -88, -43, -69, 91, 930, 29, -625, -98, 73, -86, 20, 557, 9, -55, 40, 15, -42, 42, 63, 68, 57, 58, 26, -93, -60, 5, 6, -35, -68, -27, -87, 54, -81, 14, -130, -15, 650, 95, -22, -278, -79, -321, 64, 36, 96, -46, 5, -59, 62, 42, 82, 13, 305, -62, -38, 15, 85, 15, -172, -129, -4, 90, -62, -38, -83, -32, -85, 89, -89, 963, -13, 85, 65, -98, -43, 72, -759, 52, 3, -975, 59, -11, -79, -221, 90, 29, 81, -19, 658, 71, 28, -38, -45, 45, -197, 7, -10, 96, 889, -85, 717, 59, -76, 797, 3, -24, 24, -24, 305, 65, -46, -623, -77, 429, -29, 13, -131, -82, 14, -85, 266, -53, -82, 56, -7, 91, 533, 67, -45, -75, -92, 103, -5, 14, 19, 90, -409, 938, -38, 58, 72, 57, 73, 48, -55, 21, 34, -52, 860, -8, -908, -64, -84, -52, 11, 77, -9, 21, -97, 97, -38, 38, -981, -56, 85, -6, -42, -231, 29, -88, 89, 1, 376, 24, 27, -27, 86, 14, 64, 96, 1, 39, 31, -9, 65, -91, -95, -901, 644, 56, 9, 8, -17, 21, 9, 79, 91, -289, 62, 71, 21, 35, -719, 22, 597, -11, 86, 88, 73, 32, 32, -84, 82, 2, 3, 9, -12, -32, 22, -90, -53, 53, -17, -83, 42, 30, -72, 38, -936, -502, 621, -25, 65, 935, 904, 90, -90, -53, -47, -19, 39, -41, 557, -62, 26, 316, -23, -32, 39, 215, -15, -45, 23, 33, -47, -78, -16, 20, -944, 54, -19, 19, -25, -23, -52, 347, 53, 96, 603, -99, -20, 999, 87, -66, -2, 23, 76, 3, -4, 69, -565, 41, 745, -852, 66, -2, 503, 99, -990, 90, 310, -5, 94, -36, 6, -605, 61, -26, 607, -93, 2, 985, -915, 15, -699, -1, 83, -87, -296, 49, 51, 69, -363, -734, 28, 8, -35, -556, 12, -29, 635, -36, 1, 46, -98, 52, -27, -643, 70, 739, 24, -4, -959, 470, 30, -46, -54, -44, 79, -535, 67, 676, -43, 98, -90, -8, 44, -52, -92, -799, -91, -610, -2, 2, 52, 45, 123, -20, 66, 67, 67, 90, 946, 91, 39, 69, 65, -51, 61, 46, -56, 88, -88, -31, -5, -76, 212, -439, -61, 99, 1, -49, -39, -54, -53, 70, -664, 569, 61, -9, 68, 81, 19, 98, -62, -50, 51, -10, -43, 485, -51, 82, -246, -554, -85, 14, 53, 47, -1, 72, -66, 66, 95, 87, -82, -68, -9, 70, -375, 37, 45, 51, 649, 90, -23, -31, -636, 80, 20, -93, -207, -32, 32, -81, -22, 3, -88, -22, 79, 31, -108, 8, 340, -81, 141, 73, 27, 309, 91, -88, -112, 79, 83, 307, -469, 715, 85, 63, -25, 9, -76, -789, 56, -38, -270, -7, -23, -97, -60, -43, 31, -31, 72, 967, -39, 98, -23, 57, -74, 98, 97, 747, 12, 56, -68, 61, -61, -49, 530, 66, -49, -98, 36, 64, 31, 18, 851, -77, 77, 212, -24, -88, 11, 8, -839, -18, -78, -84, 22, -22, 56, -56, 47, -47, 72, -72, -84, -70, -46, 21, 18, -277, -60, -2, -23, 29, -28, -78, -19, 22, -70, 71, 996, 86, 14, 26, 74, 21, 79, -57, -13, -50, -44, 64, 15, -115, -32, -27, -139, -902, -62, -81, 56, 4, 77, 60, -81, -73, 94, -94, -37, 229, 69, -25, -53, -83, 574, 857, -31, -127, -573, 508, 92, -746, -654, -51, 12, 75, -36, 768, 310, 30, 85, -46, -847, -80, -62, 42, 311, 259, 793, -46, 81, 33, 747, 422, -75, 75, 6, -6, 41, -949, -92, -101, 68, -75, 28, 465, -54, 66, -97, -55, 50, 623, -88, -936, -94, -35, -570, 5, -61, 67, 62, -36, 56, -88, 43, 11, -81, -47, -20, -506, 16, -16, 727, -55, -34, -840, -72, -19, -7, 96, -96, -23, 23, 54, -94, -94, -28, -48, -5, -8, 11, -88, -20, 620, 18, -34, 16, 104, 96, 38, 54, 408, -7, -24, -20, 91, -72, 883, -51, 63, -174, -89, 8, -8, 446, 68, -81, -46, -401, -77, -9, -86, -26, -792, 77, 163, 821, -848, 91, -642, 60, 29, -83, 71, -506, -53, -76, 93, -142, -951, -6, -91, 15, 77, -95, 72, -776, -96, -62, -55, 850, -72, -64, 3, -2, 2, 93, 39, -68, 36, 8, -57, -33, 82, -477, 77, 437, 63, -94, 59, 2, -40, -34, -65, -25, 97, 73, 27, -1, -14, -84, 724, 75, -91, 91, 363, -63, 297, -29, -79, 511, 366, 34, 34, 27, 60, 49, -370, 274, 50, -124, -5, 5, -5, 5, 91, -46, -57, -88, -338, -30, -6, 66, 77, 31, -43, -57, 18, 79, 5, -34, -68, 550, 199, 51, 495, -95, 74, -51, -23, 31, -83, -99, 723, -49, -71, -28, -124, 76, -72, 96, -18, 580, -99, -33, 70, 65, -39, 74, -91, -470, 96, 65, -20, -80, -19, -81, -36, 29, -93, 90, 44, 29, 209, 28, 3, -1, -45, -107, -33, 96, 14, 8, 265, -43, -33, -24, 98, 2, 537, -411, 77, -93, 290, -332, 20, 12, -84, 884, -39, -706, 8, 16, -79, 23, -23, -728, -72, 5, -5, -97, 51, -34, -20, 57, -62, 305, -51, 5, -496, -14, 40, 654, -38, 71, -89, 18, 183, 17, -66, 4, 62, -75, 15, 60, 21, 79, 32, -73, -7, 52, -313, -8, -6, -853, -7, -17, 72, -72, -14, -50, 51, -91, 91, 18, -12, -93, -64, -36, -23, 36, -13, -26, -62, -5, 293, -943, -50, 17, 79, 95, -21, 86, -251, 8, -82, 362, 3, 60, -63, 48, 1, 11, -60, -52, -229, -83, 43, -79, -20, -5, -75, 927, -27, -82, 266, -14, 30, 63, -34, 171, -32, -68, 93, 7, -12, 177, -86, 21, -31, -69, -318, -85, -71, 70, 72, -34, -97, 80, -117, 9, 91, 99, -99, -64, 74, -51, -60, 79, -42, 818, -54, 614, -695, -19, -979, -35, -486, -51, 81, -28, -92, 19, -29, 13, -82, 12, 99, -95, 53, 293, -95, 38, -53, -302, 19, 10, -57, 47, 25, 74, 53, -65, 13, -41, -68, -67, -70, -25, -50, -90, -89, 763, 863, -48, -67, 82, -58, -98, -537, -95, 37, 45, 716, -26, -98, -279, -66, -59, -75, -24, 424, 30, 15, -45, -70, -77, -353, 25, 35, -56, 96, -49, -751, 21, 47, -43, -67, -58, 72, 31, -86, 54, 29, 868, -68, 25, 90, 42, 54, 89, -27, -73, 33, 412, 62, -87, -47, 22, -53, -66, 96, -73, 1, -99, 20, 784, 795, 13, -613, -708, -61, 69, 17, 83, -54, -546, 799, 801, -84, -31, -78, -22, 89, -43, 74, 59, -64, -911, 53, 11, 347, 11, 14, 68, 7, -31, -69, -501, -98, 99, -85, -388, 40, 8, 389, 5, 65, 871, -798, -61, 54, 26, -26, 47, -33, 95, -83, 804, 26, 948, -9, 5, 75, -12, -18, -45, -18, 9, 9, 266, 34, 55, 83, -94, 41, -185, -47, -74, -79, 91, -7, -84, -36, -964, 46, -546, -9, 9, 89, 40, -1, -53, -475, 70, -8, -62, 40, 60, 60, 91, 49, -53, 34, 19, -10, 56, -50, -34, 538, -92, -908, 12, -12, -90, 88, 3, 2, 56, -65, 6, -65, 317, -152, -7, 7, -60, 56, 25, -992, 47, -13, 48, -52, -656, 15, -753, 57, 701, 82, -45, 467, 19, 54, -24, 32, -37, -2, 31, 61, 91, -521, 58, -242, 89, 90, -46, 920, 77, -77, 5, 82, -87, -404, -16, -44, -48, 112, 416, -216, -7, -6, 522, 91, -25, -437, -38, -892, -74, -634, -31, 36, -63, 18, 40, -4, 504, 40, -40, 3, 777, -455, 75, 87, -4, -83, 58, -747, -69, 58, 19, 81, -10, -90, -66, -50, -2, -82, 7, -7, -366, 866, -37, 27, -90, 2, -202, 79, 906, -16, 31, -52, 64, -84, 36, 710, -40, -19, 22, -611, 57, -53, 64, 14, -8, 6, 76, 589, 33, 48, 748, -11, 96, -85, 12, -46, -94, 70, 55, 273, 67, 881, 87, -4, -1, -97, -90, 87, 4, 96, -62, 62, -78, 28, 1, -67, 216, -19, 19, 39, 75, -714, 97, 3, -99, -96, -8, -499, 47, -57, 41, -73, 33, 14, 1, -45, 63, -86, -47, 20, 91, 98, 102, 87, -22, 36, 86, 24, -211, -217, 44, 30, 42, -98, 199, -34, 34, 50, 90, 28, -32, 64, -57, 27, 105, 47, -22, -35, 301, -49, -17, -22, -778, -606, 6, -25, 708, 36, -79, 4, -31, -13, -92, 392, 22, 78, 63, 81, -2, 8, 49, -808, -37, 67, -507, 86, -20, -75, -260, 26, -79, -39, 47, -65, 806, 33, -57, -17, 31, 96, -15, 54, 56, 608, 997, 42, 31, 31, 69, -84, -516, -81, 11, -33, 3, 802, -642, 40, -74, -49, -91, -886, 89, 11, -18, -82, -26, -252, -40, -98, -79, -60, -845, -1, 1, -25, 24, 807, -55, 11, -66, -73, 72, 5, 513, -68, 485, 70, -81, -19, -86, -72, 46, -88, -59, -41, 373, -73, -49, -751, 430, 70, 74, 726, -5, -95, 67, -666, 699, -67, 70, -82, 19, 360, 77, -899, -68, 66, -376, -78, 78, 97, -97, -58, -73, 86, -55, -9, -91, 78, 5, -38, 15, 639, 1, 51, 66, -84, 59, 8, -334, -55, 72, -82, -93, 92, 330, -94, 64, -487, 87, 65, -566, -670, 24, 10, 42, 95, 38, 366, -4, 29, -29, 91, -94, 48, -660, -40, 86, 769, 904, -4, -76, 78, -45, -73, -14, -70, -58, -69, -873, -234, -38, -90, 46, -98, -93, 37, -18, 88, -44, -553, 97, -469, -57, -58, -42, 37, 370, -331, 299, -49, -85, 85, 180, 918, 302, -128, -72, -11, -26, -63, -25, 25, 5, -47, -14, 56, 69, 525, -994, 533, -633, -1, -53, -46, -10, 98, -53, 78, -13, 66, -66, 49, -49, -9, -66, 18, 857, 72, -72, 189, 11, -57, 29, 81, -51, -702, 1, 45, -62, -29, -9, 54, 64, -330, -749, -85, -8, -81, -309, -388, 82, -88, 92, -58, 98, 43, -49, -934, 894, -94, -47, -34, -819, -741, -859, 6, 92, -73, 75, 21, -965, -90, 34, 252, -588, -64, -738, -96, -66, 66, -28, -19, -65, -86, 32, 21, 457, 22, -356, 378, 635, 31, -67, 79, 96, 604, -65, 43, 47, -65, -60, 975, -75, -30, -70, -53, -73, 91, -50, -927, -51, -41, 49, -89, 41, 3, -680, 829, 335, -84, 21, 553, -774, 90, -90, -90, 11, 49, -781, -82, 93, 267, 82, 51, 22, 78, 97, 813, 990, 34, -34, 82, 77, 69, -63, -114, -85, 7, -73, 27, -11, 5, 79, 88, 12, 95, -815, -80, -952, -748, -375, -87, 62, -79, -21, -49, 49, 48, -48, 2, -2, -328, 6, 9, -98, 29, -18, 35, 66, -77, 76, 58, -58, 540, 12, 48, 687, 65, -937, -13, -2, -378, -98, 57, -985, -23, -9, -64, -90, -10, 28, 172, -97, 450, 3, 8, 6, 88, 92, 60, 66, 29, 82, 59, 44, 48, -99, 60, -369, 88, 22, -66, -63, 89, 40, -24, 58, 26, -234, 83, 688, -37, 87, -987, 55, -55, 35, 11, 78, -12, -95, 25, 58, 49, 77, 74, -266, 66, 99, 11, -777, 58, 54, -7, 62, 77, 59, -84, 48, 41, -41, 68, -67, -29, 74, 54, -83, -90, -92, -87, 52, -32, 934, 57, -70, 21, 46, 44, 52, -52, -147, 94, 69, -19, -47, -89, -95, -57, 16, 60, 92, 72, 16, 45, 80, -90, 245, -69, 124, 58, -11, 71, -78, -40, 94, -83, -11, -43, -39, -50, 30, -54, -7, 932, -769, 34, 266, -80, -276, -2, 758, 22, -622, -701, 50, 63, -12, 58, 543, 99, -6, 6, 808, -587, 102, -95, -55, -34, 570, -9, -16, 2, -20, -63, 30, 67, 7, -69, 64, 98, -3, 3, 13, 64, -241, -4, 68, -62, -6, 68, 49, -84, 35, -23, 23, -85, -15, 52, 548, -35, 48, -52, 571, -432, -59, -41, -11, 1, 10, -79, -60, 39, -49, -950, 14, 94, -51, 42, -678, -22, -60, 82, 78, -41, 885, 74, -61, -23, 39, -44, -43, 14, -9, -91, -69, -31, 45, -80, 77, -72, -76, 78, -72, 87, 113, -40, -761, -9, 91, 82, 78, 41, 424, 24, -39, 9, -15, 15, -84, -16, 290, 899, -37, 54, 79, -25, -63, -61, -36, 55, -65, -94, 51, 53, -20, -71, 91, -16, -84, -798, 16, -11, -7, -95, 533, 81, -33, -22, -64, -5, -605, 10, 67, -36, -31, -13, 92, -421, 91, -19, 501, 43, 72, 6, 48, 31, 69, -13, 48, 89, 76, -18, -33, 75, -24, 32, -32, 11, 821, -32, 81, 19, 304, 296, -2, -98, -50, -11, -51, 972, -32, 87, -15, -601, 646, 80, 75, 680, -80, 11, 89, 13, -85, 42, 97, 896, 27, 71, -62, 180, 61, 360, 552, 65, 171, 12, -68, 68, 30, -830, 90, 10, -81, -56, -163, -28, 45, 11, 32, -16, -44, -161, -6, -90, 57, 59, -59, -54, -897, -43, 72, 584, 38, -64, 39, 23, 902, 74, 40, -93, -821, 46, -46, -62, -52, -86, 56, 44, 71, 336, 93, 151, 64, -61, -554, 50, -37, 11, -624, 68, -68, -42, 8, -54, -992, 28, 638, -585, 11, -16, -30, -66, -27, 27, 92, -93, 43, 458, 12, 88, -85, -26, -2, -87, 138, 62, 682, -82, 8, -47, 15, -58, 7, 67, 27, 33, 48, -194, -485, 293, -44, 30, 4, -4, 53, 38, 10, 96, -14, -83, -10, -31, 23, -10, 38, 2, 88, 52, 21, 27, 270, 42, -92, 73, 823, -590, 47, -79, 7, -79, -26, 626, -790, -73, -67, -50, -442, -38, 15, -51, 74, 51, -46, -97, -8, -40, 340, -61, 61, -35, -65, -511, 40, 58, 62, -19, 70, -798, -27, 748, 68, 864, 45, -367, 67, -25, 62, 63, -13, -75, -352, -62, 85, -83, 81, 39, -41, -79, -2, 2, -265, -83, -52, -84, -16, -36, 435, 27, -70, -50, 37, -14, 71, -6, -94, 302, -333, 31, -46, 46, -34, 134, -89, 95, 94, 2, -2, 8, 92, 365, 35, -225, -75, -12, -47, 559, 65, 51, -16, 76, 24, -47, 97, 50, -28, -889, -2, -19, -62, -63, -456, -81, -89, 486, 31, 724, 48, -74, 31, 69, -26, 301, 31, 652, 42, -261, 35, 50, 79, 171, -7, 7, -386, 86, 26, 395, -48, -55, -18, 555, 23, 59, -37, -25, -64, -51, 3, 837, -29, 229, 91, -406, 70, 99, -978, -76, -19, 89, 78, 47, 22, -17, 47, 53, 13, 53, 87, 4, -257, 586, -63, -463, -60, 5, 95, 66, 34, -195, 47, 6, 2, -39, -21, 56, 44, -83, -61, -770, 547, 5, -53, -66, 881, 85, 615, 19, -13, -179, -47, 320, -53, -41, 94, -95, 78, -819, 36, -36, 969, -9, -44, -89, -36, -7, -25, 8, 69, -41, -94, 769, 866, 907, 39, 3, -17, -86, 50, -50, -51, -718, 23, 50, 50, 230, 70, -94, -60, -914, 68, -36, 56, -20, 37, -37, 382, -11, 895, -66, -51, 87, -39, -9, -88, 27, -52, -24, 672, 5, -96, 74, -89, 993, -12, 28, 39, -465, 12, 31, 22, -65, -32, -865, -89, -77, -37, 9, -9, -37, -378, -85, -14, -86, -45, 45, 40, -40, -40, 507, -88, -59, -85, 65, -99, 929, -30, -75, 647, -72, 301, 40, -24, -81, 54, 10, -93, -2, 23, 92, 657, -73, 16, -79, -341, -941, 45, -4, -14, -19, 75, -42, 69, -69, -35, 20, -593, -93, -607, 8, 4, 167, 29, 52, -52, 574, -34, 53, 7, 808, 98, -499, 45, 8, -52, 16, -52, -73, 812, -11, 18, 63, -72, -9, 3, -3, 92, 17, -809, 44, 56, -318, -61, -68, -93, -9, 12, 46, 83, 51, 510, 47, 7, -307, 62, 86, -48, -71, -222, -6, -8, -82, -33, 22, -37, 47, -6, 14, 86, 96, 147, -47, -15, 66, -98, 77, 61, 98, -789, 82, -978, -804, 79, -79, 97, 903, -43, 717, 26, 32, -82, -708, -42, -380, 80, 57, 42, 61, -60, -96, -4, 34, -14, -14, -3, -203, 61, -45, -16, 299, 29, -28, 8, -11, -354, -74, -22, -75, 28, -10, -90, 99, -12, 13, -179, 48, -73, -46, -83, 43, -10, 73, 27, 52, -83, -69, -83, -80, -98, -495, -7, -37, 446, -14, 68, -65, 65, -30, 111, 67, -95, 94, 91, -84, 92, -44, -491, -11, -5, 96, 9, 352, -34, 12, 13, -98, -31, 86, -3, 3, 83, -54, 71, 743, -43, 44, -69, 25, -90, 440, -96, -524, 70, -33, 933, -819, 4, -18, 57, 76, -254, -8, -38, -49, -53, -33, -76, -22, -867, -37, -68, 5, -392, -39, -97, -72, -52, -848, -14, -83, -91, 88, -24, 24, 285, 50, -49, 14, 28, 85, 605, 47, -93, 43, -15, 56, 44, 33, 83, 12, -92, -956, 81, -61, -244, 31, 31, 27, 10, -55, -59, -8, 44, -77, 834, 66, 50, -50, 7, 33, -40, -43, -37, 63, 8, -204, 613, 21, 879, 32, 856, 12, 45, -18, -98, 24, -53, -82, -49, 88, -57, 2, 36, -80, 24, -82, 68, -773, 5, -26, -815, -638, 968, -24, 835, -93, -95, 88, 27, -23, 76, 596, 24, 61, -62, 1, -2, -98, -613, 2, -66, 37, -60, -35, -79, -47, -242, 93, 64, 94, -67, 19, -28, 63, -35, -83, -432, -85, 64, 36, -871, -29, 542, -42, -975, -88, 5, -45, -3, 72, -19, -25, 78, -95, -54, 65, 57, 27, -56, -44, 42, 29, 29, 37, -89, 63, 5, -72, 41, 15, -12, 45, 27, 43, 97, -16, 17, -68, 67, 21, 12, -2, 50, 92, 4, 56, 33, 68, 2, -36, -41, -99, -19, 34, -9, -86, 20, 81, 32, 21, -41, -19, -18, 3, -12, -13, 42, 31, 17, -32, -2, -39, 41, -25, -44, -29, -29, 43, 45, 34, -26, 50, -32, -38, 22, 19, -45, 41, 9, 33, -27, 16, -9, -10, -8, -7, -40, 15, -23, -46, -42, 33, -18, -45, -2, -8, 14, -15, -26, 15, -39 };
|
|
|
|
| 1 |
#include <stdint.h>
|
| 2 |
+
// #include <stdio.h>
|
| 3 |
|
| 4 |
#define LENGTH 4484
|
| 5 |
int16_t input[LENGTH] = { 17, 28, 8, -25, 33, -48, 2, 42, 39, -10, 29, -26, 24, 44, -37, -1, -4, 2, -43, -6, -44, 29, 47, -48, 13, -18, 18, 30, -44, 35, 18, 2, -38, 50, -28, 18, 21, 32, -8, 18, -33, 24, 46, -6, -9, 39, 7, 48, 41, -26, -52, 1, -1, -40, -60, 18, -18, -87, 73, -86, -45, 69, -24, -31, -69, -12, -79, 84, 83, 24, 70, -75, -81, -38, 24, 26, -26, -48, -52, -10, -90, 4, 54, -88, 31, -3, 91, -67, 65, -61, -32, 63, 83, -50, -90, 75, -26, -23, -26, -61, -89, -65, 250, 60, 652, -47, 88, 50, -61, -113, 36, 823, 26, -849, -46, 27, 58, 41, 68, -48, -42, 15, -22, 49, 78, 322, 28, -28, -95, -33, 56, -28, 37, 63, 13, -8, -57, 52, -64, -36, -8, -28, -313, 49, -87, -13, 24, 911, -35, -117, 60, -65, 34, -3, 52, 54, 85, -371, -67, -8, 668, -22, 96, 51, 8, -55, 69, 31, 83, -49, -734, 165, 35, 85, -45, 60, 332, 32, 36, -31, -22, 233, -702, 80, -23, 865, -6, -94, 57, 18, 225, 955, 34, -47, 55, -97, -9, 4, 63, 43, -1, 18, 7, 75, -224, -76, 10, 79, -898, -91, -47, -3, -74, 19, 50, -45, 46, 54, 36, 28, 8, -27, 55, 41, -41, 540, 60, 58, 76, -3, -831, -45, -78, -77, -2, -50, 24, -572, 3, -94, -509, -53, -35, 559, 21, -292, 10, 16, -98, 812, -40, 10, 74, 16, 255, 92, 670, -73, 56, -59, -41, -938, -62, -84, -5, 89, -23, 423, 62, -162, -57, -698, -80, 47, -413, -899, -69, 92, 322, -145, 59, 41, 39, -39, 9, -34, -28, -58, 559, -59, -89, -19, -13, 94, 34, 77, -2, -91, -86, -94, -67, -63, 430, -5, 5, 70, 30, -67, 67, -30, -39, -131, -21, 19, 98, -96, 36, 610, 54, -72, -90, -49, 11, -77, -93, -30, -5, 79, 67, 59, -29, 63, 66, -54, -546, -101, -28, 4, -6, 96, -1, 323, 435, -22, -74, -80, 54, 658, 88, -46, 21, -23, -89, -84, 72, 3, 60, 40, 48, -49, 1, -5, -195, 46, -20, 686, 88, -80, 50, 81, -31, -67, 15, -398, -269, -1, -722, -978, 53, -153, 39, 61, 7, 517, -24, -19, 19, 45, 135, 70, 950, 67, -267, -672, 41, 896, -65, -33, 35, 883, -72, -27, -86, -81, 81, -87, 13, 88, -48, 52, -47, -52, 117, -653, -36, -88, 12, -71, 25, 64, 751, -7, -33, 598, -98, 54, 30, 766, 15, -60, 695, -1, -56, 39, 16, -98, 101, 99, -277, -564, 41, -21, -79, -23, 777, 246, 37, 563, 40, 784, -80, 56, -69, -31, 3, 23, -331, -95, -563, 63, -5, -84, -48, 16, 84, -63, 78, -17, -61, -30, 3, 301, 26, 128, -988, -13, -14, 87, 15, 85, -61, 48, -587, 65, 72, 63, -754, 733, -79, 584, -81, 597, -94, -40, -66, -94, 94, 15, -15, 24, 67, 807, 82, 86, -66, 20, -41, 95, 26, 70, 430, -3, 3, -47, 31, -890, 513, -7, 61, 39, -75, 886, -97, 86, 60, 140, -87, 49, 46, 23, -4, 10, -276, -61, 24, 76, -59, -42, -530, -8, 56, -696, -83, -38, -290, 57, -39, 99, 71, 55, -381, 28, -75, -26, 22, 77, -4, -94, 68, -68, -246, 11, -65, -54, -46, -58, 56, -98, 94, -94, -429, 29, 867, 133, 41, 17, -58, -9, 920, -12, 1, -28, -72, 769, 31, 18, 82, 33, 518, -375, -78, -98, 92, -16, -44, 31, -51, 65, 40, -17, 52, -879, 3, 14, 382, 28, 38, 23, 539, 869, -46, -23, -87, -3, 790, 878, 563, -41, -67, 50, 20, 55, 42, -47, -44, -78, -675, 44, -578, -22, -821, 21, 28, 18, -682, 42, 52, 8, -66, -986, -80, -67, 6, -38, -80, -38, -85, -32, -17, 95, -3, 25, -19, 19, -56, 178, -22, 55, -355, -966, 810, -8, -388, -56, 485, 51, -28, -50, -79, -64, -32, -52, -323, 61, -322, -579, -37, 477, 508, 46, 972, -607, -919, -85, -521, 25, 49, 32, 23, 477, 71, 92, -54, -468, 59, -5, 294, -274, 20, 65, 287, 13, -856, -71, -344, 71, 77, -56, 90, 333, 56, -79, 4, 286, 89, -78, 20, 58, -313, 822, -5, 5, 92, 82, 17, 41, -38, 50, -71, -882, -75, 75, 298, -43, 45, 5, 21, 74, -55, 58, -36, 633, 57, 43, 15, -8, 93, 376, -781, 50, 55, -68, 56, -17, -71, 52, 435, 73, 69, -70, 97, 850, 44, -50, -8, 62, 18, -272, 15, 85, -14, 214, 46, -46, -51, 751, 37, 363, -18, -82, 288, -68, -94, -3, 2, 82, -21, 32, 82, -37, 37, -33, 81, 52, 51, 74, 75, -51, -44, 52, 43, 547, 753, 185, 78, 83, 54, -22, 25, -71, -32, -47, 60, 46, 80, -81, -35, 894, 14, 69, -54, 74, -24, -6, 5, -565, -30, -93, -7, 28, -85, -39, -63, 59, -30, -345, -674, 75, -354, -908, 622, 10, 4, -48, 55, -2, 99, -3, -1, -31, -54, 60, 3, 84, 40, 228, 92, -95, -177, -50, -71, 60, -38, 27, 75, 47, -126, 12, 287, 71, 95, -39, -9, 441, -92, -158, 36, 5, 49, 51, 877, -503, 241, -38, 74, 975, 49, -17, 19, -53, 53, 26, -41, -85, 22, 260, -7, -19, -70, -48, 270, 9, 71, -88, -87, 87, 2, 14, 84, -67, -33, -38, 75, -37, 13, -13, 43, -1, 51, 7, 63, -29, 15, -563, 58, -19, 50, -275, -10, 71, 42, -83, -20, -62, 88, -26, -99, -1, 93, -95, -36, -62, 29, -61, 43, 89, -10, 65, 781, 64, 84, 16, 76, 19, 98, -730, -63, 921, 83, -4, -16, -84, 77, -57, 91, 46, 89, -546, 17, 55, 51, -31, -92, -63, 47, 16, 20, 23, -43, 18, 20, -35, 97, 662, 28, 26, -16, -18, 88, 4, 29, -3, -53, 132, 21, -36, -59, 95, 15, -70, -80, 35, 66, -66, 63, 27, -358, 68, -23, 423, 62, -25, 63, -212, 12, 50, -27, 16, 23, 36, -98, -13, 85, 52, -302, 78, 398, -198, 96, -50, -46, 82, -129, -80, -13, 5, -73, -89, -58, -335, 25, 88, -164, -15, 61, 95, 69, 1, 30, 272, -221, -79, 165, 28, 43, 6, -96, 82, 82, -582, 18, 82, -637, -70, -93, -471, -633, -41, 97, -252, 59, 63, -38, 16, -41, 61, 80, 337, 94, 69, -58, 36, 15, 83, 924, 62, -48, -14, -40, -43, 46, 67, -33, -20, 23, 28, -737, 9, 77, -77, 53, 34, -87, -70, 70, 67, -49, 979, -87, -94, 45, -701, -18, 58, 59, -40, 81, 76, 243, 77, 540, -5, 869, 12, 901, 87, 40, -640, 3, -522, -134, -47, 54, -54, 884, -19, -265, 14, 143, 43, -629, 19, 86, 78, -47, -7, -59, 55, 11, -402, -29, 265, -90, -62, 11, 99, 101, -852, -48, 92, 81, -73, -41, 1, 55, -64, -20, -31, -169, -192, 65, 96, 532, 90, 15, 33, 236, 16, 94, 63, 2, 19, 949, 51, 20, 6, -71, 45, 840, -2, 92, 670, -26, 426, 18, -55, 63, -802, 89, 91, -65, 60, 1, -95, -97, -8, 15, -19, 58, 78, -32, -89, 27, -48, 68, -91, -673, 207, -2, -999, -2, -998, -66, 66, 22, 30, -35, 83, -93, -150, 5, -39, -23, -88, -28, 87, -471, 68, -468, -83, -17, -85, -39, 71, -947, 83, -33, 36, 89, 25, 897, -57, -40, 67, 733, -19, -756, 81, 849, 53, -89, -50, 35, -226, 618, -68, -82, -946, -742, -4, -58, -98, 13, 70, -81, 85, 15, -10, -41, 43, 968, 194, 46, 578, 22, -58, -763, 99, 53, -10, -21, 14, 386, 26, -25, -1, -270, -89, -20, 79, 66, -85, 236, -1, 84, -45, 68, -23, 54, -54, -9, 63, -54, 574, 6, 190, -70, 186, 81, -67, -202, 121, 781, -94, 94, -727, -280, -80, 87, 97, 82, -66, 87, 461, -761, -37, -648, 43, -120, 60, 95, 83, -43, 48, -6, 25, -9, -73, -738, -80, 17, -17, -16, 2, -11, -61, 945, -59, -402, 72, 519, -90, -37, 859, -26, 92, 13, -59, -270, 713, -84, 65, 35, -54, 54, 81, -201, -236, 89, -33, 18, 82, -13, 321, -8, -192, -8, 75, 25, 56, 44, -5, 880, 404, 17, 4, -49, -51, 10, -10, 72, 50, -3, -139, -80, 974, 59, 698, 41, 90, -891, -53, -18, 85, -79, 13, -619, -546, 71, 806, 69, -20, -80, -86, 5, 81, -64, 64, 12, 88, -331, 17, -3, 33, 279, 21, -659, -7, -25, 75, 732, 75, 493, 9, -639, 114, -84, 82, 518, -135, -82, 90, 482, -724, 7, -31, -46, -12, 92, 33, -40, 189, 77, -746, 34, 412, -9, 954, -945, -3, -40, 43, 20, 80, -81, 6, 16, -432, -9, -6, -94, -88, -43, -69, 91, 930, 29, -625, -98, 73, -86, 20, 557, 9, -55, 40, 15, -42, 42, 63, 68, 57, 58, 26, -93, -60, 5, 6, -35, -68, -27, -87, 54, -81, 14, -130, -15, 650, 95, -22, -278, -79, -321, 64, 36, 96, -46, 5, -59, 62, 42, 82, 13, 305, -62, -38, 15, 85, 15, -172, -129, -4, 90, -62, -38, -83, -32, -85, 89, -89, 963, -13, 85, 65, -98, -43, 72, -759, 52, 3, -975, 59, -11, -79, -221, 90, 29, 81, -19, 658, 71, 28, -38, -45, 45, -197, 7, -10, 96, 889, -85, 717, 59, -76, 797, 3, -24, 24, -24, 305, 65, -46, -623, -77, 429, -29, 13, -131, -82, 14, -85, 266, -53, -82, 56, -7, 91, 533, 67, -45, -75, -92, 103, -5, 14, 19, 90, -409, 938, -38, 58, 72, 57, 73, 48, -55, 21, 34, -52, 860, -8, -908, -64, -84, -52, 11, 77, -9, 21, -97, 97, -38, 38, -981, -56, 85, -6, -42, -231, 29, -88, 89, 1, 376, 24, 27, -27, 86, 14, 64, 96, 1, 39, 31, -9, 65, -91, -95, -901, 644, 56, 9, 8, -17, 21, 9, 79, 91, -289, 62, 71, 21, 35, -719, 22, 597, -11, 86, 88, 73, 32, 32, -84, 82, 2, 3, 9, -12, -32, 22, -90, -53, 53, -17, -83, 42, 30, -72, 38, -936, -502, 621, -25, 65, 935, 904, 90, -90, -53, -47, -19, 39, -41, 557, -62, 26, 316, -23, -32, 39, 215, -15, -45, 23, 33, -47, -78, -16, 20, -944, 54, -19, 19, -25, -23, -52, 347, 53, 96, 603, -99, -20, 999, 87, -66, -2, 23, 76, 3, -4, 69, -565, 41, 745, -852, 66, -2, 503, 99, -990, 90, 310, -5, 94, -36, 6, -605, 61, -26, 607, -93, 2, 985, -915, 15, -699, -1, 83, -87, -296, 49, 51, 69, -363, -734, 28, 8, -35, -556, 12, -29, 635, -36, 1, 46, -98, 52, -27, -643, 70, 739, 24, -4, -959, 470, 30, -46, -54, -44, 79, -535, 67, 676, -43, 98, -90, -8, 44, -52, -92, -799, -91, -610, -2, 2, 52, 45, 123, -20, 66, 67, 67, 90, 946, 91, 39, 69, 65, -51, 61, 46, -56, 88, -88, -31, -5, -76, 212, -439, -61, 99, 1, -49, -39, -54, -53, 70, -664, 569, 61, -9, 68, 81, 19, 98, -62, -50, 51, -10, -43, 485, -51, 82, -246, -554, -85, 14, 53, 47, -1, 72, -66, 66, 95, 87, -82, -68, -9, 70, -375, 37, 45, 51, 649, 90, -23, -31, -636, 80, 20, -93, -207, -32, 32, -81, -22, 3, -88, -22, 79, 31, -108, 8, 340, -81, 141, 73, 27, 309, 91, -88, -112, 79, 83, 307, -469, 715, 85, 63, -25, 9, -76, -789, 56, -38, -270, -7, -23, -97, -60, -43, 31, -31, 72, 967, -39, 98, -23, 57, -74, 98, 97, 747, 12, 56, -68, 61, -61, -49, 530, 66, -49, -98, 36, 64, 31, 18, 851, -77, 77, 212, -24, -88, 11, 8, -839, -18, -78, -84, 22, -22, 56, -56, 47, -47, 72, -72, -84, -70, -46, 21, 18, -277, -60, -2, -23, 29, -28, -78, -19, 22, -70, 71, 996, 86, 14, 26, 74, 21, 79, -57, -13, -50, -44, 64, 15, -115, -32, -27, -139, -902, -62, -81, 56, 4, 77, 60, -81, -73, 94, -94, -37, 229, 69, -25, -53, -83, 574, 857, -31, -127, -573, 508, 92, -746, -654, -51, 12, 75, -36, 768, 310, 30, 85, -46, -847, -80, -62, 42, 311, 259, 793, -46, 81, 33, 747, 422, -75, 75, 6, -6, 41, -949, -92, -101, 68, -75, 28, 465, -54, 66, -97, -55, 50, 623, -88, -936, -94, -35, -570, 5, -61, 67, 62, -36, 56, -88, 43, 11, -81, -47, -20, -506, 16, -16, 727, -55, -34, -840, -72, -19, -7, 96, -96, -23, 23, 54, -94, -94, -28, -48, -5, -8, 11, -88, -20, 620, 18, -34, 16, 104, 96, 38, 54, 408, -7, -24, -20, 91, -72, 883, -51, 63, -174, -89, 8, -8, 446, 68, -81, -46, -401, -77, -9, -86, -26, -792, 77, 163, 821, -848, 91, -642, 60, 29, -83, 71, -506, -53, -76, 93, -142, -951, -6, -91, 15, 77, -95, 72, -776, -96, -62, -55, 850, -72, -64, 3, -2, 2, 93, 39, -68, 36, 8, -57, -33, 82, -477, 77, 437, 63, -94, 59, 2, -40, -34, -65, -25, 97, 73, 27, -1, -14, -84, 724, 75, -91, 91, 363, -63, 297, -29, -79, 511, 366, 34, 34, 27, 60, 49, -370, 274, 50, -124, -5, 5, -5, 5, 91, -46, -57, -88, -338, -30, -6, 66, 77, 31, -43, -57, 18, 79, 5, -34, -68, 550, 199, 51, 495, -95, 74, -51, -23, 31, -83, -99, 723, -49, -71, -28, -124, 76, -72, 96, -18, 580, -99, -33, 70, 65, -39, 74, -91, -470, 96, 65, -20, -80, -19, -81, -36, 29, -93, 90, 44, 29, 209, 28, 3, -1, -45, -107, -33, 96, 14, 8, 265, -43, -33, -24, 98, 2, 537, -411, 77, -93, 290, -332, 20, 12, -84, 884, -39, -706, 8, 16, -79, 23, -23, -728, -72, 5, -5, -97, 51, -34, -20, 57, -62, 305, -51, 5, -496, -14, 40, 654, -38, 71, -89, 18, 183, 17, -66, 4, 62, -75, 15, 60, 21, 79, 32, -73, -7, 52, -313, -8, -6, -853, -7, -17, 72, -72, -14, -50, 51, -91, 91, 18, -12, -93, -64, -36, -23, 36, -13, -26, -62, -5, 293, -943, -50, 17, 79, 95, -21, 86, -251, 8, -82, 362, 3, 60, -63, 48, 1, 11, -60, -52, -229, -83, 43, -79, -20, -5, -75, 927, -27, -82, 266, -14, 30, 63, -34, 171, -32, -68, 93, 7, -12, 177, -86, 21, -31, -69, -318, -85, -71, 70, 72, -34, -97, 80, -117, 9, 91, 99, -99, -64, 74, -51, -60, 79, -42, 818, -54, 614, -695, -19, -979, -35, -486, -51, 81, -28, -92, 19, -29, 13, -82, 12, 99, -95, 53, 293, -95, 38, -53, -302, 19, 10, -57, 47, 25, 74, 53, -65, 13, -41, -68, -67, -70, -25, -50, -90, -89, 763, 863, -48, -67, 82, -58, -98, -537, -95, 37, 45, 716, -26, -98, -279, -66, -59, -75, -24, 424, 30, 15, -45, -70, -77, -353, 25, 35, -56, 96, -49, -751, 21, 47, -43, -67, -58, 72, 31, -86, 54, 29, 868, -68, 25, 90, 42, 54, 89, -27, -73, 33, 412, 62, -87, -47, 22, -53, -66, 96, -73, 1, -99, 20, 784, 795, 13, -613, -708, -61, 69, 17, 83, -54, -546, 799, 801, -84, -31, -78, -22, 89, -43, 74, 59, -64, -911, 53, 11, 347, 11, 14, 68, 7, -31, -69, -501, -98, 99, -85, -388, 40, 8, 389, 5, 65, 871, -798, -61, 54, 26, -26, 47, -33, 95, -83, 804, 26, 948, -9, 5, 75, -12, -18, -45, -18, 9, 9, 266, 34, 55, 83, -94, 41, -185, -47, -74, -79, 91, -7, -84, -36, -964, 46, -546, -9, 9, 89, 40, -1, -53, -475, 70, -8, -62, 40, 60, 60, 91, 49, -53, 34, 19, -10, 56, -50, -34, 538, -92, -908, 12, -12, -90, 88, 3, 2, 56, -65, 6, -65, 317, -152, -7, 7, -60, 56, 25, -992, 47, -13, 48, -52, -656, 15, -753, 57, 701, 82, -45, 467, 19, 54, -24, 32, -37, -2, 31, 61, 91, -521, 58, -242, 89, 90, -46, 920, 77, -77, 5, 82, -87, -404, -16, -44, -48, 112, 416, -216, -7, -6, 522, 91, -25, -437, -38, -892, -74, -634, -31, 36, -63, 18, 40, -4, 504, 40, -40, 3, 777, -455, 75, 87, -4, -83, 58, -747, -69, 58, 19, 81, -10, -90, -66, -50, -2, -82, 7, -7, -366, 866, -37, 27, -90, 2, -202, 79, 906, -16, 31, -52, 64, -84, 36, 710, -40, -19, 22, -611, 57, -53, 64, 14, -8, 6, 76, 589, 33, 48, 748, -11, 96, -85, 12, -46, -94, 70, 55, 273, 67, 881, 87, -4, -1, -97, -90, 87, 4, 96, -62, 62, -78, 28, 1, -67, 216, -19, 19, 39, 75, -714, 97, 3, -99, -96, -8, -499, 47, -57, 41, -73, 33, 14, 1, -45, 63, -86, -47, 20, 91, 98, 102, 87, -22, 36, 86, 24, -211, -217, 44, 30, 42, -98, 199, -34, 34, 50, 90, 28, -32, 64, -57, 27, 105, 47, -22, -35, 301, -49, -17, -22, -778, -606, 6, -25, 708, 36, -79, 4, -31, -13, -92, 392, 22, 78, 63, 81, -2, 8, 49, -808, -37, 67, -507, 86, -20, -75, -260, 26, -79, -39, 47, -65, 806, 33, -57, -17, 31, 96, -15, 54, 56, 608, 997, 42, 31, 31, 69, -84, -516, -81, 11, -33, 3, 802, -642, 40, -74, -49, -91, -886, 89, 11, -18, -82, -26, -252, -40, -98, -79, -60, -845, -1, 1, -25, 24, 807, -55, 11, -66, -73, 72, 5, 513, -68, 485, 70, -81, -19, -86, -72, 46, -88, -59, -41, 373, -73, -49, -751, 430, 70, 74, 726, -5, -95, 67, -666, 699, -67, 70, -82, 19, 360, 77, -899, -68, 66, -376, -78, 78, 97, -97, -58, -73, 86, -55, -9, -91, 78, 5, -38, 15, 639, 1, 51, 66, -84, 59, 8, -334, -55, 72, -82, -93, 92, 330, -94, 64, -487, 87, 65, -566, -670, 24, 10, 42, 95, 38, 366, -4, 29, -29, 91, -94, 48, -660, -40, 86, 769, 904, -4, -76, 78, -45, -73, -14, -70, -58, -69, -873, -234, -38, -90, 46, -98, -93, 37, -18, 88, -44, -553, 97, -469, -57, -58, -42, 37, 370, -331, 299, -49, -85, 85, 180, 918, 302, -128, -72, -11, -26, -63, -25, 25, 5, -47, -14, 56, 69, 525, -994, 533, -633, -1, -53, -46, -10, 98, -53, 78, -13, 66, -66, 49, -49, -9, -66, 18, 857, 72, -72, 189, 11, -57, 29, 81, -51, -702, 1, 45, -62, -29, -9, 54, 64, -330, -749, -85, -8, -81, -309, -388, 82, -88, 92, -58, 98, 43, -49, -934, 894, -94, -47, -34, -819, -741, -859, 6, 92, -73, 75, 21, -965, -90, 34, 252, -588, -64, -738, -96, -66, 66, -28, -19, -65, -86, 32, 21, 457, 22, -356, 378, 635, 31, -67, 79, 96, 604, -65, 43, 47, -65, -60, 975, -75, -30, -70, -53, -73, 91, -50, -927, -51, -41, 49, -89, 41, 3, -680, 829, 335, -84, 21, 553, -774, 90, -90, -90, 11, 49, -781, -82, 93, 267, 82, 51, 22, 78, 97, 813, 990, 34, -34, 82, 77, 69, -63, -114, -85, 7, -73, 27, -11, 5, 79, 88, 12, 95, -815, -80, -952, -748, -375, -87, 62, -79, -21, -49, 49, 48, -48, 2, -2, -328, 6, 9, -98, 29, -18, 35, 66, -77, 76, 58, -58, 540, 12, 48, 687, 65, -937, -13, -2, -378, -98, 57, -985, -23, -9, -64, -90, -10, 28, 172, -97, 450, 3, 8, 6, 88, 92, 60, 66, 29, 82, 59, 44, 48, -99, 60, -369, 88, 22, -66, -63, 89, 40, -24, 58, 26, -234, 83, 688, -37, 87, -987, 55, -55, 35, 11, 78, -12, -95, 25, 58, 49, 77, 74, -266, 66, 99, 11, -777, 58, 54, -7, 62, 77, 59, -84, 48, 41, -41, 68, -67, -29, 74, 54, -83, -90, -92, -87, 52, -32, 934, 57, -70, 21, 46, 44, 52, -52, -147, 94, 69, -19, -47, -89, -95, -57, 16, 60, 92, 72, 16, 45, 80, -90, 245, -69, 124, 58, -11, 71, -78, -40, 94, -83, -11, -43, -39, -50, 30, -54, -7, 932, -769, 34, 266, -80, -276, -2, 758, 22, -622, -701, 50, 63, -12, 58, 543, 99, -6, 6, 808, -587, 102, -95, -55, -34, 570, -9, -16, 2, -20, -63, 30, 67, 7, -69, 64, 98, -3, 3, 13, 64, -241, -4, 68, -62, -6, 68, 49, -84, 35, -23, 23, -85, -15, 52, 548, -35, 48, -52, 571, -432, -59, -41, -11, 1, 10, -79, -60, 39, -49, -950, 14, 94, -51, 42, -678, -22, -60, 82, 78, -41, 885, 74, -61, -23, 39, -44, -43, 14, -9, -91, -69, -31, 45, -80, 77, -72, -76, 78, -72, 87, 113, -40, -761, -9, 91, 82, 78, 41, 424, 24, -39, 9, -15, 15, -84, -16, 290, 899, -37, 54, 79, -25, -63, -61, -36, 55, -65, -94, 51, 53, -20, -71, 91, -16, -84, -798, 16, -11, -7, -95, 533, 81, -33, -22, -64, -5, -605, 10, 67, -36, -31, -13, 92, -421, 91, -19, 501, 43, 72, 6, 48, 31, 69, -13, 48, 89, 76, -18, -33, 75, -24, 32, -32, 11, 821, -32, 81, 19, 304, 296, -2, -98, -50, -11, -51, 972, -32, 87, -15, -601, 646, 80, 75, 680, -80, 11, 89, 13, -85, 42, 97, 896, 27, 71, -62, 180, 61, 360, 552, 65, 171, 12, -68, 68, 30, -830, 90, 10, -81, -56, -163, -28, 45, 11, 32, -16, -44, -161, -6, -90, 57, 59, -59, -54, -897, -43, 72, 584, 38, -64, 39, 23, 902, 74, 40, -93, -821, 46, -46, -62, -52, -86, 56, 44, 71, 336, 93, 151, 64, -61, -554, 50, -37, 11, -624, 68, -68, -42, 8, -54, -992, 28, 638, -585, 11, -16, -30, -66, -27, 27, 92, -93, 43, 458, 12, 88, -85, -26, -2, -87, 138, 62, 682, -82, 8, -47, 15, -58, 7, 67, 27, 33, 48, -194, -485, 293, -44, 30, 4, -4, 53, 38, 10, 96, -14, -83, -10, -31, 23, -10, 38, 2, 88, 52, 21, 27, 270, 42, -92, 73, 823, -590, 47, -79, 7, -79, -26, 626, -790, -73, -67, -50, -442, -38, 15, -51, 74, 51, -46, -97, -8, -40, 340, -61, 61, -35, -65, -511, 40, 58, 62, -19, 70, -798, -27, 748, 68, 864, 45, -367, 67, -25, 62, 63, -13, -75, -352, -62, 85, -83, 81, 39, -41, -79, -2, 2, -265, -83, -52, -84, -16, -36, 435, 27, -70, -50, 37, -14, 71, -6, -94, 302, -333, 31, -46, 46, -34, 134, -89, 95, 94, 2, -2, 8, 92, 365, 35, -225, -75, -12, -47, 559, 65, 51, -16, 76, 24, -47, 97, 50, -28, -889, -2, -19, -62, -63, -456, -81, -89, 486, 31, 724, 48, -74, 31, 69, -26, 301, 31, 652, 42, -261, 35, 50, 79, 171, -7, 7, -386, 86, 26, 395, -48, -55, -18, 555, 23, 59, -37, -25, -64, -51, 3, 837, -29, 229, 91, -406, 70, 99, -978, -76, -19, 89, 78, 47, 22, -17, 47, 53, 13, 53, 87, 4, -257, 586, -63, -463, -60, 5, 95, 66, 34, -195, 47, 6, 2, -39, -21, 56, 44, -83, -61, -770, 547, 5, -53, -66, 881, 85, 615, 19, -13, -179, -47, 320, -53, -41, 94, -95, 78, -819, 36, -36, 969, -9, -44, -89, -36, -7, -25, 8, 69, -41, -94, 769, 866, 907, 39, 3, -17, -86, 50, -50, -51, -718, 23, 50, 50, 230, 70, -94, -60, -914, 68, -36, 56, -20, 37, -37, 382, -11, 895, -66, -51, 87, -39, -9, -88, 27, -52, -24, 672, 5, -96, 74, -89, 993, -12, 28, 39, -465, 12, 31, 22, -65, -32, -865, -89, -77, -37, 9, -9, -37, -378, -85, -14, -86, -45, 45, 40, -40, -40, 507, -88, -59, -85, 65, -99, 929, -30, -75, 647, -72, 301, 40, -24, -81, 54, 10, -93, -2, 23, 92, 657, -73, 16, -79, -341, -941, 45, -4, -14, -19, 75, -42, 69, -69, -35, 20, -593, -93, -607, 8, 4, 167, 29, 52, -52, 574, -34, 53, 7, 808, 98, -499, 45, 8, -52, 16, -52, -73, 812, -11, 18, 63, -72, -9, 3, -3, 92, 17, -809, 44, 56, -318, -61, -68, -93, -9, 12, 46, 83, 51, 510, 47, 7, -307, 62, 86, -48, -71, -222, -6, -8, -82, -33, 22, -37, 47, -6, 14, 86, 96, 147, -47, -15, 66, -98, 77, 61, 98, -789, 82, -978, -804, 79, -79, 97, 903, -43, 717, 26, 32, -82, -708, -42, -380, 80, 57, 42, 61, -60, -96, -4, 34, -14, -14, -3, -203, 61, -45, -16, 299, 29, -28, 8, -11, -354, -74, -22, -75, 28, -10, -90, 99, -12, 13, -179, 48, -73, -46, -83, 43, -10, 73, 27, 52, -83, -69, -83, -80, -98, -495, -7, -37, 446, -14, 68, -65, 65, -30, 111, 67, -95, 94, 91, -84, 92, -44, -491, -11, -5, 96, 9, 352, -34, 12, 13, -98, -31, 86, -3, 3, 83, -54, 71, 743, -43, 44, -69, 25, -90, 440, -96, -524, 70, -33, 933, -819, 4, -18, 57, 76, -254, -8, -38, -49, -53, -33, -76, -22, -867, -37, -68, 5, -392, -39, -97, -72, -52, -848, -14, -83, -91, 88, -24, 24, 285, 50, -49, 14, 28, 85, 605, 47, -93, 43, -15, 56, 44, 33, 83, 12, -92, -956, 81, -61, -244, 31, 31, 27, 10, -55, -59, -8, 44, -77, 834, 66, 50, -50, 7, 33, -40, -43, -37, 63, 8, -204, 613, 21, 879, 32, 856, 12, 45, -18, -98, 24, -53, -82, -49, 88, -57, 2, 36, -80, 24, -82, 68, -773, 5, -26, -815, -638, 968, -24, 835, -93, -95, 88, 27, -23, 76, 596, 24, 61, -62, 1, -2, -98, -613, 2, -66, 37, -60, -35, -79, -47, -242, 93, 64, 94, -67, 19, -28, 63, -35, -83, -432, -85, 64, 36, -871, -29, 542, -42, -975, -88, 5, -45, -3, 72, -19, -25, 78, -95, -54, 65, 57, 27, -56, -44, 42, 29, 29, 37, -89, 63, 5, -72, 41, 15, -12, 45, 27, 43, 97, -16, 17, -68, 67, 21, 12, -2, 50, 92, 4, 56, 33, 68, 2, -36, -41, -99, -19, 34, -9, -86, 20, 81, 32, 21, -41, -19, -18, 3, -12, -13, 42, 31, 17, -32, -2, -39, 41, -25, -44, -29, -29, 43, 45, 34, -26, 50, -32, -38, 22, 19, -45, 41, 9, 33, -27, 16, -9, -10, -8, -7, -40, 15, -23, -46, -42, 33, -18, -45, -2, -8, 14, -15, -26, 15, -39 };
|
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
|
| 3 |
+
# compile and link
|
| 4 |
+
riscv-elf-gcc -march=rv32i -mabi=ilp32 -nostdlib -ffreestanding -O3 resources/start.s "$1" -T resources/linker.ld -o resources/output.elf
|
| 5 |
+
|
| 6 |
+
# extract binary
|
| 7 |
+
riscv-elf-objcopy -O binary resources/output.elf resources/output.bin
|
|
@@ -1,5 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env bash
|
| 2 |
-
|
| 3 |
-
riscv-elf-gcc -march=rv32i -mabi=ilp32 -nostdlib -ffreestanding -O2 start.s main.c -T linker.ld -o prog.elf
|
| 4 |
-
riscv-elf-objcopy -O binary prog.elf prog.bin
|
| 5 |
-
python process.py
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/env bash
|
| 2 |
+
|
| 3 |
+
od -An -tx4 -w4 resources/output.bin
|
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/env bash
|
| 2 |
+
|
| 3 |
+
riscv-elf-objdump -D resources/output.elf -j .text -j .rodata -j .data -j .bss | less -
|
|
@@ -1,24 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env python
|
| 2 |
-
|
| 3 |
-
SIZE=4096
|
| 4 |
-
LINE=8
|
| 5 |
-
DEFAULTWORD = 'X"00000000"'
|
| 6 |
-
|
| 7 |
-
data=[]
|
| 8 |
-
|
| 9 |
-
inputdata = open('prog.bin','rb').read()
|
| 10 |
-
pad = (-len(inputdata)) % 4
|
| 11 |
-
inputdata += b'\x00' * pad
|
| 12 |
-
for i in range(0, len(inputdata), 4):
|
| 13 |
-
w = inputdata[i:i+4]
|
| 14 |
-
val = int.from_bytes(w, 'little')
|
| 15 |
-
data.append(f'X"{val:08x}"')
|
| 16 |
-
|
| 17 |
-
oldsize = len(data)
|
| 18 |
-
for i in range(oldsize, SIZE):
|
| 19 |
-
data.append(DEFAULTWORD)
|
| 20 |
-
|
| 21 |
-
i = 0
|
| 22 |
-
while i < SIZE:
|
| 23 |
-
print(', '.join(data[i:i+LINE]) + ('' if i + LINE >= len(data) else ','))
|
| 24 |
-
i += LINE
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/env python3
|
| 2 |
+
|
| 3 |
+
BINARY_FILE_PATH = 'resources/output.bin'
|
| 4 |
+
WORDS_PER_LINE = 8
|
| 5 |
+
LOGSIZE2 = 14
|
| 6 |
+
|
| 7 |
+
SOURCE_FILE_PATH = '../src/bram.vhd'
|
| 8 |
+
START_MARKER = '-- START PROGMEM'
|
| 9 |
+
END_MARKER = '-- END PROGMEM'
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
MEMORY_SIZE = 1 << LOGSIZE2
|
| 13 |
+
WORDS_LEN = 1 << (LOGSIZE2 - 2)
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
# load binary to buffer
|
| 17 |
+
|
| 18 |
+
buffer = [0] * WORDS_LEN
|
| 19 |
+
with open(BINARY_FILE_PATH, 'rb') as f:
|
| 20 |
+
i = 0
|
| 21 |
+
j = 0
|
| 22 |
+
while True:
|
| 23 |
+
word = f.read(4)
|
| 24 |
+
|
| 25 |
+
if not word:
|
| 26 |
+
break
|
| 27 |
+
|
| 28 |
+
if len(word) < 4:
|
| 29 |
+
raise ValueError(f"Incomplete 32-bit word at offset {i}")
|
| 30 |
+
|
| 31 |
+
buffer[j] = int.from_bytes(word)
|
| 32 |
+
i += 4
|
| 33 |
+
j += 1
|
| 34 |
+
|
| 35 |
+
i = 0
|
| 36 |
+
lines = ['\ttype ram_type is array (0 to 4095) of std_logic_vector(31 downto 0);', '\tshared variable RAM: ram_type := (']
|
| 37 |
+
while i < WORDS_LEN:
|
| 38 |
+
lines.append('\t\t' + ', '.join(map(lambda x: f'X"{x:08x}"', buffer[i:i+WORDS_PER_LINE]))
|
| 39 |
+
+ (',' if (i + WORDS_PER_LINE) < WORDS_LEN else ''))
|
| 40 |
+
i += WORDS_PER_LINE
|
| 41 |
+
lines.append('\t);')
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
# put the binary in the source file
|
| 45 |
+
|
| 46 |
+
text = [line.rstrip("\n") for line in open(SOURCE_FILE_PATH)]
|
| 47 |
+
start_idx, end_idx = text.index(START_MARKER), text.index(END_MARKER)
|
| 48 |
+
assert 0 < start_idx and start_idx < end_idx
|
| 49 |
+
|
| 50 |
+
open(SOURCE_FILE_PATH, 'w').write('\n'.join(text[0 : start_idx + 1] + lines + text[end_idx :]))
|
|
@@ -9,4 +9,3 @@ SECTIONS {
|
|
| 9 |
.data : { *(.data*) }
|
| 10 |
.bss : { *(.bss*) }
|
| 11 |
}
|
| 12 |
-
|
|
|
|
| 9 |
.data : { *(.data*) }
|
| 10 |
.bss : { *(.bss*) }
|
| 11 |
}
|
|
|
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.section .text
|
| 2 |
+
.global _start
|
| 3 |
+
.type _start, @function
|
| 4 |
+
|
| 5 |
+
_start:
|
| 6 |
+
call main
|
| 7 |
+
1: j 1b
|
|
@@ -1,8 +0,0 @@
|
|
| 1 |
-
.section .text,"ax",@progbits
|
| 2 |
-
.global _start
|
| 3 |
-
.type _start, @function
|
| 4 |
-
|
| 5 |
-
_start:
|
| 6 |
-
call main
|
| 7 |
-
.p2align 2
|
| 8 |
-
.word 0x0000006f
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
...
|
@@ -1,5 +1,6 @@
|
|
| 1 |
library ieee;
|
| 2 |
use ieee.std_logic_1164.all;
|
|
|
|
| 3 |
|
| 4 |
use work.types.all;
|
| 5 |
|
|
@@ -16,4 +17,8 @@ package constants is
|
|
| 16 |
active => '0',
|
| 17 |
address => (others => '0')
|
| 18 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
end package constants;
|
|
|
|
| 1 |
library ieee;
|
| 2 |
use ieee.std_logic_1164.all;
|
| 3 |
+
use ieee.numeric_std.all;
|
| 4 |
|
| 5 |
use work.types.all;
|
| 6 |
|
|
|
|
| 17 |
active => '0',
|
| 18 |
address => (others => '0')
|
| 19 |
);
|
| 20 |
+
|
| 21 |
+
constant MEM_ADDRESS_BITS: integer := 14;
|
| 22 |
+
constant MEM_ADDRESS_MIN: std_logic_vector(31 downto 0) := (others => '0');
|
| 23 |
+
constant MEM_ADDRESS_MAX: std_logic_vector(31 downto 0) := std_logic_vector(to_unsigned((2**MEM_ADDRESS_BITS) - 1, 32));
|
| 24 |
end package constants;
|
|
@@ -14,12 +14,14 @@ package core_constants is
|
|
| 14 |
constant DEFAULT_DECODE_OUTPUT: decode_output_t := (
|
| 15 |
is_active => '0',
|
| 16 |
is_invalid => '0',
|
|
|
|
| 17 |
operation => OP_ADD,
|
| 18 |
operand1 => (others => '0'),
|
| 19 |
operand2 => (others => '0'),
|
| 20 |
operand3 => (others => '0'),
|
| 21 |
destination_reg => (others => '0'),
|
| 22 |
-
csr_read_only => '0'
|
|
|
|
| 23 |
);
|
| 24 |
|
| 25 |
constant DEFAULT_EXECUTE_OUTPUT: execute_output_t := (
|
|
@@ -77,4 +79,14 @@ package core_constants is
|
|
| 77 |
constant MCONFIGPTR_VALUE: std_logic_vector(31 downto 0) := X"00000000";
|
| 78 |
|
| 79 |
constant MISA_VALUE: std_logic_vector(31 downto 0) := X"40000100"; -- 32-bit RVI
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
end package core_constants;
|
|
|
|
| 14 |
constant DEFAULT_DECODE_OUTPUT: decode_output_t := (
|
| 15 |
is_active => '0',
|
| 16 |
is_invalid => '0',
|
| 17 |
+
is_invalid_address => '0',
|
| 18 |
operation => OP_ADD,
|
| 19 |
operand1 => (others => '0'),
|
| 20 |
operand2 => (others => '0'),
|
| 21 |
operand3 => (others => '0'),
|
| 22 |
destination_reg => (others => '0'),
|
| 23 |
+
csr_read_only => '0',
|
| 24 |
+
pc => (others => '0')
|
| 25 |
);
|
| 26 |
|
| 27 |
constant DEFAULT_EXECUTE_OUTPUT: execute_output_t := (
|
|
|
|
| 79 |
constant MCONFIGPTR_VALUE: std_logic_vector(31 downto 0) := X"00000000";
|
| 80 |
|
| 81 |
constant MISA_VALUE: std_logic_vector(31 downto 0) := X"40000100"; -- 32-bit RVI
|
| 82 |
+
|
| 83 |
+
constant EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0000";
|
| 84 |
+
constant EX_CAUSE_INSTRUCTION_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0001";
|
| 85 |
+
constant EX_CAUSE_ILLEGAL_INSTRUCTION: std_logic_vector(3 downto 0) := "0010";
|
| 86 |
+
constant EX_CAUSE_BREAKPOINT: std_logic_vector(3 downto 0) := "0011";
|
| 87 |
+
constant EX_CAUSE_LOAD_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0100";
|
| 88 |
+
constant EX_CAUSE_LOAD_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0101";
|
| 89 |
+
constant EX_CAUSE_STORE_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0110";
|
| 90 |
+
constant EX_CAUSE_STORE_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0111";
|
| 91 |
+
constant EX_CAUSE_ENVIRONMENT_CALL: std_logic_vector(3 downto 0) := "1011";
|
| 92 |
end package core_constants;
|
|
@@ -2,6 +2,9 @@ library ieee;
|
|
| 2 |
use ieee.std_logic_1164.all;
|
| 3 |
use ieee.numeric_std.all;
|
| 4 |
|
|
|
|
|
|
|
|
|
|
| 5 |
use work.core_types.all;
|
| 6 |
use work.core_constants.all;
|
| 7 |
|
|
@@ -116,9 +119,11 @@ begin
|
|
| 116 |
|
| 117 |
if decode_input.is_active = '1' then
|
| 118 |
v_decode_output.is_active := '1';
|
| 119 |
-
v_decode_output.
|
| 120 |
|
| 121 |
-
if
|
|
|
|
|
|
|
| 122 |
-- LUI
|
| 123 |
v_decode_output.operation := OP_ADD;
|
| 124 |
v_decode_output.operand1 := (others => '0');
|
|
@@ -298,8 +303,10 @@ begin
|
|
| 298 |
-- FENCE (implemented as NOP)
|
| 299 |
elsif i_imm = "000000000000" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
|
| 300 |
-- ECALL
|
|
|
|
| 301 |
elsif i_imm = "000000000001" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
|
| 302 |
-- EBREAK
|
|
|
|
| 303 |
elsif funct7 = "0011000" and rs2 = "00010" and rs1 = "00000" and rd = "00000" and opcode = "1110011" then
|
| 304 |
-- MRET
|
| 305 |
v_decode_output.operation := OP_MRET;
|
|
|
|
| 2 |
use ieee.std_logic_1164.all;
|
| 3 |
use ieee.numeric_std.all;
|
| 4 |
|
| 5 |
+
use work.types.all;
|
| 6 |
+
use work.constants.all;
|
| 7 |
+
|
| 8 |
use work.core_types.all;
|
| 9 |
use work.core_constants.all;
|
| 10 |
|
|
|
|
| 119 |
|
| 120 |
if decode_input.is_active = '1' then
|
| 121 |
v_decode_output.is_active := '1';
|
| 122 |
+
v_decode_output.pc := decode_input.pc;
|
| 123 |
|
| 124 |
+
if not (MEM_ADDRESS_MIN <= decode_input.pc and decode_input.pc <= MEM_ADDRESS_MAX) then
|
| 125 |
+
v_decode_output.is_invalid_address := '1';
|
| 126 |
+
elsif opcode = "0110111" then
|
| 127 |
-- LUI
|
| 128 |
v_decode_output.operation := OP_ADD;
|
| 129 |
v_decode_output.operand1 := (others => '0');
|
|
|
|
| 303 |
-- FENCE (implemented as NOP)
|
| 304 |
elsif i_imm = "000000000000" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
|
| 305 |
-- ECALL
|
| 306 |
+
v_decode_output.operation := OP_ECALL;
|
| 307 |
elsif i_imm = "000000000001" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
|
| 308 |
-- EBREAK
|
| 309 |
+
v_decode_output.operation := OP_EBREAK;
|
| 310 |
elsif funct7 = "0011000" and rs2 = "00010" and rs1 = "00000" and rd = "00000" and opcode = "1110011" then
|
| 311 |
-- MRET
|
| 312 |
v_decode_output.operation := OP_MRET;
|
|
@@ -31,7 +31,7 @@ architecture rtl of execute is
|
|
| 31 |
signal mscratch: std_logic_vector(31 downto 0) := (others => '0');
|
| 32 |
signal mepc: std_logic_vector(29 downto 0) := (others => '0');
|
| 33 |
signal mcause_int: std_logic := '0';
|
| 34 |
-
signal mcause_code: std_logic_vector(
|
| 35 |
signal mtval: std_logic_vector(31 downto 0) := (others => '0');
|
| 36 |
signal mip: std_logic_vector(15 downto 0) := (others => '0');
|
| 37 |
signal mcycle: std_logic_vector(31 downto 0) := (others => '0');
|
|
@@ -46,12 +46,22 @@ begin
|
|
| 46 |
variable v_jump: std_logic;
|
| 47 |
variable v_jump_address: std_logic_vector(31 downto 0);
|
| 48 |
variable v_mem_req: mem_req_t;
|
| 49 |
-
variable
|
| 50 |
-
variable
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
|
| 52 |
variable csr_set_bits, csr_clear_bits: std_logic_vector(31 downto 0);
|
| 53 |
variable v_temp: unsigned(63 downto 0);
|
| 54 |
|
|
|
|
|
|
|
|
|
|
| 55 |
begin
|
| 56 |
if rising_edge(clk) then
|
| 57 |
v_output := DEFAULT_EXECUTE_OUTPUT;
|
|
@@ -61,281 +71,370 @@ begin
|
|
| 61 |
v_jump_address := (others => '0');
|
| 62 |
|
| 63 |
v_temp := unsigned(mcycleh & mcycle) + 1;
|
| 64 |
-
|
| 65 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
|
| 67 |
v_temp := unsigned(minstreth & minstret);
|
| 68 |
if instr_retire = '1' then
|
| 69 |
v_temp := v_temp + 1;
|
| 70 |
end if;
|
| 71 |
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
if input.is_active = '1' and input.is_invalid = '0' then
|
| 76 |
-
if input.operation = OP_ADD then
|
| 77 |
-
v_output.result := std_logic_vector(unsigned(input.operand1) + unsigned(input.operand2));
|
| 78 |
-
elsif input.operation = OP_SUB then
|
| 79 |
-
v_output.result := std_logic_vector(unsigned(input.operand1) - unsigned(input.operand2));
|
| 80 |
-
elsif input.operation = OP_SLT then
|
| 81 |
-
if signed(input.operand1) < signed(input.operand2) then
|
| 82 |
-
v_output.result := std_logic_vector(to_unsigned(1, 32));
|
| 83 |
-
else
|
| 84 |
-
v_output.result := (others => '0');
|
| 85 |
-
end if;
|
| 86 |
-
elsif input.operation = OP_SLTU then
|
| 87 |
-
if unsigned(input.operand1) < unsigned(input.operand2) then
|
| 88 |
-
v_output.result := std_logic_vector(to_unsigned(1, 32));
|
| 89 |
-
else
|
| 90 |
-
v_output.result := (others => '0');
|
| 91 |
-
end if;
|
| 92 |
-
elsif input.operation = OP_XOR then
|
| 93 |
-
v_output.result := input.operand1 xor input.operand2;
|
| 94 |
-
elsif input.operation = OP_OR then
|
| 95 |
-
v_output.result := input.operand1 or input.operand2;
|
| 96 |
-
elsif input.operation = OP_AND then
|
| 97 |
-
v_output.result := input.operand1 and input.operand2;
|
| 98 |
-
elsif input.operation = OP_SLL then
|
| 99 |
-
v_output.result := input.operand1;
|
| 100 |
-
|
| 101 |
-
if input.operand2(4) = '1' then
|
| 102 |
-
v_output.result := v_output.result(15 downto 0) & "0000000000000000";
|
| 103 |
-
end if;
|
| 104 |
-
if input.operand2(3) = '1' then
|
| 105 |
-
v_output.result := v_output.result(23 downto 0) & "00000000";
|
| 106 |
-
end if;
|
| 107 |
-
if input.operand2(2) = '1' then
|
| 108 |
-
v_output.result := v_output.result(27 downto 0) & "0000";
|
| 109 |
-
end if;
|
| 110 |
-
if input.operand2(1) = '1' then
|
| 111 |
-
v_output.result := v_output.result(29 downto 0) & "00";
|
| 112 |
-
end if;
|
| 113 |
-
if input.operand2(0) = '1' then
|
| 114 |
-
v_output.result := v_output.result(30 downto 0) & "0";
|
| 115 |
-
end if;
|
| 116 |
-
elsif input.operation = OP_SRL or input.operation = OP_SRA then
|
| 117 |
-
v_output.result := input.operand1;
|
| 118 |
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 124 |
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
if unsigned(input.operand1) < unsigned(input.operand2) then
|
| 166 |
-
v_jump := '1';
|
| 167 |
-
v_jump_address := input.operand3;
|
| 168 |
-
end if;
|
| 169 |
-
elsif input.operation = OP_BGEU then
|
| 170 |
-
if unsigned(input.operand1) >= unsigned(input.operand2) then
|
| 171 |
v_jump := '1';
|
| 172 |
-
v_jump_address := input.
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
elsif input.
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
v_mem_req.address := input.operand1;
|
| 208 |
-
v_mem_req.value := input.operand2;
|
| 209 |
-
elsif input.operation = OP_LB or input.operation = OP_LH or input.operation = OP_LW or
|
| 210 |
-
input.operation = OP_LBU or input.operation = OP_LHU then
|
| 211 |
-
-- TODO: a misaligned load should generate an exception
|
| 212 |
-
v_output.use_mem := '1';
|
| 213 |
-
v_output.mem_addr := input.operand1(1 downto 0);
|
| 214 |
-
|
| 215 |
-
v_mem_req.active := '1';
|
| 216 |
-
v_mem_req.address := input.operand1;
|
| 217 |
-
|
| 218 |
-
if input.operation = OP_LB or input.operation = OP_LH then
|
| 219 |
-
v_output.mem_sign_extend := '1';
|
| 220 |
-
end if;
|
| 221 |
|
| 222 |
-
|
| 223 |
-
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
| 231 |
-
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 241 |
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
|
|
|
|
|
|
|
|
|
| 307 |
else
|
| 308 |
-
--
|
|
|
|
|
|
|
| 309 |
end if;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 310 |
else
|
| 311 |
-
|
| 312 |
end if;
|
| 313 |
-
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
else
|
| 321 |
-
assert false report "Unhandled operation value in execute stage" severity failure;
|
| 322 |
end if;
|
| 323 |
|
| 324 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 325 |
end if;
|
| 326 |
|
| 327 |
output <= v_output;
|
| 328 |
-
|
| 329 |
mem_req <= v_mem_req;
|
| 330 |
-
|
| 331 |
jump <= v_jump;
|
| 332 |
jump_address <= v_jump_address(31 downto 1) & "0";
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
|
|
|
|
| 339 |
end if;
|
| 340 |
end process;
|
| 341 |
|
|
|
|
| 31 |
signal mscratch: std_logic_vector(31 downto 0) := (others => '0');
|
| 32 |
signal mepc: std_logic_vector(29 downto 0) := (others => '0');
|
| 33 |
signal mcause_int: std_logic := '0';
|
| 34 |
+
signal mcause_code: std_logic_vector(3 downto 0) := (others => '0');
|
| 35 |
signal mtval: std_logic_vector(31 downto 0) := (others => '0');
|
| 36 |
signal mip: std_logic_vector(15 downto 0) := (others => '0');
|
| 37 |
signal mcycle: std_logic_vector(31 downto 0) := (others => '0');
|
|
|
|
| 46 |
variable v_jump: std_logic;
|
| 47 |
variable v_jump_address: std_logic_vector(31 downto 0);
|
| 48 |
variable v_mem_req: mem_req_t;
|
| 49 |
+
variable v_mcycle_inc, v_mcycleh_inc: std_logic_vector(31 downto 0);
|
| 50 |
+
variable v_mcycle, v_mcycleh: std_logic_vector(31 downto 0);
|
| 51 |
+
variable v_minstret_inc, v_minstreth_inc: std_logic_vector(31 downto 0);
|
| 52 |
+
variable v_minstret, v_minstreth: std_logic_vector(31 downto 0);
|
| 53 |
+
variable v_mepc: std_logic_vector(29 downto 0);
|
| 54 |
+
variable v_mcause_int: std_logic;
|
| 55 |
+
variable v_mcause_code: std_logic_vector(3 downto 0);
|
| 56 |
+
|
| 57 |
+
variable v_address, v_value: std_logic_vector(31 downto 0);
|
| 58 |
|
| 59 |
variable csr_set_bits, csr_clear_bits: std_logic_vector(31 downto 0);
|
| 60 |
variable v_temp: unsigned(63 downto 0);
|
| 61 |
|
| 62 |
+
variable has_exception: boolean;
|
| 63 |
+
variable exception_cause: std_logic_vector(3 downto 0);
|
| 64 |
+
|
| 65 |
begin
|
| 66 |
if rising_edge(clk) then
|
| 67 |
v_output := DEFAULT_EXECUTE_OUTPUT;
|
|
|
|
| 71 |
v_jump_address := (others => '0');
|
| 72 |
|
| 73 |
v_temp := unsigned(mcycleh & mcycle) + 1;
|
| 74 |
+
v_mcycle_inc := std_logic_vector(v_temp(31 downto 0));
|
| 75 |
+
v_mcycle := v_mcycle_inc;
|
| 76 |
+
v_mcycleh_inc := std_logic_vector(v_temp(63 downto 32));
|
| 77 |
+
v_mcycleh := v_mcycleh_inc;
|
| 78 |
+
v_mepc := mepc;
|
| 79 |
+
v_mcause_int := mcause_int;
|
| 80 |
+
v_mcause_code := mcause_code;
|
| 81 |
+
|
| 82 |
+
has_exception := false;
|
| 83 |
+
exception_cause := (others => '0');
|
| 84 |
|
| 85 |
v_temp := unsigned(minstreth & minstret);
|
| 86 |
if instr_retire = '1' then
|
| 87 |
v_temp := v_temp + 1;
|
| 88 |
end if;
|
| 89 |
|
| 90 |
+
v_minstret := std_logic_vector(v_temp(31 downto 0));
|
| 91 |
+
v_minstreth := std_logic_vector(v_temp(63 downto 32));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
|
| 93 |
+
if input.is_active = '1' then
|
| 94 |
+
if input.is_invalid_address = '1' then
|
| 95 |
+
has_exception := true;
|
| 96 |
+
exception_cause := EX_CAUSE_INSTRUCTION_ACCESS_FAULT;
|
| 97 |
+
elsif input.is_invalid = '1' then
|
| 98 |
+
has_exception := true;
|
| 99 |
+
exception_cause := EX_CAUSE_ILLEGAL_INSTRUCTION;
|
| 100 |
+
else
|
| 101 |
+
if input.operation = OP_ADD then
|
| 102 |
+
v_output.result := std_logic_vector(unsigned(input.operand1) + unsigned(input.operand2));
|
| 103 |
+
elsif input.operation = OP_SUB then
|
| 104 |
+
v_output.result := std_logic_vector(unsigned(input.operand1) - unsigned(input.operand2));
|
| 105 |
+
elsif input.operation = OP_SLT then
|
| 106 |
+
if signed(input.operand1) < signed(input.operand2) then
|
| 107 |
+
v_output.result := std_logic_vector(to_unsigned(1, 32));
|
| 108 |
+
else
|
| 109 |
+
v_output.result := (others => '0');
|
| 110 |
+
end if;
|
| 111 |
+
elsif input.operation = OP_SLTU then
|
| 112 |
+
if unsigned(input.operand1) < unsigned(input.operand2) then
|
| 113 |
+
v_output.result := std_logic_vector(to_unsigned(1, 32));
|
| 114 |
+
else
|
| 115 |
+
v_output.result := (others => '0');
|
| 116 |
+
end if;
|
| 117 |
+
elsif input.operation = OP_XOR then
|
| 118 |
+
v_output.result := input.operand1 xor input.operand2;
|
| 119 |
+
elsif input.operation = OP_OR then
|
| 120 |
+
v_output.result := input.operand1 or input.operand2;
|
| 121 |
+
elsif input.operation = OP_AND then
|
| 122 |
+
v_output.result := input.operand1 and input.operand2;
|
| 123 |
+
elsif input.operation = OP_SLL then
|
| 124 |
+
v_output.result := input.operand1;
|
| 125 |
|
| 126 |
+
if input.operand2(4) = '1' then
|
| 127 |
+
v_output.result := v_output.result(15 downto 0) & "0000000000000000";
|
| 128 |
+
end if;
|
| 129 |
+
if input.operand2(3) = '1' then
|
| 130 |
+
v_output.result := v_output.result(23 downto 0) & "00000000";
|
| 131 |
+
end if;
|
| 132 |
+
if input.operand2(2) = '1' then
|
| 133 |
+
v_output.result := v_output.result(27 downto 0) & "0000";
|
| 134 |
+
end if;
|
| 135 |
+
if input.operand2(1) = '1' then
|
| 136 |
+
v_output.result := v_output.result(29 downto 0) & "00";
|
| 137 |
+
end if;
|
| 138 |
+
if input.operand2(0) = '1' then
|
| 139 |
+
v_output.result := v_output.result(30 downto 0) & "0";
|
| 140 |
+
end if;
|
| 141 |
+
elsif input.operation = OP_SRL or input.operation = OP_SRA then
|
| 142 |
+
v_output.result := input.operand1;
|
| 143 |
+
|
| 144 |
+
if input.operation = OP_SRL then
|
| 145 |
+
v_sign := (others => '0');
|
| 146 |
+
else
|
| 147 |
+
v_sign := (others => input.operand1(31));
|
| 148 |
+
end if;
|
| 149 |
+
|
| 150 |
+
if input.operand2(4) = '1' then
|
| 151 |
+
v_output.result := v_sign(15 downto 0) & v_output.result(31 downto 16);
|
| 152 |
+
end if;
|
| 153 |
+
if input.operand2(3) = '1' then
|
| 154 |
+
v_output.result := v_sign(7 downto 0) & v_output.result(31 downto 8);
|
| 155 |
+
end if;
|
| 156 |
+
if input.operand2(2) = '1' then
|
| 157 |
+
v_output.result := v_sign(3 downto 0) & v_output.result(31 downto 4);
|
| 158 |
+
end if;
|
| 159 |
+
if input.operand2(1) = '1' then
|
| 160 |
+
v_output.result := v_sign(2 downto 0) & v_output.result(31 downto 3);
|
| 161 |
+
end if;
|
| 162 |
+
if input.operand2(0) = '1' then
|
| 163 |
+
v_output.result := v_sign(1 downto 0) & v_output.result(31 downto 2);
|
| 164 |
+
end if;
|
| 165 |
+
elsif input.operation = OP_JAL then
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 166 |
v_jump := '1';
|
| 167 |
+
v_jump_address := std_logic_vector(unsigned(input.operand1) + unsigned(input.operand2));
|
| 168 |
+
v_output.result := input.operand3;
|
| 169 |
+
elsif input.operation = OP_BEQ then
|
| 170 |
+
if input.operand1 = input.operand2 then
|
| 171 |
+
v_jump := '1';
|
| 172 |
+
v_jump_address := input.operand3;
|
| 173 |
+
end if;
|
| 174 |
+
elsif input.operation = OP_BNE then
|
| 175 |
+
if input.operand1 /= input.operand2 then
|
| 176 |
+
v_jump := '1';
|
| 177 |
+
v_jump_address := input.operand3;
|
| 178 |
+
end if;
|
| 179 |
+
elsif input.operation = OP_BLT then
|
| 180 |
+
if signed(input.operand1) < signed(input.operand2) then
|
| 181 |
+
v_jump := '1';
|
| 182 |
+
v_jump_address := input.operand3;
|
| 183 |
+
end if;
|
| 184 |
+
elsif input.operation = OP_BGE then
|
| 185 |
+
if signed(input.operand1) >= signed(input.operand2) then
|
| 186 |
+
v_jump := '1';
|
| 187 |
+
v_jump_address := input.operand3;
|
| 188 |
+
end if;
|
| 189 |
+
elsif input.operation = OP_BLTU then
|
| 190 |
+
if unsigned(input.operand1) < unsigned(input.operand2) then
|
| 191 |
+
v_jump := '1';
|
| 192 |
+
v_jump_address := input.operand3;
|
| 193 |
+
end if;
|
| 194 |
+
elsif input.operation = OP_BGEU then
|
| 195 |
+
if unsigned(input.operand1) >= unsigned(input.operand2) then
|
| 196 |
+
v_jump := '1';
|
| 197 |
+
v_jump_address := input.operand3;
|
| 198 |
+
end if;
|
| 199 |
+
elsif input.operation = OP_SB then
|
| 200 |
+
v_address := input.operand1;
|
| 201 |
+
v_value := input.operand2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 202 |
|
| 203 |
+
v_mem_req.active := '1';
|
| 204 |
+
v_mem_req.address := v_address;
|
| 205 |
+
|
| 206 |
+
if v_address(1 downto 0) = "00" then
|
| 207 |
+
v_mem_req.value := x"000000" & v_value(7 downto 0);
|
| 208 |
+
v_mem_req.write_enable := "0001";
|
| 209 |
+
elsif v_address(1 downto 0) = "01" then
|
| 210 |
+
v_mem_req.value := x"0000" & v_value(7 downto 0) & x"00";
|
| 211 |
+
v_mem_req.write_enable := "0010";
|
| 212 |
+
elsif v_address(1 downto 0) = "10" then
|
| 213 |
+
v_mem_req.value := x"00" & v_value(7 downto 0) & x"0000";
|
| 214 |
+
v_mem_req.write_enable := "0100";
|
| 215 |
+
else
|
| 216 |
+
v_mem_req.value := v_value(7 downto 0) & x"000000";
|
| 217 |
+
v_mem_req.write_enable := "1000";
|
| 218 |
+
end if;
|
| 219 |
+
|
| 220 |
+
if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 221 |
+
has_exception := true;
|
| 222 |
+
exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
|
| 223 |
+
end if;
|
| 224 |
+
elsif input.operation = OP_SH then
|
| 225 |
+
v_address := input.operand1;
|
| 226 |
+
v_value := input.operand2;
|
| 227 |
+
|
| 228 |
+
v_mem_req.active := '1';
|
| 229 |
+
v_mem_req.address := v_address;
|
| 230 |
+
|
| 231 |
+
if input.operand1(1 downto 0) = "00" then
|
| 232 |
+
v_mem_req.value := x"0000" & v_value(15 downto 0);
|
| 233 |
+
v_mem_req.write_enable := "0011";
|
| 234 |
+
else
|
| 235 |
+
v_mem_req.value := v_value(15 downto 0) & x"0000";
|
| 236 |
+
v_mem_req.write_enable := "1100";
|
| 237 |
+
end if;
|
| 238 |
+
|
| 239 |
+
if v_address(0) /= '0' then
|
| 240 |
+
has_exception := true;
|
| 241 |
+
exception_cause := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
|
| 242 |
+
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 243 |
+
has_exception := true;
|
| 244 |
+
exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
|
| 245 |
+
end if;
|
| 246 |
+
elsif input.operation = OP_SW then
|
| 247 |
+
v_mem_req.active := '1';
|
| 248 |
+
v_mem_req.write_enable := "1111";
|
| 249 |
+
v_mem_req.address := input.operand1;
|
| 250 |
+
v_mem_req.value := input.operand2;
|
| 251 |
+
|
| 252 |
+
if v_address(1 downto 0) /= "00" then
|
| 253 |
+
has_exception := true;
|
| 254 |
+
exception_cause := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
|
| 255 |
+
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 256 |
+
has_exception := true;
|
| 257 |
+
exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
|
| 258 |
+
end if;
|
| 259 |
+
elsif input.operation = OP_LB or input.operation = OP_LH or input.operation = OP_LW or input.operation = OP_LBU or input.operation = OP_LHU then
|
| 260 |
+
v_address := input.operand1;
|
| 261 |
+
|
| 262 |
+
v_output.use_mem := '1';
|
| 263 |
+
v_output.mem_addr := v_address(1 downto 0);
|
| 264 |
+
|
| 265 |
+
v_mem_req.active := '1';
|
| 266 |
+
v_mem_req.address := v_address;
|
| 267 |
+
|
| 268 |
+
if input.operation = OP_LB or input.operation = OP_LH then
|
| 269 |
+
v_output.mem_sign_extend := '1';
|
| 270 |
+
end if;
|
| 271 |
+
|
| 272 |
+
if input.operation = OP_LB or input.operation = OP_LBU then
|
| 273 |
+
v_output.mem_size := SIZE_BYTE;
|
| 274 |
+
if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 275 |
+
has_exception := true;
|
| 276 |
+
exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
|
| 277 |
+
end if;
|
| 278 |
+
elsif input.operation = OP_LH or input.operation = OP_LHU then
|
| 279 |
+
v_output.mem_size := SIZE_HALFWORD;
|
| 280 |
+
if v_address(0) /= '0' then
|
| 281 |
+
has_exception := true;
|
| 282 |
+
exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
|
| 283 |
+
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 284 |
+
has_exception := true;
|
| 285 |
+
exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
|
| 286 |
+
end if;
|
| 287 |
+
else
|
| 288 |
+
v_output.mem_size := SIZE_WORD;
|
| 289 |
+
if v_address(1 downto 0) /= "00" then
|
| 290 |
+
has_exception := true;
|
| 291 |
+
exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
|
| 292 |
+
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 293 |
+
has_exception := true;
|
| 294 |
+
exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
|
| 295 |
+
end if;
|
| 296 |
+
end if;
|
| 297 |
+
elsif input.operation = OP_CSRRW or input.operation = OP_CSRRS or input.operation = OP_CSRRC then
|
| 298 |
+
if input.operation = OP_CSRRW then
|
| 299 |
+
csr_set_bits := input.operand1;
|
| 300 |
+
csr_clear_bits := input.operand1;
|
| 301 |
+
elsif input.operation = OP_CSRRS then
|
| 302 |
+
csr_set_bits := input.operand1;
|
| 303 |
+
csr_clear_bits := (others => '1');
|
| 304 |
+
elsif input.operation = OP_CSRRC then
|
| 305 |
+
csr_clear_bits := not input.operand1;
|
| 306 |
+
else
|
| 307 |
+
assert false report "Unhandled CSR operation in execute stage" severity failure;
|
| 308 |
+
end if;
|
| 309 |
+
|
| 310 |
+
-- TODO: implementations for CSR read-write registers
|
| 311 |
|
| 312 |
+
if input.operand2(11 downto 0) = CSR_MSTATUS then
|
| 313 |
+
v_output.result := "000000000000000000011000" & mstatus_mpie & "000" & mstatus_mie & "000";
|
| 314 |
+
mstatus_mie <= (mstatus_mie or csr_set_bits(3)) and csr_clear_bits(3);
|
| 315 |
+
mstatus_mpie <= (mstatus_mpie or csr_set_bits(7)) and csr_clear_bits(7);
|
| 316 |
+
elsif input.operand2(11 downto 0) = CSR_MISA then
|
| 317 |
+
v_output.result := MISA_VALUE;
|
| 318 |
+
elsif input.operand2(11 downto 0) = CSR_MIE then
|
| 319 |
+
v_output.result := x"0000" & mie;
|
| 320 |
+
mie <= (mie or csr_set_bits(15 downto 0)) and csr_clear_bits(15 downto 0);
|
| 321 |
+
elsif input.operand2(11 downto 0) = CSR_MTVEC then
|
| 322 |
+
v_output.result := mtvec_address & "0" & mtvec_mode;
|
| 323 |
+
mtvec_address <= (mtvec_address or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
|
| 324 |
+
mtvec_mode <= (mtvec_mode or csr_set_bits(0)) and csr_clear_bits(0);
|
| 325 |
+
elsif input.operand2(11 downto 0) = CSR_MSTATUSH then
|
| 326 |
+
v_output.result := (others => '0');
|
| 327 |
+
elsif input.operand2(11 downto 0) = CSR_MSCRATCH then
|
| 328 |
+
v_output.result := mscratch;
|
| 329 |
+
mscratch <= (mscratch or csr_set_bits) and csr_clear_bits;
|
| 330 |
+
elsif input.operand2(11 downto 0) = CSR_MEPC then
|
| 331 |
+
v_output.result := mepc & "00";
|
| 332 |
+
v_mepc := (mepc or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
|
| 333 |
+
elsif input.operand2(11 downto 0) = CSR_MCAUSE then
|
| 334 |
+
v_output.result := mcause_int & "000000000000000000000000000" & mcause_code;
|
| 335 |
+
mcause_int <= (mcause_int or csr_set_bits(31)) and csr_clear_bits(31);
|
| 336 |
+
mcause_code <= (mcause_code or csr_set_bits(5 downto 0)) and csr_clear_bits(5 downto 0);
|
| 337 |
+
elsif input.operand2(11 downto 0) = CSR_MTVAL then
|
| 338 |
+
v_output.result := mtval;
|
| 339 |
+
mtval <= (mtval or csr_set_bits) and csr_clear_bits;
|
| 340 |
+
elsif input.operand2(11 downto 0) = CSR_MIP then
|
| 341 |
+
v_output.result := x"0000" & mip;
|
| 342 |
+
mip <= (mip or csr_set_bits(15 downto 0)) and csr_clear_bits(15 downto 0);
|
| 343 |
+
elsif input.operand2(11 downto 0) = CSR_MCYCLE then
|
| 344 |
+
v_output.result := mcycle;
|
| 345 |
+
v_mcycle := (mcycle or csr_set_bits) and csr_clear_bits;
|
| 346 |
+
elsif input.operand2(11 downto 0) = CSR_MINSTRET then
|
| 347 |
+
v_output.result := minstret;
|
| 348 |
+
v_minstret := (minstret or csr_set_bits) and csr_clear_bits;
|
| 349 |
+
elsif unsigned(CSR_MHPMCOUNTER3) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMCOUNTER31) then
|
| 350 |
+
v_output.result := (others => '0');
|
| 351 |
+
elsif input.operand2(11 downto 0) = CSR_MCYCLEH then
|
| 352 |
+
v_output.result := mcycleh;
|
| 353 |
+
v_mcycleh := (mcycleh or csr_set_bits) and csr_clear_bits;
|
| 354 |
+
elsif input.operand2(11 downto 0) = CSR_MINSTRETH then
|
| 355 |
+
v_output.result := minstreth;
|
| 356 |
+
v_minstreth := (minstreth or csr_set_bits) and csr_clear_bits;
|
| 357 |
+
elsif unsigned(CSR_MHPMCOUNTER3H) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMCOUNTER31H) then
|
| 358 |
+
v_output.result := (others => '0');
|
| 359 |
+
elsif unsigned(CSR_MHPMEVENT3) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMEVENT31) then
|
| 360 |
+
v_output.result := (others => '0');
|
| 361 |
+
elsif unsigned(CSR_MHPMEVENT3H) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMEVENT31H) then
|
| 362 |
+
v_output.result := (others => '0');
|
| 363 |
+
elsif input.csr_read_only = '1' then
|
| 364 |
+
-- read-only CSRs
|
| 365 |
+
if input.operand2(11 downto 0) = CSR_MVENDORID then
|
| 366 |
+
v_output.result := MVENDORID_VALUE;
|
| 367 |
+
elsif input.operand2(11 downto 0) = CSR_MARCHID then
|
| 368 |
+
v_output.result := MARCHID_VALUE;
|
| 369 |
+
elsif input.operand2(11 downto 0) = CSR_MIMPID then
|
| 370 |
+
v_output.result := MIMPID_VALUE;
|
| 371 |
+
elsif input.operand2(11 downto 0) = CSR_MHARTID then
|
| 372 |
+
v_output.result := MHARTID_VALUE;
|
| 373 |
+
elsif input.operand2(11 downto 0) = CSR_MCONFIGPTR then
|
| 374 |
+
v_output.result := MCONFIGPTR_VALUE;
|
| 375 |
+
else
|
| 376 |
+
-- trying to read non-existent CSR
|
| 377 |
+
has_exception := true;
|
| 378 |
+
exception_cause := EX_CAUSE_ILLEGAL_INSTRUCTION;
|
| 379 |
+
end if;
|
| 380 |
else
|
| 381 |
+
-- trying to write to non-existent or read-only CSR
|
| 382 |
+
has_exception := true;
|
| 383 |
+
exception_cause := EX_CAUSE_ILLEGAL_INSTRUCTION;
|
| 384 |
end if;
|
| 385 |
+
elsif input.operation = OP_MRET then
|
| 386 |
+
mstatus_mie <= mstatus_mpie;
|
| 387 |
+
mstatus_mpie <= '1';
|
| 388 |
+
v_jump := '1';
|
| 389 |
+
v_jump_address := mepc & "00";
|
| 390 |
+
-- TODO: reset mepc?
|
| 391 |
+
elsif input.operation = OP_ECALL then
|
| 392 |
+
has_exception := true;
|
| 393 |
+
exception_cause := EX_CAUSE_ENVIRONMENT_CALL;
|
| 394 |
+
elsif input.operation = OP_EBREAK then
|
| 395 |
+
has_exception := true;
|
| 396 |
+
exception_cause := EX_CAUSE_BREAKPOINT;
|
| 397 |
+
elsif input.operation = OP_LED then
|
| 398 |
+
led <= input.operand1(7 downto 0);
|
| 399 |
else
|
| 400 |
+
assert false report "Unhandled operation value in execute stage" severity failure;
|
| 401 |
end if;
|
| 402 |
+
|
| 403 |
+
v_output.destination_reg := input.destination_reg;
|
| 404 |
+
end if;
|
| 405 |
+
|
| 406 |
+
if v_jump = '1' and v_jump_address(1) /= '0' then
|
| 407 |
+
has_exception := true;
|
| 408 |
+
exception_cause := EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED;
|
|
|
|
|
|
|
| 409 |
end if;
|
| 410 |
|
| 411 |
+
if has_exception then
|
| 412 |
+
v_output := DEFAULT_EXECUTE_OUTPUT;
|
| 413 |
+
v_output.is_active := '1'; -- needed to trigger the next instruction
|
| 414 |
+
v_mem_req := DEFAULT_MEM_REQ;
|
| 415 |
+
v_jump := '1';
|
| 416 |
+
v_jump_address := mtvec_address & "00";
|
| 417 |
+
v_mcycle := v_mcycle_inc;
|
| 418 |
+
v_mcycleh := v_mcycleh_inc;
|
| 419 |
+
v_minstret := v_minstret_inc;
|
| 420 |
+
v_minstreth := v_minstreth_inc;
|
| 421 |
+
v_mepc := input.pc(31 downto 2);
|
| 422 |
+
v_mcause_int := '0';
|
| 423 |
+
v_mcause_code := exception_cause;
|
| 424 |
+
end if;
|
| 425 |
end if;
|
| 426 |
|
| 427 |
output <= v_output;
|
|
|
|
| 428 |
mem_req <= v_mem_req;
|
|
|
|
| 429 |
jump <= v_jump;
|
| 430 |
jump_address <= v_jump_address(31 downto 1) & "0";
|
| 431 |
+
mcycle <= v_mcycle;
|
| 432 |
+
mcycleh <= v_mcycleh;
|
| 433 |
+
minstret <= v_minstret;
|
| 434 |
+
minstreth <= v_minstreth;
|
| 435 |
+
mepc <= v_mepc;
|
| 436 |
+
mcause_int <= v_mcause_int;
|
| 437 |
+
mcause_code <= v_mcause_code;
|
| 438 |
end if;
|
| 439 |
end process;
|
| 440 |
|
|
@@ -33,6 +33,8 @@ package core_types is
|
|
| 33 |
OP_CSRRS,
|
| 34 |
OP_CSRRC,
|
| 35 |
OP_MRET,
|
|
|
|
|
|
|
| 36 |
OP_LED
|
| 37 |
);
|
| 38 |
|
|
@@ -45,12 +47,14 @@ package core_types is
|
|
| 45 |
type decode_output_t is record
|
| 46 |
is_active: std_logic;
|
| 47 |
is_invalid: std_logic;
|
|
|
|
| 48 |
operation: operation_t;
|
| 49 |
operand1: std_logic_vector(31 downto 0);
|
| 50 |
operand2: std_logic_vector(31 downto 0);
|
| 51 |
operand3: std_logic_vector(31 downto 0);
|
| 52 |
destination_reg: std_logic_vector(4 downto 0);
|
| 53 |
csr_read_only: std_logic;
|
|
|
|
| 54 |
end record decode_output_t;
|
| 55 |
|
| 56 |
type read_size_t is (SIZE_WORD, SIZE_HALFWORD, SIZE_BYTE);
|
|
|
|
| 33 |
OP_CSRRS,
|
| 34 |
OP_CSRRC,
|
| 35 |
OP_MRET,
|
| 36 |
+
OP_ECALL,
|
| 37 |
+
OP_EBREAK,
|
| 38 |
OP_LED
|
| 39 |
);
|
| 40 |
|
|
|
|
| 47 |
type decode_output_t is record
|
| 48 |
is_active: std_logic;
|
| 49 |
is_invalid: std_logic;
|
| 50 |
+
is_invalid_address: std_logic;
|
| 51 |
operation: operation_t;
|
| 52 |
operand1: std_logic_vector(31 downto 0);
|
| 53 |
operand2: std_logic_vector(31 downto 0);
|
| 54 |
operand3: std_logic_vector(31 downto 0);
|
| 55 |
destination_reg: std_logic_vector(4 downto 0);
|
| 56 |
csr_read_only: std_logic;
|
| 57 |
+
pc: std_logic_vector(31 downto 0);
|
| 58 |
end record decode_output_t;
|
| 59 |
|
| 60 |
type read_size_t is (SIZE_WORD, SIZE_HALFWORD, SIZE_BYTE);
|
...
|
@@ -80,6 +80,9 @@ package core_constants is
|
|
| 80 |
|
| 81 |
constant MISA_VALUE: std_logic_vector(31 downto 0) := X"40000100"; -- 32-bit RVI
|
| 82 |
|
|
|
|
|
|
|
|
|
|
| 83 |
constant EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0000";
|
| 84 |
constant EX_CAUSE_INSTRUCTION_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0001";
|
| 85 |
constant EX_CAUSE_ILLEGAL_INSTRUCTION: std_logic_vector(3 downto 0) := "0010";
|
|
|
|
| 80 |
|
| 81 |
constant MISA_VALUE: std_logic_vector(31 downto 0) := X"40000100"; -- 32-bit RVI
|
| 82 |
|
| 83 |
+
constant MTIME_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFF8";
|
| 84 |
+
constant MTIMEH_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFFC";
|
| 85 |
+
|
| 86 |
constant EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0000";
|
| 87 |
constant EX_CAUSE_INSTRUCTION_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0001";
|
| 88 |
constant EX_CAUSE_ILLEGAL_INSTRUCTION: std_logic_vector(3 downto 0) := "0010";
|
|
@@ -38,6 +38,8 @@ architecture rtl of execute is
|
|
| 38 |
signal minstret: std_logic_vector(31 downto 0) := (others => '0');
|
| 39 |
signal mcycleh: std_logic_vector(31 downto 0) := (others => '0');
|
| 40 |
signal minstreth: std_logic_vector(31 downto 0) := (others => '0');
|
|
|
|
|
|
|
| 41 |
begin
|
| 42 |
|
| 43 |
process (clk)
|
|
@@ -53,6 +55,8 @@ begin
|
|
| 53 |
variable v_mepc: std_logic_vector(29 downto 0);
|
| 54 |
variable v_mcause_int: std_logic;
|
| 55 |
variable v_mcause_code: std_logic_vector(3 downto 0);
|
|
|
|
|
|
|
| 56 |
|
| 57 |
variable v_address, v_value: std_logic_vector(31 downto 0);
|
| 58 |
|
|
@@ -75,10 +79,17 @@ begin
|
|
| 75 |
v_mcycle := v_mcycle_inc;
|
| 76 |
v_mcycleh_inc := std_logic_vector(v_temp(63 downto 32));
|
| 77 |
v_mcycleh := v_mcycleh_inc;
|
|
|
|
| 78 |
v_mepc := mepc;
|
| 79 |
v_mcause_int := mcause_int;
|
| 80 |
v_mcause_code := mcause_code;
|
| 81 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
has_exception := false;
|
| 83 |
exception_cause := (others => '0');
|
| 84 |
|
|
@@ -244,54 +255,66 @@ begin
|
|
| 244 |
exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
|
| 245 |
end if;
|
| 246 |
elsif input.operation = OP_SW then
|
| 247 |
-
v_mem_req.active := '1';
|
| 248 |
-
v_mem_req.write_enable := "1111";
|
| 249 |
v_mem_req.address := input.operand1;
|
| 250 |
-
v_mem_req.value := input.operand2;
|
| 251 |
|
| 252 |
-
if v_address
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
v_address := input.operand1;
|
| 261 |
-
|
| 262 |
-
v_output.use_mem := '1';
|
| 263 |
-
v_output.mem_addr := v_address(1 downto 0);
|
| 264 |
-
|
| 265 |
-
v_mem_req.active := '1';
|
| 266 |
-
v_mem_req.address := v_address;
|
| 267 |
-
|
| 268 |
-
if input.operation = OP_LB or input.operation = OP_LH then
|
| 269 |
-
v_output.mem_sign_extend := '1';
|
| 270 |
-
end if;
|
| 271 |
|
| 272 |
-
|
| 273 |
-
v_output.mem_size := SIZE_BYTE;
|
| 274 |
-
if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 275 |
-
has_exception := true;
|
| 276 |
-
exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
|
| 277 |
-
end if;
|
| 278 |
-
elsif input.operation = OP_LH or input.operation = OP_LHU then
|
| 279 |
-
v_output.mem_size := SIZE_HALFWORD;
|
| 280 |
-
if v_address(0) /= '0' then
|
| 281 |
has_exception := true;
|
| 282 |
-
exception_cause :=
|
| 283 |
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 284 |
has_exception := true;
|
| 285 |
-
exception_cause :=
|
| 286 |
end if;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 287 |
else
|
| 288 |
-
v_output.
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 295 |
end if;
|
| 296 |
end if;
|
| 297 |
elsif input.operation = OP_CSRRW or input.operation = OP_CSRRS or input.operation = OP_CSRRC then
|
|
@@ -416,6 +439,8 @@ begin
|
|
| 416 |
v_jump_address := mtvec_address & "00";
|
| 417 |
v_mcycle := v_mcycle_inc;
|
| 418 |
v_mcycleh := v_mcycleh_inc;
|
|
|
|
|
|
|
| 419 |
v_minstret := v_minstret_inc;
|
| 420 |
v_minstreth := v_minstreth_inc;
|
| 421 |
v_mepc := input.pc(31 downto 2);
|
|
@@ -430,6 +455,8 @@ begin
|
|
| 430 |
jump_address <= v_jump_address(31 downto 1) & "0";
|
| 431 |
mcycle <= v_mcycle;
|
| 432 |
mcycleh <= v_mcycleh;
|
|
|
|
|
|
|
| 433 |
minstret <= v_minstret;
|
| 434 |
minstreth <= v_minstreth;
|
| 435 |
mepc <= v_mepc;
|
|
|
|
| 38 |
signal minstret: std_logic_vector(31 downto 0) := (others => '0');
|
| 39 |
signal mcycleh: std_logic_vector(31 downto 0) := (others => '0');
|
| 40 |
signal minstreth: std_logic_vector(31 downto 0) := (others => '0');
|
| 41 |
+
signal mtime: std_logic_vector(31 downto 0) := (others => '0');
|
| 42 |
+
signal mtimeh: std_logic_vector(31 downto 0) := (others => '0');
|
| 43 |
begin
|
| 44 |
|
| 45 |
process (clk)
|
|
|
|
| 55 |
variable v_mepc: std_logic_vector(29 downto 0);
|
| 56 |
variable v_mcause_int: std_logic;
|
| 57 |
variable v_mcause_code: std_logic_vector(3 downto 0);
|
| 58 |
+
variable v_mtime_inc, v_mtimeh_inc: std_logic_vector(31 downto 0);
|
| 59 |
+
variable v_mtime, v_mtimeh: std_logic_vector(31 downto 0);
|
| 60 |
|
| 61 |
variable v_address, v_value: std_logic_vector(31 downto 0);
|
| 62 |
|
|
|
|
| 79 |
v_mcycle := v_mcycle_inc;
|
| 80 |
v_mcycleh_inc := std_logic_vector(v_temp(63 downto 32));
|
| 81 |
v_mcycleh := v_mcycleh_inc;
|
| 82 |
+
|
| 83 |
v_mepc := mepc;
|
| 84 |
v_mcause_int := mcause_int;
|
| 85 |
v_mcause_code := mcause_code;
|
| 86 |
|
| 87 |
+
v_temp := unsigned(mtimeh & mtime) + 1;
|
| 88 |
+
v_mtime_inc := std_logic_vector(v_temp(31 downto 0));
|
| 89 |
+
v_mtime := v_mtime_inc;
|
| 90 |
+
v_mtimeh_inc := std_logic_vector(v_temp(63 downto 32));
|
| 91 |
+
v_mtimeh := v_mtimeh_inc;
|
| 92 |
+
|
| 93 |
has_exception := false;
|
| 94 |
exception_cause := (others => '0');
|
| 95 |
|
|
|
|
| 255 |
exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
|
| 256 |
end if;
|
| 257 |
elsif input.operation = OP_SW then
|
|
|
|
|
|
|
| 258 |
v_mem_req.address := input.operand1;
|
|
|
|
| 259 |
|
| 260 |
+
if v_address = MTIME_ADDRESS then
|
| 261 |
+
v_mtime := input.operand2;
|
| 262 |
+
elsif v_address = MTIMEH_ADDRESS then
|
| 263 |
+
v_mtimeh := input.operand2;
|
| 264 |
+
else
|
| 265 |
+
v_mem_req.active := '1';
|
| 266 |
+
v_mem_req.write_enable := "1111";
|
| 267 |
+
v_mem_req.value := input.operand2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 268 |
|
| 269 |
+
if v_address(1 downto 0) /= "00" then
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 270 |
has_exception := true;
|
| 271 |
+
exception_cause := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
|
| 272 |
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 273 |
has_exception := true;
|
| 274 |
+
exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
|
| 275 |
end if;
|
| 276 |
+
end if;
|
| 277 |
+
elsif input.operation = OP_LB or input.operation = OP_LH or input.operation = OP_LW or input.operation = OP_LBU or input.operation = OP_LHU then
|
| 278 |
+
v_address := input.operand1;
|
| 279 |
+
|
| 280 |
+
if input.operation = OP_LW and v_address = MTIME_ADDRESS then
|
| 281 |
+
v_output.result := mtime;
|
| 282 |
+
elsif input.operation = OP_LW and v_address = MTIMEH_ADDRESS then
|
| 283 |
+
v_output.result := mtimeh;
|
| 284 |
else
|
| 285 |
+
v_output.use_mem := '1';
|
| 286 |
+
v_output.mem_addr := v_address(1 downto 0);
|
| 287 |
+
v_mem_req.active := '1';
|
| 288 |
+
v_mem_req.address := v_address;
|
| 289 |
+
|
| 290 |
+
if input.operation = OP_LB or input.operation = OP_LH then
|
| 291 |
+
v_output.mem_sign_extend := '1';
|
| 292 |
+
end if;
|
| 293 |
+
|
| 294 |
+
if input.operation = OP_LB or input.operation = OP_LBU then
|
| 295 |
+
v_output.mem_size := SIZE_BYTE;
|
| 296 |
+
if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 297 |
+
has_exception := true;
|
| 298 |
+
exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
|
| 299 |
+
end if;
|
| 300 |
+
elsif input.operation = OP_LH or input.operation = OP_LHU then
|
| 301 |
+
v_output.mem_size := SIZE_HALFWORD;
|
| 302 |
+
if v_address(0) /= '0' then
|
| 303 |
+
has_exception := true;
|
| 304 |
+
exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
|
| 305 |
+
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 306 |
+
has_exception := true;
|
| 307 |
+
exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
|
| 308 |
+
end if;
|
| 309 |
+
else
|
| 310 |
+
v_output.mem_size := SIZE_WORD;
|
| 311 |
+
if v_address(1 downto 0) /= "00" then
|
| 312 |
+
has_exception := true;
|
| 313 |
+
exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
|
| 314 |
+
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 315 |
+
has_exception := true;
|
| 316 |
+
exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
|
| 317 |
+
end if;
|
| 318 |
end if;
|
| 319 |
end if;
|
| 320 |
elsif input.operation = OP_CSRRW or input.operation = OP_CSRRS or input.operation = OP_CSRRC then
|
|
|
|
| 439 |
v_jump_address := mtvec_address & "00";
|
| 440 |
v_mcycle := v_mcycle_inc;
|
| 441 |
v_mcycleh := v_mcycleh_inc;
|
| 442 |
+
v_mtime := v_mtime_inc;
|
| 443 |
+
v_mtimeh := v_mtimeh_inc;
|
| 444 |
v_minstret := v_minstret_inc;
|
| 445 |
v_minstreth := v_minstreth_inc;
|
| 446 |
v_mepc := input.pc(31 downto 2);
|
|
|
|
| 455 |
jump_address <= v_jump_address(31 downto 1) & "0";
|
| 456 |
mcycle <= v_mcycle;
|
| 457 |
mcycleh <= v_mcycleh;
|
| 458 |
+
mtime <= v_mtime;
|
| 459 |
+
mtimeh <= v_mtimeh;
|
| 460 |
minstret <= v_minstret;
|
| 461 |
minstreth <= v_minstreth;
|
| 462 |
mepc <= v_mepc;
|
...
|
@@ -2,538 +2,543 @@ library ieee;
|
|
| 2 |
use ieee.std_logic_1164.all;
|
| 3 |
use ieee.std_logic_unsigned.all;
|
| 4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
entity bram is
|
| 6 |
port(
|
| 7 |
clka: in std_logic;
|
| 8 |
ena: in std_logic;
|
| 9 |
wea: in std_logic_vector(3 downto 0);
|
| 10 |
-
addra: in std_logic_vector(
|
| 11 |
dia: in std_logic_vector(31 downto 0);
|
| 12 |
doa: out std_logic_vector(31 downto 0);
|
| 13 |
clkb: in std_logic;
|
| 14 |
enb: in std_logic;
|
| 15 |
-
addrb: in std_logic_vector(
|
| 16 |
dob: out std_logic_vector(31 downto 0)
|
| 17 |
);
|
| 18 |
end bram;
|
| 19 |
|
| 20 |
architecture rtl of bram is
|
|
|
|
| 21 |
type ram_type is array (0 to 4095) of std_logic_vector(31 downto 0);
|
| 22 |
shared variable RAM: ram_type := (
|
| 23 |
-
X"
|
| 24 |
-
X"
|
| 25 |
-
X"
|
| 26 |
-
X"
|
| 27 |
-
X"
|
| 28 |
-
X"
|
| 29 |
-
X"
|
| 30 |
-
X"
|
| 31 |
-
X"
|
| 32 |
-
X"
|
| 33 |
-
X"
|
| 34 |
-
X"
|
| 35 |
-
X"
|
| 36 |
-
X"
|
| 37 |
-
X"
|
| 38 |
-
X"
|
| 39 |
-
X"
|
| 40 |
-
X"
|
| 41 |
-
X"
|
| 42 |
-
X"
|
| 43 |
-
X"
|
| 44 |
-
X"
|
| 45 |
-
X"
|
| 46 |
-
X"
|
| 47 |
-
X"
|
| 48 |
-
X"
|
| 49 |
-
X"
|
| 50 |
-
X"
|
| 51 |
-
X"
|
| 52 |
-
X"
|
| 53 |
-
X"
|
| 54 |
-
X"
|
| 55 |
-
X"
|
| 56 |
-
X"
|
| 57 |
-
X"
|
| 58 |
-
X"
|
| 59 |
-
X"
|
| 60 |
-
X"
|
| 61 |
-
X"
|
| 62 |
-
X"
|
| 63 |
-
X"
|
| 64 |
-
X"
|
| 65 |
-
X"
|
| 66 |
-
X"
|
| 67 |
-
X"
|
| 68 |
-
X"
|
| 69 |
-
X"
|
| 70 |
-
X"
|
| 71 |
-
X"
|
| 72 |
-
X"
|
| 73 |
-
X"
|
| 74 |
-
X"
|
| 75 |
-
X"
|
| 76 |
-
X"
|
| 77 |
-
X"
|
| 78 |
-
X"
|
| 79 |
-
X"
|
| 80 |
-
X"
|
| 81 |
-
X"
|
| 82 |
-
X"
|
| 83 |
-
X"
|
| 84 |
-
X"
|
| 85 |
-
X"
|
| 86 |
-
X"
|
| 87 |
-
X"
|
| 88 |
-
X"
|
| 89 |
-
X"
|
| 90 |
-
X"
|
| 91 |
-
X"
|
| 92 |
-
X"
|
| 93 |
-
X"
|
| 94 |
-
X"
|
| 95 |
-
X"
|
| 96 |
-
X"
|
| 97 |
-
X"
|
| 98 |
-
X"
|
| 99 |
-
X"
|
| 100 |
-
X"
|
| 101 |
-
X"
|
| 102 |
-
X"
|
| 103 |
-
X"
|
| 104 |
-
X"
|
| 105 |
-
X"
|
| 106 |
-
X"
|
| 107 |
-
X"
|
| 108 |
-
X"
|
| 109 |
-
X"
|
| 110 |
-
X"
|
| 111 |
-
X"
|
| 112 |
-
X"
|
| 113 |
-
X"
|
| 114 |
-
X"
|
| 115 |
-
X"
|
| 116 |
-
X"
|
| 117 |
-
X"
|
| 118 |
-
X"
|
| 119 |
-
X"
|
| 120 |
-
X"
|
| 121 |
-
X"
|
| 122 |
-
X"
|
| 123 |
-
X"
|
| 124 |
-
X"
|
| 125 |
-
X"
|
| 126 |
-
X"
|
| 127 |
-
X"
|
| 128 |
-
X"
|
| 129 |
-
X"
|
| 130 |
-
X"
|
| 131 |
-
X"
|
| 132 |
-
X"
|
| 133 |
-
X"
|
| 134 |
-
X"
|
| 135 |
-
X"
|
| 136 |
-
X"
|
| 137 |
-
X"
|
| 138 |
-
X"
|
| 139 |
-
X"
|
| 140 |
-
X"
|
| 141 |
-
X"
|
| 142 |
-
X"
|
| 143 |
-
X"
|
| 144 |
-
X"
|
| 145 |
-
X"
|
| 146 |
-
X"
|
| 147 |
-
X"
|
| 148 |
-
X"
|
| 149 |
-
X"
|
| 150 |
-
X"
|
| 151 |
-
X"
|
| 152 |
-
X"
|
| 153 |
-
X"
|
| 154 |
-
X"
|
| 155 |
-
X"
|
| 156 |
-
X"
|
| 157 |
-
X"
|
| 158 |
-
X"
|
| 159 |
-
X"
|
| 160 |
-
X"
|
| 161 |
-
X"
|
| 162 |
-
X"
|
| 163 |
-
X"
|
| 164 |
-
X"
|
| 165 |
-
X"
|
| 166 |
-
X"
|
| 167 |
-
X"
|
| 168 |
-
X"
|
| 169 |
-
X"
|
| 170 |
-
X"
|
| 171 |
-
X"
|
| 172 |
-
X"
|
| 173 |
-
X"
|
| 174 |
-
X"
|
| 175 |
-
X"
|
| 176 |
-
X"
|
| 177 |
-
X"
|
| 178 |
-
X"
|
| 179 |
-
X"
|
| 180 |
-
X"
|
| 181 |
-
X"
|
| 182 |
-
X"
|
| 183 |
-
X"
|
| 184 |
-
X"
|
| 185 |
-
X"
|
| 186 |
-
X"
|
| 187 |
-
X"
|
| 188 |
-
X"
|
| 189 |
-
X"
|
| 190 |
-
X"
|
| 191 |
-
X"
|
| 192 |
-
X"
|
| 193 |
-
X"
|
| 194 |
-
X"
|
| 195 |
-
X"
|
| 196 |
-
X"
|
| 197 |
-
X"
|
| 198 |
-
X"
|
| 199 |
-
X"
|
| 200 |
-
X"
|
| 201 |
-
X"
|
| 202 |
-
X"
|
| 203 |
-
X"
|
| 204 |
-
X"
|
| 205 |
-
X"
|
| 206 |
-
X"
|
| 207 |
-
X"
|
| 208 |
-
X"
|
| 209 |
-
X"
|
| 210 |
-
X"
|
| 211 |
-
X"
|
| 212 |
-
X"
|
| 213 |
-
X"
|
| 214 |
-
X"
|
| 215 |
-
X"
|
| 216 |
-
X"
|
| 217 |
-
X"
|
| 218 |
-
X"
|
| 219 |
-
X"
|
| 220 |
-
X"
|
| 221 |
-
X"
|
| 222 |
-
X"
|
| 223 |
-
X"
|
| 224 |
-
X"
|
| 225 |
-
X"
|
| 226 |
-
X"
|
| 227 |
-
X"
|
| 228 |
-
X"
|
| 229 |
-
X"
|
| 230 |
-
X"
|
| 231 |
-
X"
|
| 232 |
-
X"
|
| 233 |
-
X"
|
| 234 |
-
X"
|
| 235 |
-
X"
|
| 236 |
-
X"
|
| 237 |
-
X"
|
| 238 |
-
X"
|
| 239 |
-
X"
|
| 240 |
-
X"
|
| 241 |
-
X"
|
| 242 |
-
X"
|
| 243 |
-
X"
|
| 244 |
-
X"
|
| 245 |
-
X"
|
| 246 |
-
X"
|
| 247 |
-
X"
|
| 248 |
-
X"
|
| 249 |
-
X"
|
| 250 |
-
X"
|
| 251 |
-
X"
|
| 252 |
-
X"
|
| 253 |
-
X"
|
| 254 |
-
X"
|
| 255 |
-
X"
|
| 256 |
-
X"
|
| 257 |
-
X"
|
| 258 |
-
X"
|
| 259 |
-
X"
|
| 260 |
-
X"
|
| 261 |
-
X"
|
| 262 |
-
X"
|
| 263 |
-
X"
|
| 264 |
-
X"
|
| 265 |
-
X"
|
| 266 |
-
X"
|
| 267 |
-
X"
|
| 268 |
-
X"
|
| 269 |
-
X"
|
| 270 |
-
X"
|
| 271 |
-
X"
|
| 272 |
-
X"
|
| 273 |
-
X"
|
| 274 |
-
X"
|
| 275 |
-
X"
|
| 276 |
-
X"
|
| 277 |
-
X"
|
| 278 |
-
X"
|
| 279 |
-
X"
|
| 280 |
-
X"
|
| 281 |
-
X"
|
| 282 |
-
X"
|
| 283 |
-
X"
|
| 284 |
-
X"
|
| 285 |
-
X"
|
| 286 |
-
X"
|
| 287 |
-
X"
|
| 288 |
-
X"
|
| 289 |
-
X"
|
| 290 |
-
X"
|
| 291 |
-
X"
|
| 292 |
-
X"
|
| 293 |
-
X"
|
| 294 |
-
X"
|
| 295 |
-
X"
|
| 296 |
-
X"
|
| 297 |
-
X"
|
| 298 |
-
X"
|
| 299 |
-
X"
|
| 300 |
-
X"
|
| 301 |
-
X"
|
| 302 |
-
X"
|
| 303 |
-
X"
|
| 304 |
-
X"
|
| 305 |
-
X"
|
| 306 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 307 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 308 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 309 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 310 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 311 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 312 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 313 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 314 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 315 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 316 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 317 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 318 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 319 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 320 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 321 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 322 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 323 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 324 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 325 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 326 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 327 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 328 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 329 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 330 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 331 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 332 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 333 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 334 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 335 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 336 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 337 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 338 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 339 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 340 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 341 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 342 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 343 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 344 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 345 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 346 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 347 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 348 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 349 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 350 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 351 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 352 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 353 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 354 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 355 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 356 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 357 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 358 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 359 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 360 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 361 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 362 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 363 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 364 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 365 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 366 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 367 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 368 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 369 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 370 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 371 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 372 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 373 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 374 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 375 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 376 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 377 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 378 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 379 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 380 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 381 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 382 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 383 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 384 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 385 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 386 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 387 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 388 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 389 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 390 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 391 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 392 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 393 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 394 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 395 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 396 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 397 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 398 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 399 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 400 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 401 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 402 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 403 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 404 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 405 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 406 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 407 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 408 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 409 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 410 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 411 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 412 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 413 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 414 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 415 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 416 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 417 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 418 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 419 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 420 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 421 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 422 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 423 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 424 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 425 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 426 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 427 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 428 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 429 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 430 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 431 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 432 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 433 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 434 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 435 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 436 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 437 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 438 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 439 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 440 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 441 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 442 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 443 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 444 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 445 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 446 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 447 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 448 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 449 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 450 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 451 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 452 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 453 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 454 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 455 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 456 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 457 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 458 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 459 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 460 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 461 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 462 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 463 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 464 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 465 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 466 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 467 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 468 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 469 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 470 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 471 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 472 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 473 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 474 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 475 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 476 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 477 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 478 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 479 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 480 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 481 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 482 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 483 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 484 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 485 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 486 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 487 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 488 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 489 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 490 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 491 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 492 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 493 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 494 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 495 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 496 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 497 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 498 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 499 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 500 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 501 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 502 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 503 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 504 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 505 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 506 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 507 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 508 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 509 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 510 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 511 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 512 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 513 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 514 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 515 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 516 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 517 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 518 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 519 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 520 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 521 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 522 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 523 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 524 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 525 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 526 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 527 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 528 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 529 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 530 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 531 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 532 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 533 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 534 |
-
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000"
|
| 535 |
);
|
| 536 |
-
|
| 537 |
begin
|
| 538 |
|
| 539 |
-- port A
|
|
@@ -560,4 +565,4 @@ begin
|
|
| 560 |
end if;
|
| 561 |
end if;
|
| 562 |
end process;
|
| 563 |
-
end rtl;
|
|
|
|
| 2 |
use ieee.std_logic_1164.all;
|
| 3 |
use ieee.std_logic_unsigned.all;
|
| 4 |
|
| 5 |
+
use work.types.all;
|
| 6 |
+
use work.constants.all;
|
| 7 |
+
|
| 8 |
+
|
| 9 |
entity bram is
|
| 10 |
port(
|
| 11 |
clka: in std_logic;
|
| 12 |
ena: in std_logic;
|
| 13 |
wea: in std_logic_vector(3 downto 0);
|
| 14 |
+
addra: in std_logic_vector(MEM_ADDRESS_BITS - 3 downto 0);
|
| 15 |
dia: in std_logic_vector(31 downto 0);
|
| 16 |
doa: out std_logic_vector(31 downto 0);
|
| 17 |
clkb: in std_logic;
|
| 18 |
enb: in std_logic;
|
| 19 |
+
addrb: in std_logic_vector(MEM_ADDRESS_BITS - 3 downto 0);
|
| 20 |
dob: out std_logic_vector(31 downto 0)
|
| 21 |
);
|
| 22 |
end bram;
|
| 23 |
|
| 24 |
architecture rtl of bram is
|
| 25 |
+
-- START PROGMEM
|
| 26 |
type ram_type is array (0 to 4095) of std_logic_vector(31 downto 0);
|
| 27 |
shared variable RAM: ram_type := (
|
| 28 |
+
X"93020000", X"73930234", X"93028000", X"f3a30234", X"93028000", X"73be0234", X"73600434", X"73700434",
|
| 29 |
+
X"f32e0034", X"736f0034", X"b7220000", X"93820280", X"f39f0234", X"6f000000", X"00000000", X"00000000",
|
| 30 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 31 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 32 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 33 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 34 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 35 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 36 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 37 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 38 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 39 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 40 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 41 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 42 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 43 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 44 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 45 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 46 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 47 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 48 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 49 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 50 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 51 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 52 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 53 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 54 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 55 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 56 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 57 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 58 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 59 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 60 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 61 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 62 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 63 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 64 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 65 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 66 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 67 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 68 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 69 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 70 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 71 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 72 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 73 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 74 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 75 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 76 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 77 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 78 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 79 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 80 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 81 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 82 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 83 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 84 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 85 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 86 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 87 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 88 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 89 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 90 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 91 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 92 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 93 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 94 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 95 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 96 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 97 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 98 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 99 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 100 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 101 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 102 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 103 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 104 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 105 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 106 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 107 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 108 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 109 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 110 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 111 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 112 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 113 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 114 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 115 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 116 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 117 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 118 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 119 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 120 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 121 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 122 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 123 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 124 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 125 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 126 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 127 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 128 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 129 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 130 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 131 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 132 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 133 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 134 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 135 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 136 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 137 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 138 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 139 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 140 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 141 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 142 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 143 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 144 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 145 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 146 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 147 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 148 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 149 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 150 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 151 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 152 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 153 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 154 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 155 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 156 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 157 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 158 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 159 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 160 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 161 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 162 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 163 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 164 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 165 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 166 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 167 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 168 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 169 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 170 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 171 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 172 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 173 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 174 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 175 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 176 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 177 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 178 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 179 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 180 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 181 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 182 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 183 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 184 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 185 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 186 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 187 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 188 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 189 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 190 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 191 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 192 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 193 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 194 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 195 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 196 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 197 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 198 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 199 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 200 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 201 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 202 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 203 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 204 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 205 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 206 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 207 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 208 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 209 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 210 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 211 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 212 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 213 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 214 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 215 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 216 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 217 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 218 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 219 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 220 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 221 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 222 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 223 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 224 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 225 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 226 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 227 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 228 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 229 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 230 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 231 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 232 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 233 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 234 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 235 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 236 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 237 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 238 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 239 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 240 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 241 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 242 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 243 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 244 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 245 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 246 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 247 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 248 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 249 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 250 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 251 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 252 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 253 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 254 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 255 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 256 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 257 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 258 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 259 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 260 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 261 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 262 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 263 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 264 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 265 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 266 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 267 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 268 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 269 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 270 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 271 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 272 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 273 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 274 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 275 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 276 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 277 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 278 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 279 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 280 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 281 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 282 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 283 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 284 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 285 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 286 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 287 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 288 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 289 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 290 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 291 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 292 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 293 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 294 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 295 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 296 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 297 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 298 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 299 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 300 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 301 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 302 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 303 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 304 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 305 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 306 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 307 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 308 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 309 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 310 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 311 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 312 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 313 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 314 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 315 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 316 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 317 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 318 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 319 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 320 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 321 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 322 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 323 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 324 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 325 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 326 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 327 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 328 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 329 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 330 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 331 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 332 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 333 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 334 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 335 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 336 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 337 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 338 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 339 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 340 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 341 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 342 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 343 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 344 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 345 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 346 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 347 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 348 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 349 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 350 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 351 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 352 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 353 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 354 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 355 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 356 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 357 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 358 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 359 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 360 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 361 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 362 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 363 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 364 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 365 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 366 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 367 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 368 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 369 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 370 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 371 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 372 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 373 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 374 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 375 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 376 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 377 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 378 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 379 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 380 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 381 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 382 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 383 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 384 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 385 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 386 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 387 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 388 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 389 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 390 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 391 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 392 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 393 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 394 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 395 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 396 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 397 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 398 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 399 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 400 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 401 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 402 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 403 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 404 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 405 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 406 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 407 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 408 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 409 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 410 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 411 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 412 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 413 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 414 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 415 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 416 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 417 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 418 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 419 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 420 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 421 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 422 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 423 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 424 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 425 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 426 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 427 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 428 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 429 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 430 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 431 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 432 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 433 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 434 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 435 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 436 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 437 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 438 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 439 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 440 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 441 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 442 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 443 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 444 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 445 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 446 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 447 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 448 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 449 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 450 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 451 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 452 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 453 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 454 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 455 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 456 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 457 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 458 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 459 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 460 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 461 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 462 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 463 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 464 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 465 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 466 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 467 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 468 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 469 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 470 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 471 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 472 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 473 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 474 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 475 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 476 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 477 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 478 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 479 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 480 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 481 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 482 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 483 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 484 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 485 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 486 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 487 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 488 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 489 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 490 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 491 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 492 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 493 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 494 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 495 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 496 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 497 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 498 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 499 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 500 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 501 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 502 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 503 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 504 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 505 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 506 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 507 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 508 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 509 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 510 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 511 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 512 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 513 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 514 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 515 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 516 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 517 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 518 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 519 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 520 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 521 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 522 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 523 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 524 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 525 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 526 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 527 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 528 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 529 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 530 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 531 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 532 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 533 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 534 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 535 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 536 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 537 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 538 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
|
| 539 |
+
X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000"
|
| 540 |
);
|
| 541 |
+
-- END PROGMEM
|
| 542 |
begin
|
| 543 |
|
| 544 |
-- port A
|
|
|
|
| 565 |
end if;
|
| 566 |
end if;
|
| 567 |
end process;
|
| 568 |
+
end rtl;
|
...
|
@@ -82,6 +82,8 @@ package core_constants is
|
|
| 82 |
|
| 83 |
constant MTIME_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFF8";
|
| 84 |
constant MTIMEH_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFFC";
|
|
|
|
|
|
|
| 85 |
|
| 86 |
constant EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0000";
|
| 87 |
constant EX_CAUSE_INSTRUCTION_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0001";
|
|
|
|
| 82 |
|
| 83 |
constant MTIME_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFF8";
|
| 84 |
constant MTIMEH_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFFC";
|
| 85 |
+
constant MTIMECMP_ADDRESS: std_logic_vector(31 downto 0) := X"02004000";
|
| 86 |
+
constant MTIMECMPH_ADDRESS: std_logic_vector(31 downto 0) := X"02004004";
|
| 87 |
|
| 88 |
constant EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0000";
|
| 89 |
constant EX_CAUSE_INSTRUCTION_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0001";
|
|
@@ -40,6 +40,8 @@ architecture rtl of execute is
|
|
| 40 |
signal minstreth: std_logic_vector(31 downto 0) := (others => '0');
|
| 41 |
signal mtime: std_logic_vector(31 downto 0) := (others => '0');
|
| 42 |
signal mtimeh: std_logic_vector(31 downto 0) := (others => '0');
|
|
|
|
|
|
|
| 43 |
begin
|
| 44 |
|
| 45 |
process (clk)
|
|
@@ -57,6 +59,7 @@ begin
|
|
| 57 |
variable v_mcause_code: std_logic_vector(3 downto 0);
|
| 58 |
variable v_mtime_inc, v_mtimeh_inc: std_logic_vector(31 downto 0);
|
| 59 |
variable v_mtime, v_mtimeh: std_logic_vector(31 downto 0);
|
|
|
|
| 60 |
|
| 61 |
variable v_address, v_value: std_logic_vector(31 downto 0);
|
| 62 |
|
|
@@ -89,6 +92,8 @@ begin
|
|
| 89 |
v_mtime := v_mtime_inc;
|
| 90 |
v_mtimeh_inc := std_logic_vector(v_temp(63 downto 32));
|
| 91 |
v_mtimeh := v_mtimeh_inc;
|
|
|
|
|
|
|
| 92 |
|
| 93 |
has_exception := false;
|
| 94 |
exception_cause := (others => '0');
|
|
@@ -261,6 +266,10 @@ begin
|
|
| 261 |
v_mtime := input.operand2;
|
| 262 |
elsif v_address = MTIMEH_ADDRESS then
|
| 263 |
v_mtimeh := input.operand2;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 264 |
else
|
| 265 |
v_mem_req.active := '1';
|
| 266 |
v_mem_req.write_enable := "1111";
|
|
@@ -281,6 +290,10 @@ begin
|
|
| 281 |
v_output.result := mtime;
|
| 282 |
elsif input.operation = OP_LW and v_address = MTIMEH_ADDRESS then
|
| 283 |
v_output.result := mtimeh;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 284 |
else
|
| 285 |
v_output.use_mem := '1';
|
| 286 |
v_output.mem_addr := v_address(1 downto 0);
|
|
@@ -441,6 +454,8 @@ begin
|
|
| 441 |
v_mcycleh := v_mcycleh_inc;
|
| 442 |
v_mtime := v_mtime_inc;
|
| 443 |
v_mtimeh := v_mtimeh_inc;
|
|
|
|
|
|
|
| 444 |
v_minstret := v_minstret_inc;
|
| 445 |
v_minstreth := v_minstreth_inc;
|
| 446 |
v_mepc := input.pc(31 downto 2);
|
|
@@ -457,6 +472,8 @@ begin
|
|
| 457 |
mcycleh <= v_mcycleh;
|
| 458 |
mtime <= v_mtime;
|
| 459 |
mtimeh <= v_mtimeh;
|
|
|
|
|
|
|
| 460 |
minstret <= v_minstret;
|
| 461 |
minstreth <= v_minstreth;
|
| 462 |
mepc <= v_mepc;
|
|
|
|
| 40 |
signal minstreth: std_logic_vector(31 downto 0) := (others => '0');
|
| 41 |
signal mtime: std_logic_vector(31 downto 0) := (others => '0');
|
| 42 |
signal mtimeh: std_logic_vector(31 downto 0) := (others => '0');
|
| 43 |
+
signal mtimecmp: std_logic_vector(31 downto 0) := (others => '0');
|
| 44 |
+
signal mtimecmph: std_logic_vector(31 downto 0) := (others => '0');
|
| 45 |
begin
|
| 46 |
|
| 47 |
process (clk)
|
|
|
|
| 59 |
variable v_mcause_code: std_logic_vector(3 downto 0);
|
| 60 |
variable v_mtime_inc, v_mtimeh_inc: std_logic_vector(31 downto 0);
|
| 61 |
variable v_mtime, v_mtimeh: std_logic_vector(31 downto 0);
|
| 62 |
+
variable v_mtimecmp, v_mtimecmph: std_logic_vector(31 downto 0);
|
| 63 |
|
| 64 |
variable v_address, v_value: std_logic_vector(31 downto 0);
|
| 65 |
|
|
|
|
| 92 |
v_mtime := v_mtime_inc;
|
| 93 |
v_mtimeh_inc := std_logic_vector(v_temp(63 downto 32));
|
| 94 |
v_mtimeh := v_mtimeh_inc;
|
| 95 |
+
v_mtimecmp := mtimecmp;
|
| 96 |
+
v_mtimecmph := mtimecmph;
|
| 97 |
|
| 98 |
has_exception := false;
|
| 99 |
exception_cause := (others => '0');
|
|
|
|
| 266 |
v_mtime := input.operand2;
|
| 267 |
elsif v_address = MTIMEH_ADDRESS then
|
| 268 |
v_mtimeh := input.operand2;
|
| 269 |
+
elsif v_address = MTIMECMP_ADDRESS then
|
| 270 |
+
v_mtimecmp := input.operand2;
|
| 271 |
+
elsif v_address = MTIMECMPH_ADDRESS then
|
| 272 |
+
v_mtimecmph := input.operand2;
|
| 273 |
else
|
| 274 |
v_mem_req.active := '1';
|
| 275 |
v_mem_req.write_enable := "1111";
|
|
|
|
| 290 |
v_output.result := mtime;
|
| 291 |
elsif input.operation = OP_LW and v_address = MTIMEH_ADDRESS then
|
| 292 |
v_output.result := mtimeh;
|
| 293 |
+
elsif input.operation = OP_LW and v_address = MTIMECMP_ADDRESS then
|
| 294 |
+
v_output.result := mtimecmp;
|
| 295 |
+
elsif input.operation = OP_LW and v_address = MTIMECMPH_ADDRESS then
|
| 296 |
+
v_output.result := mtimecmph;
|
| 297 |
else
|
| 298 |
v_output.use_mem := '1';
|
| 299 |
v_output.mem_addr := v_address(1 downto 0);
|
|
|
|
| 454 |
v_mcycleh := v_mcycleh_inc;
|
| 455 |
v_mtime := v_mtime_inc;
|
| 456 |
v_mtimeh := v_mtimeh_inc;
|
| 457 |
+
v_mtimecmp := mtimecmp;
|
| 458 |
+
v_mtimecmph := mtimecmph;
|
| 459 |
v_minstret := v_minstret_inc;
|
| 460 |
v_minstreth := v_minstreth_inc;
|
| 461 |
v_mepc := input.pc(31 downto 2);
|
|
|
|
| 472 |
mcycleh <= v_mcycleh;
|
| 473 |
mtime <= v_mtime;
|
| 474 |
mtimeh <= v_mtimeh;
|
| 475 |
+
mtimecmp <= v_mtimecmp;
|
| 476 |
+
mtimecmph <= v_mtimecmph;
|
| 477 |
minstret <= v_minstret;
|
| 478 |
minstreth <= v_minstreth;
|
| 479 |
mepc <= v_mepc;
|
...
|
@@ -28,7 +28,7 @@ with open(BINARY_FILE_PATH, 'rb') as f:
|
|
| 28 |
if len(word) < 4:
|
| 29 |
raise ValueError(f"Incomplete 32-bit word at offset {i}")
|
| 30 |
|
| 31 |
-
buffer[j] = int.from_bytes(word)
|
| 32 |
i += 4
|
| 33 |
j += 1
|
| 34 |
|
|
|
|
| 28 |
if len(word) < 4:
|
| 29 |
raise ValueError(f"Incomplete 32-bit word at offset {i}")
|
| 30 |
|
| 31 |
+
buffer[j] = int.from_bytes(word, byteorder='little')
|
| 32 |
i += 4
|
| 33 |
j += 1
|
| 34 |
|
...
|
@@ -94,4 +94,6 @@ package core_constants is
|
|
| 94 |
constant EX_CAUSE_STORE_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0110";
|
| 95 |
constant EX_CAUSE_STORE_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0111";
|
| 96 |
constant EX_CAUSE_ENVIRONMENT_CALL: std_logic_vector(3 downto 0) := "1011";
|
|
|
|
|
|
|
| 97 |
end package core_constants;
|
|
|
|
| 94 |
constant EX_CAUSE_STORE_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0110";
|
| 95 |
constant EX_CAUSE_STORE_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0111";
|
| 96 |
constant EX_CAUSE_ENVIRONMENT_CALL: std_logic_vector(3 downto 0) := "1011";
|
| 97 |
+
|
| 98 |
+
constant INT_CAUSE_MACHINE_TIMER_INTERRUPT: std_logic_vector(3 downto 0) := "0111";
|
| 99 |
end package core_constants;
|
|
@@ -25,7 +25,7 @@ end execute;
|
|
| 25 |
|
| 26 |
architecture rtl of execute is
|
| 27 |
signal mstatus_mpie, mstatus_mie: std_logic := '0';
|
| 28 |
-
signal
|
| 29 |
signal mtvec_address: std_logic_vector(29 downto 0) := (others => '0');
|
| 30 |
signal mtvec_mode: std_logic := '0';
|
| 31 |
signal mscratch: std_logic_vector(31 downto 0) := (others => '0');
|
|
@@ -33,7 +33,6 @@ architecture rtl of execute is
|
|
| 33 |
signal mcause_int: std_logic := '0';
|
| 34 |
signal mcause_code: std_logic_vector(3 downto 0) := (others => '0');
|
| 35 |
signal mtval: std_logic_vector(31 downto 0) := (others => '0');
|
| 36 |
-
signal mip: std_logic_vector(15 downto 0) := (others => '0');
|
| 37 |
signal mcycle: std_logic_vector(31 downto 0) := (others => '0');
|
| 38 |
signal minstret: std_logic_vector(31 downto 0) := (others => '0');
|
| 39 |
signal mcycleh: std_logic_vector(31 downto 0) := (others => '0');
|
|
@@ -50,6 +49,7 @@ begin
|
|
| 50 |
variable v_jump: std_logic;
|
| 51 |
variable v_jump_address: std_logic_vector(31 downto 0);
|
| 52 |
variable v_mem_req: mem_req_t;
|
|
|
|
| 53 |
variable v_mcycle_inc, v_mcycleh_inc: std_logic_vector(31 downto 0);
|
| 54 |
variable v_mcycle, v_mcycleh: std_logic_vector(31 downto 0);
|
| 55 |
variable v_minstret_inc, v_minstreth_inc: std_logic_vector(31 downto 0);
|
|
@@ -60,6 +60,12 @@ begin
|
|
| 60 |
variable v_mtime_inc, v_mtimeh_inc: std_logic_vector(31 downto 0);
|
| 61 |
variable v_mtime, v_mtimeh: std_logic_vector(31 downto 0);
|
| 62 |
variable v_mtimecmp, v_mtimecmph: std_logic_vector(31 downto 0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
|
| 64 |
variable v_address, v_value: std_logic_vector(31 downto 0);
|
| 65 |
|
|
@@ -67,7 +73,6 @@ begin
|
|
| 67 |
variable v_temp: unsigned(63 downto 0);
|
| 68 |
|
| 69 |
variable has_exception: boolean;
|
| 70 |
-
variable exception_cause: std_logic_vector(3 downto 0);
|
| 71 |
|
| 72 |
begin
|
| 73 |
if rising_edge(clk) then
|
|
@@ -77,6 +82,9 @@ begin
|
|
| 77 |
v_jump := '0';
|
| 78 |
v_jump_address := (others => '0');
|
| 79 |
|
|
|
|
|
|
|
|
|
|
| 80 |
v_temp := unsigned(mcycleh & mcycle) + 1;
|
| 81 |
v_mcycle_inc := std_logic_vector(v_temp(31 downto 0));
|
| 82 |
v_mcycle := v_mcycle_inc;
|
|
@@ -94,25 +102,37 @@ begin
|
|
| 94 |
v_mtimeh := v_mtimeh_inc;
|
| 95 |
v_mtimecmp := mtimecmp;
|
| 96 |
v_mtimecmph := mtimecmph;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
|
| 98 |
has_exception := false;
|
| 99 |
-
exception_cause := (others => '0');
|
| 100 |
|
| 101 |
v_temp := unsigned(minstreth & minstret);
|
| 102 |
if instr_retire = '1' then
|
| 103 |
v_temp := v_temp + 1;
|
| 104 |
end if;
|
| 105 |
|
| 106 |
-
|
| 107 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
|
| 109 |
if input.is_active = '1' then
|
| 110 |
if input.is_invalid_address = '1' then
|
| 111 |
has_exception := true;
|
| 112 |
-
|
| 113 |
elsif input.is_invalid = '1' then
|
| 114 |
has_exception := true;
|
| 115 |
-
|
| 116 |
else
|
| 117 |
if input.operation = OP_ADD then
|
| 118 |
v_output.result := std_logic_vector(unsigned(input.operand1) + unsigned(input.operand2));
|
|
@@ -235,7 +255,7 @@ begin
|
|
| 235 |
|
| 236 |
if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 237 |
has_exception := true;
|
| 238 |
-
|
| 239 |
end if;
|
| 240 |
elsif input.operation = OP_SH then
|
| 241 |
v_address := input.operand1;
|
|
@@ -254,13 +274,13 @@ begin
|
|
| 254 |
|
| 255 |
if v_address(0) /= '0' then
|
| 256 |
has_exception := true;
|
| 257 |
-
|
| 258 |
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 259 |
has_exception := true;
|
| 260 |
-
|
| 261 |
end if;
|
| 262 |
elsif input.operation = OP_SW then
|
| 263 |
-
|
| 264 |
|
| 265 |
if v_address = MTIME_ADDRESS then
|
| 266 |
v_mtime := input.operand2;
|
|
@@ -272,15 +292,16 @@ begin
|
|
| 272 |
v_mtimecmph := input.operand2;
|
| 273 |
else
|
| 274 |
v_mem_req.active := '1';
|
|
|
|
| 275 |
v_mem_req.write_enable := "1111";
|
| 276 |
v_mem_req.value := input.operand2;
|
| 277 |
|
| 278 |
if v_address(1 downto 0) /= "00" then
|
| 279 |
has_exception := true;
|
| 280 |
-
|
| 281 |
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 282 |
has_exception := true;
|
| 283 |
-
|
| 284 |
end if;
|
| 285 |
end if;
|
| 286 |
elsif input.operation = OP_LB or input.operation = OP_LH or input.operation = OP_LW or input.operation = OP_LBU or input.operation = OP_LHU then
|
|
@@ -308,25 +329,25 @@ begin
|
|
| 308 |
v_output.mem_size := SIZE_BYTE;
|
| 309 |
if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 310 |
has_exception := true;
|
| 311 |
-
|
| 312 |
end if;
|
| 313 |
elsif input.operation = OP_LH or input.operation = OP_LHU then
|
| 314 |
v_output.mem_size := SIZE_HALFWORD;
|
| 315 |
if v_address(0) /= '0' then
|
| 316 |
has_exception := true;
|
| 317 |
-
|
| 318 |
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 319 |
has_exception := true;
|
| 320 |
-
|
| 321 |
end if;
|
| 322 |
else
|
| 323 |
v_output.mem_size := SIZE_WORD;
|
| 324 |
if v_address(1 downto 0) /= "00" then
|
| 325 |
has_exception := true;
|
| 326 |
-
|
| 327 |
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 328 |
has_exception := true;
|
| 329 |
-
|
| 330 |
end if;
|
| 331 |
end if;
|
| 332 |
end if;
|
|
@@ -347,22 +368,22 @@ begin
|
|
| 347 |
|
| 348 |
if input.operand2(11 downto 0) = CSR_MSTATUS then
|
| 349 |
v_output.result := "000000000000000000011000" & mstatus_mpie & "000" & mstatus_mie & "000";
|
| 350 |
-
|
| 351 |
-
|
| 352 |
elsif input.operand2(11 downto 0) = CSR_MISA then
|
| 353 |
v_output.result := MISA_VALUE;
|
| 354 |
elsif input.operand2(11 downto 0) = CSR_MIE then
|
| 355 |
-
v_output.result :=
|
| 356 |
-
|
| 357 |
elsif input.operand2(11 downto 0) = CSR_MTVEC then
|
| 358 |
v_output.result := mtvec_address & "0" & mtvec_mode;
|
| 359 |
-
|
| 360 |
-
|
| 361 |
elsif input.operand2(11 downto 0) = CSR_MSTATUSH then
|
| 362 |
v_output.result := (others => '0');
|
| 363 |
elsif input.operand2(11 downto 0) = CSR_MSCRATCH then
|
| 364 |
v_output.result := mscratch;
|
| 365 |
-
|
| 366 |
elsif input.operand2(11 downto 0) = CSR_MEPC then
|
| 367 |
v_output.result := mepc & "00";
|
| 368 |
v_mepc := (mepc or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
|
|
@@ -372,10 +393,9 @@ begin
|
|
| 372 |
mcause_code <= (mcause_code or csr_set_bits(5 downto 0)) and csr_clear_bits(5 downto 0);
|
| 373 |
elsif input.operand2(11 downto 0) = CSR_MTVAL then
|
| 374 |
v_output.result := mtval;
|
| 375 |
-
|
| 376 |
elsif input.operand2(11 downto 0) = CSR_MIP then
|
| 377 |
-
v_output.result :=
|
| 378 |
-
mip <= (mip or csr_set_bits(15 downto 0)) and csr_clear_bits(15 downto 0);
|
| 379 |
elsif input.operand2(11 downto 0) = CSR_MCYCLE then
|
| 380 |
v_output.result := mcycle;
|
| 381 |
v_mcycle := (mcycle or csr_set_bits) and csr_clear_bits;
|
|
@@ -411,25 +431,25 @@ begin
|
|
| 411 |
else
|
| 412 |
-- trying to read non-existent CSR
|
| 413 |
has_exception := true;
|
| 414 |
-
|
| 415 |
end if;
|
| 416 |
else
|
| 417 |
-- trying to write to non-existent or read-only CSR
|
| 418 |
has_exception := true;
|
| 419 |
-
|
| 420 |
end if;
|
| 421 |
elsif input.operation = OP_MRET then
|
| 422 |
-
|
| 423 |
-
|
| 424 |
v_jump := '1';
|
| 425 |
v_jump_address := mepc & "00";
|
| 426 |
-- TODO: reset mepc?
|
| 427 |
elsif input.operation = OP_ECALL then
|
| 428 |
has_exception := true;
|
| 429 |
-
|
| 430 |
elsif input.operation = OP_EBREAK then
|
| 431 |
has_exception := true;
|
| 432 |
-
|
| 433 |
elsif input.operation = OP_LED then
|
| 434 |
led <= input.operand1(7 downto 0);
|
| 435 |
else
|
|
@@ -439,9 +459,13 @@ begin
|
|
| 439 |
v_output.destination_reg := input.destination_reg;
|
| 440 |
end if;
|
| 441 |
|
| 442 |
-
if
|
|
|
|
|
|
|
|
|
|
|
|
|
| 443 |
has_exception := true;
|
| 444 |
-
|
| 445 |
end if;
|
| 446 |
|
| 447 |
if has_exception then
|
|
@@ -459,8 +483,15 @@ begin
|
|
| 459 |
v_minstret := v_minstret_inc;
|
| 460 |
v_minstreth := v_minstreth_inc;
|
| 461 |
v_mepc := input.pc(31 downto 2);
|
| 462 |
-
|
| 463 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 464 |
end if;
|
| 465 |
end if;
|
| 466 |
|
|
@@ -479,6 +510,15 @@ begin
|
|
| 479 |
mepc <= v_mepc;
|
| 480 |
mcause_int <= v_mcause_int;
|
| 481 |
mcause_code <= v_mcause_code;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 482 |
end if;
|
| 483 |
end process;
|
| 484 |
|
|
|
|
| 25 |
|
| 26 |
architecture rtl of execute is
|
| 27 |
signal mstatus_mpie, mstatus_mie: std_logic := '0';
|
| 28 |
+
signal mtie: std_logic := '0';
|
| 29 |
signal mtvec_address: std_logic_vector(29 downto 0) := (others => '0');
|
| 30 |
signal mtvec_mode: std_logic := '0';
|
| 31 |
signal mscratch: std_logic_vector(31 downto 0) := (others => '0');
|
|
|
|
| 33 |
signal mcause_int: std_logic := '0';
|
| 34 |
signal mcause_code: std_logic_vector(3 downto 0) := (others => '0');
|
| 35 |
signal mtval: std_logic_vector(31 downto 0) := (others => '0');
|
|
|
|
| 36 |
signal mcycle: std_logic_vector(31 downto 0) := (others => '0');
|
| 37 |
signal minstret: std_logic_vector(31 downto 0) := (others => '0');
|
| 38 |
signal mcycleh: std_logic_vector(31 downto 0) := (others => '0');
|
|
|
|
| 49 |
variable v_jump: std_logic;
|
| 50 |
variable v_jump_address: std_logic_vector(31 downto 0);
|
| 51 |
variable v_mem_req: mem_req_t;
|
| 52 |
+
variable v_mstatus_mpie, v_mstatus_mie: std_logic;
|
| 53 |
variable v_mcycle_inc, v_mcycleh_inc: std_logic_vector(31 downto 0);
|
| 54 |
variable v_mcycle, v_mcycleh: std_logic_vector(31 downto 0);
|
| 55 |
variable v_minstret_inc, v_minstreth_inc: std_logic_vector(31 downto 0);
|
|
|
|
| 60 |
variable v_mtime_inc, v_mtimeh_inc: std_logic_vector(31 downto 0);
|
| 61 |
variable v_mtime, v_mtimeh: std_logic_vector(31 downto 0);
|
| 62 |
variable v_mtimecmp, v_mtimecmph: std_logic_vector(31 downto 0);
|
| 63 |
+
variable v_mtip: std_logic;
|
| 64 |
+
variable v_mtval: std_logic_vector(31 downto 0);
|
| 65 |
+
variable v_mtie: std_logic;
|
| 66 |
+
variable v_mtvec_address: std_logic_vector(29 downto 0);
|
| 67 |
+
variable v_mtvec_mode: std_logic;
|
| 68 |
+
variable v_mscratch: std_logic_vector(31 downto 0);
|
| 69 |
|
| 70 |
variable v_address, v_value: std_logic_vector(31 downto 0);
|
| 71 |
|
|
|
|
| 73 |
variable v_temp: unsigned(63 downto 0);
|
| 74 |
|
| 75 |
variable has_exception: boolean;
|
|
|
|
| 76 |
|
| 77 |
begin
|
| 78 |
if rising_edge(clk) then
|
|
|
|
| 82 |
v_jump := '0';
|
| 83 |
v_jump_address := (others => '0');
|
| 84 |
|
| 85 |
+
v_mstatus_mie := mstatus_mie;
|
| 86 |
+
v_mstatus_mpie := mstatus_mpie;
|
| 87 |
+
|
| 88 |
v_temp := unsigned(mcycleh & mcycle) + 1;
|
| 89 |
v_mcycle_inc := std_logic_vector(v_temp(31 downto 0));
|
| 90 |
v_mcycle := v_mcycle_inc;
|
|
|
|
| 102 |
v_mtimeh := v_mtimeh_inc;
|
| 103 |
v_mtimecmp := mtimecmp;
|
| 104 |
v_mtimecmph := mtimecmph;
|
| 105 |
+
v_mtval := mtval;
|
| 106 |
+
v_mtie := mtie;
|
| 107 |
+
v_mtvec_address := mtvec_address;
|
| 108 |
+
v_mtvec_mode := mtvec_mode;
|
| 109 |
+
v_mscratch := mscratch;
|
| 110 |
|
| 111 |
has_exception := false;
|
|
|
|
| 112 |
|
| 113 |
v_temp := unsigned(minstreth & minstret);
|
| 114 |
if instr_retire = '1' then
|
| 115 |
v_temp := v_temp + 1;
|
| 116 |
end if;
|
| 117 |
|
| 118 |
+
v_minstret_inc := std_logic_vector(v_temp(31 downto 0));
|
| 119 |
+
v_minstreth_inc := std_logic_vector(v_temp(63 downto 32));
|
| 120 |
+
v_minstret := v_minstret_inc;
|
| 121 |
+
v_minstreth := v_minstret_inc;
|
| 122 |
+
|
| 123 |
+
if unsigned(mtimeh & mtime) > unsigned(mtimecmph & mtimecmp) then
|
| 124 |
+
v_mtip := '1';
|
| 125 |
+
else
|
| 126 |
+
v_mtip := '0';
|
| 127 |
+
end if;
|
| 128 |
|
| 129 |
if input.is_active = '1' then
|
| 130 |
if input.is_invalid_address = '1' then
|
| 131 |
has_exception := true;
|
| 132 |
+
v_mcause_code := EX_CAUSE_INSTRUCTION_ACCESS_FAULT;
|
| 133 |
elsif input.is_invalid = '1' then
|
| 134 |
has_exception := true;
|
| 135 |
+
v_mcause_code := EX_CAUSE_ILLEGAL_INSTRUCTION;
|
| 136 |
else
|
| 137 |
if input.operation = OP_ADD then
|
| 138 |
v_output.result := std_logic_vector(unsigned(input.operand1) + unsigned(input.operand2));
|
|
|
|
| 255 |
|
| 256 |
if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 257 |
has_exception := true;
|
| 258 |
+
v_mcause_code := EX_CAUSE_STORE_ACCESS_FAULT;
|
| 259 |
end if;
|
| 260 |
elsif input.operation = OP_SH then
|
| 261 |
v_address := input.operand1;
|
|
|
|
| 274 |
|
| 275 |
if v_address(0) /= '0' then
|
| 276 |
has_exception := true;
|
| 277 |
+
v_mcause_code := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
|
| 278 |
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 279 |
has_exception := true;
|
| 280 |
+
v_mcause_code := EX_CAUSE_STORE_ACCESS_FAULT;
|
| 281 |
end if;
|
| 282 |
elsif input.operation = OP_SW then
|
| 283 |
+
v_address := input.operand1;
|
| 284 |
|
| 285 |
if v_address = MTIME_ADDRESS then
|
| 286 |
v_mtime := input.operand2;
|
|
|
|
| 292 |
v_mtimecmph := input.operand2;
|
| 293 |
else
|
| 294 |
v_mem_req.active := '1';
|
| 295 |
+
v_mem_req.address := v_address;
|
| 296 |
v_mem_req.write_enable := "1111";
|
| 297 |
v_mem_req.value := input.operand2;
|
| 298 |
|
| 299 |
if v_address(1 downto 0) /= "00" then
|
| 300 |
has_exception := true;
|
| 301 |
+
v_mcause_code := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
|
| 302 |
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 303 |
has_exception := true;
|
| 304 |
+
v_mcause_code := EX_CAUSE_STORE_ACCESS_FAULT;
|
| 305 |
end if;
|
| 306 |
end if;
|
| 307 |
elsif input.operation = OP_LB or input.operation = OP_LH or input.operation = OP_LW or input.operation = OP_LBU or input.operation = OP_LHU then
|
|
|
|
| 329 |
v_output.mem_size := SIZE_BYTE;
|
| 330 |
if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 331 |
has_exception := true;
|
| 332 |
+
v_mcause_code := EX_CAUSE_LOAD_ACCESS_FAULT;
|
| 333 |
end if;
|
| 334 |
elsif input.operation = OP_LH or input.operation = OP_LHU then
|
| 335 |
v_output.mem_size := SIZE_HALFWORD;
|
| 336 |
if v_address(0) /= '0' then
|
| 337 |
has_exception := true;
|
| 338 |
+
v_mcause_code := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
|
| 339 |
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 340 |
has_exception := true;
|
| 341 |
+
v_mcause_code := EX_CAUSE_LOAD_ACCESS_FAULT;
|
| 342 |
end if;
|
| 343 |
else
|
| 344 |
v_output.mem_size := SIZE_WORD;
|
| 345 |
if v_address(1 downto 0) /= "00" then
|
| 346 |
has_exception := true;
|
| 347 |
+
v_mcause_code := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
|
| 348 |
elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
|
| 349 |
has_exception := true;
|
| 350 |
+
v_mcause_code := EX_CAUSE_LOAD_ACCESS_FAULT;
|
| 351 |
end if;
|
| 352 |
end if;
|
| 353 |
end if;
|
|
|
|
| 368 |
|
| 369 |
if input.operand2(11 downto 0) = CSR_MSTATUS then
|
| 370 |
v_output.result := "000000000000000000011000" & mstatus_mpie & "000" & mstatus_mie & "000";
|
| 371 |
+
v_mstatus_mie := (mstatus_mie or csr_set_bits(3)) and csr_clear_bits(3);
|
| 372 |
+
v_mstatus_mpie := (mstatus_mpie or csr_set_bits(7)) and csr_clear_bits(7);
|
| 373 |
elsif input.operand2(11 downto 0) = CSR_MISA then
|
| 374 |
v_output.result := MISA_VALUE;
|
| 375 |
elsif input.operand2(11 downto 0) = CSR_MIE then
|
| 376 |
+
v_output.result := "000000000000000000000000" & mtie & "0000000";
|
| 377 |
+
v_mtie := (mtie or csr_set_bits(7)) and csr_clear_bits(7);
|
| 378 |
elsif input.operand2(11 downto 0) = CSR_MTVEC then
|
| 379 |
v_output.result := mtvec_address & "0" & mtvec_mode;
|
| 380 |
+
v_mtvec_address := (mtvec_address or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
|
| 381 |
+
v_mtvec_mode := (mtvec_mode or csr_set_bits(0)) and csr_clear_bits(0);
|
| 382 |
elsif input.operand2(11 downto 0) = CSR_MSTATUSH then
|
| 383 |
v_output.result := (others => '0');
|
| 384 |
elsif input.operand2(11 downto 0) = CSR_MSCRATCH then
|
| 385 |
v_output.result := mscratch;
|
| 386 |
+
v_mscratch := (mscratch or csr_set_bits) and csr_clear_bits;
|
| 387 |
elsif input.operand2(11 downto 0) = CSR_MEPC then
|
| 388 |
v_output.result := mepc & "00";
|
| 389 |
v_mepc := (mepc or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
|
|
|
|
| 393 |
mcause_code <= (mcause_code or csr_set_bits(5 downto 0)) and csr_clear_bits(5 downto 0);
|
| 394 |
elsif input.operand2(11 downto 0) = CSR_MTVAL then
|
| 395 |
v_output.result := mtval;
|
| 396 |
+
v_mtval := (mtval or csr_set_bits) and csr_clear_bits;
|
| 397 |
elsif input.operand2(11 downto 0) = CSR_MIP then
|
| 398 |
+
v_output.result := "000000000000000000000000" & v_mtip & "0000000";
|
|
|
|
| 399 |
elsif input.operand2(11 downto 0) = CSR_MCYCLE then
|
| 400 |
v_output.result := mcycle;
|
| 401 |
v_mcycle := (mcycle or csr_set_bits) and csr_clear_bits;
|
|
|
|
| 431 |
else
|
| 432 |
-- trying to read non-existent CSR
|
| 433 |
has_exception := true;
|
| 434 |
+
v_mcause_code := EX_CAUSE_ILLEGAL_INSTRUCTION;
|
| 435 |
end if;
|
| 436 |
else
|
| 437 |
-- trying to write to non-existent or read-only CSR
|
| 438 |
has_exception := true;
|
| 439 |
+
v_mcause_code := EX_CAUSE_ILLEGAL_INSTRUCTION;
|
| 440 |
end if;
|
| 441 |
elsif input.operation = OP_MRET then
|
| 442 |
+
v_mstatus_mie := mstatus_mpie;
|
| 443 |
+
v_mstatus_mpie := '1';
|
| 444 |
v_jump := '1';
|
| 445 |
v_jump_address := mepc & "00";
|
| 446 |
-- TODO: reset mepc?
|
| 447 |
elsif input.operation = OP_ECALL then
|
| 448 |
has_exception := true;
|
| 449 |
+
v_mcause_code := EX_CAUSE_ENVIRONMENT_CALL;
|
| 450 |
elsif input.operation = OP_EBREAK then
|
| 451 |
has_exception := true;
|
| 452 |
+
v_mcause_code := EX_CAUSE_BREAKPOINT;
|
| 453 |
elsif input.operation = OP_LED then
|
| 454 |
led <= input.operand1(7 downto 0);
|
| 455 |
else
|
|
|
|
| 459 |
v_output.destination_reg := input.destination_reg;
|
| 460 |
end if;
|
| 461 |
|
| 462 |
+
if mstatus_mie = '1' and mtie = '1' and v_mtip = '1' then
|
| 463 |
+
has_exception := true;
|
| 464 |
+
v_mcause_int := '1';
|
| 465 |
+
v_mcause_code := INT_CAUSE_MACHINE_TIMER_INTERRUPT;
|
| 466 |
+
elsif v_jump = '1' and v_jump_address(1) /= '0' then
|
| 467 |
has_exception := true;
|
| 468 |
+
v_mcause_code := EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED;
|
| 469 |
end if;
|
| 470 |
|
| 471 |
if has_exception then
|
|
|
|
| 483 |
v_minstret := v_minstret_inc;
|
| 484 |
v_minstreth := v_minstreth_inc;
|
| 485 |
v_mepc := input.pc(31 downto 2);
|
| 486 |
+
v_mtval := (others => '0');
|
| 487 |
+
v_mstatus_mie := '0';
|
| 488 |
+
v_mstatus_mpie := mstatus_mie;
|
| 489 |
+
v_mtie := mtie;
|
| 490 |
+
v_mtvec_address := mtvec_address;
|
| 491 |
+
v_mtvec_mode := mtvec_mode;
|
| 492 |
+
v_mscratch := mscratch;
|
| 493 |
+
v_mcause_int := mcause_int;
|
| 494 |
+
v_mcause_code := mcause_code;
|
| 495 |
end if;
|
| 496 |
end if;
|
| 497 |
|
|
|
|
| 510 |
mepc <= v_mepc;
|
| 511 |
mcause_int <= v_mcause_int;
|
| 512 |
mcause_code <= v_mcause_code;
|
| 513 |
+
mtval <= v_mtval;
|
| 514 |
+
mstatus_mie <= v_mstatus_mie;
|
| 515 |
+
mstatus_mpie <= v_mstatus_mpie;
|
| 516 |
+
mtie <= v_mtie;
|
| 517 |
+
mtvec_address <= v_mtvec_address;
|
| 518 |
+
mtvec_mode <= v_mtvec_mode;
|
| 519 |
+
mscratch <= v_mscratch;
|
| 520 |
+
mcause_int <= v_mcause_int;
|
| 521 |
+
mcause_code <= v_mcause_code;
|
| 522 |
end if;
|
| 523 |
end process;
|
| 524 |
|
...
|
@@ -41,8 +41,11 @@ architecture rtl of execute is
|
|
| 41 |
signal mtimeh: std_logic_vector(31 downto 0) := (others => '0');
|
| 42 |
signal mtimecmp: std_logic_vector(31 downto 0) := (others => '0');
|
| 43 |
signal mtimecmph: std_logic_vector(31 downto 0) := (others => '0');
|
|
|
|
| 44 |
begin
|
| 45 |
|
|
|
|
|
|
|
| 46 |
process (clk)
|
| 47 |
variable v_output: execute_output_t;
|
| 48 |
variable v_sign: std_logic_vector(31 downto 0);
|
|
@@ -66,6 +69,7 @@ begin
|
|
| 66 |
variable v_mtvec_address: std_logic_vector(29 downto 0);
|
| 67 |
variable v_mtvec_mode: std_logic;
|
| 68 |
variable v_mscratch: std_logic_vector(31 downto 0);
|
|
|
|
| 69 |
|
| 70 |
variable v_address, v_value: std_logic_vector(31 downto 0);
|
| 71 |
|
|
@@ -389,8 +393,8 @@ begin
|
|
| 389 |
v_mepc := (mepc or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
|
| 390 |
elsif input.operand2(11 downto 0) = CSR_MCAUSE then
|
| 391 |
v_output.result := mcause_int & "000000000000000000000000000" & mcause_code;
|
| 392 |
-
|
| 393 |
-
|
| 394 |
elsif input.operand2(11 downto 0) = CSR_MTVAL then
|
| 395 |
v_output.result := mtval;
|
| 396 |
v_mtval := (mtval or csr_set_bits) and csr_clear_bits;
|
|
@@ -451,7 +455,7 @@ begin
|
|
| 451 |
has_exception := true;
|
| 452 |
v_mcause_code := EX_CAUSE_BREAKPOINT;
|
| 453 |
elsif input.operation = OP_LED then
|
| 454 |
-
|
| 455 |
else
|
| 456 |
assert false report "Unhandled operation value in execute stage" severity failure;
|
| 457 |
end if;
|
|
@@ -492,6 +496,7 @@ begin
|
|
| 492 |
v_mscratch := mscratch;
|
| 493 |
v_mcause_int := mcause_int;
|
| 494 |
v_mcause_code := mcause_code;
|
|
|
|
| 495 |
end if;
|
| 496 |
end if;
|
| 497 |
|
|
@@ -519,6 +524,7 @@ begin
|
|
| 519 |
mscratch <= v_mscratch;
|
| 520 |
mcause_int <= v_mcause_int;
|
| 521 |
mcause_code <= v_mcause_code;
|
|
|
|
| 522 |
end if;
|
| 523 |
end process;
|
| 524 |
|
|
|
|
| 41 |
signal mtimeh: std_logic_vector(31 downto 0) := (others => '0');
|
| 42 |
signal mtimecmp: std_logic_vector(31 downto 0) := (others => '0');
|
| 43 |
signal mtimecmph: std_logic_vector(31 downto 0) := (others => '0');
|
| 44 |
+
signal s_led: std_logic_vector(7 downto 0) := (others => '0');
|
| 45 |
begin
|
| 46 |
|
| 47 |
+
led <= s_led;
|
| 48 |
+
|
| 49 |
process (clk)
|
| 50 |
variable v_output: execute_output_t;
|
| 51 |
variable v_sign: std_logic_vector(31 downto 0);
|
|
|
|
| 69 |
variable v_mtvec_address: std_logic_vector(29 downto 0);
|
| 70 |
variable v_mtvec_mode: std_logic;
|
| 71 |
variable v_mscratch: std_logic_vector(31 downto 0);
|
| 72 |
+
variable v_led: std_logic_vector(7 downto 0);
|
| 73 |
|
| 74 |
variable v_address, v_value: std_logic_vector(31 downto 0);
|
| 75 |
|
|
|
|
| 393 |
v_mepc := (mepc or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
|
| 394 |
elsif input.operand2(11 downto 0) = CSR_MCAUSE then
|
| 395 |
v_output.result := mcause_int & "000000000000000000000000000" & mcause_code;
|
| 396 |
+
v_mcause_int := (mcause_int or csr_set_bits(31)) and csr_clear_bits(31);
|
| 397 |
+
v_mcause_code := (mcause_code or csr_set_bits(5 downto 0)) and csr_clear_bits(5 downto 0);
|
| 398 |
elsif input.operand2(11 downto 0) = CSR_MTVAL then
|
| 399 |
v_output.result := mtval;
|
| 400 |
v_mtval := (mtval or csr_set_bits) and csr_clear_bits;
|
|
|
|
| 455 |
has_exception := true;
|
| 456 |
v_mcause_code := EX_CAUSE_BREAKPOINT;
|
| 457 |
elsif input.operation = OP_LED then
|
| 458 |
+
v_led := input.operand1(7 downto 0);
|
| 459 |
else
|
| 460 |
assert false report "Unhandled operation value in execute stage" severity failure;
|
| 461 |
end if;
|
|
|
|
| 496 |
v_mscratch := mscratch;
|
| 497 |
v_mcause_int := mcause_int;
|
| 498 |
v_mcause_code := mcause_code;
|
| 499 |
+
v_led := s_led;
|
| 500 |
end if;
|
| 501 |
end if;
|
| 502 |
|
|
|
|
| 524 |
mscratch <= v_mscratch;
|
| 525 |
mcause_int <= v_mcause_int;
|
| 526 |
mcause_code <= v_mcause_code;
|
| 527 |
+
s_led <= v_led;
|
| 528 |
end if;
|
| 529 |
end process;
|
| 530 |
|