diff --git a/pythondata_cpu_serv/verilog/.gitmodules b/pythondata_cpu_serv/verilog/.gitmodules new file mode 100644 index 0000000..ef0a528 --- /dev/null +++ b/pythondata_cpu_serv/verilog/.gitmodules @@ -0,0 +1,4 @@ +[submodule "zephyr"] + path = zephyr + url = https://github.com/olofk/zephyr + branch = serv diff --git a/pythondata_cpu_serv/verilog/LICENSE b/pythondata_cpu_serv/verilog/LICENSE new file mode 100644 index 0000000..8572ea0 --- /dev/null +++ b/pythondata_cpu_serv/verilog/LICENSE @@ -0,0 +1,7 @@ +ISC License + +Copyright 2019, Olof Kindgren + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/pythondata_cpu_serv/verilog/README.md b/pythondata_cpu_serv/verilog/README.md new file mode 100644 index 0000000..b312369 --- /dev/null +++ b/pythondata_cpu_serv/verilog/README.md @@ -0,0 +1,149 @@ + + +# SERV + +SERV is an award-winning bit-serial RISC-V core + +## Prerequisites + +Create a directory to keep all the different parts of the project together. We +will refer to this directory as `$SERV` from now on. + +Download the main serv repo + +`cd $SERV && git clone https://github.com/olofk/serv` + +Install FuseSoC + +`pip install fusesoc` + +Initialize the FuseSoC standard libraries + +`fusesoc init` + +Create a workspace directory for FuseSoC + +`mkdir $SERV/workspace` + +Register the serv repo as a core library + +`cd $SERV/workspace && fusesoc library add serv $SERV` + +Check that the CPU passes the linter + +`cd $SERV/workspace && fusesoc run --target=lint serv` + +## Running test software + +Build and run the single threaded zephyr hello world example with verilator (should be stopped with Ctrl-C): + + cd $SERV/workspace + fusesoc run --target=verilator_tb servant --uart_baudrate=57600 --firmware=$SERV/serv/sw/zephyr_hello.hex + +..or... the multithreaded version + + fusesoc run --target=verilator_tb servant --uart_baudrate=57600 --firmware=$SERV/serv/sw/zephyr_hello_mt.hex --memsize=16384 + +...or... the philosophers example + + fusesoc run --target=verilator_tb servant --uart_baudrate=57600 --firmware=$SERV/serv/sw/zephyr_phil.hex --memsize=32768 + +...or... the synchronization example + + fusesoc run --target=verilator_tb servant --uart_baudrate=57600 --firmware=$SERV/serv/sw/zephyr_sync.hex --memsize=16384 + +Other applications can be tested by compiling and converting to bin and then hex e.g. with makehex.py found in `$SERV/serv/riscv-target/serv` + +## Run the compliance tests + +Build the verilator model (if not already done) + +`cd $SERV/workspace && fusesoc run --target=verilator_tb --setup --build servant` + +Download the tests repo + +`cd $SERV && git clone https://github.com/riscv/riscv-compliance` + +Run the compliance tests + +`cd $SERV/riscv-compliance && make TARGETDIR=$SERV/serv/riscv-target RISCV_TARGET=serv RISCV_DECICE=rv32i RISCV_ISA=rv32i TARGET_SIM=$SERV/workspace/build/servant_1.0.1/verilator_tb-verilator/Vservant_sim` + +## Run on hardware + +The servant SoC has been ported to a number of different FPGA boards. To see all currently supported targets run + + fusesoc core show servant + +By default, these targets have the program memory preloaded with a small Zephyr hello world example that writes its output on a UART pin. Don't forget to install the appropriate toolchain (e.g. icestorm, Vivado, Quartus...) and add to your PATH + +Some targets also depend on functionality in the FuseSoC base library (fusesoc-cores). Running `fusesoc library list` should tell you if fusesoc-cores is already available. If not, add it to your workspace with + + fusesoc library add fusesoc-cores https://github.com/fusesoc/fusesoc-cores + +Now we're ready to build. Note, for all the cases below, it's possible to run with `--memfile=$SERV/sw/blinky.hex` +(or any other suitable program) as the last argument to preload the LED blink example +instead of hello world. + +### TinyFPGA BX + +Pin A6 is used for UART output with 115200 baud rate. + + cd $SERV/workspace + fusesoc run --target=tinyfpga_bx servant + tinyprog --program build/servant_1.0.1/tinyfpga_bx-icestorm/servant_1.0.1.bin + +### Icebreaker + +Pin 9 is used for UART output with 57600 baud rate. + + cd $SERV/workspace + fusesoc run --target=icebreaker servant + +### Arty A7 35T + +Pin D10 (uart_rxd_out) is used for UART output with 57600 baud rate (to use +blinky.hex change D10 to H5 (led[4]) in data/arty_a7_35t.xdc). + + cd $SERV/workspace + fusesoc run --target=arty_a7_35t servant + +### Alhambra II + +Pin 61 is used for UART output with 38400 baud rate (note that it works with non-standard 43200 value too). This pin is connected to a FT2232H chip in board, that manages the communications between the FPGA and the computer. + + cd $SERV/workspace + fusesoc run --target=alhambra servant + iceprog -d i:0x0403:0x6010:0 build/servant_1.0.1/alhambra-icestorm/servant_1.0.1.bin + +## Other targets + +The above targets are run on the servant SoC, but there are some targets defined for the CPU itself. Verilator can be run in lint mode to check for design problems by running + + fusesoc run --target=lint serv + +It's also possible to just synthesise for different targets to check resource usage and such. To do that for the iCE40 devices, run + + fusesoc run --tool=icestorm serv --pnr=none + +...or to synthesize with vivado for Xilinx targets, run + + fusesoc run --tool=vivado serv --pnr=none + +This will synthesize for the default Vivado part. To synthesise for a specific device, run e.g. + + fusesoc run --tool=vivado serv --pnr=none --part=xc7a100tcsg324-1 + + +## Good to know + +Don't feed serv any illegal instructions after midnight. Many logic expressions are hand-optimized using the old-fashioned method with Karnaugh maps on paper, and shamelessly take advantage of the fact that some opcodes aren't supposed to appear. As serv was written with 4-input LUT FPGAs as target, and opcodes are 5 bits, this can save quite a bit of resources in the decoder. + +The bus interface is kind of Wishbone, but with most signals removed. There's an important difference though. Don't send acks on the instruction or data buses unless serv explicitly asks for something by raising its cyc signal. Otherwise serv becomes very confused. + +Don't go changing the clock frequency on a whim when running Zephyr. Or well, it's ok I guess, but since the UART is bitbanged, this will change the baud rate as well. As of writing, the UART is running at 115200 baud rate when the CPU is 32 MHz. There are two NOPs in the driver to slow it down a bit, so if those are removed I think it could achieve baud rate 115200 on a 24MHz clock.. in case someone wants to try + +## TODO + +- Applications have to be preloaded to RAM at compile-time +- Store bootloader and register file together in a RAM +- Make it faster and smaller diff --git a/pythondata_cpu_serv/verilog/bench/servant_sim.v b/pythondata_cpu_serv/verilog/bench/servant_sim.v new file mode 100644 index 0000000..64da239 --- /dev/null +++ b/pythondata_cpu_serv/verilog/bench/servant_sim.v @@ -0,0 +1,25 @@ +`default_nettype none +module servant_sim + (input wire wb_clk, + input wire wb_rst, + output wire q); + + parameter memfile = ""; + parameter memsize = 8192; + parameter with_csr = 1; + + reg [1023:0] firmware_file; + initial + if ($value$plusargs("firmware=%s", firmware_file)) begin + $display("Loading RAM from %0s", firmware_file); + $readmemh(firmware_file, dut.ram.mem); + end + + servant + #(.memfile (memfile), + .memsize (memsize), + .sim (1), + .with_csr (with_csr)) + dut(wb_clk, wb_rst, q); + +endmodule diff --git a/pythondata_cpu_serv/verilog/bench/servant_tb.cpp b/pythondata_cpu_serv/verilog/bench/servant_tb.cpp new file mode 100644 index 0000000..b8f294a --- /dev/null +++ b/pythondata_cpu_serv/verilog/bench/servant_tb.cpp @@ -0,0 +1,153 @@ +#include +#include + +#include "verilated_vcd_c.h" +#include "Vservant_sim.h" + +using namespace std; + +static bool done; + +vluint64_t main_time = 0; // Current simulation time +// This is a 64-bit integer to reduce wrap over issues and +// allow modulus. You can also use a double, if you wish. + +double sc_time_stamp () { // Called by $time in Verilog + return main_time; // converts to double, to match + // what SystemC does +} + +void INThandler(int signal) +{ + printf("\nCaught ctrl-c\n"); + done = true; +} + +typedef struct { + bool last_value; +} gpio_context_t; + +void do_gpio(gpio_context_t *context, bool gpio) { + if (context->last_value != gpio) { + context->last_value = gpio; + printf("%lu output q is %s\n", main_time, gpio ? "ON" : "OFF"); + } +} + +typedef struct { + uint8_t state; + char ch; + uint32_t baud_t; + vluint64_t last_update; +} uart_context_t; + +void uart_init(uart_context_t *context, uint32_t baud_rate) { + context->baud_t = 1000*1000*1000/baud_rate; + context->state = 0; +} + +void do_uart(uart_context_t *context, bool rx) { + if (context->state == 0) { + if (rx) + context->state++; + } + else if (context->state == 1) { + if (!rx) { + context->last_update = main_time + context->baud_t/2; + context->state++; + } + } + else if(context->state == 2) { + if (main_time > context->last_update) { + context->last_update += context->baud_t; + context->ch = 0; + context->state++; + } + } + else if (context->state < 11) { + if (main_time > context->last_update) { + context->last_update += context->baud_t; + context->ch |= rx << (context->state-3); + context->state++; + } + } + else { + if (main_time > context->last_update) { + context->last_update += context->baud_t; + putchar(context->ch); + context->state=1; + } + } +} + +int main(int argc, char **argv, char **env) +{ + vluint64_t sample_time = 0; + uint32_t insn = 0; + uint32_t ex_pc = 0; + int baud_rate = 0; + + gpio_context_t gpio_context; + uart_context_t uart_context; + Verilated::commandArgs(argc, argv); + + Vservant_sim* top = new Vservant_sim; + + const char *arg = Verilated::commandArgsPlusMatch("uart_baudrate="); + if (arg[0]) { + baud_rate = atoi(arg+15); + if (baud_rate) { + uart_init(&uart_context, baud_rate); + } + } + + VerilatedVcdC * tfp = 0; + const char *vcd = Verilated::commandArgsPlusMatch("vcd="); + if (vcd[0]) { + Verilated::traceEverOn(true); + tfp = new VerilatedVcdC; + top->trace (tfp, 99); + tfp->open ("trace.vcd"); + } + + signal(SIGINT, INThandler); + + vluint64_t timeout = 0; + const char *arg_timeout = Verilated::commandArgsPlusMatch("timeout="); + if (arg_timeout[0]) + timeout = atoi(arg_timeout+9); + + vluint64_t vcd_start = 0; + const char *arg_vcd_start = Verilated::commandArgsPlusMatch("vcd_start="); + if (arg_vcd_start[0]) + vcd_start = atoi(arg_vcd_start+11); + + bool dump = false; + top->wb_clk = 1; + bool q = top->q; + while (!(done || Verilated::gotFinish())) { + if (tfp && !dump && (main_time > vcd_start)) { + dump = true; + } + top->wb_rst = main_time < 100; + top->eval(); + if (dump) + tfp->dump(main_time); + if (baud_rate) + do_uart(&uart_context, top->q); + else + do_gpio(&gpio_context, top->q); + + if (timeout && (main_time >= timeout)) { + printf("Timeout: Exiting at time %lu\n", main_time); + done = true; + } + + top->wb_clk = !top->wb_clk; + main_time+=31.25; + + } + if (tfp) + tfp->close(); + exit(0); +} diff --git a/pythondata_cpu_serv/verilog/bench/servant_tb.v b/pythondata_cpu_serv/verilog/bench/servant_tb.v new file mode 100644 index 0000000..41183cd --- /dev/null +++ b/pythondata_cpu_serv/verilog/bench/servant_tb.v @@ -0,0 +1,24 @@ +`default_nettype none +module servant_tb; + + parameter memfile = ""; + parameter memsize = 8192; + parameter with_csr = 1; + + reg wb_clk = 1'b0; + reg wb_rst = 1'b1; + + always #31 wb_clk <= !wb_clk; + initial #62 wb_rst <= 1'b0; + + vlog_tb_utils vtu(); + + uart_decoder #(57600) uart_decoder (q); + + servant_sim + #(.memfile (memfile), + .memsize (memsize), + .with_csr (with_csr)) + dut(wb_clk, wb_rst, q); + +endmodule diff --git a/pythondata_cpu_serv/verilog/bench/uart_decoder.v b/pythondata_cpu_serv/verilog/bench/uart_decoder.v new file mode 100644 index 0000000..f80b3c5 --- /dev/null +++ b/pythondata_cpu_serv/verilog/bench/uart_decoder.v @@ -0,0 +1,18 @@ +module uart_decoder + #(parameter BAUD_RATE = 115200) + (input rx); + + localparam T = 1000000000/BAUD_RATE; + + integer i; + reg [7:0] ch; + + initial forever begin + @(negedge rx); + #(T/2) ch = 0; + for (i=0;i<8;i=i+1) + #T ch[i] = rx; + $write("%c",ch); + $fflush; + end +endmodule diff --git a/pythondata_cpu_serv/verilog/data/alhambra.pcf b/pythondata_cpu_serv/verilog/data/alhambra.pcf new file mode 100644 index 0000000..9c902dc --- /dev/null +++ b/pythondata_cpu_serv/verilog/data/alhambra.pcf @@ -0,0 +1,5 @@ +# 12 MHz clock +set_io i_clk 49 + +# RS232 +set_io q 61 diff --git a/pythondata_cpu_serv/verilog/data/arty_a7_35t.xdc b/pythondata_cpu_serv/verilog/data/arty_a7_35t.xdc new file mode 100644 index 0000000..e6fcbfa --- /dev/null +++ b/pythondata_cpu_serv/verilog/data/arty_a7_35t.xdc @@ -0,0 +1,10 @@ +set_property -dict {PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports i_clk]; + +set_property -dict {PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports q] + +#set_property -dict {PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports q] + +set_property CFGBVS VCCO [current_design] +set_property CONFIG_VOLTAGE 3.3 [current_design] + +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports i_clk]; diff --git a/pythondata_cpu_serv/verilog/data/cyc1000.sdc b/pythondata_cpu_serv/verilog/data/cyc1000.sdc new file mode 100644 index 0000000..c674e2f --- /dev/null +++ b/pythondata_cpu_serv/verilog/data/cyc1000.sdc @@ -0,0 +1,8 @@ +# Main system clock (12 Mhz) +create_clock -name "clk" -period 83.333ns [get_ports {i_clk}] + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty diff --git a/pythondata_cpu_serv/verilog/data/cyc1000.tcl b/pythondata_cpu_serv/verilog/data/cyc1000.tcl new file mode 100644 index 0000000..7d8c144 --- /dev/null +++ b/pythondata_cpu_serv/verilog/data/cyc1000.tcl @@ -0,0 +1,14 @@ +# +# Clock / Reset +# +set_location_assignment PIN_M2 -to i_clk +set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to i_clk +set_location_assignment PIN_N6 -to i_rst +set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to i_clk + +#UART/GPIO +set_location_assignment PIN_M6 -to q +set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to q + +set_location_assignment PIN_T7 -to uart_txd +set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to uart* diff --git a/pythondata_cpu_serv/verilog/data/icebreaker.pcf b/pythondata_cpu_serv/verilog/data/icebreaker.pcf new file mode 100644 index 0000000..124cb75 --- /dev/null +++ b/pythondata_cpu_serv/verilog/data/icebreaker.pcf @@ -0,0 +1,5 @@ +# 12 MHz clock +set_io i_clk 35 + +# RS232 +set_io q 9 diff --git a/pythondata_cpu_serv/verilog/data/nexys_a7.xdc b/pythondata_cpu_serv/verilog/data/nexys_a7.xdc new file mode 100644 index 0000000..3906727 --- /dev/null +++ b/pythondata_cpu_serv/verilog/data/nexys_a7.xdc @@ -0,0 +1,4 @@ +set_property -dict {PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports i_clk]; +set_property -dict {PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports q] + +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports i_clk]; diff --git a/pythondata_cpu_serv/verilog/data/tinyfpga_bx.pcf b/pythondata_cpu_serv/verilog/data/tinyfpga_bx.pcf new file mode 100644 index 0000000..7a56754 --- /dev/null +++ b/pythondata_cpu_serv/verilog/data/tinyfpga_bx.pcf @@ -0,0 +1,2 @@ +set_io q A6 +set_io i_clk B2 diff --git a/pythondata_cpu_serv/verilog/data/ulx3s.lpf b/pythondata_cpu_serv/verilog/data/ulx3s.lpf new file mode 100644 index 0000000..0ea49d6 --- /dev/null +++ b/pythondata_cpu_serv/verilog/data/ulx3s.lpf @@ -0,0 +1,14 @@ +LOCATE COMP "clk" SITE "G2"; +IOBUF PORT "clk" PULLMODE=NONE IO_TYPE=LVCMOS33; +FREQUENCY PORT "clk" 25.000 MHZ; +LOCATE COMP "q" SITE "B2"; +IOBUF PORT "q" PULLMODE=NONE IO_TYPE=LVCMOS33 DRIVE=4; + +LOCATE COMP "btn0" SITE "D6"; # BTN_PWRn (inverted logic) +IOBUF PORT "btn0" PULLMODE=UP IO_TYPE=LVCMOS33; + +LOCATE COMP "wifi_gpio0" SITE "L2"; +IOBUF PORT "wifi_gpio0" PULLMODE=UP IO_TYPE=LVCMOS33 DRIVE=4; + +LOCATE COMP "uart_txd" SITE "L4"; # FPGA transmits to ftdi +IOBUF PORT "uart_txd" PULLMODE=UP IO_TYPE=LVCMOS33 DRIVE=4; diff --git a/pythondata_cpu_serv/verilog/data/upduino2.pcf b/pythondata_cpu_serv/verilog/data/upduino2.pcf new file mode 100644 index 0000000..9611af5 --- /dev/null +++ b/pythondata_cpu_serv/verilog/data/upduino2.pcf @@ -0,0 +1,4 @@ +set_io g 39 +set_io b 40 +set_io r 41 +set_io q 14 diff --git a/pythondata_cpu_serv/verilog/data/zcu106.xdc b/pythondata_cpu_serv/verilog/data/zcu106.xdc new file mode 100644 index 0000000..2d6d0d3 --- /dev/null +++ b/pythondata_cpu_serv/verilog/data/zcu106.xdc @@ -0,0 +1,8 @@ +## Clock signal +set_property -dict { PACKAGE_PIN H9 IOSTANDARD LVDS } [get_ports i_clk_p]; +set_property -dict { PACKAGE_PIN G9 IOSTANDARD LVDS } [get_ports i_clk_n]; +create_clock -add -name sys_clk_pin -period 8 [get_nets i_clk]; + +## LED +set_property -dict { PACKAGE_PIN AL11 IOSTANDARD LVCMOS12 } [get_ports q]; +set_property -dict { PACKAGE_PIN AL17 IOSTANDARD LVCMOS12 } [get_ports o_uart_tx] diff --git a/pythondata_cpu_serv/verilog/riscv-target/serv/compliance_io.h b/pythondata_cpu_serv/verilog/riscv-target/serv/compliance_io.h new file mode 100644 index 0000000..65e0148 --- /dev/null +++ b/pythondata_cpu_serv/verilog/riscv-target/serv/compliance_io.h @@ -0,0 +1,36 @@ +// RISC-V Compliance IO Test Header File + +/* + * Copyright (c) 2005-2018 Imperas Software Ltd., www.imperas.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _COMPLIANCE_IO_H +#define _COMPLIANCE_IO_H + +//----------------------------------------------------------------------- +// RV IO Macros (Non functional) +//----------------------------------------------------------------------- + +#define RVTEST_IO_INIT +#define RVTEST_IO_WRITE_STR(_STR) +#define RVTEST_IO_CHECK() +#define RVTEST_IO_ASSERT_GPR_EQ(_R, _I) +#define RVTEST_IO_ASSERT_SFPR_EQ(_F, _R, _I) +#define RVTEST_IO_ASSERT_DFPR_EQ(_D, _R, _I) + +#endif // _COMPLIANCE_IO_H diff --git a/pythondata_cpu_serv/verilog/riscv-target/serv/compliance_test.h b/pythondata_cpu_serv/verilog/riscv-target/serv/compliance_test.h new file mode 100644 index 0000000..512793b --- /dev/null +++ b/pythondata_cpu_serv/verilog/riscv-target/serv/compliance_test.h @@ -0,0 +1,67 @@ +// RISC-V Compliance Test Header File +// Copyright (c) 2017, Codasip Ltd. All Rights Reserved. +// See LICENSE for license details. +// +// Description: Common header file for RV32I tests + +#ifndef _COMPLIANCE_TEST_H +#define _COMPLIANCE_TEST_H + +//----------------------------------------------------------------------- +// RV Compliance Macros +//----------------------------------------------------------------------- + +#define RV_COMPLIANCE_HALT \ +la a0, data_begin; \ + la a1, data_end; \ + li a2, 0x80000000; \ +complience_halt_loop: \ + beq a0, a1, complience_halt_break; \ + addi a3, a0, 4; \ +complience_halt_loop2: \ + addi a3, a3, -1; \ + \ + lb a4, 0 (a3); \ + srai a5, a4, 4; \ + andi a5, a5, 0xF; \ + li a6, 10; \ + blt a5, a6, notLetter; \ + addi a5, a5, 39; \ +notLetter: \ + addi a5, a5, 0x30; \ + sw a5, 0 (a2); \ + \ + srai a5, a4, 0; \ + andi a5, a5, 0xF; \ + li a6, 10; \ + blt a5, a6, notLetter2; \ + addi a5, a5, 39; \ +notLetter2: \ + addi a5, a5, 0x30; \ + sw a5, 0 (a2); \ + bne a0, a3,complience_halt_loop2; \ + addi a0, a0, 4; \ + \ + li a4, '\n'; \ + sw a4, 0 (a2); \ + j complience_halt_loop; \ + j complience_halt_break; \ +complience_halt_break:; \ + lui a0,0x90000000>>12; \ + sw a3,0(a0); + +#define RV_COMPLIANCE_RV32M + +#define RV_COMPLIANCE_CODE_BEGIN \ + .section .text.init; \ + .align 4; \ + .globl _start; \ +_start: \ + +#define RV_COMPLIANCE_CODE_END + +#define RV_COMPLIANCE_DATA_BEGIN .align 4; .global data_begin; data_begin: + +#define RV_COMPLIANCE_DATA_END .align 4; .global data_end; data_end: + +#endif diff --git a/pythondata_cpu_serv/verilog/riscv-target/serv/device/rv32i/Makefile.include b/pythondata_cpu_serv/verilog/riscv-target/serv/device/rv32i/Makefile.include new file mode 100644 index 0000000..9ef57a7 --- /dev/null +++ b/pythondata_cpu_serv/verilog/riscv-target/serv/device/rv32i/Makefile.include @@ -0,0 +1,26 @@ +TARGET_SIM ?= server +ifeq ($(shell command -v $(TARGET_SIM) 2> /dev/null),) + $(error Target simulator executable '$(TARGET_SIM)` not found) +endif + +RUN_TARGET=\ + $(TARGET_SIM) \ + +timeout=100000000 \ + +signature=$(work_dir_isa)/$(*).signature.output \ + +firmware=$(work_dir_isa)/$<.hex 2> $(work_dir_isa)/$@ + +RISCV_PREFIX ?= riscv32-unknown-elf- +RISCV_GCC ?= $(RISCV_PREFIX)gcc +RISCV_OBJCOPY ?= $(RISCV_PREFIX)objcopy +RISCV_OBJDUMP ?= $(RISCV_PREFIX)objdump +RISCV_GCC_OPTS ?= -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles + +COMPILE_TARGET=\ + $$(RISCV_GCC) $(2) $$(RISCV_GCC_OPTS) \ + -I$(ROOTDIR)/riscv-test-env/ \ + -I$(TARGETDIR)/$(RISCV_TARGET)/ \ + -T$(TARGETDIR)/$(RISCV_TARGET)/link.ld $$< \ + -o $(work_dir_isa)/$$@; \ + $$(RISCV_OBJCOPY) -O binary $(work_dir_isa)/$$@ $(work_dir_isa)/$$@.bin; \ + $$(RISCV_OBJDUMP) -D $(work_dir_isa)/$$@ > $(work_dir_isa)/$$@.objdump; \ + python3 $(TARGETDIR)/$(RISCV_TARGET)/makehex.py $(work_dir_isa)/$$@.bin 2048 > $(work_dir_isa)/$$@.hex; diff --git a/pythondata_cpu_serv/verilog/riscv-target/serv/link.ld b/pythondata_cpu_serv/verilog/riscv-target/serv/link.ld new file mode 100644 index 0000000..db7be33 --- /dev/null +++ b/pythondata_cpu_serv/verilog/riscv-target/serv/link.ld @@ -0,0 +1,18 @@ +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +SECTIONS +{ + . = 0x00000000; + .text.init : { *(.text.init) } + . = ALIGN(0x1000); + .tohost : { *(.tohost) } + . = ALIGN(0x1000); + .text : { *(.text) } + . = ALIGN(0x1000); + .data : { *(.data) } + .data.string : { *(.data.string)} + .bss : { *(.bss) } + _end = .; +} + diff --git a/pythondata_cpu_serv/verilog/riscv-target/serv/makehex.py b/pythondata_cpu_serv/verilog/riscv-target/serv/makehex.py new file mode 100644 index 0000000..419b378 --- /dev/null +++ b/pythondata_cpu_serv/verilog/riscv-target/serv/makehex.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +# +# This is free and unencumbered software released into the public domain. +# +# Anyone is free to copy, modify, publish, use, compile, sell, or +# distribute this software, either in source code form or as a compiled +# binary, for any purpose, commercial or non-commercial, and by any +# means. + +from sys import argv + +binfile = argv[1] +nwords = int(argv[2]) + +with open(binfile, "rb") as f: + bindata = f.read() + +assert len(bindata) < 4*nwords +assert len(bindata) % 4 == 0 + +for i in range(nwords): + if i < len(bindata) // 4: + w = bindata[4*i : 4*i+4] + print("%02x%02x%02x%02x" % (w[3], w[2], w[1], w[0])) + else: + print("0") + diff --git a/pythondata_cpu_serv/verilog/rtl/ser_shift.v b/pythondata_cpu_serv/verilog/rtl/ser_shift.v new file mode 100644 index 0000000..8ec995b --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/ser_shift.v @@ -0,0 +1,30 @@ +`default_nettype none +module ser_shift + ( + input wire i_clk, + input wire i_load, + input wire [4:0] i_shamt, + input wire i_shamt_msb, + input wire i_signbit, + input wire i_right, + output wire o_done, + input wire i_d, + output wire o_q); + + reg signbit; + reg [5:0] cnt; + reg wrapped; + + always @(posedge i_clk) begin + cnt <= cnt + 6'd1; + if (i_load) begin + cnt <= 6'd0; + signbit <= i_signbit & i_right; + end + wrapped <= cnt[5] | (i_shamt_msb & !i_right); + end + + assign o_done = (cnt[4:0] == i_shamt); + assign o_q = (i_right^wrapped) ? i_d : signbit; + +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/serv_alu.v b/pythondata_cpu_serv/verilog/rtl/serv_alu.v new file mode 100644 index 0000000..e6d7a46 --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_alu.v @@ -0,0 +1,112 @@ +`default_nettype none +module serv_alu + ( + input wire clk, + input wire i_rst, + input wire i_en, + input wire i_cnt0, + input wire i_rs1, + input wire i_rs2, + input wire i_imm, + input wire i_op_b_rs2, + input wire i_buf, + input wire i_init, + input wire i_cnt_done, + input wire i_sub, + input wire [1:0] i_bool_op, + input wire i_cmp_eq, + input wire i_cmp_uns, + output wire o_cmp, + input wire i_shamt_en, + input wire i_sh_right, + input wire i_sh_signed, + output wire o_sh_done, + input wire [3:0] i_rd_sel, + output wire o_rd); + + wire result_add; + wire result_eq; + wire result_lt; + wire result_sh; + + reg result_lt_r; + + wire [4:0] shamt; + reg shamt_msb; + + wire shamt_ser; + wire plus_1; + + wire add_cy; + reg add_cy_r; + + wire b_inv_plus_1; + wire b_inv_plus_1_cy; + reg b_inv_plus_1_cy_r; + + wire op_b = i_op_b_rs2 ? i_rs2 : i_imm; + assign shamt_ser = i_sh_right ? op_b : b_inv_plus_1; + + shift_reg #(.LEN (5)) shamt_reg + (.clk (clk), + .i_rst (i_rst), + .i_en (i_shamt_en), + .i_d (shamt_ser), + .o_q (shamt[0]), + .o_par (shamt[4:1])); + + ser_shift shift + ( + .i_clk (clk), + .i_load (i_init), + .i_shamt (shamt), + .i_shamt_msb (shamt_msb), + .i_signbit (i_sh_signed & i_rs1), + .i_right (i_sh_right), + .o_done (o_sh_done), + .i_d (i_buf), + .o_q (result_sh)); + + wire add_b = i_sub ? b_inv_plus_1 : op_b; + assign {add_cy,result_add} = i_rs1+add_b+add_cy_r; + assign {b_inv_plus_1_cy,b_inv_plus_1} = {1'b0,~op_b}+plus_1+b_inv_plus_1_cy_r; + + reg lt_r; + + reg eq_r; + + wire lt_sign = i_cnt_done & !i_cmp_uns; + + wire eq = (i_rs1 == op_b); + + assign result_eq = eq & eq_r; + assign result_lt = eq ? lt_r : op_b^lt_sign; + + assign plus_1 = i_cnt0; + assign o_cmp = i_cmp_eq ? result_eq : result_lt; + + localparam [15:0] BOOL_LUT = 16'h8E96;//And, Or, =, xor + wire result_bool = BOOL_LUT[{i_bool_op, i_rs1, op_b}]; + + assign o_rd = (i_rd_sel[0] & result_add) | + (i_rd_sel[1] & result_sh) | + (i_rd_sel[2] & result_lt_r & plus_1) | + (i_rd_sel[3] & result_bool); + + + always @(posedge clk) begin + add_cy_r <= i_en & add_cy; + b_inv_plus_1_cy_r <= i_en & b_inv_plus_1_cy; + + lt_r <= result_lt & i_en; + + if (i_en) begin + result_lt_r <= result_lt; + end + eq_r <= result_eq | ~i_en; + + if (i_shamt_en) + shamt_msb <= b_inv_plus_1_cy; + end + +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/serv_bufreg.v b/pythondata_cpu_serv/verilog/rtl/serv_bufreg.v new file mode 100644 index 0000000..1f8c70c --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_bufreg.v @@ -0,0 +1,42 @@ +module serv_bufreg + ( + input wire i_clk, + input wire i_cnt0, + input wire i_cnt1, + input wire i_en, + input wire i_init, + input wire i_loop, + input wire i_rs1, + input wire i_rs1_en, + input wire i_imm, + input wire i_imm_en, + input wire i_clr_lsb, + output reg [1:0] o_lsb, + output wire [31:0] o_dbus_adr, + output wire o_q); + + wire c, q; + reg c_r; + reg [31:0] data; + + wire clr_lsb = i_cnt0 & i_clr_lsb; + + assign {c,q} = {1'b0,(i_rs1 & i_rs1_en)} + {1'b0,(i_imm & i_imm_en & !clr_lsb)} + c_r; + + always @(posedge i_clk) begin + //Clear carry when not in INIT state + c_r <= c & i_init; + + if (i_en) + data <= {(i_loop & !i_init) ? o_q : q, data[31:1]}; + + if (i_cnt0 & i_init) + o_lsb[0] <= q; + if (i_cnt1 & i_init) + o_lsb[1] <= q; + end + + assign o_q = data[0]; + assign o_dbus_adr = {data[31:2], 2'b00}; + +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/serv_csr.v b/pythondata_cpu_serv/verilog/rtl/serv_csr.v new file mode 100644 index 0000000..897e272 --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_csr.v @@ -0,0 +1,108 @@ +`default_nettype none +module serv_csr + ( + input wire i_clk, + input wire i_en, + input wire i_cnt0to3, + input wire i_cnt2, + input wire i_cnt3, + input wire i_cnt7, + input wire i_cnt_done, + input wire i_e_op, + input wire i_ebreak, + input wire i_mem_cmd, + input wire i_mem_misalign, + //From mpram + input wire i_rf_csr_out, + //to mpram + output wire o_csr_in, + //Stuff + input wire i_mtip, + output wire o_new_irq, + input wire i_pending_irq, + input wire i_trap_taken, + input wire i_mstatus_en, + input wire i_mie_en, + input wire i_mcause_en, + input wire [1:0] i_csr_source, + input wire i_mret, + input wire i_d, + output wire o_q); + +`include "serv_params.vh" + + reg mstatus; + reg mstatus_mie; + reg mstatus_mpie; + reg mie_mtie; + + reg mcause31; + reg [3:0] mcause3_0; + wire mcause; + + wire csr_in; + wire csr_out; + + reg timer_irq_r; + + assign csr_in = (i_csr_source == CSR_SOURCE_EXT) ? i_d : + (i_csr_source == CSR_SOURCE_SET) ? csr_out | i_d : + (i_csr_source == CSR_SOURCE_CLR) ? csr_out & ~i_d : + (i_csr_source == CSR_SOURCE_CSR) ? csr_out : + 1'bx; + + assign csr_out = (i_mstatus_en & i_en & mstatus) | + i_rf_csr_out | + (i_mcause_en & i_en & mcause); + + assign o_q = csr_out; + + wire timer_irq = i_mtip & mstatus_mie & mie_mtie; + + assign mcause = i_cnt0to3 ? mcause3_0[0] : //[3:0] + i_cnt_done ? mcause31 //[31] + : 1'b0; + + assign o_csr_in = csr_in; + + assign o_new_irq = !timer_irq_r & timer_irq; + + + always @(posedge i_clk) begin + /* + Note: To save resources mstatus_mpie (mstatus bit 7) is not + readable or writable from sw + */ + if (i_mstatus_en & i_cnt3) + mstatus_mie <= csr_in; + + if (i_mie_en & i_cnt7) + mie_mtie <= csr_in; + + mstatus <= i_cnt2 & mstatus_mie; + + timer_irq_r <= timer_irq; + + if (i_mret) begin + mstatus_mie <= mstatus_mpie; + end + + if (i_trap_taken) begin + mstatus_mpie <= mstatus_mie; + mstatus_mie <= 1'b0; + mcause31 <= i_pending_irq; + mcause3_0 <= i_pending_irq ? 4'd7 : + i_e_op ? {!i_ebreak, 3'b011} : + i_mem_misalign ? {2'b01, i_mem_cmd, 1'b0} : + 4'd0; + end + + if (i_mcause_en & i_en) begin + if (i_cnt0to3) + mcause3_0 <= {csr_in, mcause3_0[3:1]}; + if (i_cnt_done) + mcause31 <= csr_in; + end + end + +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/serv_ctrl.v b/pythondata_cpu_serv/verilog/rtl/serv_ctrl.v new file mode 100644 index 0000000..203c8a4 --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_ctrl.v @@ -0,0 +1,100 @@ +`default_nettype none +module serv_ctrl + ( + input wire clk, + input wire i_rst, + //State + input wire i_pc_en, + input wire i_cnt12to31, + input wire i_cnt2, + input wire i_cnt_done, + //Control + input wire i_jump, + input wire i_jal_or_jalr, + input wire i_utype, + input wire i_pc_rel, + input wire i_trap, + //Data + input wire i_imm, + input wire i_buf, + input wire i_csr_pc, + output wire o_rd, + output wire o_bad_pc, + //External + output wire [31:0] o_ibus_adr, + output wire o_ibus_cyc, + input wire i_ibus_ack); + + parameter RESET_PC = 32'd0; + parameter WITH_CSR = 1; + + reg en_pc_r; + + wire pc_plus_4; + wire pc_plus_4_cy; + reg pc_plus_4_cy_r; + wire pc_plus_offset; + wire pc_plus_offset_cy; + reg pc_plus_offset_cy_r; + wire pc_plus_offset_aligned; + wire plus_4; + + wire pc; + + wire new_pc; + + wire offset_a; + wire offset_b; + + assign plus_4 = i_cnt2; + + assign o_ibus_adr[0] = pc; + assign o_bad_pc = pc_plus_offset_aligned; + + assign {pc_plus_4_cy,pc_plus_4} = pc+plus_4+pc_plus_4_cy_r; + + shift_reg + #( + .LEN (32), + .INIT (RESET_PC)) + pc_reg + ( + .clk (clk), + .i_rst (i_rst), + .i_en (i_pc_en), + .i_d (new_pc), + .o_q (pc), + .o_par (o_ibus_adr[31:1]) + ); + + generate + if (WITH_CSR) + assign new_pc = i_trap ? (i_csr_pc & en_pc_r) : i_jump ? pc_plus_offset_aligned : pc_plus_4; + else + assign new_pc = i_jump ? pc_plus_offset_aligned : pc_plus_4; + endgenerate + assign o_rd = (i_utype & pc_plus_offset_aligned) | (pc_plus_4 & i_jal_or_jalr); + + assign offset_a = i_pc_rel & pc; + assign offset_b = i_utype ? (i_imm & i_cnt12to31): i_buf; + assign {pc_plus_offset_cy,pc_plus_offset} = offset_a+offset_b+pc_plus_offset_cy_r; + + assign pc_plus_offset_aligned = pc_plus_offset & en_pc_r; + + assign o_ibus_cyc = en_pc_r & !i_pc_en; + + always @(posedge clk) begin + pc_plus_4_cy_r <= i_pc_en & pc_plus_4_cy; + pc_plus_offset_cy_r <= i_pc_en & pc_plus_offset_cy; + + if (i_pc_en) + en_pc_r <= 1'b1; + else if (o_ibus_cyc & i_ibus_ack) + en_pc_r <= 1'b0; + + if (i_rst) begin + en_pc_r <= 1'b1; + end + end + +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/serv_decode.v b/pythondata_cpu_serv/verilog/rtl/serv_decode.v new file mode 100644 index 0000000..d66a1e0 --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_decode.v @@ -0,0 +1,239 @@ +`default_nettype none +module serv_decode + ( + input wire clk, + //Input + input wire i_cnt_en, + input wire i_cnt_done, + input wire [31:2] i_wb_rdt, + input wire i_wb_en, + input wire i_alu_cmp, + //To state + output wire o_take_branch, + output wire o_e_op, + output wire o_ebreak, + output wire o_branch_op, + output wire o_mem_op, + output wire o_shift_op, + output wire o_slt_op, + output wire o_rd_op, + //To bufreg + output wire o_bufreg_loop, + output wire o_bufreg_rs1_en, + output wire o_bufreg_imm_en, + output wire o_bufreg_clr_lsb, + //To ctrl + output wire o_ctrl_jal_or_jalr, + output wire o_ctrl_utype, + output wire o_ctrl_pc_rel, + output wire o_ctrl_mret, + //To alu + output wire o_alu_sub, + output wire [1:0] o_alu_bool_op, + output wire o_alu_cmp_eq, + output wire o_alu_cmp_uns, + output wire o_alu_sh_signed, + output wire o_alu_sh_right, + output wire [3:0] o_alu_rd_sel, + //To RF + output reg [4:0] o_rf_rd_addr, + output reg [4:0] o_rf_rs1_addr, + output reg [4:0] o_rf_rs2_addr, + //To mem IF + output wire o_mem_signed, + output wire o_mem_word, + output wire o_mem_half, + output wire o_mem_cmd, + //To CSR + output wire o_csr_en, + output wire [1:0] o_csr_addr, + output wire o_csr_mstatus_en, + output wire o_csr_mie_en, + output wire o_csr_mcause_en, + output wire [1:0] o_csr_source, + output wire o_csr_d_sel, + output wire o_csr_imm, + //To top + output wire o_imm, + output wire o_op_b_source, + output wire o_rd_csr_en, + output wire o_rd_alu_en); + +`include "serv_params.vh" + + reg [4:0] opcode; + reg [2:0] funct3; + reg op20; + reg op21; + reg op22; + reg op26; + + reg imm30; + + wire op_or_opimm = (!opcode[4] & opcode[2] & !opcode[0]); + + assign o_mem_op = !opcode[4] & !opcode[2] & !opcode[0]; + assign o_shift_op = op_or_opimm & (funct3[1:0] == 2'b01); + assign o_slt_op = op_or_opimm & (funct3[2:1] == 2'b01); + assign o_branch_op = opcode[4] & !opcode[2]; + + //Matches system opcodes except CSR accesses (funct3 == 0) + //No idea anymore why the !op21 condition is needed here + assign o_e_op = opcode[4] & opcode[2] & !op21 & !(|funct3); + + assign o_ebreak = op20; + + //jal,branch = imm + //jalr = rs1+imm + //mem = rs1+imm + //shift = rs1 + assign o_bufreg_rs1_en = !opcode[4] | (!opcode[1] & opcode[0]); + assign o_bufreg_imm_en = !opcode[2]; + + //Loop bufreg contents for shift operations + assign o_bufreg_loop = op_or_opimm; + + //Clear LSB of immediate for BRANCH and JAL ops + //True for BRANCH and JAL + //False for JALR/LOAD/STORE/OP/OPIMM? + assign o_bufreg_clr_lsb = opcode[4] & ((opcode[1:0] == 2'b00) | (opcode[1:0] == 2'b11)); + + //Take branch for jump or branch instructions (opcode == 1x0xx) if + //a) It's an unconditional branch (opcode[0] == 1) + //b) It's a conditional branch (opcode[0] == 0) of type beq,blt,bltu (funct3[0] == 0) and ALU compare is true + //c) It's a conditional branch (opcode[0] == 0) of type bne,bge,bgeu (funct3[0] == 1) and ALU compare is false + //Only valid during the last cycle of INIT, when the branch condition has + //been calculated. + assign o_take_branch = opcode[4] & !opcode[2] & (opcode[0] | (i_alu_cmp^funct3[0])); + + assign o_ctrl_utype = !opcode[4] & opcode[2] & opcode[0]; + assign o_ctrl_jal_or_jalr = opcode[4] & opcode[0]; + + //True for jal, b* auipc + //False for jalr, lui + assign o_ctrl_pc_rel = (opcode[2:0] == 3'b000) | + (opcode[1:0] == 2'b11) | + (opcode[4:3] == 2'b00); + + assign o_ctrl_mret = (opcode[4] & opcode[2] & op21 & !(|funct3)); + + //Write to RD + //True for OP-IMM, AUIPC, OP, LUI, SYSTEM, JALR, JAL, LOAD + //False for STORE, BRANCH, MISC-MEM + assign o_rd_op = (opcode[2] | + (!opcode[2] & opcode[4] & opcode[0]) | + (!opcode[2] & !opcode[3] & !opcode[0])) & (|o_rf_rd_addr); + + assign o_alu_sub = opcode[3] & imm30/*alu_sub_r*/; + + /* + 300 0_000 mstatus RWSC + 304 0_100 mie SCWi + 305 0_101 mtvec RW + 340 1_000 mscratch + 341 1_001 mepc RW + 342 1_010 mcause R + 343 1_011 mtval + 344 1_100 mip CWi + */ + + //true for mtvec,mscratch,mepc and mtval + //false for mstatus, mie, mcause, mip + wire csr_valid = op20 | (op26 & !op22 & !op21); + + //Matches system ops except eceall/ebreak + wire csr_op = opcode[4] & opcode[2] & (|funct3); + assign o_rd_csr_en = csr_op; + + assign o_csr_en = csr_op & csr_valid; + assign o_csr_mstatus_en = csr_op & !op26 & !op22; + assign o_csr_mie_en = csr_op & !op26 & op22 & !op20; + assign o_csr_mcause_en = csr_op & op21 & !op20; + + assign o_csr_source = funct3[1:0]; + assign o_csr_d_sel = funct3[2]; + assign o_csr_imm = o_rf_rs1_addr[0]; + + assign o_csr_addr = (op26 & !op20) ? CSR_MSCRATCH : + (op26 & !op21) ? CSR_MEPC : + (op26) ? CSR_MTVAL : + CSR_MTVEC; + + assign o_alu_cmp_eq = funct3[2:1] == 2'b00; + + assign o_alu_cmp_uns = (funct3[0] & funct3[1]) | (funct3[1] & funct3[2]); + assign o_alu_sh_signed = imm30; + assign o_alu_sh_right = funct3[2]; + + assign o_mem_cmd = opcode[3]; + assign o_mem_signed = ~funct3[2]; + assign o_mem_word = funct3[1]; + assign o_mem_half = funct3[0]; + + assign o_alu_bool_op = funct3[1:0]; + + reg signbit; + + reg [8:0] imm19_12_20; + reg imm7; + reg [5:0] imm30_25; + reg [4:0] imm24_20; + reg [4:0] imm11_7; + + wire [1:0] m2; + //True for OP-IMM, LOAD, STORE, JALR + //False for LUI, AUIPC, JAL + assign m2[0] = (opcode[1:0] == 2'b00) | (opcode[2:1] == 2'b00); + assign m2[1] = opcode[4] & !opcode[0]; + wire m3 = opcode[4]; + + assign o_alu_rd_sel[0] = (funct3 == 3'b000); // Add/sub + assign o_alu_rd_sel[1] = (funct3[1:0] == 2'b01); //Shift + assign o_alu_rd_sel[2] = (funct3[2:1] == 2'b01); //SLT* + assign o_alu_rd_sel[3] = (funct3[2] & !(funct3[1:0] == 2'b01)); //Bool + always @(posedge clk) begin + if (i_wb_en) begin + o_rf_rd_addr <= i_wb_rdt[11:7]; + o_rf_rs1_addr <= i_wb_rdt[19:15]; + o_rf_rs2_addr <= i_wb_rdt[24:20]; + funct3 <= i_wb_rdt[14:12]; + imm30 <= i_wb_rdt[30]; + opcode <= i_wb_rdt[6:2]; + op20 <= i_wb_rdt[20]; + op21 <= i_wb_rdt[21]; + op22 <= i_wb_rdt[22]; + op26 <= i_wb_rdt[26]; + + //Immediate decoder + signbit <= i_wb_rdt[31]; + imm19_12_20 <= {i_wb_rdt[19:12],i_wb_rdt[20]}; + imm7 <= i_wb_rdt[7]; + imm30_25 <= i_wb_rdt[30:25]; + imm24_20 <= i_wb_rdt[24:20]; + imm11_7 <= i_wb_rdt[11:7]; + end + if (i_cnt_en) begin + imm19_12_20 <= {m3 ? signbit : imm24_20[0], imm19_12_20[8:1]}; + imm7 <= signbit; + imm30_25 <= {m2[1] ? imm7 : m2[0] ? signbit : imm19_12_20[0], imm30_25[5:1]}; + imm24_20 <= {imm30_25[0], imm24_20[4:1]}; + imm11_7 <= {imm30_25[0], imm11_7[4:1]}; + if (csr_op & o_csr_d_sel) + o_rf_rs1_addr <= {1'b0,o_rf_rs1_addr[4:1]}; + end + end + + //True for S (STORE) or B (BRANCH) type instructions + //False for J type instructions + wire m1 = opcode[3:0] == 4'b1000; + + assign o_imm = i_cnt_done ? signbit : m1 ? imm11_7[0] : imm24_20[0]; + + //0 (OP_B_SOURCE_IMM) when OPIMM + //1 (OP_B_SOURCE_RS2) when BRANCH or OP + assign o_op_b_source = opcode[3]; + + assign o_rd_alu_en = !opcode[0] & opcode[2] & !opcode[4]; + + +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/serv_mem_if.v b/pythondata_cpu_serv/verilog/rtl/serv_mem_if.v new file mode 100644 index 0000000..b9ea5cb --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_mem_if.v @@ -0,0 +1,68 @@ +`default_nettype none +module serv_mem_if + #(parameter WITH_CSR = 1) + ( + input wire i_clk, + input wire i_en, + input wire i_mem_op, + input wire i_signed, + input wire i_word, + input wire i_half, + input wire [1:0] i_bytecnt, + input wire i_rs2, + output wire o_rd, + input wire [1:0] i_lsb, + output wire o_misalign, + //External interface + output wire [31:0] o_wb_dat, + output wire [3:0] o_wb_sel, + input wire [31:0] i_wb_rdt, + input wire i_wb_ack); + + reg signbit; + + wire [2:0] tmp = {1'b0,i_bytecnt}+{1'b0,i_lsb}; + + reg [31:0] dat; + + wire dat_en = i_en & !tmp[2]; + + wire dat_cur = + ((i_lsb == 2'd3) & dat[24]) | + ((i_lsb == 2'd2) & dat[16]) | + ((i_lsb == 2'd1) & dat[8]) | + ((i_lsb == 2'd0) & dat[0]); + + wire dat_valid = i_word | (i_bytecnt == 2'b00) | (i_half & !i_bytecnt[1]); + + assign o_rd = i_mem_op & (dat_valid ? dat_cur : signbit & i_signed); + + assign o_wb_sel[3] = (i_lsb == 2'b11) | i_word | (i_half & i_lsb[1]); + assign o_wb_sel[2] = (i_lsb == 2'b10) | i_word; + assign o_wb_sel[1] = (i_lsb == 2'b01) | i_word | (i_half & !i_lsb[1]); + assign o_wb_sel[0] = (i_lsb == 2'b00); + + assign o_wb_dat = dat; + + always @(posedge i_clk) begin + if (dat_en) + dat <= {i_rs2, dat[31:1]}; + + if (i_wb_ack) + dat <= i_wb_rdt; + + if (dat_valid) + signbit <= dat_cur; + end + generate + if (WITH_CSR) begin + reg misalign; + always @(posedge i_clk) + misalign <= (i_lsb[0] & (i_word | i_half)) | (i_lsb[1] & i_word); + assign o_misalign = misalign & i_mem_op; + end else begin + assign o_misalign = 1'b0; + end + endgenerate + +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/serv_params.vh b/pythondata_cpu_serv/verilog/rtl/serv_params.vh new file mode 100644 index 0000000..0cf79d9 --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_params.vh @@ -0,0 +1,11 @@ +localparam [1:0] + CSR_SOURCE_CSR = 2'b00, + CSR_SOURCE_EXT = 2'b01, + CSR_SOURCE_SET = 2'b10, + CSR_SOURCE_CLR = 2'b11; + +localparam [1:0] + CSR_MSCRATCH = 2'b00, + CSR_MTVEC = 2'b01, + CSR_MEPC = 2'b10, + CSR_MTVAL = 2'b11; diff --git a/pythondata_cpu_serv/verilog/rtl/serv_rf_if.v b/pythondata_cpu_serv/verilog/rtl/serv_rf_if.v new file mode 100644 index 0000000..b26e75f --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_rf_if.v @@ -0,0 +1,122 @@ +`default_nettype none +module serv_rf_if + #(parameter WITH_CSR = 1) + (//RF Interface + output wire [4+WITH_CSR:0] o_wreg0, + output wire [4+WITH_CSR:0] o_wreg1, + output wire o_wen0, + output wire o_wen1, + output wire o_wdata0, + output wire o_wdata1, + output wire [4+WITH_CSR:0] o_rreg0, + output wire [4+WITH_CSR:0] o_rreg1, + input wire i_rdata0, + input wire i_rdata1, + + //Trap interface + input wire i_trap, + input wire i_mret, + input wire i_mepc, + input wire i_mem_misalign, + input wire i_bufreg_q, + input wire i_bad_pc, + output wire o_csr_pc, + //CSR interface + input wire i_csr_en, + input wire [1:0] i_csr_addr, + input wire i_csr, + output wire o_csr, + //RD write port + input wire i_rd_wen, + input wire [4:0] i_rd_waddr, + input wire i_ctrl_rd, + input wire i_alu_rd, + input wire i_rd_alu_en, + input wire i_csr_rd, + input wire i_rd_csr_en, + input wire i_mem_rd, + + //RS1 read port + input wire [4:0] i_rs1_raddr, + output wire o_rs1, + //RS2 read port + input wire [4:0] i_rs2_raddr, + output wire o_rs2); + + +`include "serv_params.vh" + + /* + ********** Write side *********** + */ + + generate + if (WITH_CSR) begin + wire rd = (i_ctrl_rd ) | + (i_alu_rd & i_rd_alu_en) | + (i_csr_rd & i_rd_csr_en) | + (i_mem_rd); + + wire mtval = i_mem_misalign ? i_bufreg_q : i_bad_pc; + + assign o_wdata0 = i_trap ? mtval : rd; + assign o_wdata1 = i_trap ? i_mepc : i_csr; + + //port 0 rd mtval + //port 1 csr mepc + //mepc 100010 + //mtval 100011 + //csr 1000xx + //rd 0xxxxx + assign o_wreg0 = i_trap ? {4'b1000,CSR_MTVAL} : {1'b0,i_rd_waddr}; + assign o_wreg1 = i_trap ? {4'b1000,CSR_MEPC} : {4'b1000,i_csr_addr}; + + assign o_wen0 = i_trap | i_rd_wen; + assign o_wen1 = i_trap | i_csr_en; + + /* + ********** Read side *********** + */ + + //0 : RS1 + //1 : RS2 / CSR + + + assign o_rreg0 = {1'b0, i_rs1_raddr}; + assign o_rreg1 = + i_trap ? {4'b1000, CSR_MTVEC} : + i_mret ? {4'b1000, CSR_MEPC} : + i_csr_en ? {4'b1000, i_csr_addr} : + {1'b0,i_rs2_raddr}; + + assign o_rs1 = i_rdata0; + assign o_rs2 = i_rdata1; + assign o_csr = i_rdata1 & i_csr_en; + assign o_csr_pc = i_rdata1; + + end else begin + wire rd = (i_ctrl_rd ) | + (i_alu_rd & i_rd_alu_en) | + (i_mem_rd); + + assign o_wdata0 = rd; + assign o_wdata1 = 1'b0; + + assign o_wreg0 = i_rd_waddr; + assign o_wreg1 = 5'd0; + + assign o_wen0 =i_rd_wen; + assign o_wen1 = 1'b0; + + /* + ********** Read side *********** + */ + + assign o_rreg0 = i_rs1_raddr; + assign o_rreg1 = i_rs2_raddr; + + assign o_rs1 = i_rdata0; + assign o_rs2 = i_rdata1; + end // else: !if(WITH_CSR) + endgenerate +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/serv_rf_ram.v b/pythondata_cpu_serv/verilog/rtl/serv_rf_ram.v new file mode 100644 index 0000000..9bbc503 --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_rf_ram.v @@ -0,0 +1,26 @@ +module serv_rf_ram + #(parameter width=0, + parameter csr_regs=4, + parameter depth=32*(32+csr_regs)/width) + (input wire i_clk, + input wire [$clog2(depth)-1:0] i_waddr, + input wire [width-1:0] i_wdata, + input wire i_wen, + input wire [$clog2(depth)-1:0] i_raddr, + output reg [width-1:0] o_rdata); + + reg [width-1:0] memory [0:depth-1]; + + always @(posedge i_clk) begin + if (i_wen) + memory[i_waddr] <= i_wdata; + o_rdata <= memory[i_raddr]; + end + +`ifdef SERV_CLEAR_RAM + integer i; + initial + for (i=0;i 2) + always @(posedge i_clk) wdata0_r <= {i_wdata0, wdata0_r[width-2:1]}; + else + always @(posedge i_clk) wdata0_r <= i_wdata0; + endgenerate + + always @(posedge i_clk) begin + wen0_r <= i_wen0; + wen1_r <= i_wen1; + wreq_r <= i_wreq | rgnt; + + wdata1_r <= {i_wdata1,wdata1_r[width-1:1]}; + + if (wgo) + wcnt <= wcnt+5'd1; + + if (wreq_r) begin + wgo <= 1'b1; + end + + if (wcnt == 5'b11111) + wgo <= 1'b0; + + if (i_rst) begin + wcnt <= 5'd0; + end + end + + /* + ********** Read side *********** + */ + + reg [4:0] rcnt; + + wire rtrig0; + reg rtrig1; + + wire [$clog2(32+csr_regs)-1:0] rreg = rtrig0 ? i_rreg1 : i_rreg0; + generate if (width == 32) + assign o_raddr = rreg; + else + assign o_raddr = {rreg, rcnt[4:l2w]}; + endgenerate + + reg [width-1:0] rdata0; + reg [width-2:0] rdata1; + + assign o_rdata0 = rdata0[0]; + assign o_rdata1 = rtrig1 ? i_rdata[0] : rdata1[0]; + + assign rtrig0 = (rcnt[l2w-1:0] == 1); + + reg rreq_r; + + generate if (width>2) + always @(posedge i_clk) begin + rdata1 <= {1'b0,rdata1[width-2:1]}; //Optimize? + if (rtrig1) + rdata1[width-2:0] <= i_rdata[width-1:1]; + end + else + always @(posedge i_clk) if (rtrig1) rdata1 <= i_rdata[1]; + endgenerate + + always @(posedge i_clk) begin + rtrig1 <= rtrig0; + rcnt <= rcnt+5'd1; + if (i_rreq) + rcnt <= 5'd0; + + rreq_r <= i_rreq; + rgnt <= rreq_r; + + rdata0 <= {1'b0,rdata0[width-1:1]}; + if (rtrig0) + rdata0 <= i_rdata; + + if (i_rst) begin + rgnt <= 1'b0; + rreq_r <= 1'b0; + end + end + + + +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/serv_rf_top.v b/pythondata_cpu_serv/verilog/rtl/serv_rf_top.v new file mode 100644 index 0000000..66aec5d --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_rf_top.v @@ -0,0 +1,163 @@ +`default_nettype none + +module serv_rf_top + #(parameter RESET_PC = 32'd0, + parameter WITH_CSR = 1, + parameter RF_WIDTH = 2) + ( + input wire clk, + input wire i_rst, + input wire i_timer_irq, +`ifdef RISCV_FORMAL + output wire rvfi_valid, + output wire [63:0] rvfi_order, + output wire [31:0] rvfi_insn, + output wire rvfi_trap, + output wire rvfi_halt, + output wire rvfi_intr, + output wire [1:0] rvfi_mode, + output wire [1:0] rvfi_ixl, + output wire [4:0] rvfi_rs1_addr, + output wire [4:0] rvfi_rs2_addr, + output wire [31:0] rvfi_rs1_rdata, + output wire [31:0] rvfi_rs2_rdata, + output wire [4:0] rvfi_rd_addr, + output wire [31:0] rvfi_rd_wdata, + output wire [31:0] rvfi_pc_rdata, + output wire [31:0] rvfi_pc_wdata, + output wire [31:0] rvfi_mem_addr, + output wire [3:0] rvfi_mem_rmask, + output wire [3:0] rvfi_mem_wmask, + output wire [31:0] rvfi_mem_rdata, + output wire [31:0] rvfi_mem_wdata, +`endif + output wire [31:0] o_ibus_adr, + output wire o_ibus_cyc, + input wire [31:0] i_ibus_rdt, + input wire i_ibus_ack, + output wire [31:0] o_dbus_adr, + output wire [31:0] o_dbus_dat, + output wire [3:0] o_dbus_sel, + output wire o_dbus_we , + output wire o_dbus_cyc, + input wire [31:0] i_dbus_rdt, + input wire i_dbus_ack); + + localparam CSR_REGS = WITH_CSR*4; + localparam RF_L2D = $clog2((32+CSR_REGS)*32/RF_WIDTH); + + wire rf_wreq; + wire rf_rreq; + wire [4+WITH_CSR:0] wreg0; + wire [4+WITH_CSR:0] wreg1; + wire wen0; + wire wen1; + wire wdata0; + wire wdata1; + wire [4+WITH_CSR:0] rreg0; + wire [4+WITH_CSR:0] rreg1; + wire rf_ready; + wire rdata0; + wire rdata1; + + wire [RF_L2D-1:0] waddr; + wire [RF_WIDTH-1:0] wdata; + wire wen; + wire [RF_L2D-1:0] raddr; + wire [RF_WIDTH-1:0] rdata; + + serv_rf_ram_if + #(.width (RF_WIDTH), + .csr_regs (CSR_REGS)) + rf_ram_if + (.i_clk (clk), + .i_rst (i_rst), + .i_wreq (rf_wreq), + .i_rreq (rf_rreq), + .o_ready (rf_ready), + .i_wreg0 (wreg0), + .i_wreg1 (wreg1), + .i_wen0 (wen0), + .i_wen1 (wen1), + .i_wdata0 (wdata0), + .i_wdata1 (wdata1), + .i_rreg0 (rreg0), + .i_rreg1 (rreg1), + .o_rdata0 (rdata0), + .o_rdata1 (rdata1), + .o_waddr (waddr), + .o_wdata (wdata), + .o_wen (wen), + .o_raddr (raddr), + .i_rdata (rdata)); + + serv_rf_ram + #(.width (RF_WIDTH), + .csr_regs (CSR_REGS)) + rf_ram + (.i_clk (clk), + .i_waddr (waddr), + .i_wdata (wdata), + .i_wen (wen), + .i_raddr (raddr), + .o_rdata (rdata)); + + serv_top + #(.RESET_PC (RESET_PC), + .WITH_CSR (WITH_CSR)) + cpu + ( + .clk (clk), + .i_rst (i_rst), + .i_timer_irq (i_timer_irq), +`ifdef RISCV_FORMAL + .rvfi_valid (rvfi_valid ), + .rvfi_order (rvfi_order ), + .rvfi_insn (rvfi_insn ), + .rvfi_trap (rvfi_trap ), + .rvfi_halt (rvfi_halt ), + .rvfi_intr (rvfi_intr ), + .rvfi_mode (rvfi_mode ), + .rvfi_ixl (rvfi_ixl ), + .rvfi_rs1_addr (rvfi_rs1_addr ), + .rvfi_rs2_addr (rvfi_rs2_addr ), + .rvfi_rs1_rdata (rvfi_rs1_rdata), + .rvfi_rs2_rdata (rvfi_rs2_rdata), + .rvfi_rd_addr (rvfi_rd_addr ), + .rvfi_rd_wdata (rvfi_rd_wdata ), + .rvfi_pc_rdata (rvfi_pc_rdata ), + .rvfi_pc_wdata (rvfi_pc_wdata ), + .rvfi_mem_addr (rvfi_mem_addr ), + .rvfi_mem_rmask (rvfi_mem_rmask), + .rvfi_mem_wmask (rvfi_mem_wmask), + .rvfi_mem_rdata (rvfi_mem_rdata), + .rvfi_mem_wdata (rvfi_mem_wdata), +`endif + .o_rf_rreq (rf_rreq), + .o_rf_wreq (rf_wreq), + .i_rf_ready (rf_ready), + .o_wreg0 (wreg0), + .o_wreg1 (wreg1), + .o_wen0 (wen0), + .o_wen1 (wen1), + .o_wdata0 (wdata0), + .o_wdata1 (wdata1), + .o_rreg0 (rreg0), + .o_rreg1 (rreg1), + .i_rdata0 (rdata0), + .i_rdata1 (rdata1), + + .o_ibus_adr (o_ibus_adr), + .o_ibus_cyc (o_ibus_cyc), + .i_ibus_rdt (i_ibus_rdt), + .i_ibus_ack (i_ibus_ack), + + .o_dbus_adr (o_dbus_adr), + .o_dbus_dat (o_dbus_dat), + .o_dbus_sel (o_dbus_sel), + .o_dbus_we (o_dbus_we), + .o_dbus_cyc (o_dbus_cyc), + .i_dbus_rdt (i_dbus_rdt), + .i_dbus_ack (i_dbus_ack)); + +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/serv_state.v b/pythondata_cpu_serv/verilog/rtl/serv_state.v new file mode 100644 index 0000000..b919264 --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_state.v @@ -0,0 +1,153 @@ +module serv_state + ( + input wire i_clk, + input wire i_rst, + input wire i_new_irq, + output wire o_trap_taken, + output reg o_pending_irq, + input wire i_dbus_ack, + input wire i_ibus_ack, + output wire o_rf_rreq, + output wire o_rf_wreq, + input wire i_rf_ready, + output wire o_rf_rd_en, + input wire i_take_branch, + input wire i_branch_op, + input wire i_mem_op, + input wire i_shift_op, + input wire i_slt_op, + input wire i_e_op, + input wire i_rd_op, + output reg o_init, + output reg o_cnt_en, + output wire o_cnt0, + output wire o_cnt0to3, + output wire o_cnt12to31, + output wire o_cnt1, + output wire o_cnt2, + output wire o_cnt3, + output wire o_cnt7, + output wire o_ctrl_pc_en, + output reg o_ctrl_jump, + output wire o_ctrl_trap, + input wire i_ctrl_misalign, + output wire o_alu_shamt_en, + input wire i_alu_sh_done, + output wire o_dbus_cyc, + output wire [1:0] o_mem_bytecnt, + input wire i_mem_misalign, + output reg o_cnt_done, + output wire o_bufreg_hold); + + parameter WITH_CSR = 1; + + wire cnt4; + + reg stage_two_req; + + reg [4:2] o_cnt; + reg [3:0] o_cnt_r; + + //Update PC in RUN or TRAP states + assign o_ctrl_pc_en = o_cnt_en & !o_init; + + + assign o_mem_bytecnt = o_cnt[4:3]; + + assign o_cnt0to3 = (o_cnt[4:2] == 3'd0); + assign o_cnt12to31 = (o_cnt[4] | (o_cnt[3:2] == 2'b11)); + assign o_cnt0 = (o_cnt[4:2] == 3'd0) & o_cnt_r[0]; + assign o_cnt1 = (o_cnt[4:2] == 3'd0) & o_cnt_r[1]; + assign o_cnt2 = (o_cnt[4:2] == 3'd0) & o_cnt_r[2]; + assign o_cnt3 = (o_cnt[4:2] == 3'd0) & o_cnt_r[3]; + assign cnt4 = (o_cnt[4:2] == 3'd1) & o_cnt_r[0]; + assign o_cnt7 = (o_cnt[4:2] == 3'd1) & o_cnt_r[3]; + + assign o_alu_shamt_en = (o_cnt0to3 | cnt4) & o_init; + + + //slt*, branch/jump, shift, load/store + wire two_stage_op = i_slt_op | i_mem_op | i_branch_op | i_shift_op; + + reg stage_two_pending; + + assign o_dbus_cyc = !o_cnt_en & stage_two_pending & i_mem_op & !i_mem_misalign; + + wire trap_pending = WITH_CSR & ((o_ctrl_jump & i_ctrl_misalign) | i_mem_misalign); + + //Prepare RF for reads when a new instruction is fetched + // or when stage one caused an exception (rreq implies a write request too) + assign o_rf_rreq = i_ibus_ack | (stage_two_req & trap_pending); + + //Prepare RF for writes when everything is ready to enter stage two + assign o_rf_wreq = ((i_shift_op & i_alu_sh_done & stage_two_pending) | (i_mem_op & i_dbus_ack) | (stage_two_req & (i_slt_op | i_branch_op))) & !trap_pending; + + assign o_rf_rd_en = i_rd_op & o_cnt_en & !o_init; + + //Shift operations require bufreg to hold for one cycle between INIT and RUN before shifting + assign o_bufreg_hold = !o_cnt_en & (stage_two_req | ~i_shift_op); + + always @(posedge i_clk) begin + if (o_cnt_done) + o_ctrl_jump <= o_init & i_take_branch; + + if (o_cnt_en) + stage_two_pending <= o_init; + + o_cnt_done <= (o_cnt[4:2] == 3'b111) & o_cnt_r[2]; + + //Need a strobe for the first cycle in the IDLE state after INIT + stage_two_req <= o_cnt_done & o_init; + + if (i_rf_ready & !stage_two_pending) + o_init <= two_stage_op & !o_pending_irq; + + if (o_cnt_done) + o_init <= 1'b0; + + if (i_rf_ready) + o_cnt_en <= 1'b1; + + if (o_cnt_done) + o_cnt_en <= 1'b0; + + o_cnt <= o_cnt + {2'd0,o_cnt_r[3]}; + if (o_cnt_en) + o_cnt_r <= {o_cnt_r[2:0],o_cnt_r[3]}; + + if (i_rst) begin + o_cnt <= 3'd0; + stage_two_pending <= 1'b0; + o_ctrl_jump <= 1'b0; + o_cnt_r <= 4'b0001; + end + end + + generate + if (WITH_CSR) begin + reg irq_sync; + reg misalign_trap_sync; + + assign o_ctrl_trap = i_e_op | o_pending_irq | misalign_trap_sync; + assign o_trap_taken = i_ibus_ack & o_ctrl_trap; + + always @(posedge i_clk) begin + if (i_ibus_ack) + irq_sync <= 1'b0; + if (i_new_irq) + irq_sync <= 1'b1; + + if (i_ibus_ack) + o_pending_irq <= irq_sync; + + if (stage_two_req) + misalign_trap_sync <= trap_pending; + if (i_ibus_ack) + misalign_trap_sync <= 1'b0; + end // always @ (posedge i_clk) + end else begin + always @(*) + o_pending_irq = 1'b0; + end + endgenerate +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/serv_top.v b/pythondata_cpu_serv/verilog/rtl/serv_top.v new file mode 100644 index 0000000..9c9ea9d --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/serv_top.v @@ -0,0 +1,494 @@ +`default_nettype none + +module serv_top + #(parameter WITH_CSR = 1, + parameter RESET_PC = 32'd0) + ( + input wire clk, + input wire i_rst, + input wire i_timer_irq, +`ifdef RISCV_FORMAL + output reg rvfi_valid = 1'b0, + output reg [63:0] rvfi_order = 64'd0, + output reg [31:0] rvfi_insn = 32'd0, + output reg rvfi_trap = 1'b0, + output reg rvfi_halt = 1'b0, + output reg rvfi_intr = 1'b0, + output reg [1:0] rvfi_mode = 2'b11, + output reg [1:0] rvfi_ixl = 2'b01, + output reg [4:0] rvfi_rs1_addr, + output reg [4:0] rvfi_rs2_addr, + output reg [31:0] rvfi_rs1_rdata, + output reg [31:0] rvfi_rs2_rdata, + output reg [4:0] rvfi_rd_addr, + output reg [31:0] rvfi_rd_wdata, + output reg [31:0] rvfi_pc_rdata, + output reg [31:0] rvfi_pc_wdata, + output reg [31:0] rvfi_mem_addr, + output reg [3:0] rvfi_mem_rmask, + output reg [3:0] rvfi_mem_wmask, + output reg [31:0] rvfi_mem_rdata, + output reg [31:0] rvfi_mem_wdata, +`endif + //RF Interface + output wire o_rf_rreq, + output wire o_rf_wreq, + input wire i_rf_ready, + output wire [4+WITH_CSR:0] o_wreg0, + output wire [4+WITH_CSR:0] o_wreg1, + output wire o_wen0, + output wire o_wen1, + output wire o_wdata0, + output wire o_wdata1, + output wire [4+WITH_CSR:0] o_rreg0, + output wire [4+WITH_CSR:0] o_rreg1, + input wire i_rdata0, + input wire i_rdata1, + + output wire [31:0] o_ibus_adr, + output wire o_ibus_cyc, + input wire [31:0] i_ibus_rdt, + input wire i_ibus_ack, + output wire [31:0] o_dbus_adr, + output wire [31:0] o_dbus_dat, + output wire [3:0] o_dbus_sel, + output wire o_dbus_we , + output wire o_dbus_cyc, + input wire [31:0] i_dbus_rdt, + input wire i_dbus_ack); + + wire [4:0] rd_addr; + wire [4:0] rs1_addr; + wire [4:0] rs2_addr; + + wire take_branch; + wire e_op; + wire ebreak; + wire branch_op; + wire mem_op; + wire shift_op; + wire slt_op; + wire rd_op; + + wire rd_alu_en; + wire rd_csr_en; + wire ctrl_rd; + wire alu_rd; + wire mem_rd; + wire csr_rd; + + wire ctrl_pc_en; + wire jump; + wire jal_or_jalr; + wire utype; + wire mret; + wire imm; + wire trap; + wire pc_rel; + + wire init; + wire cnt_en; + wire cnt0to3; + wire cnt12to31; + wire cnt0; + wire cnt1; + wire cnt2; + wire cnt3; + wire cnt7; + + wire cnt_done; + + wire bufreg_hold; + wire bufreg_rs1_en; + wire bufreg_imm_en; + wire bufreg_loop; + wire bufreg_q; + + wire alu_sub; + wire [1:0] alu_bool_op; + wire alu_cmp_eq; + wire alu_cmp_uns; + wire alu_cmp; + wire alu_shamt_en; + wire alu_sh_signed; + wire alu_sh_right; + wire alu_sh_done; + wire [3:0] alu_rd_sel; + + wire rs1; + wire rs2; + wire rd_en; + + wire op_b_source; + wire op_b; + + wire mem_signed; + wire mem_word; + wire mem_half; + wire [1:0] mem_bytecnt; + + wire mem_misalign; + + wire bad_pc; + + wire csr_mstatus_en; + wire csr_mie_en; + wire csr_mcause_en; + wire [1:0] csr_source; + wire csr_imm; + wire csr_d_sel; + wire csr_en; + wire [1:0] csr_addr; + wire csr_pc; + + + wire new_irq; + wire trap_taken; + wire pending_irq; + + wire [1:0] lsb; + + serv_state + #(.WITH_CSR (WITH_CSR)) + state + ( + .i_clk (clk), + .i_rst (i_rst), + .i_new_irq (new_irq), + .o_trap_taken (trap_taken), + .o_pending_irq (pending_irq), + .i_dbus_ack (i_dbus_ack), + .i_ibus_ack (i_ibus_ack), + .o_rf_rreq (o_rf_rreq), + .o_rf_wreq (o_rf_wreq), + .i_rf_ready (i_rf_ready), + .o_rf_rd_en (rd_en), + .i_take_branch (take_branch), + .i_branch_op (branch_op), + .i_mem_op (mem_op), + .i_shift_op (shift_op), + .i_slt_op (slt_op), + .i_e_op (e_op), + .i_rd_op (rd_op), + .o_init (init), + .o_cnt_en (cnt_en), + .o_cnt0to3 (cnt0to3), + .o_cnt12to31 (cnt12to31), + .o_cnt0 (cnt0), + .o_cnt1 (cnt1), + .o_cnt2 (cnt2), + .o_cnt3 (cnt3), + .o_cnt7 (cnt7), + .o_cnt_done (cnt_done), + .o_bufreg_hold (bufreg_hold), + .o_ctrl_pc_en (ctrl_pc_en), + .o_ctrl_jump (jump), + .o_ctrl_trap (trap), + .i_ctrl_misalign(lsb[1]), + .o_alu_shamt_en (alu_shamt_en), + .i_alu_sh_done (alu_sh_done), + .o_dbus_cyc (o_dbus_cyc), + .o_mem_bytecnt (mem_bytecnt), + .i_mem_misalign (mem_misalign)); + + wire bufreg_clr_lsb; + + serv_decode decode + ( + .clk (clk), + //Input + .i_cnt_en (cnt_en), + .i_cnt_done (cnt_done), + .i_wb_rdt (i_ibus_rdt[31:2]), + .i_wb_en (o_ibus_cyc & i_ibus_ack), + .i_alu_cmp (alu_cmp), + //To state + .o_take_branch (take_branch), + .o_e_op (e_op), + .o_ebreak (ebreak), + .o_branch_op (branch_op), + .o_mem_op (mem_op), + .o_shift_op (shift_op), + .o_slt_op (slt_op), + .o_rd_op (rd_op), + //To bufreg + .o_bufreg_loop (bufreg_loop), + .o_bufreg_rs1_en (bufreg_rs1_en), + .o_bufreg_imm_en (bufreg_imm_en), + .o_bufreg_clr_lsb (bufreg_clr_lsb), + //To ctrl + .o_ctrl_jal_or_jalr (jal_or_jalr), + .o_ctrl_utype (utype), + .o_ctrl_pc_rel (pc_rel), + .o_ctrl_mret (mret), + //To alu + .o_op_b_source (op_b_source), + .o_alu_sub (alu_sub), + .o_alu_bool_op (alu_bool_op), + .o_alu_cmp_eq (alu_cmp_eq), + .o_alu_cmp_uns (alu_cmp_uns), + .o_alu_sh_signed (alu_sh_signed), + .o_alu_sh_right (alu_sh_right), + .o_alu_rd_sel (alu_rd_sel), + //To RF + .o_rf_rd_addr (rd_addr), + .o_rf_rs1_addr (rs1_addr), + .o_rf_rs2_addr (rs2_addr), + //To mem IF + .o_mem_cmd (o_dbus_we), + .o_mem_signed (mem_signed), + .o_mem_word (mem_word), + .o_mem_half (mem_half), + //To CSR + .o_csr_en (csr_en), + .o_csr_addr (csr_addr), + .o_csr_mstatus_en (csr_mstatus_en), + .o_csr_mie_en (csr_mie_en), + .o_csr_mcause_en (csr_mcause_en), + .o_csr_source (csr_source), + .o_csr_d_sel (csr_d_sel), + .o_csr_imm (csr_imm), + //To top + .o_imm (imm), + .o_rd_csr_en (rd_csr_en), + .o_rd_alu_en (rd_alu_en)); + + serv_bufreg bufreg + ( + .i_clk (clk), + .i_cnt0 (cnt0), + .i_cnt1 (cnt1), + .i_en (!bufreg_hold), + .i_init (init), + .i_loop (bufreg_loop), + .i_rs1 (rs1), + .i_rs1_en (bufreg_rs1_en), + .i_imm (imm), + .i_imm_en (bufreg_imm_en), + .i_clr_lsb (bufreg_clr_lsb), + .o_lsb (lsb), + .o_dbus_adr (o_dbus_adr), + .o_q (bufreg_q)); + + serv_ctrl + #(.RESET_PC (RESET_PC), + .WITH_CSR (WITH_CSR)) + ctrl + ( + .clk (clk), + .i_rst (i_rst), + //State + .i_pc_en (ctrl_pc_en), + .i_cnt12to31 (cnt12to31), + .i_cnt2 (cnt2), + .i_cnt_done (cnt_done), + //Control + .i_jump (jump), + .i_jal_or_jalr (jal_or_jalr), + .i_utype (utype), + .i_pc_rel (pc_rel), + .i_trap (trap | mret), + //Data + .i_imm (imm), + .i_buf (bufreg_q), + .i_csr_pc (csr_pc), + .o_rd (ctrl_rd), + .o_bad_pc (bad_pc), + //External + .o_ibus_adr (o_ibus_adr), + .o_ibus_cyc (o_ibus_cyc), + .i_ibus_ack (i_ibus_ack)); + + + serv_alu alu + ( + .clk (clk), + .i_rst (i_rst), + .i_en (cnt_en), + .i_cnt0 (cnt0), + .i_rs1 (rs1), + .i_rs2 (rs2), + .i_imm (imm), + .i_op_b_rs2 (op_b_source), + .i_buf (bufreg_q), + .i_init (init), + .i_cnt_done (cnt_done), + .i_sub (alu_sub), + .i_bool_op (alu_bool_op), + .i_cmp_eq (alu_cmp_eq), + .i_cmp_uns (alu_cmp_uns), + .o_cmp (alu_cmp), + .i_shamt_en (alu_shamt_en), + .i_sh_right (alu_sh_right), + .i_sh_signed (alu_sh_signed), + .o_sh_done (alu_sh_done), + .i_rd_sel (alu_rd_sel), + .o_rd (alu_rd)); + + wire csr_in; + wire rf_csr_out; + + serv_rf_if + #(.WITH_CSR (WITH_CSR)) + rf_if + (//RF interface + .o_wreg0 (o_wreg0), + .o_wreg1 (o_wreg1), + .o_wen0 (o_wen0), + .o_wen1 (o_wen1), + .o_wdata0 (o_wdata0), + .o_wdata1 (o_wdata1), + .o_rreg0 (o_rreg0), + .o_rreg1 (o_rreg1), + .i_rdata0 (i_rdata0), + .i_rdata1 (i_rdata1), + + //Trap interface + .i_trap (trap), + .i_mret (mret), + .i_mepc (o_ibus_adr[0]), + .i_mem_misalign (mem_misalign), + .i_bufreg_q (bufreg_q), + .i_bad_pc (bad_pc), + .o_csr_pc (csr_pc), + //CSR write port + .i_csr_en (csr_en), + .i_csr_addr (csr_addr), + .i_csr (csr_in), + //RD write port + .i_rd_wen (rd_en), + .i_rd_waddr (rd_addr), + .i_ctrl_rd (ctrl_rd), + .i_alu_rd (alu_rd), + .i_rd_alu_en (rd_alu_en), + .i_csr_rd (csr_rd), + .i_rd_csr_en (rd_csr_en), + .i_mem_rd (mem_rd), + + //RS1 read port + .i_rs1_raddr (rs1_addr), + .o_rs1 (rs1), + //RS2 read port + .i_rs2_raddr (rs2_addr), + .o_rs2 (rs2), + + //CSR read port + .o_csr (rf_csr_out)); + + serv_mem_if + #(.WITH_CSR (WITH_CSR)) + mem_if + ( + .i_clk (clk), + .i_en (cnt_en), + .i_mem_op (mem_op), + .i_signed (mem_signed), + .i_word (mem_word), + .i_half (mem_half), + .i_bytecnt (mem_bytecnt), + .i_rs2 (rs2), + .o_rd (mem_rd), + .i_lsb (lsb), + .o_misalign (mem_misalign), + //External interface + .o_wb_dat (o_dbus_dat), + .o_wb_sel (o_dbus_sel), + .i_wb_rdt (i_dbus_rdt), + .i_wb_ack (i_dbus_ack)); + + generate + if (WITH_CSR) begin + serv_csr csr + ( + .i_clk (clk), + .i_en (cnt_en), + .i_cnt0to3 (cnt0to3), + .i_cnt2 (cnt2), + .i_cnt3 (cnt3), + .i_cnt7 (cnt7), + .i_cnt_done (cnt_done), + .i_e_op (e_op), + .i_ebreak (ebreak), + .i_mem_cmd (o_dbus_we), + .i_mem_misalign (mem_misalign), + .i_rf_csr_out (rf_csr_out), + .o_csr_in (csr_in), + .i_mtip (i_timer_irq), + .o_new_irq (new_irq), + .i_trap_taken (trap_taken), + .i_pending_irq (pending_irq), + .i_mstatus_en (csr_mstatus_en), + .i_mie_en (csr_mie_en ), + .i_mcause_en (csr_mcause_en ), + .i_csr_source (csr_source), + .i_mret (mret), + .i_d (csr_d_sel ? csr_imm : rs1), + .o_q (csr_rd)); + end else begin + assign csr_in = 1'b0; + assign csr_rd = 1'b0; + assign new_irq = 1'b0; + end + endgenerate + + +`ifdef RISCV_FORMAL + reg [31:0] pc = RESET_PC; + + wire rs_en = (branch_op|mem_op|shift_op|slt_op) ? init : ctrl_pc_en; + + always @(posedge clk) begin + rvfi_valid <= cnt_done & ctrl_pc_en & !i_rst; + rvfi_order <= rvfi_order + {63'd0,rvfi_valid}; + if (o_ibus_cyc & i_ibus_ack) + rvfi_insn <= i_ibus_rdt; + if (o_wen0) + rvfi_rd_wdata <= {o_wdata0,rvfi_rd_wdata[31:1]}; + if (cnt_done & ctrl_pc_en) begin + rvfi_pc_rdata <= pc; + if (!rd_en) + rvfi_rd_addr <= 5'd0; + if (!rd_en | !(|rd_addr)) + rvfi_rd_wdata <= 32'd0; + end + rvfi_trap <= trap; + if (rvfi_valid) begin + rvfi_trap <= 1'b0; + pc <= rvfi_pc_wdata; + end + + rvfi_halt <= 1'b0; + rvfi_intr <= 1'b0; + rvfi_mode <= 2'd3; + rvfi_ixl = 2'd1; + if (i_rf_ready) begin + rvfi_rs1_addr <= rs1_addr; + rvfi_rs2_addr <= rs2_addr; + rvfi_rd_addr <= rd_addr; + end + if (rs_en) begin + rvfi_rs1_rdata <= {rs1,rvfi_rs1_rdata[31:1]}; + rvfi_rs2_rdata <= {rs2,rvfi_rs2_rdata[31:1]}; + end + + if (i_dbus_ack) begin + rvfi_mem_addr <= o_dbus_adr; + rvfi_mem_rmask <= o_dbus_we ? 4'b0000 : o_dbus_sel; + rvfi_mem_wmask <= o_dbus_we ? o_dbus_sel : 4'b0000; + rvfi_mem_rdata <= i_dbus_rdt; + rvfi_mem_wdata <= o_dbus_dat; + end + if (i_ibus_ack) begin + rvfi_mem_rmask <= 4'b0000; + rvfi_mem_wmask <= 4'b0000; + end + end + /* verilator lint_off COMBDLY */ + always @(o_ibus_adr) + rvfi_pc_wdata <= o_ibus_adr; + /* verilator lint_on COMBDLY */ + + +`endif + +endmodule diff --git a/pythondata_cpu_serv/verilog/rtl/shift_reg.v b/pythondata_cpu_serv/verilog/rtl/shift_reg.v new file mode 100644 index 0000000..64b5ed7 --- /dev/null +++ b/pythondata_cpu_serv/verilog/rtl/shift_reg.v @@ -0,0 +1,20 @@ +module shift_reg + #(parameter LEN = 0, + parameter INIT = 0) + ( + input wire clk, + input wire i_rst, + input wire i_en, + input wire i_d, + output wire o_q, + output wire [LEN-2:0] o_par); + + reg [LEN-1:0] data; + assign o_q = data[0]; + assign o_par = data[LEN-1:1]; + always @(posedge clk) + if (i_rst) + data <= INIT; + else if (i_en) + data <= {i_d, data[LEN-1:1]}; +endmodule diff --git a/pythondata_cpu_serv/verilog/serv.core b/pythondata_cpu_serv/verilog/serv.core new file mode 100644 index 0000000..fe9c899 --- /dev/null +++ b/pythondata_cpu_serv/verilog/serv.core @@ -0,0 +1,47 @@ +CAPI=2: + +name : ::serv:1.0.1 + +filesets: + core: + files: + - rtl/serv_params.vh : {is_include_file : true} + - rtl/shift_reg.v + - rtl/ser_shift.v + - rtl/serv_bufreg.v + - rtl/serv_alu.v + - rtl/serv_csr.v + - rtl/serv_ctrl.v + - rtl/serv_decode.v + - rtl/serv_mem_if.v + - rtl/serv_rf_if.v + - rtl/serv_rf_ram_if.v + - rtl/serv_rf_ram.v + - rtl/serv_state.v + - rtl/serv_top.v + - rtl/serv_rf_top.v + file_type : verilogSource + +targets: + default: + filesets : [core] + parameters : [RISCV_FORMAL, SERV_CLEAR_RAM] + toplevel : ["is_toplevel? (serv_rf_top)"] + + lint: + default_tool : verilator + filesets : [core] + tools: + verilator: + mode : lint-only + toplevel : serv_rf_top + +parameters: + RISCV_FORMAL: + datatype : bool + paramtype : vlogdefine + + SERV_CLEAR_RAM: + datatype : bool + paramtype : vlogdefine + diff --git a/pythondata_cpu_serv/verilog/servant.core b/pythondata_cpu_serv/verilog/servant.core new file mode 100644 index 0000000..81fba29 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant.core @@ -0,0 +1,282 @@ +CAPI=2: + +name : ::servant:1.0.1 + +filesets: + service: + files: [servant/ice40_pll.v, servant/service.v] + file_type : verilogSource + depend : ["fusesoc:utils:generators"] + + mem_files: + files: + - sw/blinky.hex : {copyto : blinky.hex} + - sw/zephyr_hello.hex : {copyto : zephyr_hello.hex} + file_type : user + + servant_tb: + files: + - bench/servant_sim.v + - "!tool_verilator? (bench/uart_decoder.v)" + - "!tool_verilator? (bench/servant_tb.v)" + - "tool_verilator? (bench/servant_tb.cpp)" : {file_type : cppSource} + file_type : verilogSource + depend : [vlog_tb_utils] + + soc: + files: + - servant/servant_clock_gen.v + - servant/servant_timer.v + - servant/servant_gpio.v + - servant/servant_arbiter.v + - servant/servant_mux.v + - "tool_quartus? (servant/servant_ram_quartus.sv)" : {file_type : systemVerilogSource} + - "!tool_quartus? (servant/servant_ram.v)" + - servant/servant.v + file_type : verilogSource + depend : [serv] + + cyc1000: + files: + - data/cyc1000.sdc : {file_type : SDC} + - data/cyc1000.tcl : {file_type : tclSource} + - servant/servclone10_clock_gen.v : {file_type : verilogSource} + - servant/servclone10.v : {file_type : verilogSource} + + tinyfpga_bx: {files: [data/tinyfpga_bx.pcf : {file_type : PCF}]} + icebreaker : {files: [data/icebreaker.pcf : {file_type : PCF}]} + alhambra : {files: [data/alhambra.pcf : {file_type : PCF}]} + + nexys_a7: + files: + - servant/servix_clock_gen.v : {file_type : verilogSource} + - servant/servix.v : {file_type : verilogSource} + - data/nexys_a7.xdc : {file_type : xdc} + arty_a7_35t: + files: + - servant/servix_clock_gen.v : {file_type : verilogSource} + - servant/servix.v : {file_type : verilogSource} + - data/arty_a7_35t.xdc : {file_type : xdc} + + ulx3s: + files: + - data/ulx3s.lpf : {file_type : LPF} + - servant/ecppll.v : {file_type : verilogSource} + - servant/servant_ecp5_clock_gen.v : {file_type : verilogSource} + - servant/servant_ecp5.v : {file_type : verilogSource} + + upduino2: + files: + - servant/servant_upduino2.v : {file_type : verilogSource} + - data/upduino2.pcf : {file_type : PCF} + + zcu106: + files: + - servant/servus_clock_gen.v : {file_type : verilogSource} + - servant/servus.v : {file_type : verilogSource} + - data/zcu106.xdc : {file_type : xdc} + +targets: + default: + filesets : [soc] + + cyc1000: + default_tool: quartus + description: cyc1000 FPGA board + filesets : [mem_files, soc, cyc1000] + parameters : [memfile, memsize=32768] + tools: + quartus: + family : Cyclone 10 LP + device : 10CL025YU256C8G + toplevel : servclone10 + + icebreaker: + default_tool : icestorm + filesets : [mem_files, soc, service, icebreaker] + generate: [icebreaker_pll] + parameters : [memfile, memsize, PLL=ICE40_PAD] + tools: + icestorm: + nextpnr_options: [--up5k, --freq, 16] + pnr: next + toplevel : service + + tinyfpga_bx: + default_tool : icestorm + filesets : [mem_files, soc, service, tinyfpga_bx] + generate: [tinyfpga_bx_pll] + parameters : [memfile, memsize, PLL=ICE40_CORE] + tools: + icestorm: + nextpnr_options : [--lp8k, --package, cm81, --freq, 32] + pnr: next + toplevel : service + + alhambra: + default_tool : icestorm + description: Open-hardware iCE40HX4K FPGA board + filesets : [mem_files, soc, service, alhambra] + generate: [alhambra_pll] + parameters : [memfile, memsize, PLL=ICE40_CORE] + tools: + icestorm: + nextpnr_options : [--hx8k, --package, tq144:4k, --freq, 16] + pnr: next + toplevel : service + + lint: + default_tool : verilator + filesets : [soc] + tools: + verilator: + mode : lint-only + toplevel : servant + + nexys_a7: + default_tool: vivado + filesets : [mem_files, soc, nexys_a7] + parameters : [memfile, memsize, frequency=32] + tools: + vivado: {part : xc7a100tcsg324-1} + toplevel : servix + + arty_a7_35t: + default_tool: vivado + filesets : [mem_files, soc, arty_a7_35t] + parameters : [memfile, memsize, frequency=16] + tools: + vivado: {part : xc7a35ticsg324-1L} + toplevel : servix + + sim: + default_tool: icarus + filesets : [soc, servant_tb] + parameters : + - RISCV_FORMAL + - SERV_CLEAR_RAM=true + - firmware + - memsize + toplevel : servant_tb + + ulx3s_85: + default_tool: diamond + description : ULX3S 85k version + filesets : [mem_files, soc, ulx3s] + parameters : [memfile, memsize] + tools: + diamond: + part : LFE5U-85F-6BG381C + trellis: + nextpnr_options : [--package, CABGA381, --85k] + toplevel: servant_ecp5 + + upduino2: + default_tool : icestorm + filesets : [mem_files, soc, upduino2] + parameters : [memfile, memsize] + tools: + icestorm: + nextpnr_options: [--package, sg48, --up5k, --freq, 24] + pnr: next + toplevel : servant_upduino2 + + verilator_tb: + default_tool: verilator + filesets : [soc, servant_tb] + parameters : + - RISCV_FORMAL + - firmware + - memsize + - signature + - timeout + - uart_baudrate + - vcd + - vcd_start + tools: + verilator: + verilator_options : [--trace] + toplevel : servant_sim + + zcu106: + default_tool: vivado + description : Zynq UltraScale+ MPSoC ZCU106 Evaluation Kit + filesets : [mem_files, soc, zcu106] + parameters : [memfile, memsize] + tools: + vivado: {part : xczu7ev-ffvc1156-2-e} + toplevel : servus + +parameters: + PLL: + datatype : str + description : PLL type to use for main clock generation + paramtype : vlogparam + + RISCV_FORMAL: + datatype : bool + paramtype : vlogdefine + + SERV_CLEAR_RAM: + datatype : bool + paramtype : vlogdefine + + firmware: + datatype : file + description : Preload RAM with a hex file at runtime (overrides memfile) + paramtype : plusarg + + frequency: + datatype : int + description : PLL output frequency + paramtype : vlogparam + + memfile: + datatype : file + description : Preload RAM with a hex file at compile-time + paramtype : vlogparam + + memsize: + datatype : int + default : 8192 + description : Memory size in bytes for RAM (default 8kiB) + paramtype : vlogparam + + signature: + datatype : file + paramtype : plusarg + uart_baudrate: + datatype : int + description : Treat q output as an UART with the specified baudrate (0 or omitted parameter disables UART decoding) + paramtype : plusarg + + timeout: + datatype : int + paramtype : plusarg + + vcd: + datatype : bool + paramtype : plusarg + + vcd_start: + datatype : int + description : Delay start of VCD dumping until the specified time + paramtype : plusarg + +generate: + icebreaker_pll: + generator: icepll + parameters: + freq_out : 16 + + tinyfpga_bx_pll: + generator: icepll + parameters: + freq_in : 16 + freq_out : 32 + + alhambra_pll: + generator: icepll + parameters: + freq_in : 12 + freq_out : 16 diff --git a/pythondata_cpu_serv/verilog/servant/ecppll.v b/pythondata_cpu_serv/verilog/servant/ecppll.v new file mode 100644 index 0000000..bae4953 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/ecppll.v @@ -0,0 +1,38 @@ +module pll(input clki, + output locked, + output clko +); +wire clkfb; +wire clkos; +wire clkop; +(* ICP_CURRENT="12" *) (* LPF_RESISTOR="8" *) (* MFG_ENABLE_FILTEROPAMP="1" *) (* MFG_GMCREF_SEL="2" *) +EHXPLLL #( + .PLLRST_ENA("DISABLED"), + .INTFB_WAKE("DISABLED"), + .STDBY_ENABLE("DISABLED"), + .DPHASE_SOURCE("DISABLED"), + .CLKOP_FPHASE(0), + .CLKOP_CPHASE(18), + .OUTDIVIDER_MUXA("DIVA"), + .CLKOP_ENABLE("ENABLED"), + .CLKOP_DIV(38), + .CLKFB_DIV(5), + .CLKI_DIV(8), + .FEEDBK_PATH("INT_OP") + ) pll_i ( + .CLKI(clki), + .CLKFB(clkfb), + .CLKINTFB(clkfb), + .CLKOP(clkop), + .RST(1'b0), + .STDBY(1'b0), + .PHASESEL0(1'b0), + .PHASESEL1(1'b0), + .PHASEDIR(1'b0), + .PHASESTEP(1'b0), + .PLLWAKESYNC(1'b0), + .ENCLKOP(1'b0), + .LOCK(locked) + ); +assign clko = clkop; +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/ice40_pll.v b/pythondata_cpu_serv/verilog/servant/ice40_pll.v new file mode 100644 index 0000000..8daad94 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/ice40_pll.v @@ -0,0 +1,40 @@ +`default_nettype none +module ice40_pll + ( + input i_clk, + output o_clk, + output o_rst); + + parameter PLL = "NONE"; + + wire locked; + + reg [1:0] rst_reg; + always @(posedge o_clk) + rst_reg <= {!locked, rst_reg[1]}; + assign o_rst = rst_reg[0]; + + generate + if (PLL == "ICE40_CORE") begin + SB_PLL40_CORE + #(`include "pll.vh") + pll + ( + .LOCK(locked), + .RESETB(1'b1), + .BYPASS(1'b0), + .REFERENCECLK(i_clk), + .PLLOUTCORE(o_clk)); + end else if (PLL == "ICE40_PAD") begin + SB_PLL40_PAD + #(`include "pll.vh") + pll + ( + .LOCK(locked), + .RESETB(1'b1), + .BYPASS(1'b0), + .PACKAGEPIN (i_clk), + .PLLOUTCORE(o_clk)); + end + endgenerate +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servant.v b/pythondata_cpu_serv/verilog/servant/servant.v new file mode 100644 index 0000000..a5e6424 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servant.v @@ -0,0 +1,189 @@ +`default_nettype none +module servant +( + input wire wb_clk, + input wire wb_rst, + output wire q); + + parameter memfile = "zephyr_hello.hex"; + parameter memsize = 8192; + parameter sim = 0; + parameter with_csr = 1; + + wire timer_irq; + + wire [31:0] wb_ibus_adr; + wire wb_ibus_cyc; + wire [31:0] wb_ibus_rdt; + wire wb_ibus_ack; + + wire [31:0] wb_dbus_adr; + wire [31:0] wb_dbus_dat; + wire [3:0] wb_dbus_sel; + wire wb_dbus_we; + wire wb_dbus_cyc; + wire [31:0] wb_dbus_rdt; + wire wb_dbus_ack; + + wire [31:0] wb_dmem_adr; + wire [31:0] wb_dmem_dat; + wire [3:0] wb_dmem_sel; + wire wb_dmem_we; + wire wb_dmem_cyc; + wire [31:0] wb_dmem_rdt; + wire wb_dmem_ack; + + wire [31:0] wb_mem_adr; + wire [31:0] wb_mem_dat; + wire [3:0] wb_mem_sel; + wire wb_mem_we; + wire wb_mem_cyc; + wire [31:0] wb_mem_rdt; + wire wb_mem_ack; + + wire wb_gpio_dat; + wire wb_gpio_we; + wire wb_gpio_cyc; + wire wb_gpio_rdt; + + wire [31:0] wb_timer_dat; + wire wb_timer_we; + wire wb_timer_cyc; + wire [31:0] wb_timer_rdt; + + servant_arbiter arbiter + (.i_wb_cpu_dbus_adr (wb_dmem_adr), + .i_wb_cpu_dbus_dat (wb_dmem_dat), + .i_wb_cpu_dbus_sel (wb_dmem_sel), + .i_wb_cpu_dbus_we (wb_dmem_we ), + .i_wb_cpu_dbus_cyc (wb_dmem_cyc), + .o_wb_cpu_dbus_rdt (wb_dmem_rdt), + .o_wb_cpu_dbus_ack (wb_dmem_ack), + + .i_wb_cpu_ibus_adr (wb_ibus_adr), + .i_wb_cpu_ibus_cyc (wb_ibus_cyc), + .o_wb_cpu_ibus_rdt (wb_ibus_rdt), + .o_wb_cpu_ibus_ack (wb_ibus_ack), + + .o_wb_cpu_adr (wb_mem_adr), + .o_wb_cpu_dat (wb_mem_dat), + .o_wb_cpu_sel (wb_mem_sel), + .o_wb_cpu_we (wb_mem_we ), + .o_wb_cpu_cyc (wb_mem_cyc), + .i_wb_cpu_rdt (wb_mem_rdt), + .i_wb_cpu_ack (wb_mem_ack)); + + servant_mux #(sim) servant_mux + ( + .i_clk (wb_clk), + .i_rst (wb_rst), + .i_wb_cpu_adr (wb_dbus_adr), + .i_wb_cpu_dat (wb_dbus_dat), + .i_wb_cpu_sel (wb_dbus_sel), + .i_wb_cpu_we (wb_dbus_we), + .i_wb_cpu_cyc (wb_dbus_cyc), + .o_wb_cpu_rdt (wb_dbus_rdt), + .o_wb_cpu_ack (wb_dbus_ack), + + .o_wb_mem_adr (wb_dmem_adr), + .o_wb_mem_dat (wb_dmem_dat), + .o_wb_mem_sel (wb_dmem_sel), + .o_wb_mem_we (wb_dmem_we), + .o_wb_mem_cyc (wb_dmem_cyc), + .i_wb_mem_rdt (wb_dmem_rdt), + + .o_wb_gpio_dat (wb_gpio_dat), + .o_wb_gpio_we (wb_gpio_we), + .o_wb_gpio_cyc (wb_gpio_cyc), + .i_wb_gpio_rdt (wb_gpio_rdt), + + .o_wb_timer_dat (wb_timer_dat), + .o_wb_timer_we (wb_timer_we), + .o_wb_timer_cyc (wb_timer_cyc), + .i_wb_timer_rdt (wb_timer_rdt)); + + servant_ram + #(.memfile (memfile), + .depth (memsize)) + ram + (// Wishbone interface + .i_wb_clk (wb_clk), + .i_wb_adr (wb_mem_adr[$clog2(memsize)-1:2]), + .i_wb_cyc (wb_mem_cyc), + .i_wb_we (wb_mem_we) , + .i_wb_sel (wb_mem_sel), + .i_wb_dat (wb_mem_dat), + .o_wb_rdt (wb_mem_rdt), + .o_wb_ack (wb_mem_ack)); + + generate + if (with_csr) begin + servant_timer + #(.WIDTH (32)) + timer + (.i_clk (wb_clk), + .o_irq (timer_irq), + .i_wb_cyc (wb_timer_cyc), + .i_wb_we (wb_timer_we) , + .i_wb_dat (wb_timer_dat), + .o_wb_dat (wb_timer_rdt)); + end else begin + assign wb_timer_rdt = 32'd0; + assign timer_irq = 1'b0; + end + endgenerate + + servant_gpio gpio + (.i_wb_clk (wb_clk), + .i_wb_dat (wb_gpio_dat), + .i_wb_we (wb_gpio_we), + .i_wb_cyc (wb_gpio_cyc), + .o_wb_rdt (wb_gpio_rdt), + .o_gpio (q)); + + serv_rf_top + #(.RESET_PC (32'h0000_0000), + .WITH_CSR (with_csr)) + cpu + ( + .clk (wb_clk), + .i_rst (wb_rst), + .i_timer_irq (timer_irq), +`ifdef RISCV_FORMAL + .rvfi_valid (), + .rvfi_order (), + .rvfi_insn (), + .rvfi_trap (), + .rvfi_halt (), + .rvfi_intr (), + .rvfi_mode (), + .rvfi_ixl (), + .rvfi_rs1_addr (), + .rvfi_rs2_addr (), + .rvfi_rs1_rdata (), + .rvfi_rs2_rdata (), + .rvfi_rd_addr (), + .rvfi_rd_wdata (), + .rvfi_pc_rdata (), + .rvfi_pc_wdata (), + .rvfi_mem_addr (), + .rvfi_mem_rmask (), + .rvfi_mem_wmask (), + .rvfi_mem_rdata (), + .rvfi_mem_wdata (), +`endif + + .o_ibus_adr (wb_ibus_adr), + .o_ibus_cyc (wb_ibus_cyc), + .i_ibus_rdt (wb_ibus_rdt), + .i_ibus_ack (wb_ibus_ack), + + .o_dbus_adr (wb_dbus_adr), + .o_dbus_dat (wb_dbus_dat), + .o_dbus_sel (wb_dbus_sel), + .o_dbus_we (wb_dbus_we), + .o_dbus_cyc (wb_dbus_cyc), + .i_dbus_rdt (wb_dbus_rdt), + .i_dbus_ack (wb_dbus_ack)); + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servant_arbiter.v b/pythondata_cpu_serv/verilog/servant/servant_arbiter.v new file mode 100644 index 0000000..00b39c8 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servant_arbiter.v @@ -0,0 +1,39 @@ +/* Arbitrates between dbus and ibus accesses. + * Relies on the fact that not both masters are active at the same time + */ +module servant_arbiter + ( + input wire [31:0] i_wb_cpu_dbus_adr, + input wire [31:0] i_wb_cpu_dbus_dat, + input wire [3:0] i_wb_cpu_dbus_sel, + input wire i_wb_cpu_dbus_we, + input wire i_wb_cpu_dbus_cyc, + output wire [31:0] o_wb_cpu_dbus_rdt, + output wire o_wb_cpu_dbus_ack, + + input wire [31:0] i_wb_cpu_ibus_adr, + input wire i_wb_cpu_ibus_cyc, + output wire [31:0] o_wb_cpu_ibus_rdt, + output wire o_wb_cpu_ibus_ack, + + output wire [31:0] o_wb_cpu_adr, + output wire [31:0] o_wb_cpu_dat, + output wire [3:0] o_wb_cpu_sel, + output wire o_wb_cpu_we, + output wire o_wb_cpu_cyc, + input wire [31:0] i_wb_cpu_rdt, + input wire i_wb_cpu_ack); + + assign o_wb_cpu_dbus_rdt = i_wb_cpu_rdt; + assign o_wb_cpu_dbus_ack = i_wb_cpu_ack & !i_wb_cpu_ibus_cyc; + + assign o_wb_cpu_ibus_rdt = i_wb_cpu_rdt; + assign o_wb_cpu_ibus_ack = i_wb_cpu_ack & i_wb_cpu_ibus_cyc; + + assign o_wb_cpu_adr = i_wb_cpu_ibus_cyc ? i_wb_cpu_ibus_adr : i_wb_cpu_dbus_adr; + assign o_wb_cpu_dat = i_wb_cpu_dbus_dat; + assign o_wb_cpu_sel = i_wb_cpu_dbus_sel; + assign o_wb_cpu_we = i_wb_cpu_dbus_we & !i_wb_cpu_ibus_cyc; + assign o_wb_cpu_cyc = i_wb_cpu_ibus_cyc | i_wb_cpu_dbus_cyc; + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servant_clock_gen.v b/pythondata_cpu_serv/verilog/servant/servant_clock_gen.v new file mode 100644 index 0000000..c430de8 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servant_clock_gen.v @@ -0,0 +1,26 @@ +`default_nettype none +module servant_clock_gen + ( + input wire i_clk, + output wire o_clk, + output wire o_rst); + + parameter [79:0] PLL = "NONE"; + + generate + if ((PLL == "ICE40_CORE") || (PLL == "ICE40_PAD")) begin + ice40_pll #(.PLL (PLL)) pll + (.i_clk (i_clk), + .o_clk (o_clk), + .o_rst (o_rst)); + end else begin + assign o_clk = i_clk; + + reg [4:0] rst_reg = 5'b11111; + + always @(posedge o_clk) + rst_reg <= {1'b0, rst_reg[4:1]}; + assign o_rst = rst_reg[0]; + end + endgenerate +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servant_ecp5.v b/pythondata_cpu_serv/verilog/servant/servant_ecp5.v new file mode 100644 index 0000000..a868d57 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servant_ecp5.v @@ -0,0 +1,33 @@ +`default_nettype none +module servant_ecp5 +( + input wire clk, + input wire btn0, + output wire wifi_gpio0, + output wire uart_txd, + output wire q); + + parameter memfile = "zephyr_hello.hex"; + parameter memsize = 8192; + + wire wb_clk; + wire wb_rst; + + assign wifi_gpio0 = btn0; + assign uart_txd = q; + + servant_ecp5_clock_gen clock_gen + (.i_clk (clk), + .i_rst (!btn0), + .o_clk (wb_clk), + .o_rst (wb_rst)); + + servant + #(.memfile (memfile), + .memsize (memsize)) + servant + (.wb_clk (wb_clk), + .wb_rst (wb_rst), + .q (q)); + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servant_ecp5_clock_gen.v b/pythondata_cpu_serv/verilog/servant/servant_ecp5_clock_gen.v new file mode 100644 index 0000000..0c5d24a --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servant_ecp5_clock_gen.v @@ -0,0 +1,25 @@ +`default_nettype none +module servant_ecp5_clock_gen + ( + input i_clk, + input i_rst, + output o_clk, + output o_rst); + + wire locked; + + reg [1:0] rst_reg; + always @(posedge o_clk) + if (i_rst) + rst_reg <= 2'b11; + else + rst_reg <= {!locked, rst_reg[1]}; + + assign o_rst = rst_reg[0]; + + pll pll + (.clki (i_clk), + .clko (o_clk), + .locked (locked)); + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servant_gpio.v b/pythondata_cpu_serv/verilog/servant/servant_gpio.v new file mode 100644 index 0000000..da1debc --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servant_gpio.v @@ -0,0 +1,14 @@ +module servant_gpio + (input wire i_wb_clk, + input wire i_wb_dat, + input wire i_wb_we, + input wire i_wb_cyc, + output reg o_wb_rdt, + output reg o_gpio); + + always @(posedge i_wb_clk) begin + o_wb_rdt <= o_gpio; + if (i_wb_cyc & i_wb_we) + o_gpio <= i_wb_dat; + end +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servant_mux.v b/pythondata_cpu_serv/verilog/servant/servant_mux.v new file mode 100644 index 0000000..8c11eff --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servant_mux.v @@ -0,0 +1,89 @@ +/* + mem = 00 + gpio = 01 + timer = 10 + testcon = 11 + */ +module servant_mux + ( + input wire i_clk, + input wire i_rst, + input wire [31:0] i_wb_cpu_adr, + input wire [31:0] i_wb_cpu_dat, + input wire [3:0] i_wb_cpu_sel, + input wire i_wb_cpu_we, + input wire i_wb_cpu_cyc, + output wire [31:0] o_wb_cpu_rdt, + output reg o_wb_cpu_ack, + + output wire [31:0] o_wb_mem_adr, + output wire [31:0] o_wb_mem_dat, + output wire [3:0] o_wb_mem_sel, + output wire o_wb_mem_we, + output wire o_wb_mem_cyc, + input wire [31:0] i_wb_mem_rdt, + + output wire o_wb_gpio_dat, + output wire o_wb_gpio_we, + output wire o_wb_gpio_cyc, + input wire i_wb_gpio_rdt, + + output wire [31:0] o_wb_timer_dat, + output wire o_wb_timer_we, + output wire o_wb_timer_cyc, + input wire [31:0] i_wb_timer_rdt); + + parameter sim = 0; + + wire [1:0] s = i_wb_cpu_adr[31:30]; + + assign o_wb_cpu_rdt = s[1] ? i_wb_timer_rdt : + s[0] ? {31'd0,i_wb_gpio_rdt} : i_wb_mem_rdt; + always @(posedge i_clk) begin + o_wb_cpu_ack <= 1'b0; + if (i_wb_cpu_cyc & !o_wb_cpu_ack) + o_wb_cpu_ack <= 1'b1; + if (i_rst) + o_wb_cpu_ack <= 1'b0; + end + + assign o_wb_mem_adr = i_wb_cpu_adr; + assign o_wb_mem_dat = i_wb_cpu_dat; + assign o_wb_mem_sel = i_wb_cpu_sel; + assign o_wb_mem_we = i_wb_cpu_we; + assign o_wb_mem_cyc = i_wb_cpu_cyc & (s == 2'b00); + + assign o_wb_gpio_dat = i_wb_cpu_dat[0]; + assign o_wb_gpio_we = i_wb_cpu_we; + assign o_wb_gpio_cyc = i_wb_cpu_cyc & (s == 2'b01); + + assign o_wb_timer_dat = i_wb_cpu_dat; + assign o_wb_timer_we = i_wb_cpu_we; + assign o_wb_timer_cyc = i_wb_cpu_cyc & s[1]; + + generate + if (sim) begin + wire sig_en = (i_wb_cpu_adr[31:28] == 4'h8) & i_wb_cpu_cyc & o_wb_cpu_ack; + wire halt_en = (i_wb_cpu_adr[31:28] == 4'h9) & i_wb_cpu_cyc & o_wb_cpu_ack; + + reg [1023:0] signature_file; + integer f = 0; + + initial + /* verilator lint_off WIDTH */ + if ($value$plusargs("signature=%s", signature_file)) begin + $display("Writing signature to %0s", signature_file); + f = $fopen(signature_file, "w"); + end + /* verilator lint_on WIDTH */ + + always @(posedge i_clk) + if (sig_en & (f != 0)) + $fwrite(f, "%c", i_wb_cpu_dat[7:0]); + else if(halt_en) begin + $display("Test complete"); + $finish; + end + end + endgenerate +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servant_ram.v b/pythondata_cpu_serv/verilog/servant/servant_ram.v new file mode 100644 index 0000000..11e058c --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servant_ram.v @@ -0,0 +1,39 @@ +`default_nettype none +module servant_ram + #(//Memory parameters + parameter depth = 256, + parameter aw = $clog2(depth), + parameter memfile = "") + (input wire i_wb_clk, + input wire [aw-1:2] i_wb_adr, + input wire [31:0] i_wb_dat, + input wire [3:0] i_wb_sel, + input wire i_wb_we, + input wire i_wb_cyc, + output reg [31:0] o_wb_rdt, + output reg o_wb_ack); + + wire [3:0] we = {4{i_wb_we & i_wb_cyc}} & i_wb_sel; + + reg [31:0] mem [0:depth/4-1] /* verilator public */; + + wire [aw-3:0] addr = i_wb_adr[aw-1:2]; + + always @(posedge i_wb_clk) + o_wb_ack <= i_wb_cyc & !o_wb_ack; + + always @(posedge i_wb_clk) begin + if (we[0]) mem[addr][7:0] <= i_wb_dat[7:0]; + if (we[1]) mem[addr][15:8] <= i_wb_dat[15:8]; + if (we[2]) mem[addr][23:16] <= i_wb_dat[23:16]; + if (we[3]) mem[addr][31:24] <= i_wb_dat[31:24]; + o_wb_rdt <= mem[addr]; + end + + initial + if(|memfile) begin + $display("Preloading %m from %s", memfile); + $readmemh(memfile, mem); + end + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servant_ram_quartus.sv b/pythondata_cpu_serv/verilog/servant/servant_ram_quartus.sv new file mode 100644 index 0000000..8073359 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servant_ram_quartus.sv @@ -0,0 +1,41 @@ +`default_nettype none +module servant_ram + #(//Memory parameters + parameter depth = 256, + parameter aw = $clog2(depth), + parameter memfile = "") + (input wire i_wb_clk, + input wire [aw-1:2] i_wb_adr, + input wire [31:0] i_wb_dat, + input wire [3:0] i_wb_sel, + input wire i_wb_we, + input wire i_wb_cyc, + output reg [31:0] o_wb_rdt, + output reg o_wb_ack); + + wire we = i_wb_we & i_wb_cyc; + + logic [3:0][7:0] mem[0:depth/4-1]; + + wire [aw-3:0] addr = i_wb_adr[aw-1:2]; + + always @(posedge i_wb_clk) + o_wb_ack <= i_wb_cyc & !o_wb_ack; + + always_ff @(posedge i_wb_clk) begin + if(we) begin + if(i_wb_sel[0]) mem[addr][0] <= i_wb_dat[7:0]; + if(i_wb_sel[1]) mem[addr][1] <= i_wb_dat[15:8]; + if(i_wb_sel[2]) mem[addr][2] <= i_wb_dat[23:16]; + if(i_wb_sel[3]) mem[addr][3] <= i_wb_dat[31:24]; + end + o_wb_rdt <= mem[addr]; + end + + initial + if(|memfile) begin + $display("Preloading %m from %s", memfile); + $readmemh(memfile, mem); + end + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servant_timer.v b/pythondata_cpu_serv/verilog/servant/servant_timer.v new file mode 100644 index 0000000..28bdb82 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servant_timer.v @@ -0,0 +1,30 @@ +`default_nettype none +module servant_timer + #(parameter WIDTH = 16, + parameter DIVIDER = 0) + (input wire i_clk, + output reg o_irq, + input wire [31:0] i_wb_dat, + input wire i_wb_we, + input wire i_wb_cyc, + output reg [31:0] o_wb_dat); + + localparam HIGH = WIDTH-1-DIVIDER; + + reg [WIDTH-1:0] mtime; + reg [HIGH:0] mtimecmp; + + wire [HIGH:0] mtimeslice = mtime[WIDTH-1:DIVIDER]; + + always @(mtimeslice) begin + o_wb_dat = 32'd0; + o_wb_dat[HIGH:0] = mtimeslice; + end + + always @(posedge i_clk) begin + if (i_wb_cyc & i_wb_we) + mtimecmp <= i_wb_dat[HIGH:0]; + mtime <= mtime + 'd1; + o_irq <= (mtimeslice >= mtimecmp); + end +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servant_upduino2.v b/pythondata_cpu_serv/verilog/servant/servant_upduino2.v new file mode 100644 index 0000000..7c43004 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servant_upduino2.v @@ -0,0 +1,77 @@ +`default_nettype none +module servant_upduino2 + ( + output wire g, + output wire b, + output wire r, + output wire q); + + parameter memfile = "zephyr_hello.hex"; + parameter memsize = 8192; + parameter PLL = "NONE"; + + wire clk; + wire clk48; + wire locked; + + SB_HFOSC inthosc + ( + .CLKHFPU(1'b1), + .CLKHFEN(1'b1), + .CLKHF(clk48)); + + SB_PLL40_CORE + #( + .FEEDBACK_PATH("SIMPLE"), + .DIVR(4'b0010), + .DIVF(7'b0111111), + .DIVQ(3'b110), + .FILTER_RANGE(3'b001)) + pll + (.LOCK(locked), + .RESETB(1'b1), + .BYPASS(1'b0), + .REFERENCECLK(clk48), + .PLLOUTCORE(clk)); + + SB_RGBA_DRV + #( + .CURRENT_MODE ("0b1"), + .RGB0_CURRENT ("0b000111"), + .RGB1_CURRENT ("0b000111"), + .RGB2_CURRENT ("0b000111")) + RGBA_DRIVER + ( + .CURREN(1'b1), + .RGBLEDEN(1'b1), + .RGB0PWM(q), + .RGB1PWM(q), + .RGB2PWM(q), + .RGB0(g), + .RGB1(b), + .RGB2(r)); + + reg rst = 1'b1; + +/* + //Delayed reset + reg [25:0] cnt; + always @(posedge clk) begin + if (!cnt[25]) + cnt <= cnt + 1; + rst <= !cnt[25]; + end + */ + + always @(posedge clk) + rst <= !locked; + + servant + #(.memfile (memfile), + .memsize (memsize)) + servant + (.wb_clk (clk), + .wb_rst (rst), + .q (q)); + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servclone10.v b/pythondata_cpu_serv/verilog/servant/servclone10.v new file mode 100644 index 0000000..f2bf38d --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servclone10.v @@ -0,0 +1,31 @@ +`default_nettype none +module servclone10 +( + input wire i_clk, + input wire i_rst, + output wire q, + output wire uart_txd); + + parameter memfile = "zephyr_hello.hex"; + parameter memsize = 8192; + + wire wb_clk; + wire wb_rst; + + assign uart_txd = q; + + servclone10_clock_gen clock_gen + (.i_clk (i_clk), + .i_rst (i_rst), + .o_clk (wb_clk), + .o_rst (wb_rst)); + + servant + #(.memfile (memfile), + .memsize (memsize)) + servant + (.wb_clk (wb_clk), + .wb_rst (wb_rst), + .q (q)); + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servclone10_clock_gen.v b/pythondata_cpu_serv/verilog/servant/servclone10_clock_gen.v new file mode 100644 index 0000000..bf96ffd --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servclone10_clock_gen.v @@ -0,0 +1,50 @@ +`default_nettype none +module servclone10_clock_gen + (input wire i_clk, + input wire i_rst, + output wire o_clk, + output wire o_rst); + + wire [4:0] clk; + + wire clk_fb; + + wire locked; + reg [9:0] r; + + assign o_clk = clk[0]; + + assign o_rst = r[9]; + + always @(posedge o_clk) + if (locked) + r <= {r[8:0],1'b0}; + else + r <= 10'b1111111111; + + cyclone10lp_pll + #(.bandwidth_type ("auto"), + .clk0_divide_by (6), + .clk0_duty_cycle (50), + .clk0_multiply_by (16), + .clk0_phase_shift ("0"), + .compensate_clock ("clk0"), + .inclk0_input_frequency (83333), + .operation_mode ("normal"), + .pll_type ("auto"), + .lpm_type ("cyclone10lp_pll")) + pll + (.activeclock (), + .areset (i_rst), + .clk (clk), + .clkbad (), + .fbin (clk_fb), + .fbout (clk_fb), + .inclk (i_clk), + .locked (locked), + .phasedone (), + .scandataout (), + .scandone (), + .vcooverrange (), + .vcounderrange ()); +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/service.v b/pythondata_cpu_serv/verilog/servant/service.v new file mode 100644 index 0000000..0f60a99 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/service.v @@ -0,0 +1,28 @@ +`default_nettype none +module service +( + input wire i_clk, + output wire q); + + parameter memfile = "zephyr_hello.hex"; + parameter memsize = 8192; + parameter PLL = "NONE"; + + wire wb_clk; + wire wb_rst; + + servant_clock_gen #(.PLL (PLL)) + clock_gen + (.i_clk (i_clk), + .o_clk (wb_clk), + .o_rst (wb_rst)); + + servant + #(.memfile (memfile), + .memsize (memsize)) + servant + (.wb_clk (wb_clk), + .wb_rst (wb_rst), + .q (q)); + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servix.v b/pythondata_cpu_serv/verilog/servant/servix.v new file mode 100644 index 0000000..9b665ed --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servix.v @@ -0,0 +1,30 @@ +`default_nettype none +module servix +( + input wire i_clk, + output wire q); + + parameter frequency = 32; + parameter memfile = "zephyr_hello.hex"; + parameter memsize = 8192; + parameter PLL = "NONE"; + + wire wb_clk; + wire wb_rst; + + servix_clock_gen + #(.frequency (frequency)) + clock_gen + (.i_clk (i_clk), + .o_clk (wb_clk), + .o_rst (wb_rst)); + + servant + #(.memfile (memfile), + .memsize (memsize)) + servant + (.wb_clk (wb_clk), + .wb_rst (wb_rst), + .q (q)); + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servix_clock_gen.v b/pythondata_cpu_serv/verilog/servant/servix_clock_gen.v new file mode 100644 index 0000000..b44e75c --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servix_clock_gen.v @@ -0,0 +1,39 @@ +`default_nettype none +module servix_clock_gen + (input wire i_clk, + output wire o_clk, + output reg o_rst); + + parameter frequency = 32; + + wire clkfb; + wire locked; + reg locked_r; + + PLLE2_BASE + #(.BANDWIDTH("OPTIMIZED"), + .CLKFBOUT_MULT(16), + .CLKIN1_PERIOD(10.0), //100MHz + .CLKOUT0_DIVIDE((frequency == 32) ? 50 : 100), + .DIVCLK_DIVIDE(1), + .STARTUP_WAIT("FALSE")) + PLLE2_BASE_inst + (.CLKOUT0(o_clk), + .CLKOUT1(), + .CLKOUT2(), + .CLKOUT3(), + .CLKOUT4(), + .CLKOUT5(), + .CLKFBOUT(clkfb), + .LOCKED(locked), + .CLKIN1(i_clk), + .PWRDWN(1'b0), + .RST(1'b0), + .CLKFBIN(clkfb)); + + always @(posedge o_clk) begin + locked_r <= locked; + o_rst <= !locked_r; + end + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servus.v b/pythondata_cpu_serv/verilog/servant/servus.v new file mode 100644 index 0000000..05fa774 --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servus.v @@ -0,0 +1,36 @@ +`default_nettype none +module servus + (input wire i_clk_p, + input wire i_clk_n, + output wire o_uart_tx, + output wire q); + + parameter memfile = "zephyr_hello.hex"; + parameter memsize = 8192; + + wire i_clk; + wire clk; + wire rst; + + assign o_uart_tx = q; + + IBUFDS ibufds + (.I (i_clk_p), + .IB (i_clk_n), + .O (i_clk)); + + servus_clock_gen + clock_gen + (.i_clk (i_clk), + .o_clk (clk), + .o_rst (rst)); + + servant + #(.memfile (memfile), + .memsize (memsize)) + servant + (.wb_clk (clk), + .wb_rst (rst), + .q (q)); + +endmodule diff --git a/pythondata_cpu_serv/verilog/servant/servus_clock_gen.v b/pythondata_cpu_serv/verilog/servant/servus_clock_gen.v new file mode 100644 index 0000000..0e91c8c --- /dev/null +++ b/pythondata_cpu_serv/verilog/servant/servus_clock_gen.v @@ -0,0 +1,44 @@ +`default_nettype none +module servus_clock_gen + (input wire i_clk, + output wire o_clk, + output reg o_rst); + + wire clkfb; + wire locked; + reg locked_r; + + MMCME4_ADV + #(.DIVCLK_DIVIDE (5), + .CLKFBOUT_MULT_F (48.000), + .CLKOUT0_DIVIDE_F (75.0), + .CLKIN1_PERIOD (8.0), //125MHz + .STARTUP_WAIT ("FALSE")) + mmcm + (.CLKFBOUT (clkfb), + .CLKFBOUTB (), + .CLKOUT0 (o_clk), + .CLKOUT0B (), + .CLKOUT1 (), + .CLKOUT1B (), + .CLKOUT2 (), + .CLKOUT2B (), + .CLKOUT3 (), + .CLKOUT3B (), + .CLKOUT4 (), + .CLKOUT5 (), + .CLKOUT6 (), + .CLKIN1 (i_clk), + .CLKIN2 (1'b0), + .CLKINSEL (1'b1), + .LOCKED (locked), + .PWRDWN (1'b0), + .RST (1'b0), + .CLKFBIN (clkfb)); + + always @(posedge o_clk) begin + locked_r <= locked; + o_rst <= !locked_r; + end + +endmodule diff --git a/pythondata_cpu_serv/verilog/serving.core b/pythondata_cpu_serv/verilog/serving.core new file mode 100644 index 0000000..63bca35 --- /dev/null +++ b/pythondata_cpu_serv/verilog/serving.core @@ -0,0 +1,25 @@ +CAPI=2: + +name : ::serving:0 + +filesets: + rtl: + files: + - serving/serving_arbiter.v + - serving/serving_mux.v + - serving/serving_ram.v + - serving/serving.v + file_type : verilogSource + depend : [serv] + +targets: + default: + filesets : [rtl] + + lint: + default_tool : verilator + filesets : [rtl] + tools: + verilator: + mode : lint-only + toplevel : serving diff --git a/pythondata_cpu_serv/verilog/serving/serving.v b/pythondata_cpu_serv/verilog/serving/serving.v new file mode 100644 index 0000000..374bab4 --- /dev/null +++ b/pythondata_cpu_serv/verilog/serving/serving.v @@ -0,0 +1,232 @@ +/* serving.v : Top-level for the serving SoC + * + * ISC License + * + * Copyright (C) 2020 Olof Kindgren + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +`default_nettype none +module serving + ( + input wire i_clk, + input wire i_rst, + input wire i_timer_irq, + + output wire [31:0] o_wb_adr, + output wire [31:0] o_wb_dat, + output wire [3:0] o_wb_sel, + output wire o_wb_we , + output wire o_wb_stb, + input wire [31:0] i_wb_rdt, + input wire i_wb_ack); + + parameter memfile = ""; + parameter memsize = 8192; + parameter WITH_CSR = 1; + localparam regs = 32+WITH_CSR*4; + + localparam rf_width = 8; + + localparam aw = $clog2(memsize); + + wire [31:0] wb_ibus_adr; + wire wb_ibus_stb; + wire [31:0] wb_ibus_rdt; + wire wb_ibus_ack; + + wire [31:0] wb_dbus_adr; + wire [31:0] wb_dbus_dat; + wire [3:0] wb_dbus_sel; + wire wb_dbus_we; + wire wb_dbus_stb; + wire [31:0] wb_dbus_rdt; + wire wb_dbus_ack; + + wire [31:0] wb_dmem_adr; + wire [31:0] wb_dmem_dat; + wire [3:0] wb_dmem_sel; + wire wb_dmem_we; + wire wb_dmem_stb; + wire [31:0] wb_dmem_rdt; + wire wb_dmem_ack; + + wire [31:0] wb_mem_adr; + wire [31:0] wb_mem_dat; + wire [3:0] wb_mem_sel; + wire wb_mem_we; + wire wb_mem_stb; + wire [31:0] wb_mem_rdt; + wire wb_mem_ack; + + wire [6+WITH_CSR:0] waddr; + wire [rf_width-1:0] wdata; + wire wen; + wire [6+WITH_CSR:0] raddr; + wire [rf_width-1:0] rdata; + + + wire [aw-1:0] rf_waddr = ~{{aw-2-5-WITH_CSR{1'b0}},waddr}; + wire [aw-1:0] rf_raddr = ~{{aw-2-5-WITH_CSR{1'b0}},raddr}; + + serving_arbiter arbiter + (.i_wb_cpu_dbus_adr (wb_dmem_adr), + .i_wb_cpu_dbus_dat (wb_dmem_dat), + .i_wb_cpu_dbus_sel (wb_dmem_sel), + .i_wb_cpu_dbus_we (wb_dmem_we ), + .i_wb_cpu_dbus_stb (wb_dmem_stb), + .o_wb_cpu_dbus_rdt (wb_dmem_rdt), + .o_wb_cpu_dbus_ack (wb_dmem_ack), + + .i_wb_cpu_ibus_adr (wb_ibus_adr), + .i_wb_cpu_ibus_stb (wb_ibus_stb), + .o_wb_cpu_ibus_rdt (wb_ibus_rdt), + .o_wb_cpu_ibus_ack (wb_ibus_ack), + + .o_wb_mem_adr (wb_mem_adr), + .o_wb_mem_dat (wb_mem_dat), + .o_wb_mem_sel (wb_mem_sel), + .o_wb_mem_we (wb_mem_we ), + .o_wb_mem_stb (wb_mem_stb), + .i_wb_mem_rdt (wb_mem_rdt), + .i_wb_mem_ack (wb_mem_ack)); + + serving_mux mux + (.i_clk (i_clk), + .i_rst (i_rst), + + .i_wb_cpu_adr (wb_dbus_adr), + .i_wb_cpu_dat (wb_dbus_dat), + .i_wb_cpu_sel (wb_dbus_sel), + .i_wb_cpu_we (wb_dbus_we), + .i_wb_cpu_stb (wb_dbus_stb), + .o_wb_cpu_rdt (wb_dbus_rdt), + .o_wb_cpu_ack (wb_dbus_ack), + + .o_wb_mem_adr (wb_dmem_adr), + .o_wb_mem_dat (wb_dmem_dat), + .o_wb_mem_sel (wb_dmem_sel), + .o_wb_mem_we (wb_dmem_we), + .o_wb_mem_stb (wb_dmem_stb), + .i_wb_mem_rdt (wb_dmem_rdt), + .i_wb_mem_ack (wb_dmem_ack), + + .o_wb_ext_adr (o_wb_adr), + .o_wb_ext_dat (o_wb_dat), + .o_wb_ext_sel (o_wb_sel), + .o_wb_ext_we (o_wb_we), + .o_wb_ext_stb (o_wb_stb), + .i_wb_ext_rdt (i_wb_rdt), + .i_wb_ext_ack (i_wb_ack)); + + serving_ram + #(.memfile (memfile), + .depth (memsize)) + ram + (// Wishbone interface + .i_clk (i_clk), + .i_waddr (rf_waddr), + .i_wdata (wdata), + .i_wen (wen), + .i_raddr (rf_raddr), + .o_rdata (rdata), + .i_wb_adr (wb_mem_adr[$clog2(memsize)-1:2]), + .i_wb_stb (wb_mem_stb), + .i_wb_we (wb_mem_we) , + .i_wb_sel (wb_mem_sel), + .i_wb_dat (wb_mem_dat), + .o_wb_rdt (wb_mem_rdt), + .o_wb_ack (wb_mem_ack)); + + localparam RF_L2W = $clog2(rf_width); + + wire rf_wreq; + wire rf_rreq; + wire [$clog2(regs)-1:0] wreg0; + wire [$clog2(regs)-1:0] wreg1; + wire wen0; + wire wen1; + wire wdata0; + wire wdata1; + wire [$clog2(regs)-1:0] rreg0; + wire [$clog2(regs)-1:0] rreg1; + wire rf_ready; + wire rdata0; + wire rdata1; + + + serv_rf_ram_if + #(.width (rf_width), + .csr_regs (WITH_CSR*4)) + rf_ram_if + (.i_clk (i_clk), + .i_rst (i_rst), + .i_wreq (rf_wreq), + .i_rreq (rf_rreq), + .o_ready (rf_ready), + .i_wreg0 (wreg0), + .i_wreg1 (wreg1), + .i_wen0 (wen0), + .i_wen1 (wen1), + .i_wdata0 (wdata0), + .i_wdata1 (wdata1), + .i_rreg0 (rreg0), + .i_rreg1 (rreg1), + .o_rdata0 (rdata0), + .o_rdata1 (rdata1), + .o_waddr (waddr), + .o_wdata (wdata), + .o_wen (wen), + .o_raddr (raddr), + .i_rdata (rdata)); + + serv_top + #(.RESET_PC (32'h0000_0000), + .WITH_CSR (WITH_CSR)) + cpu + ( + .clk (i_clk), + .i_rst (i_rst), + .i_timer_irq (i_timer_irq), + //RF IF + .o_rf_rreq (rf_rreq), + .o_rf_wreq (rf_wreq), + .i_rf_ready (rf_ready), + .o_wreg0 (wreg0), + .o_wreg1 (wreg1), + .o_wen0 (wen0), + .o_wen1 (wen1), + .o_wdata0 (wdata0), + .o_wdata1 (wdata1), + .o_rreg0 (rreg0), + .o_rreg1 (rreg1), + .i_rdata0 (rdata0), + .i_rdata1 (rdata1), + + //Instruction bus + .o_ibus_adr (wb_ibus_adr), + .o_ibus_cyc (wb_ibus_stb), + .i_ibus_rdt (wb_ibus_rdt), + .i_ibus_ack (wb_ibus_ack), + + //Data bus + .o_dbus_adr (wb_dbus_adr), + .o_dbus_dat (wb_dbus_dat), + .o_dbus_sel (wb_dbus_sel), + .o_dbus_we (wb_dbus_we), + .o_dbus_cyc (wb_dbus_stb), + .i_dbus_rdt (wb_dbus_rdt), + .i_dbus_ack (wb_dbus_ack)); + +endmodule diff --git a/pythondata_cpu_serv/verilog/serving/serving_arbiter.v b/pythondata_cpu_serv/verilog/serving/serving_arbiter.v new file mode 100644 index 0000000..9d537d4 --- /dev/null +++ b/pythondata_cpu_serv/verilog/serving/serving_arbiter.v @@ -0,0 +1,57 @@ +/* serving_arbiter.v : I/D arbiter for the serving SoC + * Relies on the fact that not both masters are active at the same time + * + * ISC License + * + * Copyright (C) 2020 Olof Kindgren + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +module serving_arbiter + ( + input wire [31:0] i_wb_cpu_dbus_adr, + input wire [31:0] i_wb_cpu_dbus_dat, + input wire [3:0] i_wb_cpu_dbus_sel, + input wire i_wb_cpu_dbus_we, + input wire i_wb_cpu_dbus_stb, + output wire [31:0] o_wb_cpu_dbus_rdt, + output wire o_wb_cpu_dbus_ack, + + input wire [31:0] i_wb_cpu_ibus_adr, + input wire i_wb_cpu_ibus_stb, + output wire [31:0] o_wb_cpu_ibus_rdt, + output wire o_wb_cpu_ibus_ack, + + output wire [31:0] o_wb_mem_adr, + output wire [31:0] o_wb_mem_dat, + output wire [3:0] o_wb_mem_sel, + output wire o_wb_mem_we, + output wire o_wb_mem_stb, + input wire [31:0] i_wb_mem_rdt, + input wire i_wb_mem_ack); + + assign o_wb_cpu_dbus_rdt = i_wb_mem_rdt; + assign o_wb_cpu_dbus_ack = i_wb_mem_ack & !i_wb_cpu_ibus_stb; + + assign o_wb_cpu_ibus_rdt = i_wb_mem_rdt; + assign o_wb_cpu_ibus_ack = i_wb_mem_ack & i_wb_cpu_ibus_stb; + + assign o_wb_mem_adr = i_wb_cpu_ibus_stb ? i_wb_cpu_ibus_adr : i_wb_cpu_dbus_adr; + assign o_wb_mem_dat = i_wb_cpu_dbus_dat; + assign o_wb_mem_sel = i_wb_cpu_dbus_sel; + assign o_wb_mem_we = i_wb_cpu_dbus_we & !i_wb_cpu_ibus_stb; + assign o_wb_mem_stb = i_wb_cpu_ibus_stb | i_wb_cpu_dbus_stb; + + +endmodule diff --git a/pythondata_cpu_serv/verilog/serving/serving_mux.v b/pythondata_cpu_serv/verilog/serving/serving_mux.v new file mode 100644 index 0000000..daa1be8 --- /dev/null +++ b/pythondata_cpu_serv/verilog/serving/serving_mux.v @@ -0,0 +1,66 @@ +/* serving_mux.v : Simple Wishbone mux for the serving SoC + * + * ISC License + * + * Copyright (C) 2020 Olof Kindgren + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +module serving_mux + ( + input wire i_clk, + input wire i_rst, + + input wire [31:0] i_wb_cpu_adr, + input wire [31:0] i_wb_cpu_dat, + input wire [3:0] i_wb_cpu_sel, + input wire i_wb_cpu_we, + input wire i_wb_cpu_stb, + output wire [31:0] o_wb_cpu_rdt, + output wire o_wb_cpu_ack, + + output wire [31:0] o_wb_mem_adr, + output wire [31:0] o_wb_mem_dat, + output wire [3:0] o_wb_mem_sel, + output wire o_wb_mem_we, + output wire o_wb_mem_stb, + input wire [31:0] i_wb_mem_rdt, + input wire i_wb_mem_ack, + + output wire [31:0] o_wb_ext_adr, + output wire [31:0] o_wb_ext_dat, + output wire [3:0] o_wb_ext_sel, + output wire o_wb_ext_we, + output wire o_wb_ext_stb, + input wire [31:0] i_wb_ext_rdt, + input wire i_wb_ext_ack); + + wire ext = (i_wb_cpu_adr[31:30] != 2'b00); + + assign o_wb_cpu_rdt = ext ? i_wb_ext_rdt : i_wb_mem_rdt; + assign o_wb_cpu_ack = ext ? i_wb_ext_ack : i_wb_mem_ack; + + assign o_wb_mem_adr = i_wb_cpu_adr; + assign o_wb_mem_dat = i_wb_cpu_dat; + assign o_wb_mem_sel = i_wb_cpu_sel; + assign o_wb_mem_we = i_wb_cpu_we; + assign o_wb_mem_stb = i_wb_cpu_stb & !ext; + + assign o_wb_ext_adr = i_wb_cpu_adr; + assign o_wb_ext_dat = i_wb_cpu_dat; + assign o_wb_ext_sel = i_wb_cpu_sel; + assign o_wb_ext_we = i_wb_cpu_we; + assign o_wb_ext_stb = i_wb_cpu_stb & ext; + +endmodule diff --git a/pythondata_cpu_serv/verilog/serving/serving_ram.v b/pythondata_cpu_serv/verilog/serving/serving_ram.v new file mode 100644 index 0000000..b58c224 --- /dev/null +++ b/pythondata_cpu_serv/verilog/serving/serving_ram.v @@ -0,0 +1,83 @@ +/* serving_ram.v : Shared RF I/D SRAM for the serving SoC + * + * ISC License + * + * Copyright (C) 2020 Olof Kindgren + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +`default_nettype none +module serving_ram + #(//Memory parameters + parameter depth = 256, + parameter aw = $clog2(depth), + parameter memfile = "") + (input wire i_clk, + input wire [aw-1:0] i_waddr, + input wire [7:0] i_wdata, + input wire i_wen, + input wire [aw-1:0] i_raddr, + output wire [7:0] o_rdata, + + input wire [aw-1:2] i_wb_adr, + input wire [31:0] i_wb_dat, + input wire [3:0] i_wb_sel, + input wire i_wb_we, + input wire i_wb_stb, + output wire [31:0] o_wb_rdt, + output reg o_wb_ack); + + wire wb_en = i_wb_stb & !i_wen & !o_wb_ack; + + wire wb_we = i_wb_we & i_wb_sel[bsel]; + + wire we = wb_en ? wb_we : i_wen; + + reg [7:0] mem [0:depth-1] /* verilator public */; + + wire [aw-1:0] waddr = wb_en ? {i_wb_adr[aw-1:2],bsel} : i_waddr; + wire [7:0] wdata = wb_en ? i_wb_dat[bsel*8+:8] : i_wdata; + wire [aw-1:0] raddr = wb_en ? {i_wb_adr[aw-1:2],bsel} : i_raddr; + + reg [2:0] wb_en_r; + + reg [1:0] bsel; + + reg [23:0] wb_rdt; + assign o_wb_rdt = {rdata, wb_rdt}; + + always @(posedge i_clk) begin + if (wb_en) bsel <= bsel + 2'd1; + wb_en_r <= {wb_en_r[1:0], wb_en}; + o_wb_ack <= wb_en & &bsel; + if (bsel == 2'b01) wb_rdt[7:0] <= rdata; + if (bsel == 2'b10) wb_rdt[15:8] <= rdata; + if (bsel == 2'b11) wb_rdt[23:16] <= rdata; + end + + reg [7:0] rdata; + + always @(posedge i_clk) begin + if (we) mem[waddr] <= wdata; + rdata <= mem[raddr]; + end + + initial + if(|memfile) begin + $display("Preloading %m from %s", memfile); + $readmemh(memfile, mem); + end + + assign o_rdata = rdata; +endmodule diff --git a/pythondata_cpu_serv/verilog/sw/Makefile b/pythondata_cpu_serv/verilog/sw/Makefile new file mode 100644 index 0000000..1133f0c --- /dev/null +++ b/pythondata_cpu_serv/verilog/sw/Makefile @@ -0,0 +1,9 @@ +%.elf: %.S link.ld + riscv64-unknown-elf-gcc -nostartfiles -march=rv32i -mabi=ilp32 -Tlink.ld -o$@ $< +%.bin: %.elf + riscv64-unknown-elf-objcopy -O binary $< $@ +%.hex: %.bin + python3 makehex.py $< 2048 > $@ + +clean: + rm -f *.elf *.bin *.hex diff --git a/pythondata_cpu_serv/verilog/sw/blinky.S b/pythondata_cpu_serv/verilog/sw/blinky.S new file mode 100644 index 0000000..80bc620 --- /dev/null +++ b/pythondata_cpu_serv/verilog/sw/blinky.S @@ -0,0 +1,46 @@ +/* +* LED Blinker +* Assuming that GPIO_BASE is mapped to a GPIO core, which in turn is +* connected to LEDs, this will light the LEDs one at a time. +* Useful as smoke test to see that serv is running correctly +*/ +#ifndef GPIO_BASE +#define GPIO_BASE 0x40000000 +#endif + +#ifndef DELAY +#define DELAY 0x100000 /* Loop 100000 times before inverting the LED */ +#endif + + /* + a0 = GPIO Base address + t0 = Value + t1 = Timer max value + t2 = Current timer value + + */ + +.globl _start +_start: + /* Load GPIO base address to a0 */ + lui a0, %hi(GPIO_BASE) + addi a0, a0, %lo(GPIO_BASE) + + /* Set timer value to control blink speed */ + li t1, DELAY + +bl1: + /* Write to LEDs */ + sb t0, 0(a0) + + /* invert LED */ + xori t0, t0, 1 + + /* Reset timer */ + and t2, zero, zero + + /* Delay loop */ +time1: + addi t2, t2, 1 + bne t1, t2, time1 + j bl1 diff --git a/pythondata_cpu_serv/verilog/sw/blinky.hex b/pythondata_cpu_serv/verilog/sw/blinky.hex new file mode 100644 index 0000000..b9847be --- /dev/null +++ b/pythondata_cpu_serv/verilog/sw/blinky.hex @@ -0,0 +1,2048 @@ +40000537 +00050513 +00100337 +00550023 +0012c293 +000073b3 +00138393 +fe731ee3 +fedff06f +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/pythondata_cpu_serv/verilog/sw/link.ld b/pythondata_cpu_serv/verilog/sw/link.ld new file mode 100644 index 0000000..3398348 --- /dev/null +++ b/pythondata_cpu_serv/verilog/sw/link.ld @@ -0,0 +1,10 @@ +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +SECTIONS +{ + . = 0x00000000; + .text : { *(.text) } + .data : { *(.data) } + .bss : { *(.bss) } +} diff --git a/pythondata_cpu_serv/verilog/sw/makehex.py b/pythondata_cpu_serv/verilog/sw/makehex.py new file mode 100644 index 0000000..419b378 --- /dev/null +++ b/pythondata_cpu_serv/verilog/sw/makehex.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +# +# This is free and unencumbered software released into the public domain. +# +# Anyone is free to copy, modify, publish, use, compile, sell, or +# distribute this software, either in source code form or as a compiled +# binary, for any purpose, commercial or non-commercial, and by any +# means. + +from sys import argv + +binfile = argv[1] +nwords = int(argv[2]) + +with open(binfile, "rb") as f: + bindata = f.read() + +assert len(bindata) < 4*nwords +assert len(bindata) % 4 == 0 + +for i in range(nwords): + if i < len(bindata) // 4: + w = bindata[4*i : 4*i+4] + print("%02x%02x%02x%02x" % (w[3], w[2], w[1], w[0])) + else: + print("0") + diff --git a/pythondata_cpu_serv/verilog/sw/zephyr_hello.hex b/pythondata_cpu_serv/verilog/sw/zephyr_hello.hex new file mode 100644 index 0000000..10f929b --- /dev/null +++ b/pythondata_cpu_serv/verilog/sw/zephyr_hello.hex @@ -0,0 +1,2048 @@ +00000297 +01028293 +30529073 +5d80006f +fb010113 +00112023 +00312223 +00412423 +00512623 +00612823 +00712a23 +01c12c23 +01d12e23 +03e12023 +03f12223 +02a12423 +02b12623 +02c12823 +02d12a23 +02e12c23 +02f12e23 +05012023 +05112223 +341022f3 +04512423 +300022f3 +04512623 +1e8000ef +00000313 +02051e63 +342022f3 +800003b7 +fff38393 +0072f2b3 +00b00313 +00628a63 +00010513 +00000097 +12c08093 +4800006f +04812283 +00428293 +04512423 +0880006f +00010293 +00002397 +e1438393 +0043a103 +ff010113 +00512023 +0003ae03 +001e0e13 +01c3a023 +00030863 +00000097 +03c08093 +4c80006f +34202573 +800002b7 +fff28293 +00557533 +150000ef +00001297 +7ec28293 +00351513 +00a282b3 +0002a503 +0042a303 +000300e7 +00002317 +db430313 +00032383 +fff38393 +00732023 +00012283 +00028113 +0900006f +00002297 +d9428293 +0082a303 +02832623 +02932823 +03232a23 +03332c23 +03432e23 +05532023 +05632223 +05732423 +05832623 +05932823 +05a32a23 +05b32c23 +02232423 +00002397 +bf438393 +0003ae03 +07c32623 +0202a303 +0062a423 +02832103 +02c32403 +03032483 +03432903 +03832983 +03c32a03 +04032a83 +04432b03 +04832b83 +04c32c03 +05032c83 +05432d03 +05832d83 +04812283 +34129073 +04c12283 +30029073 +00012083 +00412183 +00812203 +00c12283 +01012303 +01412383 +01812e03 +01c12e83 +02012f03 +02412f83 +02812503 +02c12583 +03012603 +03412683 +03812703 +03c12783 +04012803 +04412883 +05010113 +30200073 +00000073 +00002297 +ca428293 +0082a303 +06c32383 +00857513 +300522f3 +00038513 +00008067 +00100313 +00a312b3 +3442b373 +00008067 +342022f3 +80000337 +0062f2b3 +00000513 +00028463 +00150513 +00008067 +02060063 +02000793 +40c787b3 +00f04c63 +fe060513 +00000713 +00a5d533 +00070593 +00008067 +00c5d733 +00c55533 +00f595b3 +00b56533 +fe9ff06f +00050613 +00000513 +0015f693 +00068463 +00c50533 +0015d593 +00161613 +fe0596e3 +00008067 +06054063 +0605c663 +00058613 +00050593 +fff00513 +02060c63 +00100693 +00b67a63 +00c05863 +00161613 +00169693 +feb66ae3 +00000513 +00c5e663 +40c585b3 +00d56533 +0016d693 +00165613 +fe0696e3 +00008067 +00008293 +fb5ff0ef +00058513 +00028067 +40a00533 +0005d863 +40b005b3 +f9dff06f +40b005b3 +00008293 +f91ff0ef +40a00533 +00028067 +00008293 +0005ca63 +00054c63 +f79ff0ef +00058513 +00028067 +40b005b3 +fe0558e3 +40a00533 +f61ff0ef +40b00533 +00028067 +000025b7 +00002537 +96058593 +96850513 +2750006f +ff010113 +00112623 +00812423 +00600793 +02f50463 +1f0010ef +02050463 +1e8010ef +04051663 +000025b7 +c2c58593 +00002537 +c4050513 +23d000ef +279000ef +ffdff06f +1d4010ef +fc051ce3 +00002437 +ec840413 +00842583 +00002537 +c6050513 +215000ef +00842503 +23c010ef +fd1ff06f +000025b7 +c2858593 +fb9ff06f +fb010113 +04812423 +04912223 +04112623 +00600793 +00050493 +00058413 +0ea7e063 +00002737 +00251793 +97c70713 +00e787b3 +0007a783 +00078067 +00002537 +aac50513 +1b9000ef +13c010ef +04442783 +01042883 +00c42803 +02f12823 +04042783 +00442703 +00042683 +02f12623 +03c42783 +04842603 +00050593 +02f12423 +03842783 +00002537 +b3050513 +02f12223 +03442783 +02f12023 +03042783 +00f12e23 +02c42783 +00f12c23 +02842783 +00f12a23 +02442783 +00f12823 +02042783 +00f12623 +01c42783 +00f12423 +01842783 +00f12223 +01442783 +00f12023 +00842783 +125000ef +00040593 +00048513 +ea9ff0ef +00002537 +ad450513 +f55ff06f +00002537 +af050513 +f49ff06f +00002537 +00048593 +b0c50513 +0f1000ef +f39ff06f +ff010113 +00812423 +00112623 +00050413 +34202673 +00161613 +00165613 +00500793 +02c7e863 +00002737 +00261793 +99870713 +00f707b3 +0007a583 +00002537 +9b850513 +0a9000ef +00040593 +00000513 +ea5ff0ef +000025b7 +9b058593 +fe1ff06f +ff010113 +00112623 +342025f3 +00002537 +00159593 +0015d593 +c8850513 +071000ef +000025b7 +9d458593 +00400513 +e69ff0ef +000027b7 +dc878793 +0007a703 +00070c63 +0007a303 +0007a023 +000027b7 +dcc7a503 +00030067 +00008067 +ff010113 +00112623 +5b9000ef +085000ef +5d1000ef +00002117 +90c10113 +000012b7 +80028293 +00510133 +fd9ff0ef +00159793 +00b787b3 +00279713 +00c52783 +00e787b3 +00b50703 +00b75463 +0007a783 +41f65713 +01f77713 +00c70733 +40575713 +00271713 +00e787b3 +00f6a023 +01f67513 +00008067 +fe010113 +00c10693 +00112e23 +fb1ff0ef +00c12703 +00100793 +00a79533 +00072783 +01c12083 +00a7e7b3 +00f72023 +02010113 +00008067 +fe010113 +00912a23 +00452483 +00812c23 +00050413 +00855503 +00048593 +01212823 +01312623 +01412423 +01512223 +01612023 +00112e23 +c01ff0ef +00042983 +00a44a83 +fff00793 +00050a13 +00a989b3 +00f405a3 +00000913 +01f00b13 +03594c63 +00000493 +00845783 +08f4cc63 +01c12083 +01812403 +01412483 +01012903 +00c12983 +00812a03 +00412a83 +00012b03 +02010113 +00008067 +00048593 +000a0513 +bc9ff0ef +00191713 +01270733 +00271793 +00c42703 +00f70733 +00470793 +00f72223 +00f72423 +00ab4e63 +012405a3 +0024d493 +00348493 +ffc4f493 +00190913 +f85ff06f +01f50513 +41f55793 +01f7f793 +00a787b3 +4057d793 +00279793 +01372023 +00f989b3 +fcdff06f +00442583 +00048513 +b31ff0ef +00042783 +00048613 +00000593 +00a78533 +00c42783 +00148493 +00478713 +00e52023 +0087a703 +00e52223 +0087a703 +00a72023 +00a7a423 +00040513 +e8dff0ef +f1dff06f +00000513 +00008067 +ff010113 +00812423 +00050413 +04500513 +00112623 +00912223 +00058493 +000400e7 +00048593 +05200513 +000400e7 +00040313 +00812403 +00c12083 +00048593 +00412483 +05200513 +01010113 +00030067 +0005a783 +00178793 +00f5a023 +000027b7 +d507a303 +00030067 +fc010113 +02812c23 +03312623 +03412423 +03612023 +01a12823 +02112e23 +02912a23 +03212823 +03512223 +01712e23 +01812c23 +01912a23 +01b12623 +00050993 +00058a13 +00060d13 +00068b13 +00100413 +00e05463 +00070413 +00100793 +02000c93 +00fb1463 +03000c93 +3b9ad4b7 +00100913 +00a00a93 +00000c13 +9ff48493 +00200d93 +00148b93 +000c1463 +0ba4f263 +000b8593 +000d0513 +a1dff0ef +000a0593 +03050513 +000980e7 +00190913 +00100c13 +000b8593 +000d0513 +a45ff0ef +00050d13 +00a00593 +00048513 +9edff0ef +fffa8a93 +00100793 +00050493 +fafa96e3 +000a0593 +030d0513 +000980e7 +00300793 +41240433 +06fb0663 +03c12083 +03812403 +03412483 +03012903 +02c12983 +02812a03 +02412a83 +02012b03 +01c12b83 +01812c03 +01412c83 +01012d03 +00c12d83 +04010113 +00008067 +f95440e3 +f76deee3 +000a0593 +000c8513 +000980e7 +00190913 +f69ff06f +000a0593 +02000513 +000980e7 +fff40413 +fe8048e3 +f95ff06f +000027b7 +d4a7a823 +00008067 +fb010113 +04812423 +04912223 +05212023 +03312e23 +03412c23 +03512a23 +03912223 +03a12023 +01b12e23 +04112623 +03612823 +03712623 +03812423 +00050413 +00058493 +00060a93 +00068d13 +00000a13 +fff00913 +00000993 +00000c93 +80000db7 +000ac503 +04051063 +04c12083 +04812403 +04412483 +04012903 +03c12983 +03812a03 +03412a83 +03012b03 +02c12b83 +02812c03 +02412c83 +02012d03 +01c12d83 +05010113 +00008067 +000c9e63 +02500693 +36d50c63 +00048593 +000400e7 +001a8a93 +fa5ff06f +06400693 +12d50063 +06a6e263 +03900693 +02a6ea63 +03100693 +0ed57463 +02d00693 +34d50c63 +03000793 +0cf50063 +02500713 +02e51263 +00048593 +02500513 +000400e7 +1600006f +05800693 +1cd50063 +06300713 +30e50063 +00048593 +02500513 +000400e7 +00048593 +000ac503 +fd5ff06f +07000693 +16d50c63 +02a6e063 +06900693 +0ad50463 +06c00693 +08d50c63 +06800693 +f6d506e3 +fc5ff06f +07500693 +10d50863 +02a6ee63 +07300713 +fae518e3 +000d2c03 +004d0b13 +000c0b93 +000bc503 +26051a63 +00300793 +00f99863 +418b8bb3 +41790bb3 +27704863 +000b0d13 +0cc0006f +07800693 +12d50663 +07a00693 +fa9ff06f +00095e63 +28098a63 +fd050913 +f00992e3 +00200993 +efdff06f +fe0948e3 +00291693 +01268933 +00191913 +fd090913 +01250933 +fddff06f +001a0a13 +ed9ff06f +040a1263 +000d2603 +004d0d13 +02065063 +00048593 +02d00513 +00c12023 +000400e7 +00012603 +fff90913 +40c00633 +00090713 +00098693 +00048593 +00040513 +c7dff0ef +03c0006f +00100713 +faea0ee3 +007d0793 +ff87f713 +00072603 +00472683 +00870d13 +01b60733 +00c73733 +00d70733 +fa0700e3 +00048593 +00040513 +bddff0ef +00000c93 +e55ff06f +000a1863 +000d2603 +004d0d13 +f9dff06f +00100713 +feea08e3 +007d0793 +ff87f713 +00870d13 +00072603 +00472703 +fc0710e3 +800007b7 +fff7c793 +f6c7f8e3 +fb1ff06f +00048593 +03000513 +000400e7 +00048593 +07800513 +000400e7 +00800913 +00100993 +00100693 +0b46c263 +000d2783 +00012423 +004d0d13 +00f12223 +01000c13 +00000b93 +00012023 +01000893 +00412503 +00812583 +fff88b13 +002b1613 +01112623 +de0ff0ef +00f57513 +08051863 +00012783 +03000693 +00079863 +00c12883 +00100793 +08f89663 +00a68533 +01851513 +00048593 +41855513 +000400e7 +001b8b93 +040b1863 +00300693 +00000c93 +d6d996e3 +00191713 +41770bb3 +f17054e3 +00048593 +02000513 +000400e7 +fffb8b93 +fedff06f +007d0793 +ff87f693 +0006a783 +00868d13 +00f12223 +0046a783 +00f12423 +f55ff06f +01912023 +000b0893 +f59ff06f +00900793 +05700693 +f8a7e2e3 +03000693 +f7dff06f +fffc0793 +00f12623 +01894c63 +00100793 +00f99c63 +00048593 +03000513 +000400e7 +00c12c03 +fc1ff06f +00200793 +fef99ae3 +00048593 +02000513 +fe5ff06f +00048593 +001b8b93 +000400e7 +d7dff06f +00048593 +02000513 +000400e7 +fffb8b93 +d81ff06f +000d2503 +00048593 +004d0b13 +000400e7 +d71ff06f +00000a13 +fff00913 +00000993 +00100c93 +c85ff06f +00300993 +c7dff06f +00100993 +c75ff06f +fe010113 +00050613 +00001537 +00058693 +81050513 +00c10593 +00112e23 +00012623 +b9dff0ef +01c12083 +02010113 +00008067 +fc010113 +02b12223 +02410593 +00112e23 +02c12423 +02d12623 +02e12823 +02f12a23 +03012c23 +03112e23 +00b12623 +fa5ff0ef +01c12083 +04010113 +00008067 +00008067 +00800793 +3007a7f3 +00008067 +00100793 +00a79533 +30452573 +00008067 +00800793 +3007b7f3 +30405073 +34405073 +00008067 +ff010113 +00812423 +00912223 +00002437 +00112623 +00a00793 +00050493 +dd840413 +00f51c63 +00042503 +00d00593 +00452783 +0047a783 +000780e7 +00042503 +0ff4f593 +00452783 +0047a783 +000780e7 +00c12083 +00812403 +00048513 +00412483 +01010113 +00008067 +ff010113 +00812423 +00001437 +e7440513 +00112623 +1e4000ef +e7440513 +00812403 +00c12083 +01010113 +a85ff06f +00002537 +ff010113 +cb850513 +00112623 +3e0000ef +000027b7 +dca7ac23 +fb9ff0ef +00c12083 +00000513 +01010113 +00008067 +fe010113 +00912a23 +00112e23 +00812c23 +01212823 +01312623 +01412423 +00800493 +3004b4f3 +00002a37 +800007b7 +ddca0a13 +0007a983 +000a2903 +00027437 +10040593 +41298533 +b5cff0ef +10040593 +b28ff0ef +01250533 +10040413 +00850433 +00aa2023 +413409b3 +3e700793 +0084f493 +0137c863 +0004e437 +20040413 +00850433 +800007b7 +0087a023 +3004a4f3 +01812403 +01c12083 +01412483 +01012903 +00c12983 +00812a03 +00100513 +02010113 +7980006f +800006b7 +0006a783 +00027737 +ff010113 +10070713 +00112623 +00e787b3 +00700513 +00f6a023 +e4dff0ef +00c12083 +00000513 +01010113 +00008067 +00008067 +00000513 +00008067 +00054783 +0005c703 +00e79463 +00079663 +40e78533 +00008067 +00150513 +00158593 +fe1ff06f +0ff5f693 +00050793 +0037f713 +04071463 +0ff5f593 +00859713 +00b765b3 +01059713 +00b765b3 +00c78333 +00078713 +00300813 +40e308b3 +03186a63 +00265713 +00271593 +00b787b3 +40b60633 +00c78633 +02c79463 +00008067 +fe060ee3 +00178793 +fed78fa3 +fff60613 +fa5ff06f +00470713 +feb72e23 +fc1ff06f +00178793 +fed78fa3 +fd1ff06f +fff00513 +00008067 +000027b7 +d4a7aa23 +00008067 +00852703 +0026f793 +00b7e5b3 +00072503 +04059a63 +00100793 +00c79633 +00452783 +fea00513 +00f677b3 +04078063 +f7e6f793 +fdd00513 +02079a63 +0806f513 +00472783 +00050a63 +00f66633 +00c72223 +00000513 +00008067 +fff64613 +00f67633 +00c72223 +00008067 +fdd00513 +00008067 +00852783 +0007a503 +0047a783 +00052883 +00452803 +02059063 +00100713 +00c71733 +00e87833 +fea00513 +02080c63 +00068463 +00080693 +00800713 +30073773 +0008a603 +00877713 +00f647b3 +00d7c7b3 +0107f7b3 +00c7c7b3 +00f8a023 +30072773 +00000513 +00008067 +00852503 +00052703 +00452503 +00072783 +0007a783 +00a7c7b3 +00472503 +00a7f7b3 +02059863 +00c7d7b3 +0017f793 +00f6a023 +00100793 +00c797b3 +00472603 +00c7f7b3 +00079463 +fea00593 +00058513 +00008067 +00f6a023 +00000593 +ff1ff06f +00052703 +00852783 +00872703 +00e7a023 +000027b7 +ccc78793 +00f52223 +00000513 +00008067 +00159593 +2005e593 +00800793 +3007b7f3 +40000737 +0087f793 +00b72023 +4015d593 +00000013 +00000013 +fe0598e3 +3007a7f3 +00008067 +400007b7 +0007a783 +00000513 +00f58023 +00008067 +400007b7 +00100713 +00e7a023 +00000513 +00008067 +00251713 +000027b7 +00150513 +cfc78793 +00251513 +ff010113 +00e78733 +00a787b3 +00812423 +00912223 +00072403 +0007a483 +00112623 +00946c63 +00c12083 +00812403 +00412483 +01010113 +00008067 +00042783 +00040513 +0047a783 +000780e7 +00050463 +00042223 +00c40413 +fcdff06f +ff010113 +000027b7 +00912223 +000024b7 +00812423 +00112623 +d7078413 +01212023 +d7078793 +dac48493 +00941c63 +00050913 +00078413 +02941463 +00000413 +0440006f +00442703 +00070863 +00042703 +00072703 +02a70863 +00c40413 +fd1ff06f +00442783 +00079663 +00c40413 +fcdff06f +00042783 +00090513 +0007a583 +cb9ff0ef +fe0514e3 +00040513 +00c12083 +00812403 +00412483 +00012903 +01010113 +00008067 +00002537 +000027b7 +dc050613 +ef078793 +40c78633 +00000593 +dc050513 +c9dff06f +000027b7 +ff010113 +00002737 +6f078793 +00000513 +ecf72623 +00112623 +ebdff0ef +00100513 +eb5ff0ef +00200513 +eadff0ef +00002537 +d1050513 +a1dff0ef +00300513 +e99ff0ef +f8dfe0ef +000027b7 +e5878793 +00c7c703 +ffe77713 +00e78623 +00800793 +3007b7f3 +0000006f +00452703 +00052783 +00f72023 +00e7a223 +00052023 +00052223 +00008067 +ff010113 +00812423 +00912223 +00112623 +00050493 +00800413 +30043473 +fc9ff0ef +00d4c783 +00847413 +ffd7f793 +00f486a3 +30042473 +00c12083 +00812403 +0004a423 +00412483 +01010113 +00008067 +000027b7 +ec87a783 +00079663 +00058513 +d91fe06f +0085f593 +3005a5f3 +00008067 +00052783 +00f51463 +00000793 +00078513 +00008067 +ff010113 +00812423 +00002437 +00912223 +00050493 +ec840513 +02050513 +00112623 +fcdff0ef +ec840793 +00051463 +00c7a503 +02049c63 +0087a703 +00d74683 +01f6f693 +02069463 +000026b7 +d6c6a683 +00d70e63 +00e7ae23 +00c12083 +00812403 +00412483 +01010113 +00008067 +00a7ae23 +fe9ff06f +ff010113 +00812423 +00912223 +00112623 +00050493 +00800413 +30043473 +00d54783 +00847413 +0407f793 +00078a63 +ec9ff0ef +00d4c783 +fbf7f793 +00f486a3 +000027b7 +ed07a503 +40950533 +00153513 +f45ff0ef +30042473 +00c12083 +00812403 +00412483 +01010113 +00008067 +000027b7 +ed07a503 +00008067 +000027b7 +ec87a503 +00a03533 +00008067 +000027b7 +ed07a783 +00c7c503 +00157513 +00008067 +06052783 +ff010113 +00812423 +00112623 +00050413 +00078463 +000780e7 +00d44783 +01f7f713 +02071863 +01842703 +02071463 +00040513 +f35ff0ef +00d44783 +00c12083 +0087e793 +00f406a3 +00812403 +01010113 +00008067 +0027f793 +00078663 +00040513 +e19ff0ef +01842783 +fc0788e3 +01840513 +104000ef +fc5ff06f +fd010113 +02112623 +00800593 +3005b5f3 +0085f593 +00b12623 +f71ff0ef +00c12583 +01c10513 +e29ff0ef +02c12083 +03010113 +00008067 +000027b7 +de07a783 +00079463 +9a9ff06f +00000513 +00008067 +00052783 +02050263 +00002737 +d5c72703 +00e50c63 +00078a63 +0087a703 +00852683 +00d70733 +00e7a423 +00452703 +00f72023 +00e7a223 +00052023 +00052223 +00008067 +000027b7 +de47c783 +ff010113 +00112623 +00812423 +00912223 +fff00513 +00079663 +80000537 +fff54513 +000027b7 +d5878793 +0007a403 +02f40463 +02040263 +00842483 +f69ff0ef +40a484b3 +00000513 +0004c863 +00842403 +f55ff0ef +40a40533 +00c12083 +00812403 +00412483 +01010113 +00008067 +ff010113 +00812423 +00112623 +00800413 +30043473 +00052783 +00847413 +02078063 +f31ff0ef +00000513 +30042473 +00c12083 +00812403 +01010113 +00008067 +fea00513 +fe9ff06f +fe010113 +00812c23 +00112e23 +00912a23 +01212823 +01312623 +01412423 +01512223 +00800413 +30043473 +000029b7 +00002a37 +00002937 +dea9a023 +00847413 +de098993 +d58a0a13 +dc090913 +00800a93 +000a2483 +0009a783 +00092683 +00492503 +01448c63 +00048a63 +0084a703 +06e7d063 +40f70733 +00e4a423 +00d786b3 +41f7d713 +00a70733 +00f6b7b3 +00e787b3 +00d92023 +00f92223 +0009a023 +eb9ff0ef +00000593 +809ff0ef +30042473 +01c12083 +01812403 +01412483 +01012903 +00c12983 +00812a03 +00412a83 +02010113 +00008067 +00d706b3 +41f75593 +00a585b3 +00e6b633 +00b60633 +40e787b3 +0004a423 +00048513 +00d92023 +00c92223 +00f9a023 +e19ff0ef +30042473 +00c4a783 +00048513 +000780e7 +300ab473 +00847413 +f3dff06f +ff010113 +00812423 +00912223 +00002437 +000024b7 +00112623 +dac40413 +dac48493 +00946e63 +00c12083 +00812403 +00412483 +00000513 +01010113 +00008067 +01440793 +00040513 +00f42a23 +00f42c23 +da1fe0ef +01c40413 +fcdff06f +00008067 +00000000 +00000578 +00000000 +00000578 +00000000 +00000578 +00000000 +00000578 +00000000 +00000578 +00000000 +00000578 +00000000 +00000578 +00000000 +00000f34 +00001cb0 +00001208 +00001d60 +000019d0 +00000f04 +00000000 +00001cc0 +00000fe0 +00000000 +00001cb8 +00001274 +00000000 +000019d0 +00001888 +00000000 +76726573 +00656369 +6c6c6548 +6f57206f +21646c72 +0a732520 +00000000 +00000450 +00000508 +00000508 +00000444 +00000450 +000004f0 +000004fc +00001a24 +00001a44 +00001a60 +00001a74 +00001a80 +00001a98 +6e6b6e75 +006e776f +65637845 +6f697470 +6163206e +20657375 +28207325 +0a296425 +00000000 +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +74736e49 +74637572 +206e6f69 +72646461 +20737365 +6173696d +6e67696c +00006465 +74736e49 +74637572 +206e6f69 +65636341 +66207373 +746c7561 +00000000 +656c6c49 +206c6167 +74736e69 +74637572 +006e6f69 +61657242 +696f706b +0000746e +64616f4c +64646120 +73736572 +73696d20 +67696c61 +0064656e +64616f4c +63636120 +20737365 +6c756166 +00000074 +2a2a2a2a +72654b20 +206c656e +6f6c6c41 +69746163 +46206e6f +756c6961 +20216572 +2a2a2a2a +0000000a +2a2a2a2a +654b202a +6c656e72 +504f4f20 +2a202153 +2a2a2a2a +0000000a +2a2a2a2a +654b202a +6c656e72 +6e615020 +20216369 +2a2a2a2a +00000a2a +2a2a2a2a +6b6e5520 +6e776f6e +74614620 +45206c61 +726f7272 +21642520 +2a2a2a20 +00000a2a +72727543 +20746e65 +65726874 +49206461 +203d2044 +460a7025 +746c7561 +20676e69 +74736e69 +74637572 +206e6f69 +72646461 +20737365 +7830203d +200a7825 +3a617220 +25783020 +67202078 +30203a70 +20782578 +3a707420 +25783020 +74202078 +30203a30 +0a782578 +31742020 +7830203a +20207825 +203a3274 +78257830 +33742020 +7830203a +20207825 +203a3474 +78257830 +7420200a +30203a35 +20782578 +3a367420 +25783020 +61202078 +30203a30 +20782578 +3a316120 +25783020 +20200a78 +203a3261 +78257830 +33612020 +7830203a +20207825 +203a3461 +78257830 +35612020 +7830203a +200a7825 +3a366120 +25783020 +61202078 +30203a37 +0a782578 +00000000 +00525349 +65737365 +6169746e +6874206c +64616572 +00000000 +61746146 +6166206c +20746c75 +25206e69 +53202173 +6e6e6970 +2e676e69 +000a2e2e +61746146 +6166206c +20746c75 +74206e69 +61657268 +70252064 +62412021 +6974726f +0a2e676e +00000000 +72757053 +73756f69 +746e6920 +75727265 +64207470 +63657465 +21646574 +51524920 +6425203a +0000000a +3044454c +00000000 +74726175 +00000030 +5f737973 +636f6c63 +0000006b +000010dc +00001148 +000011ac +00000000 +00000000 +00000000 +00000000 +00001260 +0000122c +00000000 +00000000 +00000000 +00001d70 +00001da0 +00001dac +00001dac +00001dac +2a2a2a2a +6f42202a +6e69746f +655a2067 +72796870 +20534f20 +6870657a +762d7279 +34312e31 +342d312e +3763672d +36643263 +33313532 +2a206566 +2a2a2a2a +0000000a +000007bc +000010c8 +00001d58 +00001d58 +40000000 +00000001 +fffffff5 +00001de8 +00001954 +00000000 +00000000 +00001924 +00000000 +00001dd0 +00001948 +00001ce8 +00000000 +00001930 +00000000 +00000000 +0000193c +00000000 +00000000 +00001dac +00001dac +00000000 +00000000 +ffffffff +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/pythondata_cpu_serv/verilog/sw/zephyr_hello_mt.hex b/pythondata_cpu_serv/verilog/sw/zephyr_hello_mt.hex new file mode 100644 index 0000000..f40034e --- /dev/null +++ b/pythondata_cpu_serv/verilog/sw/zephyr_hello_mt.hex @@ -0,0 +1,4096 @@ +00000297 +01028293 +30529073 +5e00006f +fb010113 +00112023 +00312223 +00412423 +00512623 +00612823 +00712a23 +01c12c23 +01d12e23 +03e12023 +03f12223 +02a12423 +02b12623 +02c12823 +02d12a23 +02e12c23 +02f12e23 +05012023 +05112223 +341022f3 +04512423 +300022f3 +04512623 +1f0000ef +00000313 +02051e63 +342022f3 +800003b7 +fff38393 +0072f2b3 +00b00313 +00628a63 +00010513 +00000097 +13408093 +4880006f +04812283 +00428293 +04512423 +0900006f +00010293 +00002397 +7e438393 +0043a103 +ff010113 +00512023 +0003ae03 +001e0e13 +01c3a023 +00030863 +00000097 +03c08093 +4d00006f +34202573 +800002b7 +fff28293 +00557533 +158000ef +00002297 +1a028293 +00351513 +00a282b3 +0002a503 +0042a303 +000300e7 +00002317 +78430313 +00032383 +fff38393 +00732023 +00012283 +00028113 +00832383 +02032e03 +087e0863 +00002297 +75c28293 +0082a303 +02832623 +02932823 +03232a23 +03332c23 +03432e23 +05532023 +05632223 +05732423 +05832623 +05932823 +05a32a23 +05b32c23 +02232423 +00002397 +5b038393 +0003ae03 +07c32623 +0202a303 +0062a423 +02832103 +02c32403 +03032483 +03432903 +03832983 +03c32a03 +04032a83 +04432b03 +04832b83 +04c32c03 +05032c83 +05432d03 +05832d83 +04812283 +34129073 +04c12283 +30029073 +00012083 +00412183 +00812203 +00c12283 +01012303 +01412383 +01812e03 +01c12e83 +02012f03 +02412f83 +02812503 +02c12583 +03012603 +03412683 +03812703 +03c12783 +04012803 +04412883 +05010113 +30200073 +00000073 +00002297 +66c28293 +0082a303 +06c32383 +00857513 +300522f3 +00038513 +00008067 +00100313 +00a312b3 +3442b373 +00008067 +342022f3 +80000337 +0062f2b3 +00000513 +00028463 +00150513 +00008067 +02060063 +02000793 +40c787b3 +00f04c63 +fe060513 +00000713 +00a5d533 +00070593 +00008067 +00c5d733 +00c55533 +00f595b3 +00b56533 +fe9ff06f +00050613 +00000513 +0015f693 +00068463 +00c50533 +0015d593 +00161613 +fe0596e3 +00008067 +06054063 +0605c663 +00058613 +00050593 +fff00513 +02060c63 +00100693 +00b67a63 +00c05863 +00161613 +00169693 +feb66ae3 +00000513 +00c5e663 +40c585b3 +00d56533 +0016d693 +00165613 +fe0696e3 +00008067 +00008293 +fb5ff0ef +00058513 +00028067 +40a00533 +0005d863 +40b005b3 +f9dff06f +40b005b3 +00008293 +f91ff0ef +40a00533 +00028067 +00008293 +0005ca63 +00054c63 +f79ff0ef +00058513 +00028067 +40b005b3 +fe0558e3 +40a00533 +f61ff0ef +40b00533 +00028067 +000025b7 +00002537 +31458593 +31c50513 +3490006f +ff010113 +00112623 +00812423 +00600793 +02f50463 +02d010ef +02050463 +025010ef +04051663 +000025b7 +5e058593 +00002537 +5f450513 +311000ef +34d000ef +ffdff06f +011010ef +fc051ce3 +00003437 +89840413 +00842583 +00002537 +61450513 +2e9000ef +00842503 +235010ef +fd1ff06f +000025b7 +5dc58593 +fb9ff06f +fb010113 +04812423 +04912223 +04112623 +00600793 +00050493 +00058413 +0ea7e063 +00002737 +00251793 +33070713 +00e787b3 +0007a783 +00078067 +00002537 +46050513 +28d000ef +758010ef +04442783 +01042883 +00c42803 +02f12823 +04042783 +00442703 +00042683 +02f12623 +03c42783 +04842603 +00050593 +02f12423 +03842783 +00002537 +4e450513 +02f12223 +03442783 +02f12023 +03042783 +00f12e23 +02c42783 +00f12c23 +02842783 +00f12a23 +02442783 +00f12823 +02042783 +00f12623 +01c42783 +00f12423 +01842783 +00f12223 +01442783 +00f12023 +00842783 +1f9000ef +00040593 +00048513 +ea9ff0ef +00002537 +48850513 +f55ff06f +00002537 +4a450513 +f49ff06f +00002537 +00048593 +4c050513 +1c5000ef +f39ff06f +ff010113 +00812423 +00112623 +00050413 +34202673 +00161613 +00165613 +00500793 +02c7e863 +00002737 +00261793 +34c70713 +00f707b3 +0007a583 +00002537 +36c50513 +17d000ef +00040593 +00000513 +ea5ff0ef +000025b7 +36458593 +fe1ff06f +ff010113 +00112623 +342025f3 +00002537 +00159593 +0015d593 +63c50513 +145000ef +000025b7 +38858593 +00400513 +e69ff0ef +000027b7 +79078793 +0007a703 +00070c63 +0007a303 +0007a023 +000027b7 +7947a503 +00030067 +00008067 +ff010113 +00112623 +68d000ef +159000ef +6f1000ef +00003117 +8e410113 +000012b7 +80028293 +00510133 +fd9ff0ef +2700006f +fd010113 +01312e23 +00068993 +03012683 +02812423 +03212023 +00058413 +00060913 +00088593 +00400613 +02912223 +02112623 +00050493 +00e12623 +00f12423 +01012223 +7d0010ef +00812783 +fb090593 +00b405b3 +0404ae23 +0604a023 +ff05f593 +02f5a823 +000027b7 +00c12703 +00412803 +88078793 +04f5a623 +000007b7 +02c12083 +02812403 +60478793 +0335a423 +02e5a623 +0305aa23 +04f5a423 +02b4a423 +02012903 +02412483 +01c12983 +03010113 +00008067 +00159793 +00b787b3 +00279713 +00c52783 +00e787b3 +00b50703 +00b75463 +0007a783 +41f65713 +01f77713 +00c70733 +40575713 +00271713 +00e787b3 +00f6a023 +01f67513 +00008067 +fe010113 +00c10693 +00112e23 +fb1ff0ef +00c12703 +00100793 +00a79533 +00072783 +01c12083 +00a7e7b3 +00f72023 +02010113 +00008067 +fe010113 +00912a23 +00452483 +00812c23 +00050413 +00855503 +00048593 +01212823 +01312623 +01412423 +01512223 +01612023 +00112e23 +b51ff0ef +00042983 +00a44a83 +fff00793 +00050a13 +00a989b3 +00f405a3 +00000913 +01f00b13 +03594c63 +00000493 +00845783 +08f4cc63 +01c12083 +01812403 +01412483 +01012903 +00c12983 +00812a03 +00412a83 +00012b03 +02010113 +00008067 +00048593 +000a0513 +b19ff0ef +00191713 +01270733 +00271793 +00c42703 +00f70733 +00470793 +00f72223 +00f72423 +00ab4e63 +012405a3 +0024d493 +00348493 +ffc4f493 +00190913 +f85ff06f +01f50513 +41f55793 +01f7f793 +00a787b3 +4057d793 +00279793 +01372023 +00f989b3 +fcdff06f +00442583 +00048513 +a81ff0ef +00042783 +00048613 +00000593 +00a78533 +00c42783 +00148493 +00478713 +00e52023 +0087a703 +00e52223 +0087a703 +00a72023 +00a7a423 +00040513 +e8dff0ef +f1dff06f +ff010113 +00050793 +00058513 +00060593 +00068613 +00112623 +000780e7 +320010ef +5a0010ef +00000513 +00008067 +ff010113 +00812423 +00050413 +04500513 +00112623 +00912223 +00058493 +000400e7 +00048593 +05200513 +000400e7 +00040313 +00812403 +00c12083 +00048593 +00412483 +05200513 +01010113 +00030067 +0005a783 +00178793 +00f5a023 +000027b7 +7147a303 +00030067 +fc010113 +02812c23 +03312623 +03412423 +03612023 +01a12823 +02112e23 +02912a23 +03212823 +03512223 +01712e23 +01812c23 +01912a23 +01b12623 +00050993 +00058a13 +00060d13 +00068b13 +00100413 +00e05463 +00070413 +00100793 +02000c93 +00fb1463 +03000c93 +3b9ad4b7 +00100913 +00a00a93 +00000c13 +9ff48493 +00200d93 +00148b93 +000c1463 +0ba4f263 +000b8593 +000d0513 +949ff0ef +000a0593 +03050513 +000980e7 +00190913 +00100c13 +000b8593 +000d0513 +971ff0ef +00050d13 +00a00593 +00048513 +919ff0ef +fffa8a93 +00100793 +00050493 +fafa96e3 +000a0593 +030d0513 +000980e7 +00300793 +41240433 +06fb0663 +03c12083 +03812403 +03412483 +03012903 +02c12983 +02812a03 +02412a83 +02012b03 +01c12b83 +01812c03 +01412c83 +01012d03 +00c12d83 +04010113 +00008067 +f95440e3 +f76deee3 +000a0593 +000c8513 +000980e7 +00190913 +f69ff06f +000a0593 +02000513 +000980e7 +fff40413 +fe8048e3 +f95ff06f +000027b7 +70a7aa23 +00008067 +fb010113 +04812423 +04912223 +05212023 +03312e23 +03412c23 +03512a23 +03912223 +03a12023 +01b12e23 +04112623 +03612823 +03712623 +03812423 +00050413 +00058493 +00060a93 +00068d13 +00000a13 +fff00913 +00000993 +00000c93 +80000db7 +000ac503 +04051063 +04c12083 +04812403 +04412483 +04012903 +03c12983 +03812a03 +03412a83 +03012b03 +02c12b83 +02812c03 +02412c83 +02012d03 +01c12d83 +05010113 +00008067 +000c9e63 +02500693 +36d50c63 +00048593 +000400e7 +001a8a93 +fa5ff06f +06400693 +12d50063 +06a6e263 +03900693 +02a6ea63 +03100693 +0ed57463 +02d00693 +34d50c63 +03000793 +0cf50063 +02500713 +02e51263 +00048593 +02500513 +000400e7 +1600006f +05800693 +1cd50063 +06300713 +30e50063 +00048593 +02500513 +000400e7 +00048593 +000ac503 +fd5ff06f +07000693 +16d50c63 +02a6e063 +06900693 +0ad50463 +06c00693 +08d50c63 +06800693 +f6d506e3 +fc5ff06f +07500693 +10d50863 +02a6ee63 +07300713 +fae518e3 +000d2c03 +004d0b13 +000c0b93 +000bc503 +26051a63 +00300793 +00f99863 +418b8bb3 +41790bb3 +27704863 +000b0d13 +0cc0006f +07800693 +12d50663 +07a00693 +fa9ff06f +00095e63 +28098a63 +fd050913 +f00992e3 +00200993 +efdff06f +fe0948e3 +00291693 +01268933 +00191913 +fd090913 +01250933 +fddff06f +001a0a13 +ed9ff06f +040a1263 +000d2603 +004d0d13 +02065063 +00048593 +02d00513 +00c12023 +000400e7 +00012603 +fff90913 +40c00633 +00090713 +00098693 +00048593 +00040513 +c7dff0ef +03c0006f +00100713 +faea0ee3 +007d0793 +ff87f713 +00072603 +00472683 +00870d13 +01b60733 +00c73733 +00d70733 +fa0700e3 +00048593 +00040513 +bddff0ef +00000c93 +e55ff06f +000a1863 +000d2603 +004d0d13 +f9dff06f +00100713 +feea08e3 +007d0793 +ff87f713 +00870d13 +00072603 +00472703 +fc0710e3 +800007b7 +fff7c793 +f6c7f8e3 +fb1ff06f +00048593 +03000513 +000400e7 +00048593 +07800513 +000400e7 +00800913 +00100993 +00100693 +0b46c263 +000d2783 +00012423 +004d0d13 +00f12223 +01000c13 +00000b93 +00012023 +01000893 +00412503 +00812583 +fff88b13 +002b1613 +01112623 +d0cff0ef +00f57513 +08051863 +00012783 +03000693 +00079863 +00c12883 +00100793 +08f89663 +00a68533 +01851513 +00048593 +41855513 +000400e7 +001b8b93 +040b1863 +00300693 +00000c93 +d6d996e3 +00191713 +41770bb3 +f17054e3 +00048593 +02000513 +000400e7 +fffb8b93 +fedff06f +007d0793 +ff87f693 +0006a783 +00868d13 +00f12223 +0046a783 +00f12423 +f55ff06f +01912023 +000b0893 +f59ff06f +00900793 +05700693 +f8a7e2e3 +03000693 +f7dff06f +fffc0793 +00f12623 +01894c63 +00100793 +00f99c63 +00048593 +03000513 +000400e7 +00c12c03 +fc1ff06f +00200793 +fef99ae3 +00048593 +02000513 +fe5ff06f +00048593 +001b8b93 +000400e7 +d7dff06f +00048593 +02000513 +000400e7 +fffb8b93 +d81ff06f +000d2503 +00048593 +004d0b13 +000400e7 +d71ff06f +00000a13 +fff00913 +00000993 +00100c93 +c85ff06f +00300993 +c7dff06f +00100993 +c75ff06f +fe010113 +00050613 +00001537 +00058693 +8ec50513 +00c10593 +00112e23 +00012623 +b9dff0ef +01c12083 +02010113 +00008067 +fc010113 +02b12223 +02410593 +00112e23 +02c12423 +02d12623 +02e12823 +02f12a23 +03012c23 +03112e23 +00b12623 +fa5ff0ef +01c12083 +04010113 +00008067 +00008067 +00800793 +3007a7f3 +00008067 +00100793 +00a79533 +30452573 +00008067 +00800793 +3007b7f3 +30405073 +34405073 +00008067 +ff010113 +00812423 +00912223 +00002437 +00112623 +00a00793 +00050493 +7a040413 +00f51c63 +00042503 +00d00593 +00452783 +0047a783 +000780e7 +00042503 +0ff4f593 +00452783 +0047a783 +000780e7 +00c12083 +00812403 +00048513 +00412483 +01010113 +00008067 +ff010113 +00812423 +00001437 +f5040513 +00112623 +1e4000ef +f5040513 +00812403 +00c12083 +01010113 +a85ff06f +00002537 +ff010113 +66c50513 +00112623 +3e0000ef +000027b7 +7aa7a023 +fb9ff0ef +00c12083 +00000513 +01010113 +00008067 +fe010113 +00912a23 +00112e23 +00812c23 +01212823 +01312623 +01412423 +00800493 +3004b4f3 +00002a37 +800007b7 +7a4a0a13 +0007a983 +000a2903 +00027437 +10040593 +41298533 +a88ff0ef +10040593 +a54ff0ef +01250533 +10040413 +00850433 +00aa2023 +413409b3 +3e700793 +0084f493 +0137c863 +0004e437 +20040413 +00850433 +800007b7 +0087a023 +3004a4f3 +01812403 +01c12083 +01412483 +01012903 +00c12983 +00812a03 +00100513 +02010113 +0380106f +800006b7 +0006a783 +00027737 +ff010113 +10070713 +00112623 +00e787b3 +00700513 +00f6a023 +e4dff0ef +00c12083 +00000513 +01010113 +00008067 +00008067 +00000513 +00008067 +00054783 +0005c703 +00e79463 +00079663 +40e78533 +00008067 +00150513 +00158593 +fe1ff06f +0ff5f693 +00050793 +0037f713 +04071463 +0ff5f593 +00859713 +00b765b3 +01059713 +00b765b3 +00c78333 +00078713 +00300813 +40e308b3 +03186a63 +00265713 +00271593 +00b787b3 +40b60633 +00c78633 +02c79463 +00008067 +fe060ee3 +00178793 +fed78fa3 +fff60613 +fa5ff06f +00470713 +feb72e23 +fc1ff06f +00178793 +fed78fa3 +fd1ff06f +fff00513 +00008067 +000027b7 +70a7ac23 +00008067 +00852703 +0026f793 +00b7e5b3 +00072503 +04059a63 +00100793 +00c79633 +00452783 +fea00513 +00f677b3 +04078063 +f7e6f793 +fdd00513 +02079a63 +0806f513 +00472783 +00050a63 +00f66633 +00c72223 +00000513 +00008067 +fff64613 +00f67633 +00c72223 +00008067 +fdd00513 +00008067 +00852783 +0007a503 +0047a783 +00052883 +00452803 +02059063 +00100713 +00c71733 +00e87833 +fea00513 +02080c63 +00068463 +00080693 +00800713 +30073773 +0008a603 +00877713 +00f647b3 +00d7c7b3 +0107f7b3 +00c7c7b3 +00f8a023 +30072773 +00000513 +00008067 +00852503 +00052703 +00452503 +00072783 +0007a783 +00a7c7b3 +00472503 +00a7f7b3 +02059863 +00c7d7b3 +0017f793 +00f6a023 +00100793 +00c797b3 +00472603 +00c7f7b3 +00079463 +fea00593 +00058513 +00008067 +00f6a023 +00000593 +ff1ff06f +00052703 +00852783 +00872703 +00e7a023 +000027b7 +68078793 +00f52223 +00000513 +00008067 +00159593 +2005e593 +00800793 +3007b7f3 +40000737 +0087f793 +00b72023 +4015d593 +00000013 +00000013 +fe0598e3 +3007a7f3 +00008067 +400007b7 +0007a783 +00000513 +00f58023 +00008067 +400007b7 +00100713 +00e7a023 +00000513 +00008067 +00251713 +000027b7 +00150513 +6b078793 +00251513 +ff010113 +00e78733 +00a787b3 +00812423 +00912223 +00072403 +0007a483 +00112623 +00946c63 +00c12083 +00812403 +00412483 +01010113 +00008067 +00042783 +00040513 +0047a783 +000780e7 +00050463 +00042223 +00c40413 +fcdff06f +ff010113 +000027b7 +00912223 +000024b7 +00812423 +00112623 +73478413 +01212023 +73478793 +77048493 +00941c63 +00050913 +00078413 +02941463 +00000413 +0440006f +00442703 +00070863 +00042703 +00072703 +02a70863 +00c40413 +fd1ff06f +00442783 +00079663 +00c40413 +fcdff06f +00042783 +00090513 +0007a583 +cb9ff0ef +fe0514e3 +00040513 +00c12083 +00812403 +00412483 +00012903 +01010113 +00008067 +00002537 +000037b7 +78850613 +8c478793 +40c78633 +00000593 +78850513 +c9dff06f +ff010113 +00200513 +00112623 +ecdff0ef +00002537 +6c450513 +a3dff0ef +00300513 +eb9ff0ef +07d000ef +ed5fe0ef +000037b7 +82878793 +00c7c703 +ffe77713 +00e78623 +00c12083 +01010113 +00008067 +f6010113 +08812c23 +000037b7 +00003437 +09312623 +6d078793 +89840993 +00f9a223 +01010793 +07000613 +00000593 +00078513 +08112e23 +08912a23 +09212823 +c11ff0ef +00100713 +00a9a423 +00000513 +00e10ea3 +e3dff0ef +00100513 +e35ff0ef +10100793 +00f11e23 +654000ef +000027b7 +70478793 +00003937 +00f12223 +000016b7 +00100793 +000035b7 +82890493 +00f12023 +00000713 +00000793 +00000893 +00000813 +48c68693 +40000613 +8d058593 +82890513 +0299a023 +6f4000ef +00d4c783 +89840413 +ffb7f713 +00e486a3 +01b7f793 +00079a63 +0184a783 +00079663 +82890513 +2f0000ef +000027b7 +70c78793 +00f12223 +00002537 +00100793 +000026b7 +000035b7 +7b850493 +00f12023 +00f00893 +00000813 +00000793 +00000713 +20c68693 +20000613 +cd058593 +7b850513 +684000ef +00d4c783 +00942623 +00800513 +ffb7f793 +00f486a3 +000037b7 +8b078793 +00f42c23 +00f42e23 +30053573 +00857513 +c01fe0ef +00452703 +00052783 +00f72023 +00e7a223 +00052023 +00052223 +00008067 +00d54783 +01f7f793 +00079863 +01852503 +00153513 +00008067 +00000513 +00008067 +ff010113 +00112623 +a89ff0ef +000027b7 +7ac7a783 +00c12083 +00003737 +00a78533 +8aa72423 +00000593 +00078513 +01010113 +2010006f +ff010113 +00812423 +00912223 +00112623 +01212023 +00058493 +00800413 +30043473 +000037b7 +00a00593 +00950513 +8a07a423 +c09fe0ef +000027b7 +00002937 +7aa92623 +7a97a423 +00847413 +f85ff0ef +30042473 +00c12083 +00812403 +00412483 +00012903 +01010113 +00008067 +ff010113 +00812423 +00912223 +00112623 +00050493 +00800413 +30043473 +f0dff0ef +00d4c783 +00847413 +ffd7f793 +00f486a3 +30042473 +00c12083 +00812403 +0004a423 +00412483 +01010113 +00008067 +000037b7 +8987a783 +00079663 +00058513 +ac9fe06f +0085f593 +3005a5f3 +00008067 +00003737 +89872703 +00071463 +aadfe06f +00857793 +3007a7f3 +00008067 +00800513 +30053573 +00857513 +fd9ff06f +00800793 +3007b7f3 +00003737 +8a072683 +00f6c703 +fff70713 +00e687a3 +0087f793 +3007a7f3 +00008067 +00052783 +00f51463 +00000793 +00078513 +00008067 +fe010113 +00812c23 +00003437 +00912a23 +00050493 +89840513 +02450513 +00112e23 +fcdff0ef +89840413 +00051463 +00c42503 +00842783 +02049a63 +00d7c703 +01f77713 +02071463 +00e7d683 +07f00713 +00d77e63 +02f42023 +01c12083 +01812403 +01412483 +02010113 +00008067 +00f50863 +00a12623 +e21ff0ef +00c12503 +02a42023 +fd9ff06f +ff010113 +00812423 +00112623 +00800413 +30043473 +000037b7 +8a07a703 +00100513 +00847413 +00f74783 +00178793 +00f707a3 +f51ff0ef +30042473 +00812403 +00c12083 +01010113 +ef1ff06f +ff010113 +00812423 +00112623 +00800413 +30043473 +00003737 +89870793 +0247a783 +000036b7 +8bc68693 +00847413 +89870713 +06d78063 +04078e63 +02872583 +00e50603 +00e78803 +05065063 +0047a703 +00f52023 +00e52223 +00a72023 +00a7a223 +00d54783 +0407e793 +00f506a3 +00000513 +ecdff0ef +30042473 +00c12083 +00812403 +01010113 +00008067 +00b78663 +0007a783 +fa079ae3 +02872783 +00d52023 +00f52223 +02872783 +00a7a023 +02a72423 +fb5ff06f +ff052783 +ff010113 +00812423 +01212023 +00112623 +00912223 +00050413 +fe850913 +02078663 +00800493 +3004b4f3 +00090513 +cb1ff0ef +ff544783 +0084f493 +ffd7f793 +fef40aa3 +3004a4f3 +fe042823 +ff544783 +00090513 +feb7f793 +fef40aa3 +ca1ff0ef +02050063 +00812403 +00c12083 +00412483 +00090513 +00012903 +01010113 +ed9ff06f +00c12083 +00812403 +00412483 +00012903 +01010113 +00008067 +ff010113 +00812423 +00912223 +00112623 +00050413 +00800493 +3004b4f3 +c2dff0ef +00003737 +89870793 +0247a783 +000036b7 +8bc68693 +0084f493 +89870713 +06d78663 +06078463 +02872583 +00e40603 +00e78503 +04a65663 +0047a683 +00f42023 +00d42223 +0086a023 +0087a223 +00d44783 +00872503 +0407e793 +40850533 +00f406a3 +00153513 +d75ff0ef +3004a4f3 +00c12083 +00812403 +00412483 +01010113 +00008067 +00b78663 +0007a783 +fa0794e3 +02872783 +00d42023 +00f42223 +02872783 +0087a023 +02872423 +fa9ff06f +000027b7 +7ac7a703 +000037b7 +89878793 +06070463 +0087a703 +07f00693 +00e75603 +04c6ec63 +000026b7 +00e70603 +7a86a683 +04d64463 +000026b7 +7306a683 +02d70e63 +01872683 +02069a63 +0107a683 +02d54063 +ff010113 +00070513 +00112623 +ee1ff0ef +00c12083 +01010113 +b59ff06f +40a686b3 +00d7a823 +00008067 +0007a823 +00008067 +ff010113 +00812423 +00912223 +00112623 +00050493 +00800413 +30043473 +00d54783 +00847413 +0407f793 +00078a63 +ad9ff0ef +00d4c783 +fbf7f793 +00f486a3 +000037b7 +8a07a503 +40950533 +00153513 +c65ff0ef +30042473 +00c12083 +00812403 +00412483 +01010113 +00008067 +000037b7 +89878793 +02478713 +02e7a223 +02e7a423 +00000593 +00000513 +af1ff06f +000037b7 +8a07a503 +00008067 +00d54783 +01f7f793 +00079863 +01852503 +00153513 +00008067 +00000513 +00008067 +000037b7 +8987a503 +00a03533 +00008067 +000037b7 +8a07a783 +00c7c503 +00157513 +00008067 +ff010113 +00812423 +00112623 +00912223 +00800413 +30043473 +00d54783 +00847413 +0047f713 +00071e63 +30042473 +00c12083 +00812403 +00412483 +01010113 +00008067 +ffb7f793 +00f506a3 +00050493 +f71ff0ef +00050663 +00048513 +c49ff0ef +00040593 +00812403 +00c12083 +00412483 +00003537 +8c450513 +01010113 +ad9ff06f +fe010113 +02012303 +00812c23 +00112e23 +00612023 +00050413 +975fe0ef +000037b7 +8a07a783 +01c12083 +0687a783 +06f42423 +01812403 +02010113 +00008067 +06052783 +ff010113 +00812423 +00112623 +00050413 +00078463 +000780e7 +00040513 +ee5ff0ef +02050463 +00040513 +e45ff0ef +00d44783 +00c12083 +0087e793 +00f406a3 +00812403 +01010113 +00008067 +00d44783 +0027f793 +00078663 +00040513 +9f1ff0ef +01842783 +fc0786e3 +01840513 +300000ef +fc1ff06f +fd010113 +000027b7 +03212023 +00002937 +02812423 +02912223 +02112623 +01312e23 +01412c23 +77078413 +77078493 +77090913 +03246c63 +a3dff0ef +00048413 +fff00993 +00002a37 +07246463 +02812403 +02c12083 +02412483 +02012903 +01c12983 +01812a03 +03010113 +ac9ff06f +02c42783 +00f12223 +02042783 +00f12023 +01442783 +01c42883 +01842803 +01042703 +00c42683 +00842603 +00442583 +00042503 +eb9ff0ef +00042783 +0487ae23 +03040413 +f89ff06f +02442503 +01350a63 +00042483 +00051a63 +00048513 +e15ff0ef +03040413 +f7dff06f +00a00593 +00950513 +cd4fe0ef +00150613 +94ca0593 +01848513 +134000ef +fddff06f +00d50623 +00c506a3 +00b50723 +000507a3 +00052c23 +00052e23 +00008067 +fd010113 +02112623 +00800593 +3005b5f3 +0085f593 +00b12623 +e6dff0ef +00c12583 +01c10513 +8f9ff0ef +02c12083 +03010113 +00008067 +000027b7 +7b07a783 +00079463 +a84ff06f +00000513 +00008067 +00052783 +02050263 +00002737 +72072703 +00e50c63 +00078a63 +0087a703 +00852683 +00d70733 +00e7a423 +00452703 +00f72023 +00e7a223 +00052023 +00052223 +00008067 +000027b7 +7b47c783 +ff010113 +00112623 +00812423 +00912223 +fff00513 +00079663 +80000537 +fff54513 +000027b7 +71c78793 +0007a403 +02f40463 +02040263 +00842483 +f69ff0ef +40a484b3 +00000513 +0004c863 +00842403 +f55ff0ef +40a40533 +000037b7 +8a87a783 +00078663 +00a7d463 +00078513 +00c12083 +00812403 +00412483 +01010113 +00008067 +fe010113 +00812c23 +00912a23 +00112e23 +00050413 +00c12623 +00b52623 +00800493 +3004b4f3 +f01ff0ef +00c12603 +0084f493 +00c04463 +00100613 +000027b7 +71c7a703 +00a60633 +00c42423 +71c78793 +00f70663 +0047a583 +02071063 +0047a703 +00f42023 +00e42223 +0047a703 +00872023 +0087a223 +02c0006f +00872603 +00842683 +04c6d863 +40d606b3 +00d72423 +00472683 +00e42023 +00d42223 +0086a023 +00872223 +0007a703 +00f70a63 +00e41863 +ed5ff0ef +00000593 +900ff0ef +3004a4f3 +01c12083 +01812403 +01412483 +02010113 +00008067 +40c686b3 +00d42423 +f8b702e3 +00072703 +f79ff06f +ff010113 +00812423 +00112623 +00800413 +30043473 +00052783 +00847413 +02078063 +e3dff0ef +00000513 +30042473 +00c12083 +00812403 +01010113 +00008067 +fea00513 +fe9ff06f +ff010113 +00112623 +00812423 +00800793 +3007b473 +e45ff0ef +00847793 +3007a7f3 +00c12083 +00812403 +01010113 +00008067 +fe010113 +00812c23 +00912a23 +00112e23 +00050493 +00b12623 +00800413 +30043473 +e09ff0ef +00847413 +00c12583 +00a4da63 +00100793 +00a7d663 +00048513 +820ff0ef +30042473 +01c12083 +01812403 +01412483 +02010113 +00008067 +fe010113 +00812c23 +00912a23 +00112e23 +01212823 +01312623 +01412423 +01512223 +00050493 +00800413 +991ff0ef +30043473 +000029b7 +00002a37 +00002937 +7a99a823 +00847413 +7b098993 +71ca0a13 +78890913 +00800a93 +000a2483 +0009a783 +00092683 +00492503 +01448c63 +00048a63 +0084a703 +06e7d063 +40f70733 +00e4a423 +00d786b3 +41f7d713 +00a70733 +00f6b7b3 +00e787b3 +00d92023 +00f92223 +0009a023 +d35ff0ef +00000593 +f61fe0ef +30042473 +01c12083 +01812403 +01412483 +01012903 +00c12983 +00812a03 +00412a83 +02010113 +00008067 +00d706b3 +41f75593 +00a585b3 +00e6b633 +00b60633 +40e787b3 +0004a423 +00048513 +00d92023 +00c92223 +00f9a023 +c95ff0ef +30042473 +00c4a783 +00048513 +000780e7 +300ab473 +00847413 +f3dff06f +ff010113 +00812423 +00112623 +00800413 +300437f3 +e49ff0ef +00a04463 +00100513 +00100593 +e69ff0ef +cedfe0ef +fe5ff06f +ff010113 +00812423 +00912223 +00002437 +000024b7 +00112623 +77040413 +77048493 +00946e63 +00c12083 +00812403 +00412483 +00000513 +01010113 +00008067 +01440793 +00040513 +00f42a23 +00f42c23 +ca4fe0ef +01c40413 +fcdff06f +00008067 +00000000 +00000580 +00000000 +00000580 +00000000 +00000580 +00000000 +00000580 +00000000 +00000580 +00000000 +00000580 +00000000 +00000580 +00000000 +00001010 +00002664 +000012e4 +00002724 +00002384 +00000fe0 +00000000 +00002674 +000010bc +00000000 +0000266c +00001350 +00000000 +00002384 +0000223c +00000000 +76726573 +00656369 +6c6c6548 +6f57206f +21646c72 +0a732520 +00000000 +00000458 +00000510 +00000510 +0000044c +00000458 +000004f8 +00000504 +000023d8 +000023f8 +00002414 +00002428 +00002434 +0000244c +6e6b6e75 +006e776f +65637845 +6f697470 +6163206e +20657375 +28207325 +0a296425 +00000000 +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +74736e49 +74637572 +206e6f69 +72646461 +20737365 +6173696d +6e67696c +00006465 +74736e49 +74637572 +206e6f69 +65636341 +66207373 +746c7561 +00000000 +656c6c49 +206c6167 +74736e69 +74637572 +006e6f69 +61657242 +696f706b +0000746e +64616f4c +64646120 +73736572 +73696d20 +67696c61 +0064656e +64616f4c +63636120 +20737365 +6c756166 +00000074 +2a2a2a2a +72654b20 +206c656e +6f6c6c41 +69746163 +46206e6f +756c6961 +20216572 +2a2a2a2a +0000000a +2a2a2a2a +654b202a +6c656e72 +504f4f20 +2a202153 +2a2a2a2a +0000000a +2a2a2a2a +654b202a +6c656e72 +6e615020 +20216369 +2a2a2a2a +00000a2a +2a2a2a2a +6b6e5520 +6e776f6e +74614620 +45206c61 +726f7272 +21642520 +2a2a2a20 +00000a2a +72727543 +20746e65 +65726874 +49206461 +203d2044 +460a7025 +746c7561 +20676e69 +74736e69 +74637572 +206e6f69 +72646461 +20737365 +7830203d +200a7825 +3a617220 +25783020 +67202078 +30203a70 +20782578 +3a707420 +25783020 +74202078 +30203a30 +0a782578 +31742020 +7830203a +20207825 +203a3274 +78257830 +33742020 +7830203a +20207825 +203a3474 +78257830 +7420200a +30203a35 +20782578 +3a367420 +25783020 +61202078 +30203a30 +20782578 +3a316120 +25783020 +20200a78 +203a3261 +78257830 +33612020 +7830203a +20207825 +203a3461 +78257830 +35612020 +7830203a +200a7825 +3a366120 +25783020 +61202078 +30203a37 +0a782578 +00000000 +00525349 +65737365 +6169746e +6874206c +64616572 +00000000 +61746146 +6166206c +20746c75 +25206e69 +53202173 +6e6e6970 +2e676e69 +000a2e2e +61746146 +6166206c +20746c75 +74206e69 +61657268 +70252064 +62412021 +6974726f +0a2e676e +00000000 +72757053 +73756f69 +746e6920 +75727265 +64207470 +63657465 +21646574 +51524920 +6425203a +0000000a +3044454c +00000000 +74726175 +00000030 +5f737973 +636f6c63 +0000006b +000011b8 +00001224 +00001288 +00000000 +00000000 +00000000 +00000000 +0000133c +00001308 +00000000 +00000000 +00000000 +00002734 +00002764 +00002770 +00002770 +00002770 +2a2a2a2a +6f42202a +6e69746f +655a2067 +72796870 +20534f20 +6870657a +762d7279 +34312e31 +342d312e +3763672d +36643263 +33313532 +2a206566 +2a2a2a2a +0000000a +6e69616d +00000000 +656c6469 +00000000 +00000898 +000011a4 +0000271c +0000271c +40000000 +00000001 +fffffff5 +000027b8 +00002308 +00000000 +00000000 +000022d8 +00000000 +00002798 +000022fc +0000269c +00000000 +000022e4 +00000000 +00000000 +000022f0 +00000000 +00000000 +00002770 +00002770 +00000000 +00000000 +0000000f +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/pythondata_cpu_serv/verilog/sw/zephyr_phil.hex b/pythondata_cpu_serv/verilog/sw/zephyr_phil.hex new file mode 100644 index 0000000..eab86ee --- /dev/null +++ b/pythondata_cpu_serv/verilog/sw/zephyr_phil.hex @@ -0,0 +1,4096 @@ +00000297 +01028293 +30529073 +1390006f +fb010113 +00112023 +00312223 +00412423 +00512623 +00612823 +00712a23 +01c12c23 +01d12e23 +03e12023 +03f12223 +02a12423 +02b12623 +02c12823 +02d12a23 +02e12c23 +02f12e23 +05012023 +05112223 +341022f3 +04512423 +300022f3 +04512623 +1f0000ef +00000313 +02051e63 +342022f3 +800003b7 +fff38393 +0072f2b3 +00b00313 +00628a63 +00010513 +00000097 +13408093 +7e00006f +04812283 +00428293 +04512423 +0900006f +00010293 +00004397 +1a438393 +0043a103 +ff010113 +00512023 +0003ae03 +001e0e13 +01c3a023 +00030863 +00000097 +03c08093 +0290006f +34202573 +800002b7 +fff28293 +00557533 +158000ef +00003297 +65028293 +00351513 +00a282b3 +0002a503 +0042a303 +000300e7 +00004317 +14430313 +00032383 +fff38393 +00732023 +00012283 +00028113 +00832383 +02032e03 +087e0863 +00004297 +11c28293 +0082a303 +02832623 +02932823 +03232a23 +03332c23 +03432e23 +05532023 +05632223 +05732423 +05832623 +05932823 +05a32a23 +05b32c23 +02232423 +00004397 +c5838393 +0003ae03 +07c32623 +0202a303 +0062a423 +02832103 +02c32403 +03032483 +03432903 +03832983 +03c32a03 +04032a83 +04432b03 +04832b83 +04c32c03 +05032c83 +05432d03 +05832d83 +04812283 +34129073 +04c12283 +30029073 +00012083 +00412183 +00812203 +00c12283 +01012303 +01412383 +01812e03 +01c12e83 +02012f03 +02412f83 +02812503 +02c12583 +03012603 +03412683 +03812703 +03c12783 +04012803 +04412883 +05010113 +30200073 +00000073 +00004297 +02c28293 +0082a303 +06c32383 +00857513 +300522f3 +00038513 +00008067 +00100313 +00a312b3 +3442b373 +00008067 +342022f3 +80000337 +0062f2b3 +00000513 +00028463 +00150513 +00008067 +02060063 +02000793 +40c787b3 +00f04c63 +fe060513 +00000713 +00a5d533 +00070593 +00008067 +00c5d733 +00c55533 +00f595b3 +00b56533 +fe9ff06f +00050613 +00000513 +0015f693 +00068463 +00c50533 +0015d593 +00161613 +fe0596e3 +00008067 +06054063 +0605c663 +00058613 +00050593 +fff00513 +02060c63 +00100693 +00b67a63 +00c05863 +00161613 +00169693 +feb66ae3 +00000513 +00c5e663 +40c585b3 +00d56533 +0016d693 +00165613 +fe0696e3 +00008067 +00008293 +fb5ff0ef +00058513 +00028067 +40a00533 +0005d863 +40b005b3 +f9dff06f +40b005b3 +00008293 +f91ff0ef +40a00533 +00028067 +00008293 +0005ca63 +00054c63 +f79ff0ef +00058513 +00028067 +40b005b3 +fe0558e3 +40a00533 +f61ff0ef +40b00533 +00028067 +fe010113 +00112e23 +00812c23 +00912a23 +00060413 +00058493 +01212823 +00050913 +3bd020ef +269020ef +00a12623 +00004537 +00100613 +00190593 +9b450513 +089010ef +00c12703 +06074263 +00004637 +000046b7 +9b060613 +9d868693 +00004537 +00090593 +9c050513 +061010ef +06040063 +3e700793 +0487d663 +000045b7 +a3058593 +00040613 +00048513 +041010ef +01812403 +01c12083 +01412483 +01012903 +00004537 +b3050513 +02010113 +0210106f +00004637 +000046b7 +9ac60613 +a3068693 +fa1ff06f +000045b7 +9d858593 +fb9ff06f +000045b7 +a3058593 +00048513 +7f0010ef +fb1ff06f +fd010113 +02912223 +01412c23 +02112623 +02812423 +03212023 +01312e23 +01512a23 +01612823 +01712623 +01812423 +01912223 +00500793 +00050493 +00150a13 +10f50e63 +000037b7 +7c478793 +00251713 +00e78733 +00072903 +002a1713 +00e787b3 +0007a983 +00004cb7 +00004c37 +00004bb7 +00004b37 +00004ab7 +00000613 +934c8593 +00048513 +ea5ff0ef +fff00593 +00090513 +689010ef +00000613 +94cc0593 +00048513 +e89ff0ef +fff00593 +00098513 +66d010ef +184030ef +06400593 +dc5ff0ef +000a0593 +d91ff0ef +01f57513 +00150513 +00151413 +00a40433 +00341413 +00a40433 +00040613 +964b8593 +00048513 +e41ff0ef +00040513 +151020ef +00098513 +76d010ef +00000613 +97cb0593 +00048513 +e21ff0ef +00090513 +755010ef +120030ef +06400593 +d61ff0ef +000a0593 +d2dff0ef +01f57513 +00150513 +00151413 +00a40433 +00341413 +00a40433 +00040613 +00048513 +994a8593 +dddff0ef +00040513 +0ed020ef +f21ff06f +00004937 +e6090993 +06498993 +e6090913 +ef9ff06f +00003637 +000035b7 +00003537 +fc010113 +7dc60613 +7e458593 +7ec50513 +02112e23 +02812c23 +02912a23 +03212823 +03312623 +03412423 +03512223 +03612023 +01712e23 +63c010ef +00001537 +00000593 +38850513 +004020ef +00004537 +e6050413 +e6050513 +535010ef +01440513 +52d010ef +02840513 +525010ef +03c40513 +51d010ef +05040513 +515010ef +06440513 +00004937 +00004437 +505010ef +ed840413 +29090913 +00000493 +00300a93 +fff00b93 +00400b13 +00000a37 +00600993 +409a88b3 +00048713 +00090593 +00000813 +00000793 +464a0693 +30000613 +00040513 +01712223 +01612023 +1c1020ef +00040513 +00148493 +0fd020ef +07040413 +30090913 +fd3490e3 +03c12083 +03812403 +03412483 +03012903 +02c12983 +02812a03 +02412a83 +02012b03 +01c12b83 +04010113 +00008067 +ff010113 +00112623 +00812423 +00600793 +02f50463 +089020ef +02050463 +081020ef +04051663 +000045b7 +c8c58593 +00004537 +ca050513 +524010ef +560010ef +ffdff06f +06d020ef +fc051ce3 +00004437 +25840413 +00842583 +00004537 +cc050513 +4fc010ef +00842503 +309020ef +fd1ff06f +000045b7 +c8858593 +fb9ff06f +fb010113 +04812423 +04912223 +04112623 +00600793 +00050493 +00058413 +0ea7e063 +00004737 +00251793 +9dc70713 +00e787b3 +0007a783 +00078067 +00004537 +b0c50513 +4a0010ef +7b4020ef +04442783 +01042883 +00c42803 +02f12823 +04042783 +00442703 +00042683 +02f12623 +03c42783 +04842603 +00050593 +02f12423 +03842783 +00004537 +b9050513 +02f12223 +03442783 +02f12023 +03042783 +00f12e23 +02c42783 +00f12c23 +02842783 +00f12a23 +02442783 +00f12823 +02042783 +00f12623 +01c42783 +00f12423 +01842783 +00f12223 +01442783 +00f12023 +00842783 +40c010ef +00040593 +00048513 +ea9ff0ef +00004537 +b3450513 +f55ff06f +00004537 +b5050513 +f49ff06f +00004537 +00048593 +b6c50513 +3d8010ef +f39ff06f +ff010113 +00812423 +00112623 +00050413 +34202673 +00161613 +00165613 +00500793 +02c7e863 +00004737 +00261793 +9f870713 +00f707b3 +0007a583 +00004537 +a1850513 +390010ef +00040593 +00000513 +ea5ff0ef +000045b7 +a1058593 +fe1ff06f +ff010113 +00112623 +342025f3 +00004537 +00159593 +0015d593 +ce850513 +358010ef +000045b7 +a3458593 +00400513 +e69ff0ef +000047b7 +e3878793 +0007a703 +00070c63 +0007a303 +0007a023 +000047b7 +e3c7a503 +00030067 +00008067 +ff010113 +00112623 +06d010ef +36c010ef +0d1010ef +00005117 +14c10113 +000012b7 +80028293 +00510133 +fd9ff0ef +4850006f +fd010113 +01312e23 +00068993 +03012683 +02812423 +03212023 +00058413 +00060913 +00088593 +00400613 +02912223 +02112623 +00050493 +00e12623 +00f12423 +01012223 +0a5020ef +00812783 +fb090593 +00b405b3 +0404ae23 +0604a023 +ff05f593 +02f5a823 +000027b7 +00c12703 +00412803 +88078793 +04f5a623 +000017b7 +02c12083 +02812403 +95c78793 +0335a423 +02e5a623 +0305aa23 +04f5a423 +02b4a423 +02012903 +02412483 +01c12983 +03010113 +00008067 +00159793 +00b787b3 +00279713 +00c52783 +00e787b3 +00b50703 +00b75463 +0007a783 +41f65713 +01f77713 +00c70733 +40575713 +00271713 +00e787b3 +00f6a023 +01f67513 +00008067 +fe010113 +00c10693 +00112e23 +fb1ff0ef +00c12703 +00100793 +00a79533 +00072783 +01c12083 +00a7e7b3 +00f72023 +02010113 +00008067 +fe010113 +00912a23 +00452483 +00812c23 +00050413 +00855503 +00048593 +01212823 +01312623 +01412423 +01512223 +01612023 +00112e23 +ff8ff0ef +00042983 +00a44a83 +fff00793 +00050a13 +00a989b3 +00f405a3 +00000913 +01f00b13 +03594c63 +00000493 +00845783 +08f4cc63 +01c12083 +01812403 +01412483 +01012903 +00c12983 +00812a03 +00412a83 +00012b03 +02010113 +00008067 +00048593 +000a0513 +fc0ff0ef +00191713 +01270733 +00271793 +00c42703 +00f70733 +00470793 +00f72223 +00f72423 +00ab4e63 +012405a3 +0024d493 +00348493 +ffc4f493 +00190913 +f85ff06f +01f50513 +41f55793 +01f7f793 +00a787b3 +4057d793 +00279793 +01372023 +00f989b3 +fcdff06f +00442583 +00048513 +f28ff0ef +00042783 +00048613 +00000593 +00a78533 +00c42783 +00148493 +00478713 +00e52023 +0087a703 +00e52223 +0087a703 +00a72023 +00a7a423 +00040513 +e8dff0ef +f1dff06f +00058663 +00c52223 +00008067 +00052783 +0017f793 +00f66633 +00c52023 +00008067 +00052783 +fe010113 +00812c23 +00912a23 +01212823 +01312623 +00112e23 +00050993 +00058913 +00f62023 +00060413 +00100493 +00042583 +03259263 +01c12083 +01812403 +00048513 +01012903 +01412483 +00c12983 +02010113 +00008067 +0049a783 +00090513 +000780e7 +00042783 +00051e63 +0047a783 +00440413 +fc0782e3 +00148493 +00f42023 +fb1ff06f +0007a783 +ffe7f793 +fe5ff06f +00259793 +fd010113 +ff878793 +01612823 +00f50b33 +03212023 +000b2903 +00478793 +02912223 +00f504b3 +02812423 +00492783 +0004a403 +01412c23 +01712623 +40f40a33 +02112623 +01312e23 +01512a23 +001a3b93 +08f41c63 +00442a83 +01403a33 +08f40c63 +00442983 +00200793 +00b7de63 +ffcb2503 +00040613 +00452583 +412585b3 +0015b593 +ed1ff0ef +000a8613 +000b8593 +00040513 +ec1ff0ef +00090613 +000a0593 +00040513 +eb1ff0ef +00098613 +000b8593 +00090513 +ea1ff0ef +02c12083 +008b2023 +02812403 +0124a023 +01c12983 +02412483 +02012903 +01812a03 +01412a83 +01012b03 +00c12b83 +03010113 +00008067 +00042a83 +ffeafa93 +f69ff06f +00042983 +ffe9f993 +f69ff06f +0085a783 +0005a703 +00178793 +00279693 +00f5a423 +00d70733 +00a72023 +0045a703 +00100693 +00f707b3 +00078023 +00052503 +0085a783 +0005a703 +ffe57513 +00051a63 +00279793 +00f707b3 +0007a503 +00008067 +00178793 +00279613 +00f5a423 +00c70733 +00a72023 +0045a703 +00f707b3 +00d78023 +fbdff06f +fd010113 +01712623 +40000bb7 +01312e23 +01612823 +01812423 +01a12023 +02112623 +02812423 +02912223 +03212023 +01412c23 +01512a23 +01912223 +00050d13 +00058993 +00060b13 +00100c13 +fffb8b93 +0f3c5863 +01798a33 +002a1a13 +014d0a33 +ffca2483 +000a2903 +0044ac83 +41990ab3 +001aba93 +000c8413 +01991663 +0004a403 +ffe47413 +00042783 +0017f793 +04079063 +00098593 +008a2023 +000d0513 +df5ff0ef +0004a783 +00198993 +ffe7f793 +00f4a023 +00042783 +000a2483 +0017e793 +00f42023 +012a2223 +07990463 +0044a403 +00042a03 +00442703 +ffea7a13 +000a0863 +000a2783 +0017f793 +14078463 +00070863 +00072783 +0017f793 +08078863 +01691a63 +00000613 +000a8593 +00048513 +cd9ff0ef +00042783 +ffe7f793 +00f42023 +0004a783 +0017f713 +00070c63 +fff98993 +f29ff06f +0004a403 +ffe47413 +f99ff06f +0017e793 +00f4a023 +02c12083 +02812403 +02412483 +02012903 +01c12983 +01812a03 +01412a83 +01012b03 +00c12b83 +00812c03 +00412c83 +00012d03 +03010113 +00008067 +00042783 +ffe7f793 +1080006f +000a0793 +0b990863 +00070793 +0007a683 +0016f693 +0a069263 +0004a703 +00042683 +00098593 +00177713 +ffe6f693 +00d76733 +00e42023 +0004a703 +000d0513 +00176713 +00e4a023 +0007a703 +00176713 +00e7a023 +00299793 +00fd07b3 +fe87ae23 +cb1ff0ef +f5691ee3 +02812403 +02c12083 +02012903 +01c12983 +01812a03 +01012b03 +00c12b83 +00812c03 +00412c83 +00012d03 +000a8593 +00048513 +01412a83 +02412483 +00000613 +03010113 +bb9ff06f +000a0793 +f79900e3 +00070793 +f4079ce3 +01991463 +00070a13 +00299b93 +ffcb8b93 +017d0bb3 +008ba023 +014ba223 +00198593 +000d0513 +c31ff0ef +00042783 +ffe7f793 +00f42023 +000a2783 +000ba403 +0017e793 +00fa2023 +ef990ce3 +00442783 +012ba023 +f11ff06f +00052503 +00050863 +00058c63 +00452783 +00079463 +00008067 +00078513 +fe9ff06f +00052783 +ffe7f793 +fe9ff06f +fd010113 +02812423 +02912223 +01312e23 +02112623 +03212023 +01412c23 +01512a23 +01612823 +01712623 +03010413 +0005a783 +0005a223 +00050993 +0017f793 +00f5a023 +00052783 +00058493 +04079663 +00b9a023 +00100793 +00f52423 +0005a783 +0017e793 +00f5a023 +fd040113 +02c12083 +02812403 +02412483 +02012903 +01c12983 +01812a03 +01412a83 +01012b03 +00c12b83 +03010113 +00008067 +00852783 +00010a93 +00279793 +01378793 +ff07f793 +40f10133 +00010a13 +000a0613 +a91ff0ef +00251793 +00fa0933 +ffc92b83 +0049a783 +00050b13 +000b8593 +00048513 +000780e7 +00154593 +00048613 +000b8513 +0ff5f593 +a3dff0ef +0004a783 +001b0b13 +00992023 +ffe7f793 +00f4a023 +000b0b93 +00090793 +00100813 +01784a63 +000a2703 +00072783 +0017e793 +0cc0006f +ffc7a603 +ffc78913 +00062703 +00177713 +0a071e63 +ff87a583 +ff878493 +0045a703 +00070693 +00e61663 +0005a683 +ffe6f693 +04068063 +0006a503 +00048793 +00157513 +02051863 +0005a703 +ffeb8b93 +ffe77713 +00e5a023 +00062703 +00176713 +00e62023 +0006a703 +00176713 +00e6a023 +f81ff06f +002b9793 +00fa07b3 +ffc7a783 +00462683 +40e60733 +00173713 +40d787b3 +0017b793 +00f70863 +000b8593 +000a0513 +a19ff0ef +fffb8593 +000a0513 +a0dff0ef +0004a703 +00072783 +0017e793 +00f72023 +00092703 +00072783 +ffe7f793 +00f72023 +0089a783 +0167d463 +0169a423 +000a2783 +00f9a023 +000a8113 +e61ff06f +fd010113 +02812423 +02912223 +01412c23 +01612823 +01712623 +01812423 +02112623 +03212023 +01312e23 +01512a23 +01912223 +03010413 +00852783 +00010b93 +00050b13 +00279793 +01378793 +ff07f793 +40f10133 +00010a13 +000a0613 +00058493 +8e1ff0ef +00251c13 +018a0c33 +ffcc2783 +10979263 +0004a903 +00050993 +ffe97913 +0c090463 +0044a783 +0c078063 +00100793 +00000513 +0137d463 +ff8c2503 +012c2023 +00198713 +00492783 +00271a93 +00070993 +015a0ab3 +0e079e63 +ff8aac83 +10050263 +00452583 +00090613 +409585b3 +0015b593 +851ff0ef +0f949a63 +00092703 +0004a783 +ffe77713 +0017f793 +00e7e7b3 +00f4a023 +00092783 +0017f793 +00f4e7b3 +00f92023 +0044a783 +00f92223 +ffcaa703 +ffcc2783 +0004a223 +feec2e23 +fefaae23 +0004a683 +00092703 +ffe6f793 +00177713 +00f76733 +00e4a023 +00092783 +0016f693 +ffe7f793 +00d7e7b3 +00f92023 +0004a783 +ffe7f913 +00091463 +0044a903 +00100713 +0b374c63 +012b2023 +0a090463 +00092783 +0017e793 +00f92023 +000b8113 +fd040113 +02c12083 +02812403 +02412483 +02012903 +01c12983 +01812a03 +01412a83 +01012b03 +00c12b83 +00812c03 +00412c83 +03010113 +00008067 +00faa023 +00170713 +00078913 +ee9ff06f +012b2023 +f11ff06f +004ca583 +00048613 +000c8513 +412585b3 +0015b593 +f44ff0ef +0004a703 +00092683 +00177793 +ffe6f693 +00d7e7b3 +00f4a023 +00092783 +ffe77713 +0017f793 +00e7e7b3 +ef5ff06f +000b2423 +f65ff06f +00299a93 +015a0ab3 +ff8aa503 +02091863 +0017f793 +00048613 +06079463 +00452583 +00000613 +409585b3 +0015b593 +ee0ff0ef +000a2783 +00fb2023 +f29ff06f +00452583 +00090613 +409585b3 +0015b593 +ec0ff0ef +0004a783 +0017f793 +00078863 +00092783 +0017f793 +00079a63 +00092783 +0017e793 +00f92023 +fbdff06f +ff2aae23 +00000613 +00098593 +000a0513 +8a9ff0ef +fa5ff06f +00052503 +00058793 +00051663 +00000513 +00008067 +0085a683 +fff00713 +00e69463 +80dff06f +0005a603 +00269713 +00e60733 +00072503 +00452503 +fe0514e3 +0045a583 +00d58533 +00054503 +00050c63 +fff68693 +00d7a423 +ffc72503 +00008067 +00e7a423 +0087a683 +fff68713 +00d05863 +00d586b3 +0006c683 +fe0684e3 +00e7a423 +f80748e3 +00271713 +00e60733 +00072503 +00008067 +ff010113 +00050793 +00058513 +00060593 +00068613 +00112623 +000780e7 +169010ef +461010ef +00000513 +00008067 +ff010113 +00812423 +00050413 +04500513 +00112623 +00912223 +00058493 +000400e7 +00048593 +05200513 +000400e7 +00040313 +00812403 +00c12083 +00048593 +00412483 +05200513 +01010113 +00030067 +0005a783 +00178793 +00f5a023 +000047b7 +dc07a303 +00030067 +fc010113 +02812c23 +03312623 +03412423 +03612023 +01a12823 +02112e23 +02912a23 +03212823 +03512223 +01712e23 +01812c23 +01912a23 +01b12623 +00050993 +00058a13 +00060d13 +00068b13 +00100413 +00e05463 +00070413 +00100793 +02000c93 +00fb1463 +03000c93 +3b9ad4b7 +00100913 +00a00a93 +00000c13 +9ff48493 +00200d93 +00148b93 +000c1463 +0ba4f263 +000b8593 +000d0513 +bddfe0ef +000a0593 +03050513 +000980e7 +00190913 +00100c13 +000b8593 +000d0513 +c05fe0ef +00050d13 +00a00593 +00048513 +badfe0ef +fffa8a93 +00100793 +00050493 +fafa96e3 +000a0593 +030d0513 +000980e7 +00300793 +41240433 +06fb0663 +03c12083 +03812403 +03412483 +03012903 +02c12983 +02812a03 +02412a83 +02012b03 +01c12b83 +01812c03 +01412c83 +01012d03 +00c12d83 +04010113 +00008067 +f95440e3 +f76deee3 +000a0593 +000c8513 +000980e7 +00190913 +f69ff06f +000a0593 +02000513 +000980e7 +fff40413 +fe8048e3 +f95ff06f +000047b7 +dca7a023 +00008067 +fb010113 +04812423 +04912223 +05212023 +03312e23 +03412c23 +03512a23 +03912223 +03a12023 +01b12e23 +04112623 +03612823 +03712623 +03812423 +00050413 +00058493 +00060a93 +00068d13 +00000a13 +fff00913 +00000993 +00000c93 +80000db7 +000ac503 +04051063 +04c12083 +04812403 +04412483 +04012903 +03c12983 +03812a03 +03412a83 +03012b03 +02c12b83 +02812c03 +02412c83 +02012d03 +01c12d83 +05010113 +00008067 +000c9e63 +02500693 +36d50c63 +00048593 +000400e7 +001a8a93 +fa5ff06f +06400693 +12d50063 +06a6e263 +03900693 +02a6ea63 +03100693 +0ed57463 +02d00693 +34d50c63 +03000793 +0cf50063 +02500713 +02e51263 +00048593 +02500513 +000400e7 +1600006f +05800693 +1cd50063 +06300713 +30e50063 +00048593 +02500513 +000400e7 +00048593 +000ac503 +fd5ff06f +07000693 +16d50c63 +02a6e063 +06900693 +0ad50463 +06c00693 +08d50c63 +06800693 +f6d506e3 +fc5ff06f +07500693 +10d50863 +02a6ee63 +07300713 +fae518e3 +000d2c03 +004d0b13 +000c0b93 +000bc503 +26051a63 +00300793 +00f99863 +418b8bb3 +41790bb3 +27704863 +000b0d13 +0cc0006f +07800693 +12d50663 +07a00693 +fa9ff06f +00095e63 +28098a63 +fd050913 +f00992e3 +00200993 +efdff06f +fe0948e3 +00291693 +01268933 +00191913 +fd090913 +01250933 +fddff06f +001a0a13 +ed9ff06f +040a1263 +000d2603 +004d0d13 +02065063 +00048593 +02d00513 +00c12023 +000400e7 +00012603 +fff90913 +40c00633 +00090713 +00098693 +00048593 +00040513 +c7dff0ef +03c0006f +00100713 +faea0ee3 +007d0793 +ff87f713 +00072603 +00472683 +00870d13 +01b60733 +00c73733 +00d70733 +fa0700e3 +00048593 +00040513 +bddff0ef +00000c93 +e55ff06f +000a1863 +000d2603 +004d0d13 +f9dff06f +00100713 +feea08e3 +007d0793 +ff87f713 +00870d13 +00072603 +00472703 +fc0710e3 +800007b7 +fff7c793 +f6c7f8e3 +fb1ff06f +00048593 +03000513 +000400e7 +00048593 +07800513 +000400e7 +00800913 +00100993 +00100693 +0b46c263 +000d2783 +00012423 +004d0d13 +00f12223 +01000c13 +00000b93 +00012023 +01000893 +00412503 +00812583 +fff88b13 +002b1613 +01112623 +fa0fe0ef +00f57513 +08051863 +00012783 +03000693 +00079863 +00c12883 +00100793 +08f89663 +00a68533 +01851513 +00048593 +41855513 +000400e7 +001b8b93 +040b1863 +00300693 +00000c93 +d6d996e3 +00191713 +41770bb3 +f17054e3 +00048593 +02000513 +000400e7 +fffb8b93 +fedff06f +007d0793 +ff87f693 +0006a783 +00868d13 +00f12223 +0046a783 +00f12423 +f55ff06f +01912023 +000b0893 +f59ff06f +00900793 +05700693 +f8a7e2e3 +03000693 +f7dff06f +fffc0793 +00f12623 +01894c63 +00100793 +00f99c63 +00048593 +03000513 +000400e7 +00c12c03 +fc1ff06f +00200793 +fef99ae3 +00048593 +02000513 +fe5ff06f +00048593 +001b8b93 +000400e7 +d7dff06f +00048593 +02000513 +000400e7 +fffb8b93 +d81ff06f +000d2503 +00048593 +004d0b13 +000400e7 +d71ff06f +00000a13 +fff00913 +00000993 +00100c93 +c85ff06f +00300993 +c7dff06f +00100993 +c75ff06f +fe010113 +00050613 +00001537 +00058693 +65850513 +00c10593 +00112e23 +00012623 +b9dff0ef +01c12083 +02010113 +00008067 +fc010113 +02b12223 +02410593 +00112e23 +02c12423 +02d12623 +02e12823 +02f12a23 +03012c23 +03112e23 +00b12623 +fa5ff0ef +01c12083 +04010113 +00008067 +00008067 +00800793 +3007a7f3 +00008067 +00100793 +00a79533 +30452573 +00008067 +00800793 +3007b7f3 +30405073 +34405073 +00008067 +ff010113 +00812423 +00912223 +00004437 +00112623 +00a00793 +00050493 +e4840413 +00f51c63 +00042503 +00d00593 +00452783 +0047a783 +000780e7 +00042503 +0ff4f593 +00452783 +0047a783 +000780e7 +00c12083 +00812403 +00048513 +00412483 +01010113 +00008067 +00002537 +cbc50513 +aa5ff06f +00004537 +ff010113 +d1850513 +00112623 +3cc000ef +000047b7 +e4a7a423 +fd9ff0ef +00c12083 +00000513 +01010113 +00008067 +fe010113 +00912a23 +00112e23 +00812c23 +01212823 +01312623 +01412423 +00800493 +3004b4f3 +00004a37 +800007b7 +e4ca0a13 +0007a983 +000a2903 +00027437 +10040593 +41298533 +d3cfe0ef +10040593 +d08fe0ef +01250533 +10040413 +00850433 +00aa2023 +413409b3 +3e700793 +0084f493 +0137c863 +0004e437 +20040413 +00850433 +800007b7 +0087a023 +3004a4f3 +01812403 +01c12083 +01412483 +01012903 +00c12983 +00812a03 +00100513 +02010113 +7180106f +800006b7 +0006a783 +00027737 +ff010113 +10070713 +00112623 +00e787b3 +00700513 +00f6a023 +e6dff0ef +00c12083 +00000513 +01010113 +00008067 +00008067 +00000513 +00008067 +00054783 +0005c703 +00e79463 +00079663 +40e78533 +00008067 +00150513 +00158593 +fe1ff06f +0ff5f693 +00050793 +0037f713 +04071463 +0ff5f593 +00859713 +00b765b3 +01059713 +00b765b3 +00c78333 +00078713 +00300813 +40e308b3 +03186a63 +00265713 +00271593 +00b787b3 +40b60633 +00c78633 +02c79463 +00008067 +fe060ee3 +00178793 +fed78fa3 +fff60613 +fa5ff06f +00470713 +feb72e23 +fc1ff06f +00178793 +fed78fa3 +fd1ff06f +00852703 +0026f793 +00b7e5b3 +00072503 +04059a63 +00100793 +00c79633 +00452783 +fea00513 +00f677b3 +04078063 +f7e6f793 +fdd00513 +02079a63 +0806f513 +00472783 +00050a63 +00f66633 +00c72223 +00000513 +00008067 +fff64613 +00f67633 +00c72223 +00008067 +fdd00513 +00008067 +00852783 +0007a503 +0047a783 +00052883 +00452803 +02059063 +00100713 +00c71733 +00e87833 +fea00513 +02080c63 +00068463 +00080693 +00800713 +30073773 +0008a603 +00877713 +00f647b3 +00d7c7b3 +0107f7b3 +00c7c7b3 +00f8a023 +30072773 +00000513 +00008067 +00852503 +00052703 +00452503 +00072783 +0007a783 +00a7c7b3 +00472503 +00a7f7b3 +02059863 +00c7d7b3 +0017f793 +00f6a023 +00100793 +00c797b3 +00472603 +00c7f7b3 +00079463 +fea00593 +00058513 +00008067 +00f6a023 +00000593 +ff1ff06f +00052703 +00852783 +00872703 +00e7a023 +000047b7 +d2c78793 +00f52223 +00000513 +00008067 +00159593 +2005e593 +00800793 +3007b7f3 +40000737 +0087f793 +00b72023 +4015d593 +00000013 +00000013 +fe0598e3 +3007a7f3 +00008067 +400007b7 +0007a783 +00000513 +00f58023 +00008067 +400007b7 +00100713 +00e7a023 +00000513 +00008067 +00251713 +000047b7 +00150513 +d5c78793 +00251513 +ff010113 +00e78733 +00a787b3 +00812423 +00912223 +00072403 +0007a483 +00112623 +00946c63 +00c12083 +00812403 +00412483 +01010113 +00008067 +00042783 +00040513 +0047a783 +000780e7 +00050463 +00042223 +00c40413 +fcdff06f +ff010113 +000047b7 +00912223 +000044b7 +00812423 +00112623 +ddc78413 +01212023 +ddc78793 +e1848493 +00941c63 +00050913 +00078413 +02941463 +00000413 +0440006f +00442703 +00070863 +00042703 +00072703 +02a70863 +00c40413 +fd1ff06f +00442783 +00079663 +00c40413 +fcdff06f +00042783 +00090513 +0007a583 +ccdff0ef +fe0514e3 +00040513 +00c12083 +00812403 +00412483 +00012903 +01010113 +00008067 +00004537 +000047b7 +e3050613 +28c78793 +40c78633 +00000593 +e3050513 +cb1ff06f +ff010113 +00200513 +00112623 +ecdff0ef +00004537 +d7050513 +a71ff0ef +00300513 +eb9ff0ef +771000ef +be4fe0ef +000047b7 +1e878793 +00c7c703 +ffe77713 +00e78623 +00c12083 +01010113 +00008067 +f6010113 +08812c23 +000067b7 +00004437 +09312623 +29078793 +25840993 +00f9a223 +01010793 +07000613 +00000593 +00078513 +08112e23 +08912a23 +09212823 +c25ff0ef +00100713 +00a9a423 +00000513 +00e10ea3 +e3dff0ef +00100513 +e35ff0ef +10100793 +00f11e23 +375000ef +000047b7 +db078793 +00004937 +00f12223 +000026b7 +00100793 +000055b7 +1e890493 +00f12023 +00000713 +00000793 +00000893 +00000813 +1c468693 +40000613 +49058593 +1e890513 +0299a023 +571000ef +00d4c783 +25840413 +ffb7f713 +00e486a3 +01b7f793 +00079a63 +0184a783 +00079663 +1e890513 +6ac000ef +000047b7 +db878793 +00f12223 +00004537 +00100793 +000036b7 +000065b7 +17850493 +00f12023 +02800893 +00000813 +00000793 +00000713 +6bc68693 +20000613 +89058593 +17850513 +501000ef +00d4c783 +00942623 +00800513 +ffb7f793 +00f486a3 +000047b7 +27078793 +00f42c23 +00f42e23 +30053573 +00857513 +ec9fd0ef +00052423 +00052623 +00a52023 +00a52223 +00008067 +000047b7 +25878613 +00058693 +00862583 +fe010113 +00812c23 +00f5c703 +00112e23 +00912a23 +fff70713 +00050413 +00e587a3 +00c52703 +25878793 +02070063 +00852583 +00862603 +04c58663 +04069863 +588000ef +ff000513 +0280006f +0087a683 +00e68683 +0087a783 +00170713 +00d42823 +00e42623 +00f42423 +560000ef +00000513 +01c12083 +01812403 +01412483 +02010113 +00008067 +01052683 +fcdff06f +00e58783 +00e60583 +00b7d463 +00078593 +0005d463 +00000593 +00800493 +3004b4f3 +00842503 +0084f493 +00e50783 +00f5d863 +00d12623 +0d5000ef +00c12683 +00004537 +00040613 +00048593 +25850513 +085000ef +00a12623 +00051863 +4e4000ef +00c12503 +f85ff06f +00042783 +01042583 +00f40e63 +00078c63 +00e78783 +00b7d463 +00078593 +0005d463 +00000593 +00800493 +3004b4f3 +00842503 +0084f493 +00e50783 +00f58463 +069000ef +3004a4f3 +494000ef +ff500513 +f35ff06f +000047b7 +2607a703 +00f74783 +fff78793 +00f707a3 +00c52783 +00100713 +00e78863 +fff78793 +00f52623 +4600006f +ff010113 +00812423 +00912223 +00112623 +01212023 +00050413 +00800493 +3004b4f3 +01052583 +00852503 +0084f493 +00e50783 +00f58463 +7f4000ef +00040513 +234000ef +00a42423 +00050913 +04050263 +00d54783 +01f7f793 +00079863 +01852783 +00079463 +444000ef +3004a4f3 +00e90783 +06092623 +00f42823 +00812403 +00c12083 +00412483 +00012903 +01010113 +f75ff06f +00042623 +3004a4f3 +fe1ff06f +00452703 +00052783 +00f72023 +00e7a223 +00052023 +00052223 +00008067 +00d54783 +01f7f793 +00079863 +01852503 +00153513 +00008067 +00000513 +00008067 +00e50703 +00e58683 +00100793 +00d74c63 +00000793 +00e6c863 +01052783 +0105a503 +00a7b7b3 +00078513 +00008067 +ff010113 +00112623 +84dff0ef +000047b7 +e547a783 +00c12083 +00004737 +00a78533 +26a72423 +00000593 +00078513 +01010113 +6a50006f +ff010113 +00812423 +00912223 +00112623 +01212023 +00058493 +00800413 +30043473 +000047b7 +00a00593 +00950513 +2607a423 +c81fd0ef +000047b7 +00004937 +e4a92a23 +e497a823 +00847413 +f85ff0ef +30042473 +00c12083 +00812403 +00412483 +00012903 +01010113 +00008067 +ff010113 +00812423 +00912223 +00112623 +00050493 +00800413 +30043473 +ee1ff0ef +00d4c783 +00847413 +ffd7f793 +00f486a3 +30042473 +00c12083 +00812403 +0004a423 +00412483 +01010113 +00008067 +000047b7 +2587a783 +00079663 +00058513 +b41fd06f +0085f593 +3005a5f3 +00008067 +00004737 +25872703 +00071463 +b25fd06f +00857793 +3007a7f3 +00008067 +00800513 +30053573 +00857513 +fd9ff06f +00800793 +3007b7f3 +00004737 +26072683 +00f6c703 +fff70713 +00e687a3 +0087f793 +3007a7f3 +00008067 +00052783 +00f51463 +00000793 +00078513 +00008067 +ff010113 +00812423 +00112623 +00912223 +01212023 +00800413 +30043973 +fd1ff0ef +00050493 +00897793 +3007a7f3 +02050663 +30043473 +df5ff0ef +00d4c783 +00847413 +ffd7f793 +00f486a3 +30042473 +0004a423 +01848513 +49d000ef +00c12083 +00812403 +00048513 +00012903 +00412483 +01010113 +00008067 +fe010113 +00812c23 +00912a23 +01212823 +00112e23 +02010413 +00c52703 +00050493 +00058913 +00170793 +00f52623 +00e5a823 +04079a63 +00852783 +00279713 +01770713 +ff077713 +01778793 +40e10133 +ff07f793 +00f10713 +40f10133 +00f10793 +ff07f793 +ff077713 +fef42423 +fff00793 +fee42223 +fef42623 +fe440593 +00048513 +d01fe0ef +02051663 +00090593 +00048513 +849fe0ef +fe040113 +01c12083 +01812403 +01412483 +01012903 +02010113 +00008067 +00c4a783 +00178713 +00e4a623 +00f52823 +fb9ff06f +ff010113 +00812423 +00112623 +00050413 +a0dfe0ef +00042783 +00079463 +00042623 +00c12083 +00812403 +01010113 +00008067 +00000593 +fb4fe06f +fe010113 +00812c23 +00004437 +00912a23 +00050493 +25840513 +02450513 +00112e23 +fd9ff0ef +25840413 +00051463 +00c42503 +00842783 +02049a63 +00d7c703 +01f77713 +02071463 +00e7d683 +07f00713 +00d77e63 +02f42023 +01c12083 +01812403 +01412483 +02010113 +00008067 +00f50863 +00a12623 +cb5ff0ef +00c12503 +02a42023 +fd9ff06f +ff010113 +00812423 +00112623 +00800413 +30043473 +000047b7 +2607a703 +00100513 +00847413 +00f74783 +00178793 +00f707a3 +f51ff0ef +30042473 +00812403 +00c12083 +01010113 +d85ff06f +ff010113 +00812423 +00912223 +00112623 +00050493 +00800413 +30043473 +00050593 +00004537 +27c50513 +e19ff0ef +00d4c783 +00000513 +00847413 +0407e793 +00f486a3 +ef9ff0ef +30042473 +00c12083 +00812403 +00412483 +01010113 +00008067 +ff052783 +ff010113 +00812423 +01212023 +00112623 +00912223 +00050413 +fe850913 +02078663 +00800493 +3004b4f3 +00090513 +b69ff0ef +ff544783 +0084f493 +ffd7f793 +fef40aa3 +3004a4f3 +fe042823 +ff544783 +00090513 +feb7f793 +fef40aa3 +b59ff0ef +02050063 +00812403 +00c12083 +00412483 +00090513 +00012903 +01010113 +f29ff06f +00c12083 +00812403 +00412483 +00012903 +01010113 +00008067 +fe010113 +00812c23 +00912a23 +00112e23 +01212823 +01312623 +00050493 +00800413 +30043473 +00004937 +25890913 +02490993 +00050593 +00098513 +dd5ff0ef +00048593 +00098513 +d09ff0ef +00d4c783 +00892503 +00847413 +0407e793 +40950533 +00f486a3 +00153513 +de1ff0ef +30042473 +01c12083 +01812403 +01412483 +01012903 +00c12983 +02010113 +00008067 +000047b7 +e547a703 +000047b7 +25878793 +06070463 +0087a703 +07f00693 +00e75603 +04c6ec63 +000046b7 +00e70603 +e506a683 +04d64463 +000046b7 +dd86a683 +02d70e63 +01872683 +02069a63 +0107a683 +02d54063 +ff010113 +00070513 +00112623 +f1dff0ef +00c12083 +01010113 +a79ff06f +40a686b3 +00d7a823 +00008067 +0007a823 +00008067 +ff010113 +00812423 +00912223 +00112623 +01212023 +00050493 +00800413 +30043473 +00d54783 +00004937 +00847413 +0407f793 +25890913 +00078e63 +00050593 +02490513 +cc5ff0ef +00d4c783 +fbf7f793 +00f486a3 +00892503 +40950533 +00153513 +ce1ff0ef +30042473 +00c12083 +00812403 +00412483 +00012903 +01010113 +00008067 +fe010113 +00812c23 +00b12623 +00050413 +00c12423 +00112e23 +f6dff0ef +00d44783 +00c12583 +00812603 +0027e793 +00f406a3 +02058a63 +0005a783 +00b42423 +06f58663 +06078463 +00e40703 +00e78683 +04d75663 +0047a703 +00f42023 +00e42223 +00872023 +0087a223 +fff00793 +04f60e63 +00a00593 +00960513 +e54fd0ef +00150613 +01840513 +01812403 +01c12083 +000035b7 +9f058593 +02010113 +6d00006f +0045a683 +00d78663 +0007a783 +fa0792e3 +0045a783 +00b42023 +00f42223 +0045a783 +0087a023 +0085a223 +fa5ff06f +01c12083 +01812403 +02010113 +00008067 +000047b7 +2607a503 +ff010113 +00812423 +00058413 +00060593 +00068613 +00112623 +f0dff0ef +00040513 +00812403 +00c12083 +01010113 +d14fd06f +fe010113 +00812c23 +00912a23 +01212823 +00112e23 +01312623 +01412423 +00050493 +00058913 +00800413 +30043473 +861ff0ef +01891913 +00847413 +00050a13 +41895913 +06050463 +000049b7 +27c98993 +00048593 +00098513 +b29ff0ef +00098513 +01248723 +00048593 +a59ff0ef +00100513 +b49ff0ef +30042473 +020a0e63 +000047b7 +2607a783 +00f7c783 +02079663 +01812403 +01c12083 +01412483 +01012903 +00c12983 +00812a03 +02010113 +959ff06f +01248723 +fc5ff06f +01c12083 +01812403 +01412483 +01012903 +00c12983 +00812a03 +02010113 +00008067 +000047b7 +00002737 +25878793 +5c470713 +00000593 +00000513 +0207a223 +0207a623 +0207a823 +02e7a423 +815ff06f +00e50503 +00008067 +ff010113 +00912223 +000044b7 +25848493 +000047b7 +0084a703 +dd87a783 +00112623 +00812423 +01212023 +02f70c63 +00800413 +30043473 +0084a583 +02448913 +00090513 +a39ff0ef +0084a583 +00090513 +00847413 +969ff0ef +00100513 +a59ff0ef +30042473 +00800513 +30053573 +00812403 +00c12083 +00412483 +00012903 +00857513 +01010113 +b8cfd06f +fd010113 +02112623 +02812423 +02912223 +03212023 +01312e23 +02051663 +00a12623 +f5dff0ef +00c12503 +02c12083 +02812403 +02412483 +02012903 +01c12983 +03010113 +00008067 +00a00593 +00950513 +be8fd0ef +00150993 +794000ef +00a98433 +00800913 +30093973 +000044b7 +25848493 +0084a503 +c81ff0ef +0084a503 +000035b7 +00098613 +9f058593 +01850513 +448000ef +0084a703 +00897513 +00d74783 +0107e793 +00f706a3 +ae8fd0ef +744000ef +40a40433 +00000513 +f6805ce3 +00241793 +00878533 +00151513 +f69ff06f +000047b7 +2607a503 +00008067 +00d54783 +01f7f793 +00079863 +01852503 +00153513 +00008067 +00000513 +00008067 +000047b7 +2587a503 +00a03533 +00008067 +000047b7 +2607a783 +00c7c503 +00157513 +00008067 +ff010113 +00812423 +00112623 +00912223 +00800413 +30043473 +00d54783 +00847413 +0047f713 +00071e63 +30042473 +00c12083 +00812403 +00412483 +01010113 +00008067 +ffb7f793 +00f506a3 +00050493 +f71ff0ef +00050663 +00048513 +989ff0ef +00040593 +00812403 +00c12083 +00412483 +00004537 +28c50513 +01010113 +eacff06f +fe010113 +02012303 +00812c23 +00112e23 +00612023 +00050413 +919fd0ef +000047b7 +2607a783 +01c12083 +0687a783 +06f42423 +01812403 +02010113 +00008067 +fe010113 +02012303 +00912a23 +00012223 +02412483 +00612023 +00812c23 +00112e23 +00050413 +fa1ff0ef +fff00793 +00f48863 +02049263 +00040513 +f11ff0ef +00040513 +01c12083 +01812403 +01412483 +02010113 +00008067 +00a00593 +00948513 +a0cfd0ef +000035b7 +00150613 +9f058593 +01840513 +294000ef +fc9ff06f +06052783 +ff010113 +00812423 +00112623 +00050413 +00078463 +000780e7 +00040513 +e6dff0ef +02050463 +00040513 +a81ff0ef +00d44783 +00c12083 +0087e793 +00f406a3 +00812403 +01010113 +00008067 +00d44783 +0027f793 +00078663 +00040513 +d4cff0ef +01842783 +fc0786e3 +01840513 +300000ef +fc1ff06f +fd010113 +000047b7 +03212023 +00004937 +02812423 +02912223 +02112623 +01312e23 +01412c23 +e1878413 +e1878493 +e1890913 +03246c63 +d98ff0ef +00048413 +fff00993 +00003a37 +07246463 +02812403 +02c12083 +02412483 +02012903 +01c12983 +01812a03 +03010113 +f90ff06f +02c42783 +00f12223 +02042783 +00f12023 +01442783 +01c42883 +01842803 +01042703 +00c42683 +00842603 +00442583 +00042503 +e41ff0ef +00042783 +0487ae23 +03040413 +f89ff06f +02442503 +01350a63 +00042483 +00051a63 +00048513 +d9dff0ef +03040413 +f7dff06f +00a00593 +00950513 +8a8fd0ef +00150613 +9f0a0593 +01848513 +134000ef +fddff06f +00d50623 +00c506a3 +00b50723 +000507a3 +00052c23 +00052e23 +00008067 +fd010113 +02112623 +00800593 +3005b5f3 +0085f593 +00b12623 +e6dff0ef +00c12583 +01c10513 +c54ff0ef +02c12083 +03010113 +00008067 +000047b7 +e587a783 +00079463 +ba5fe06f +00000513 +00008067 +00052783 +02050263 +00004737 +dc872703 +00e50c63 +00078a63 +0087a703 +00852683 +00d70733 +00e7a423 +00452703 +00f72023 +00e7a223 +00052023 +00052223 +00008067 +000047b7 +e5c7c783 +ff010113 +00112623 +00812423 +00912223 +fff00513 +00079663 +80000537 +fff54513 +000047b7 +dc478793 +0007a403 +02f40463 +02040263 +00842483 +f69ff0ef +40a484b3 +00000513 +0004c863 +00842403 +f55ff0ef +40a40533 +000047b7 +2687a783 +00078663 +00a7d463 +00078513 +00c12083 +00812403 +00412483 +01010113 +00008067 +fe010113 +00812c23 +00912a23 +00112e23 +00050413 +00c12623 +00b52623 +00800493 +3004b4f3 +f01ff0ef +00c12603 +0084f493 +00c04463 +00100613 +000047b7 +dc47a703 +00a60633 +00c42423 +dc478793 +00f70663 +0047a583 +02071063 +0047a703 +00f42023 +00e42223 +0047a703 +00872023 +0087a223 +02c0006f +00872603 +00842683 +04c6d863 +40d606b3 +00d72423 +00472683 +00e42023 +00d42223 +0086a023 +00872223 +0007a703 +00f70a63 +00e41863 +ed5ff0ef +00000593 +a21fe0ef +3004a4f3 +01c12083 +01812403 +01412483 +02010113 +00008067 +40c686b3 +00d42423 +f8b702e3 +00072703 +f79ff06f +ff010113 +00812423 +00112623 +00800413 +30043473 +00052783 +00847413 +02078063 +e3dff0ef +00000513 +30042473 +00c12083 +00812403 +01010113 +00008067 +fea00513 +fe9ff06f +ff010113 +00112623 +00812423 +00800793 +3007b473 +e45ff0ef +00847793 +3007a7f3 +00c12083 +00812403 +01010113 +00008067 +fe010113 +00812c23 +00912a23 +00112e23 +00050493 +00b12623 +00800413 +30043473 +e09ff0ef +00847413 +00c12583 +00a4da63 +00100793 +00a7d663 +00048513 +941fe0ef +30042473 +01c12083 +01812403 +01412483 +02010113 +00008067 +fe010113 +00812c23 +00912a23 +00112e23 +01212823 +01312623 +01412423 +01512223 +00050493 +00800413 +dccff0ef +30043473 +000049b7 +00004a37 +00004937 +e499ac23 +00847413 +e5898993 +dc4a0a13 +e3090913 +00800a93 +000a2483 +0009a783 +00092683 +00492503 +01448c63 +00048a63 +0084a703 +06e7d063 +40f70733 +00e4a423 +00d786b3 +41f7d713 +00a70733 +00f6b7b3 +00e787b3 +00d92023 +00f92223 +0009a023 +d35ff0ef +00000593 +881fe0ef +30042473 +01c12083 +01812403 +01412483 +01012903 +00c12983 +00812a03 +00412a83 +02010113 +00008067 +00d706b3 +41f75593 +00a585b3 +00e6b633 +00b60633 +40e787b3 +0004a423 +00048513 +00d92023 +00c92223 +00f9a023 +c95ff0ef +30042473 +00c4a783 +00048513 +000780e7 +300ab473 +00847413 +f3dff06f +ff010113 +00812423 +00112623 +00800413 +30043473 +ff8fe0ef +00004737 +e3070713 +00050793 +00072503 +00472583 +00847413 +00a78533 +00f537b3 +00b785b3 +30042473 +00c12083 +00812403 +01010113 +00008067 +000047b7 +e307a503 +00008067 +ff010113 +00112623 +f9dff0ef +00c12083 +00251793 +00a78533 +00151513 +00000593 +01010113 +00008067 +ff010113 +00812423 +00112623 +00800413 +300437f3 +dc5ff0ef +00a04463 +00100513 +00100593 +de5ff0ef +da8fe0ef +fe5ff06f +ff010113 +00812423 +00912223 +00004437 +000044b7 +00112623 +e1840413 +e1848493 +00946e63 +00c12083 +00812403 +00412483 +00000513 +01010113 +00008067 +01440793 +00040513 +00f42a23 +00f42c23 +b4cfd0ef +01c40413 +fcdff06f +00008067 +00000000 +000008d8 +00000000 +000008d8 +00000000 +000008d8 +00000000 +000008d8 +00000000 +000008d8 +00000000 +000008d8 +00000000 +000008d8 +00000000 +00001d5c +00003d10 +0000201c +00003dcc +00003a30 +00001d2c +00000000 +00003d20 +00001e08 +00000000 +00003d18 +00002088 +00000000 +00003a30 +000036ec +00000000 +00003e60 +00003e74 +00003e88 +00003e9c +00003eb0 +00003ec4 +6574756d +00736578 +616e7964 +0063696d +4a325b1b +35315b1b +4448313b +206f6d65 +63736544 +74706972 +0a6e6f69 +2d2d2d2d +2d2d2d2d +2d2d2d2d +2d2d2d2d +206e410a +6c706d69 +6e656d65 +69746174 +6f206e6f +20612066 +756c6f73 +6e6f6974 +206f7420 +20656874 +696e6944 +5020676e +6f6c6968 +68706f73 +0a737265 +626f7270 +206d656c +63206128 +7373616c +6d206369 +69746c75 +7268742d +20646165 +636e7973 +6e6f7268 +74617a69 +206e6f69 +626f7270 +296d656c +68540a2e +70207369 +69747261 +616c7563 +6d692072 +6d656c70 +61746e65 +6e6f6974 +6d656420 +74736e6f +65746172 +68742073 +73752065 +20656761 +6d20666f +69746c75 +0a656c70 +65657270 +6974706d +20656c62 +20646e61 +706f6f63 +74617265 +20657669 +65726874 +20736461 +6420666f +65666669 +676e6972 +69727020 +7469726f +2c736569 +0a736120 +6c6c6577 +20736120 +25207325 +6e612073 +68742064 +64616572 +656c7320 +6e697065 +000a2e67 +20202020 +53202020 +56524154 +20474e49 +20202020 +00002020 +48202020 +49444c4f +4f20474e +4620454e +204b524f +00002020 +41452020 +474e4954 +205b2020 +64257325 +20736d20 +0000205d +44202020 +50504f52 +4f204445 +4620454e +204b524f +00002020 +49485420 +4e494b4e +205b2047 +64257325 +20736d20 +0000205d +00000043 +00000050 +64255b1b +4864253b +00000000 +6c696850 +706f736f +20726568 +5b206425 +253a7325 +5d642573 +00000020 +000007b0 +00000868 +00000868 +000007a4 +000007b0 +00000850 +0000085c +00003a84 +00003aa4 +00003ac0 +00003ad4 +00003ae0 +00003af8 +6e6b6e75 +006e776f +65637845 +6f697470 +6163206e +20657375 +28207325 +0a296425 +00000000 +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +74736e49 +74637572 +206e6f69 +72646461 +20737365 +6173696d +6e67696c +00006465 +74736e49 +74637572 +206e6f69 +65636341 +66207373 +746c7561 +00000000 +656c6c49 +206c6167 +74736e69 +74637572 +006e6f69 +61657242 +696f706b +0000746e +64616f4c +64646120 +73736572 +73696d20 +67696c61 +0064656e +64616f4c +63636120 +20737365 +6c756166 +00000074 +2a2a2a2a +72654b20 +206c656e +6f6c6c41 +69746163 +46206e6f +756c6961 +20216572 +2a2a2a2a +0000000a +2a2a2a2a +654b202a +6c656e72 +504f4f20 +2a202153 +2a2a2a2a +0000000a +2a2a2a2a +654b202a +6c656e72 +6e615020 +20216369 +2a2a2a2a +00000a2a +2a2a2a2a +6b6e5520 +6e776f6e +74614620 +45206c61 +726f7272 +21642520 +2a2a2a20 +00000a2a +72727543 +20746e65 +65726874 +49206461 +203d2044 +460a7025 +746c7561 +20676e69 +74736e69 +74637572 +206e6f69 +72646461 +20737365 +7830203d +200a7825 +3a617220 +25783020 +67202078 +30203a70 +20782578 +3a707420 +25783020 +74202078 +30203a30 +0a782578 +31742020 +7830203a +20207825 +203a3274 +78257830 +33742020 +7830203a +20207825 +203a3474 +78257830 +7420200a +30203a35 +20782578 +3a367420 +25783020 +61202078 +30203a30 +20782578 +3a316120 +25783020 +20200a78 +203a3261 +78257830 +33612020 +7830203a +20207825 +203a3461 +78257830 +35612020 +7830203a +200a7825 +3a366120 +25783020 +61202078 +30203a37 +0a782578 +00000000 +00525349 +65737365 +6169746e +6874206c +64616572 +00000000 +61746146 +6166206c +20746c75 +25206e69 +53202173 +6e6e6970 +2e676e69 +000a2e2e +61746146 +6166206c +20746c75 +74206e69 +61657268 +70252064 +62412021 +6974726f +0a2e676e +00000000 +72757053 +73756f69 +746e6920 +75727265 +64207470 +63657465 +21646574 +51524920 +6425203a +0000000a +3044454c +00000000 +74726175 +00000030 +5f737973 +636f6c63 +0000006b +00001ef0 +00001f5c +00001fc0 +00000000 +00000000 +00000000 +00000000 +00002074 +00002040 +00000000 +00000000 +00000000 +00003ddc +00003e0c +00003e18 +00003e18 +00003e18 +2a2a2a2a +6f42202a +6e69746f +655a2067 +72796870 +20534f20 +6870657a +762d7279 +34312e31 +342d312e +3763672d +36643263 +33313532 +2a206566 +2a2a2a2a +0000000a +6e69616d +00000000 +656c6469 +00000000 +00001604 +00003dc4 +00003dc4 +40000000 +00000001 +fffffff5 +00004178 +000037b8 +00000000 +00000000 +00003788 +00000000 +00003e40 +000037ac +00003d48 +00000000 +00003794 +00000000 +00000000 +000037a0 +00000000 +00000000 +00003e18 +00003e18 +00000000 +00000000 +00000028 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/pythondata_cpu_serv/verilog/sw/zephyr_sync.hex b/pythondata_cpu_serv/verilog/sw/zephyr_sync.hex new file mode 100644 index 0000000..604178b --- /dev/null +++ b/pythondata_cpu_serv/verilog/sw/zephyr_sync.hex @@ -0,0 +1,4096 @@ +00000297 +01028293 +30529073 +6c80006f +fb010113 +00112023 +00312223 +00412423 +00512623 +00612823 +00712a23 +01c12c23 +01d12e23 +03e12023 +03f12223 +02a12423 +02b12623 +02c12823 +02d12a23 +02e12c23 +02f12e23 +05012023 +05112223 +341022f3 +04512423 +300022f3 +04512623 +1f0000ef +00000313 +02051e63 +342022f3 +800003b7 +fff38393 +0072f2b3 +00b00313 +00628a63 +00010513 +00000097 +13408093 +5700006f +04812283 +00428293 +04512423 +0900006f +00010293 +00003397 +eb438393 +0043a103 +ff010113 +00512023 +0003ae03 +001e0e13 +01c3a023 +00030863 +00000097 +03c08093 +5b80006f +34202573 +800002b7 +fff28293 +00557533 +158000ef +00002297 +71028293 +00351513 +00a282b3 +0002a503 +0042a303 +000300e7 +00003317 +e5430313 +00032383 +fff38393 +00732023 +00012283 +00028113 +00832383 +02032e03 +087e0863 +00003297 +e2c28293 +0082a303 +02832623 +02932823 +03232a23 +03332c23 +03432e23 +05532023 +05632223 +05732423 +05832623 +05932823 +05a32a23 +05b32c23 +02232423 +00003397 +b5038393 +0003ae03 +07c32623 +0202a303 +0062a423 +02832103 +02c32403 +03032483 +03432903 +03832983 +03c32a03 +04032a83 +04432b03 +04832b83 +04c32c03 +05032c83 +05432d03 +05832d83 +04812283 +34129073 +04c12283 +30029073 +00012083 +00412183 +00812203 +00c12283 +01012303 +01412383 +01812e03 +01c12e83 +02012f03 +02412f83 +02812503 +02c12583 +03012603 +03412683 +03812703 +03c12783 +04012803 +04412883 +05010113 +30200073 +00000073 +00003297 +d3c28293 +0082a303 +06c32383 +00857513 +300522f3 +00038513 +00008067 +00100313 +00a312b3 +3442b373 +00008067 +342022f3 +80000337 +0062f2b3 +00000513 +00028463 +00150513 +00008067 +02060063 +02000793 +40c787b3 +00f04c63 +fe060513 +00000713 +00a5d533 +00070593 +00008067 +00c5d733 +00c55533 +00f595b3 +00b56533 +fe9ff06f +00050613 +00000513 +0015f693 +00068463 +00c50533 +0015d593 +00161613 +fe0596e3 +00008067 +06054063 +0605c663 +00058613 +00050593 +fff00513 +02060c63 +00100693 +00b67a63 +00c05863 +00161613 +00169693 +feb66ae3 +00000513 +00c5e663 +40c585b3 +00d56533 +0016d693 +00165613 +fe0696e3 +00008067 +00008293 +fb5ff0ef +00058513 +00028067 +40a00533 +0005d863 +40b005b3 +f9dff06f +40b005b3 +00008293 +f91ff0ef +40a00533 +00028067 +00008293 +0005ca63 +00054c63 +f79ff0ef +00058513 +00028067 +40b005b3 +fe0558e3 +40a00533 +f61ff0ef +40b00533 +00028067 +fe010113 +00812c23 +00912a23 +01212823 +01312623 +01412423 +00112e23 +00050993 +00058a13 +00060913 +00003437 +000034b7 +fff00593 +000a0513 +48d010ef +3f1010ef +51d010ef +00050593 +88440613 +00051463 +00098593 +88c48513 +3e9000ef +1f400513 +309010ef +00090513 +3d1010ef +fc5ff06f +00003637 +000035b7 +00003537 +ff010113 +d4060613 +d5058593 +cb450513 +00112623 +f71ff0ef +fe010113 +000006b7 +000035b7 +00003537 +40000613 +00700893 +00000813 +00000793 +00000713 +3f868693 +fa058593 +00012223 +00012023 +e1850513 +00112e23 +54d010ef +000035b7 +8b458593 +479010ef +00003637 +000035b7 +00003537 +d5060613 +d4058593 +cbc50513 +f09ff0ef +ff010113 +00112623 +00812423 +00600793 +02f50463 +421010ef +02050463 +419010ef +04051663 +000035b7 +b7058593 +00003537 +b8450513 +311000ef +34d000ef +ffdff06f +405010ef +fc051ce3 +00003437 +f6840413 +00842583 +00003537 +ba450513 +2e9000ef +00842503 +6b1010ef +fd1ff06f +000035b7 +b6c58593 +fb9ff06f +fb010113 +04812423 +04912223 +04112623 +00600793 +00050493 +00058413 +0ea7e063 +00003737 +00251793 +8c070713 +00e787b3 +0007a783 +00078067 +00003537 +9f050513 +28d000ef +275010ef +04442783 +01042883 +00c42803 +02f12823 +04042783 +00442703 +00042683 +02f12623 +03c42783 +04842603 +00050593 +02f12423 +03842783 +00003537 +a7450513 +02f12223 +03442783 +02f12023 +03042783 +00f12e23 +02c42783 +00f12c23 +02842783 +00f12a23 +02442783 +00f12823 +02042783 +00f12623 +01c42783 +00f12423 +01842783 +00f12223 +01442783 +00f12023 +00842783 +1f9000ef +00040593 +00048513 +ea9ff0ef +00003537 +a1850513 +f55ff06f +00003537 +a3450513 +f49ff06f +00003537 +00048593 +a5050513 +1c5000ef +f39ff06f +ff010113 +00812423 +00112623 +00050413 +34202673 +00161613 +00165613 +00500793 +02c7e863 +00003737 +00261793 +8dc70713 +00f707b3 +0007a583 +00003537 +8fc50513 +17d000ef +00040593 +00000513 +ea5ff0ef +000035b7 +8f458593 +fe1ff06f +ff010113 +00112623 +342025f3 +00003537 +00159593 +0015d593 +bcc50513 +145000ef +000035b7 +91858593 +00400513 +e69ff0ef +000037b7 +d8078793 +0007a703 +00070c63 +0007a303 +0007a023 +000037b7 +d847a503 +00030067 +00008067 +ff010113 +00112623 +68d000ef +159000ef +6f9000ef +00003117 +6cc10113 +000012b7 +80028293 +00510133 +fd9ff0ef +2700006f +fd010113 +01312e23 +00068993 +03012683 +02812423 +03212023 +00058413 +00060913 +00088593 +00400613 +02912223 +02112623 +00050493 +00e12623 +00f12423 +01012223 +44d010ef +00812783 +fb090593 +00b405b3 +0404ae23 +0604a023 +ff05f593 +02f5a823 +000027b7 +00c12703 +00412803 +88078793 +04f5a623 +000007b7 +02c12083 +02812403 +6ec78793 +0335a423 +02e5a623 +0305aa23 +04f5a423 +02b4a423 +02012903 +02412483 +01c12983 +03010113 +00008067 +00159793 +00b787b3 +00279713 +00c52783 +00e787b3 +00b50703 +00b75463 +0007a783 +41f65713 +01f77713 +00c70733 +40575713 +00271713 +00e787b3 +00f6a023 +01f67513 +00008067 +fe010113 +00c10693 +00112e23 +fb1ff0ef +00c12703 +00100793 +00a79533 +00072783 +01c12083 +00a7e7b3 +00f72023 +02010113 +00008067 +fe010113 +00912a23 +00452483 +00812c23 +00050413 +00855503 +00048593 +01212823 +01312623 +01412423 +01512223 +01612023 +00112e23 +a69ff0ef +00042983 +00a44a83 +fff00793 +00050a13 +00a989b3 +00f405a3 +00000913 +01f00b13 +03594c63 +00000493 +00845783 +08f4cc63 +01c12083 +01812403 +01412483 +01012903 +00c12983 +00812a03 +00412a83 +00012b03 +02010113 +00008067 +00048593 +000a0513 +a31ff0ef +00191713 +01270733 +00271793 +00c42703 +00f70733 +00470793 +00f72223 +00f72423 +00ab4e63 +012405a3 +0024d493 +00348493 +ffc4f493 +00190913 +f85ff06f +01f50513 +41f55793 +01f7f793 +00a787b3 +4057d793 +00279793 +01372023 +00f989b3 +fcdff06f +00442583 +00048513 +999ff0ef +00042783 +00048613 +00000593 +00a78533 +00c42783 +00148493 +00478713 +00e52023 +0087a703 +00e52223 +0087a703 +00a72023 +00a7a423 +00040513 +e8dff0ef +f1dff06f +ff010113 +00050793 +00058513 +00060593 +00068613 +00112623 +000780e7 +63c010ef +21d010ef +00000513 +00008067 +ff010113 +00812423 +00050413 +04500513 +00112623 +00912223 +00058493 +000400e7 +00048593 +05200513 +000400e7 +00040313 +00812403 +00c12083 +00048593 +00412483 +05200513 +01010113 +00030067 +0005a783 +00178793 +00f5a023 +000037b7 +ca47a303 +00030067 +fc010113 +02812c23 +03312623 +03412423 +03612023 +01a12823 +02112e23 +02912a23 +03212823 +03512223 +01712e23 +01812c23 +01912a23 +01b12623 +00050993 +00058a13 +00060d13 +00068b13 +00100413 +00e05463 +00070413 +00100793 +02000c93 +00fb1463 +03000c93 +3b9ad4b7 +00100913 +00a00a93 +00000c13 +9ff48493 +00200d93 +00148b93 +000c1463 +0ba4f263 +000b8593 +000d0513 +861ff0ef +000a0593 +03050513 +000980e7 +00190913 +00100c13 +000b8593 +000d0513 +889ff0ef +00050d13 +00a00593 +00048513 +831ff0ef +fffa8a93 +00100793 +00050493 +fafa96e3 +000a0593 +030d0513 +000980e7 +00300793 +41240433 +06fb0663 +03c12083 +03812403 +03412483 +03012903 +02c12983 +02812a03 +02412a83 +02012b03 +01c12b83 +01812c03 +01412c83 +01012d03 +00c12d83 +04010113 +00008067 +f95440e3 +f76deee3 +000a0593 +000c8513 +000980e7 +00190913 +f69ff06f +000a0593 +02000513 +000980e7 +fff40413 +fe8048e3 +f95ff06f +000037b7 +caa7a223 +00008067 +fb010113 +04812423 +04912223 +05212023 +03312e23 +03412c23 +03512a23 +03912223 +03a12023 +01b12e23 +04112623 +03612823 +03712623 +03812423 +00050413 +00058493 +00060a93 +00068d13 +00000a13 +fff00913 +00000993 +00000c93 +80000db7 +000ac503 +04051063 +04c12083 +04812403 +04412483 +04012903 +03c12983 +03812a03 +03412a83 +03012b03 +02c12b83 +02812c03 +02412c83 +02012d03 +01c12d83 +05010113 +00008067 +000c9e63 +02500693 +36d50c63 +00048593 +000400e7 +001a8a93 +fa5ff06f +06400693 +12d50063 +06a6e263 +03900693 +02a6ea63 +03100693 +0ed57463 +02d00693 +34d50c63 +03000793 +0cf50063 +02500713 +02e51263 +00048593 +02500513 +000400e7 +1600006f +05800693 +1cd50063 +06300713 +30e50063 +00048593 +02500513 +000400e7 +00048593 +000ac503 +fd5ff06f +07000693 +16d50c63 +02a6e063 +06900693 +0ad50463 +06c00693 +08d50c63 +06800693 +f6d506e3 +fc5ff06f +07500693 +10d50863 +02a6ee63 +07300713 +fae518e3 +000d2c03 +004d0b13 +000c0b93 +000bc503 +26051a63 +00300793 +00f99863 +418b8bb3 +41790bb3 +27704863 +000b0d13 +0cc0006f +07800693 +12d50663 +07a00693 +fa9ff06f +00095e63 +28098a63 +fd050913 +f00992e3 +00200993 +efdff06f +fe0948e3 +00291693 +01268933 +00191913 +fd090913 +01250933 +fddff06f +001a0a13 +ed9ff06f +040a1263 +000d2603 +004d0d13 +02065063 +00048593 +02d00513 +00c12023 +000400e7 +00012603 +fff90913 +40c00633 +00090713 +00098693 +00048593 +00040513 +c7dff0ef +03c0006f +00100713 +faea0ee3 +007d0793 +ff87f713 +00072603 +00472683 +00870d13 +01b60733 +00c73733 +00d70733 +fa0700e3 +00048593 +00040513 +bddff0ef +00000c93 +e55ff06f +000a1863 +000d2603 +004d0d13 +f9dff06f +00100713 +feea08e3 +007d0793 +ff87f713 +00870d13 +00072603 +00472703 +fc0710e3 +800007b7 +fff7c793 +f6c7f8e3 +fb1ff06f +00048593 +03000513 +000400e7 +00048593 +07800513 +000400e7 +00800913 +00100993 +00100693 +0b46c263 +000d2783 +00012423 +004d0d13 +00f12223 +01000c13 +00000b93 +00012023 +01000893 +00412503 +00812583 +fff88b13 +002b1613 +01112623 +c24ff0ef +00f57513 +08051863 +00012783 +03000693 +00079863 +00c12883 +00100793 +08f89663 +00a68533 +01851513 +00048593 +41855513 +000400e7 +001b8b93 +040b1863 +00300693 +00000c93 +d6d996e3 +00191713 +41770bb3 +f17054e3 +00048593 +02000513 +000400e7 +fffb8b93 +fedff06f +007d0793 +ff87f693 +0006a783 +00868d13 +00f12223 +0046a783 +00f12423 +f55ff06f +01912023 +000b0893 +f59ff06f +00900793 +05700693 +f8a7e2e3 +03000693 +f7dff06f +fffc0793 +00f12623 +01894c63 +00100793 +00f99c63 +00048593 +03000513 +000400e7 +00c12c03 +fc1ff06f +00200793 +fef99ae3 +00048593 +02000513 +fe5ff06f +00048593 +001b8b93 +000400e7 +d7dff06f +00048593 +02000513 +000400e7 +fffb8b93 +d81ff06f +000d2503 +00048593 +004d0b13 +000400e7 +d71ff06f +00000a13 +fff00913 +00000993 +00100c93 +c85ff06f +00300993 +c7dff06f +00100993 +c75ff06f +fe010113 +00050613 +00001537 +00058693 +9d450513 +00c10593 +00112e23 +00012623 +b9dff0ef +01c12083 +02010113 +00008067 +fc010113 +02b12223 +02410593 +00112e23 +02c12423 +02d12623 +02e12823 +02f12a23 +03012c23 +03112e23 +00b12623 +fa5ff0ef +01c12083 +04010113 +00008067 +00008067 +00800793 +3007a7f3 +00008067 +00100793 +00a79533 +30452573 +00008067 +00800793 +3007b7f3 +30405073 +34405073 +00008067 +ff010113 +00812423 +00912223 +00003437 +00112623 +00a00793 +00050493 +d9040413 +00f51c63 +00042503 +00d00593 +00452783 +0047a783 +000780e7 +00042503 +0ff4f593 +00452783 +0047a783 +000780e7 +00c12083 +00812403 +00048513 +00412483 +01010113 +00008067 +ff010113 +00812423 +00001437 +03840513 +00112623 +1e4000ef +03840513 +00812403 +00c12083 +01010113 +a85ff06f +00003537 +ff010113 +bfc50513 +00112623 +3e0000ef +000037b7 +d8a7a823 +fb9ff0ef +00c12083 +00000513 +01010113 +00008067 +fe010113 +00912a23 +00112e23 +00812c23 +01212823 +01312623 +01412423 +00800493 +3004b4f3 +00003a37 +800007b7 +d94a0a13 +0007a983 +000a2903 +00027437 +10040593 +41298533 +9a0ff0ef +10040593 +96cff0ef +01250533 +10040413 +00850433 +00aa2023 +413409b3 +3e700793 +0084f493 +0137c863 +0004e437 +20040413 +00850433 +800007b7 +0087a023 +3004a4f3 +01812403 +01c12083 +01412483 +01012903 +00c12983 +00812a03 +00100513 +02010113 +4b40106f +800006b7 +0006a783 +00027737 +ff010113 +10070713 +00112623 +00e787b3 +00700513 +00f6a023 +e4dff0ef +00c12083 +00000513 +01010113 +00008067 +00008067 +00000513 +00008067 +00054783 +0005c703 +00e79463 +00079663 +40e78533 +00008067 +00150513 +00158593 +fe1ff06f +0ff5f693 +00050793 +0037f713 +04071463 +0ff5f593 +00859713 +00b765b3 +01059713 +00b765b3 +00c78333 +00078713 +00300813 +40e308b3 +03186a63 +00265713 +00271593 +00b787b3 +40b60633 +00c78633 +02c79463 +00008067 +fe060ee3 +00178793 +fed78fa3 +fff60613 +fa5ff06f +00470713 +feb72e23 +fc1ff06f +00178793 +fed78fa3 +fd1ff06f +fff00513 +00008067 +000037b7 +caa7a423 +00008067 +00852703 +0026f793 +00b7e5b3 +00072503 +04059a63 +00100793 +00c79633 +00452783 +fea00513 +00f677b3 +04078063 +f7e6f793 +fdd00513 +02079a63 +0806f513 +00472783 +00050a63 +00f66633 +00c72223 +00000513 +00008067 +fff64613 +00f67633 +00c72223 +00008067 +fdd00513 +00008067 +00852783 +0007a503 +0047a783 +00052883 +00452803 +02059063 +00100713 +00c71733 +00e87833 +fea00513 +02080c63 +00068463 +00080693 +00800713 +30073773 +0008a603 +00877713 +00f647b3 +00d7c7b3 +0107f7b3 +00c7c7b3 +00f8a023 +30072773 +00000513 +00008067 +00852503 +00052703 +00452503 +00072783 +0007a783 +00a7c7b3 +00472503 +00a7f7b3 +02059863 +00c7d7b3 +0017f793 +00f6a023 +00100793 +00c797b3 +00472603 +00c7f7b3 +00079463 +fea00593 +00058513 +00008067 +00f6a023 +00000593 +ff1ff06f +00052703 +00852783 +00872703 +00e7a023 +000037b7 +c1078793 +00f52223 +00000513 +00008067 +00159593 +2005e593 +00800793 +3007b7f3 +40000737 +0087f793 +00b72023 +4015d593 +00000013 +00000013 +fe0598e3 +3007a7f3 +00008067 +400007b7 +0007a783 +00000513 +00f58023 +00008067 +400007b7 +00100713 +00e7a023 +00000513 +00008067 +00251713 +000037b7 +00150513 +c4078793 +00251513 +ff010113 +00e78733 +00a787b3 +00812423 +00912223 +00072403 +0007a483 +00112623 +00946c63 +00c12083 +00812403 +00412483 +01010113 +00008067 +00042783 +00040513 +0047a783 +000780e7 +00050463 +00042223 +00c40413 +fcdff06f +ff010113 +000037b7 +00912223 +000034b7 +00812423 +00112623 +cd478413 +01212023 +cd478793 +d1048493 +00941c63 +00050913 +00078413 +02941463 +00000413 +0440006f +00442703 +00070863 +00042703 +00072703 +02a70863 +00c40413 +fd1ff06f +00442783 +00079663 +00c40413 +fcdff06f +00042783 +00090513 +0007a583 +cb9ff0ef +fe0514e3 +00040513 +00c12083 +00812403 +00412483 +00012903 +01010113 +00008067 +00003537 +000037b7 +d7850613 +f9478793 +40c78633 +00000593 +d7850513 +c9dff06f +00000013 +00008067 +ff010113 +00200513 +00112623 +ec5ff0ef +00003537 +c5450513 +a35ff0ef +00300513 +eb1ff0ef +4f1000ef +fd1ff0ef +000037b7 +ef878793 +00c7c703 +ffe77713 +00e78623 +00c12083 +01010113 +00008067 +f6010113 +08812c23 +000047b7 +00003437 +09312623 +5a078793 +f6840993 +00f9a223 +01010793 +07000613 +00000593 +00078513 +08112e23 +08912a23 +09212823 +c09ff0ef +00100713 +00a9a423 +00000513 +00e10ea3 +e35ff0ef +00100513 +e2dff0ef +10100793 +00f11e23 +7d4000ef +000037b7 +c9478793 +00003937 +00f12223 +000016b7 +00100793 +000035b7 +ef890493 +00f12023 +00000713 +00000793 +00000893 +00000813 +57c68693 +40000613 +7a058593 +ef890513 +0299a023 +2f1000ef +00d4c783 +f6840413 +ffb7f713 +00e486a3 +01b7f793 +00079a63 +0184a783 +00079663 +ef890513 +2f0000ef +000037b7 +c9c78793 +00f12223 +00003537 +00100793 +000026b7 +000045b7 +e8850493 +00f12023 +00f00893 +00000813 +00000793 +00000713 +77c68693 +20000613 +ba058593 +e8850513 +281000ef +00d4c783 +00942623 +00800513 +ffb7f793 +00f486a3 +000037b7 +f8078793 +00f42c23 +00f42e23 +30053573 +00857513 +b11fe0ef +00452703 +00052783 +00f72023 +00e7a223 +00052023 +00052223 +00008067 +00d54783 +01f7f793 +00079863 +01852503 +00153513 +00008067 +00000513 +00008067 +ff010113 +00112623 +a81ff0ef +000037b7 +d9c7a783 +00c12083 +00003737 +00a78533 +f6a72c23 +00000593 +00078513 +01010113 +6750006f +ff010113 +00812423 +00912223 +00112623 +01212023 +00058493 +00800413 +30043473 +000037b7 +00a00593 +00950513 +f607ac23 +b19fe0ef +000037b7 +00003937 +d8a92e23 +d897ac23 +00847413 +f85ff0ef +30042473 +00c12083 +00812403 +00412483 +00012903 +01010113 +00008067 +ff010113 +00812423 +00912223 +00112623 +00050493 +00800413 +30043473 +f0dff0ef +00d4c783 +00847413 +ffd7f793 +00f486a3 +30042473 +00c12083 +00812403 +0004a423 +00412483 +01010113 +00008067 +000037b7 +f687a783 +00079663 +00058513 +9d9fe06f +0085f593 +3005a5f3 +00008067 +00003737 +f6872703 +00071463 +9bdfe06f +00857793 +3007a7f3 +00008067 +00800513 +30053573 +00857513 +fd9ff06f +00800793 +3007b7f3 +00003737 +f7072683 +00f6c703 +fff70713 +00e687a3 +0087f793 +3007a7f3 +00008067 +00052783 +00f51463 +00000793 +00078513 +00008067 +fe010113 +00812c23 +00003437 +00912a23 +00050493 +f6840513 +02450513 +00112e23 +fcdff0ef +f6840413 +00051463 +00c42503 +00842783 +02049a63 +00d7c703 +01f77713 +02071463 +00e7d683 +07f00713 +00d77e63 +02f42023 +01c12083 +01812403 +01412483 +02010113 +00008067 +00f50863 +00a12623 +e21ff0ef +00c12503 +02a42023 +fd9ff06f +ff010113 +00812423 +00112623 +00800413 +30043473 +000037b7 +f707a703 +00100513 +00847413 +00f74783 +00178793 +00f707a3 +f51ff0ef +30042473 +00812403 +00c12083 +01010113 +ef1ff06f +ff010113 +00812423 +00112623 +00800413 +30043473 +00003737 +f6870793 +0247a783 +000036b7 +f8c68693 +00847413 +f6870713 +06d78063 +04078e63 +02872583 +00e50603 +00e78803 +05065063 +0047a703 +00f52023 +00e52223 +00a72023 +00a7a223 +00d54783 +0407e793 +00f506a3 +00000513 +ecdff0ef +30042473 +00c12083 +00812403 +01010113 +00008067 +00b78663 +0007a783 +fa079ae3 +02872783 +00d52023 +00f52223 +02872783 +00a7a023 +02a72423 +fb5ff06f +ff052783 +ff010113 +00812423 +01212023 +00112623 +00912223 +00050413 +fe850913 +02078663 +00800493 +3004b4f3 +00090513 +cb1ff0ef +ff544783 +0084f493 +ffd7f793 +fef40aa3 +3004a4f3 +fe042823 +ff544783 +00090513 +feb7f793 +fef40aa3 +ca1ff0ef +02050063 +00812403 +00c12083 +00412483 +00090513 +00012903 +01010113 +ed9ff06f +00c12083 +00812403 +00412483 +00012903 +01010113 +00008067 +ff010113 +00812423 +00912223 +00112623 +00050413 +00800493 +3004b4f3 +c2dff0ef +00003737 +f6870793 +0247a783 +000036b7 +f8c68693 +0084f493 +f6870713 +06d78663 +06078463 +02872583 +00e40603 +00e78503 +04a65663 +0047a683 +00f42023 +00d42223 +0086a023 +0087a223 +00d44783 +00872503 +0407e793 +40850533 +00f406a3 +00153513 +d75ff0ef +3004a4f3 +00c12083 +00812403 +00412483 +01010113 +00008067 +00b78663 +0007a783 +fa0794e3 +02872783 +00d42023 +00f42223 +02872783 +0087a023 +02872423 +fa9ff06f +000037b7 +d9c7a703 +000037b7 +f6878793 +06070463 +0087a703 +07f00693 +00e75603 +04c6ec63 +000036b7 +00e70603 +d986a683 +04d64463 +000036b7 +cd06a683 +02d70e63 +01872683 +02069a63 +0107a683 +02d54063 +ff010113 +00070513 +00112623 +ee1ff0ef +00c12083 +01010113 +b59ff06f +40a686b3 +00d7a823 +00008067 +0007a823 +00008067 +ff010113 +00812423 +00912223 +00112623 +00050493 +00800413 +30043473 +00d54783 +00847413 +0407f793 +00078a63 +ad9ff0ef +00d4c783 +fbf7f793 +00f486a3 +000037b7 +f707a503 +40950533 +00153513 +c65ff0ef +30042473 +00c12083 +00812403 +00412483 +01010113 +00008067 +fe010113 +00812c23 +00b12623 +00050413 +00c12423 +00112e23 +f81ff0ef +00d44783 +00c12583 +00812603 +0027e793 +00f406a3 +02058a63 +0005a783 +00b42423 +06f58663 +06078463 +00e40703 +00e78683 +04d75663 +0047a703 +00f42023 +00e42223 +00872023 +0087a223 +fff00793 +04f60e63 +00a00593 +00960513 +de0fe0ef +00150613 +01840513 +01812403 +01c12083 +000025b7 +a3c58593 +02010113 +7940006f +0045a683 +00d78663 +0007a783 +fa0792e3 +0045a783 +00b42023 +00f42223 +0045a783 +0087a023 +0085a223 +fa5ff06f +01c12083 +01812403 +02010113 +00008067 +000037b7 +f707a503 +ff010113 +00812423 +00058413 +00060593 +00068613 +00112623 +f0dff0ef +00040513 +00812403 +00c12083 +01010113 +ca0fe06f +ff010113 +00812423 +00112623 +00912223 +01212023 +00800413 +30043973 +b0dff0ef +00050493 +00897793 +3007a7f3 +02050663 +30043473 +95dff0ef +00d4c783 +00847413 +ffd7f793 +00f486a3 +30042473 +0004a423 +01848513 +7a8000ef +00c12083 +00812403 +00048513 +00012903 +00412483 +01010113 +00008067 +000037b7 +f6878793 +02478713 +02e7a223 +02e7a423 +00000593 +00000513 +971ff06f +ff010113 +00812423 +00003437 +f6840793 +0087a703 +000037b7 +cd07a783 +00112623 +00912223 +06f70263 +f6840413 +00800493 +3004b4f3 +00842503 +0084f493 +8c1ff0ef +02442783 +000036b7 +f8c68693 +00842703 +06d78263 +06078063 +02842603 +00e70583 +00e78503 +04a5d263 +0047a683 +00f72023 +00d72223 +00e6a023 +00e7a223 +00100513 +a29ff0ef +3004a4f3 +00800513 +30053573 +00812403 +00c12083 +00412483 +00857513 +01010113 +b64fe06f +00f60663 +0007a783 +fa0798e3 +02842783 +00d72023 +00f72223 +02842783 +00e7a023 +02e42423 +fb1ff06f +fd010113 +02112623 +02812423 +02912223 +03212023 +01312e23 +02051663 +00a12623 +f11ff0ef +00c12503 +02c12083 +02812403 +02412483 +02012903 +01c12983 +03010113 +00008067 +00a00593 +00950513 +b98fe0ef +00150993 +02d000ef +00a98433 +00800913 +30093973 +000034b7 +f6848493 +0084a503 +cb9ff0ef +0084a503 +000025b7 +00098613 +a3c58593 +01850513 +530000ef +0084a703 +00897513 +00d74783 +0107e793 +00f706a3 +a98fe0ef +7dc000ef +40a40433 +00000513 +f6805ce3 +00241793 +00878533 +00151513 +f69ff06f +000037b7 +f707a503 +00008067 +ff010113 +00812423 +01212023 +00112623 +00912223 +00050913 +00800413 +30043473 +00847413 +da9ff0ef +04050463 +00d54783 +00050493 +01f7f793 +00079863 +01852783 +00079463 +98dff0ef +0604a623 +00040593 +00812403 +00c12083 +00412483 +00012903 +00003537 +f9450513 +01010113 +815ff06f +00892703 +00c92783 +40e787b3 +00f037b3 +00e787b3 +00f92423 +fc5ff06f +00050613 +00058693 +00800793 +3007b7f3 +00852703 +0087f593 +00070c63 +fff70713 +00e52423 +3005a7f3 +00000513 +00008067 +00069863 +3005a7f3 +ff000513 +00008067 +00003537 +f9450513 +cc1ff06f +00d54783 +01f7f793 +00079863 +01852503 +00153513 +00008067 +00000513 +00008067 +000037b7 +f687a503 +00a03533 +00008067 +000037b7 +f707a783 +00c7c503 +00157513 +00008067 +fb900513 +00008067 +00000513 +00008067 +ff010113 +00812423 +00112623 +00912223 +00800413 +30043473 +00d54783 +00847413 +0047f713 +00071e63 +30042473 +00c12083 +00812403 +00412483 +01010113 +00008067 +ffb7f793 +00f506a3 +00050493 +f61ff0ef +00050663 +00048513 +84dff0ef +00040593 +00812403 +00c12083 +00412483 +00003537 +f9450513 +01010113 +edcff06f +fe010113 +02012303 +00812c23 +00112e23 +00612023 +00050413 +d70fe0ef +000037b7 +f707a783 +01c12083 +0687a783 +06f42423 +01812403 +02010113 +00008067 +fe010113 +02012303 +00912a23 +00012223 +02412483 +00612023 +00812c23 +00112e23 +00050413 +fa1ff0ef +fff00793 +00f48863 +02049263 +00040513 +f11ff0ef +00040513 +01c12083 +01812403 +01412483 +02010113 +00008067 +00a00593 +00948513 +8d4fe0ef +000025b7 +00150613 +a3c58593 +01840513 +294000ef +fc9ff06f +06052783 +ff010113 +00812423 +00112623 +00050413 +00078463 +000780e7 +00040513 +e5dff0ef +02050463 +00040513 +9d1ff0ef +00d44783 +00c12083 +0087e793 +00f406a3 +00812403 +01010113 +00008067 +00d44783 +0027f793 +00078663 +00040513 +d7cff0ef +01842783 +fc0786e3 +01840513 +300000ef +fc1ff06f +fd010113 +000037b7 +03212023 +00003937 +02812423 +02912223 +02112623 +01312e23 +01412c23 +d1078413 +d1078493 +d4090913 +03246c63 +dc8ff0ef +00048413 +fff00993 +00002a37 +07246463 +02812403 +02c12083 +02412483 +02012903 +01c12983 +01812a03 +03010113 +e54ff06f +02c42783 +00f12223 +02042783 +00f12023 +01442783 +01c42883 +01842803 +01042703 +00c42683 +00842603 +00442583 +00042503 +e41ff0ef +00042783 +0487ae23 +03040413 +f89ff06f +02442503 +01350a63 +00042483 +00051a63 +00048513 +d9dff0ef +03040413 +f7dff06f +00a00593 +00950513 +f71fd0ef +00150613 +a3ca0593 +01848513 +134000ef +fddff06f +00d50623 +00c506a3 +00b50723 +000507a3 +00052c23 +00052e23 +00008067 +fd010113 +02112623 +00800593 +3005b5f3 +0085f593 +00b12623 +e6dff0ef +00c12583 +01c10513 +c84ff0ef +02c12083 +03010113 +00008067 +000037b7 +da07a783 +00079463 +e09fe06f +00000513 +00008067 +00052783 +02050263 +00003737 +cb072703 +00e50c63 +00078a63 +0087a703 +00852683 +00d70733 +00e7a423 +00452703 +00f72023 +00e7a223 +00052023 +00052223 +00008067 +000037b7 +da47c783 +ff010113 +00112623 +00812423 +00912223 +fff00513 +00079663 +80000537 +fff54513 +000037b7 +cac78793 +0007a403 +02f40463 +02040263 +00842483 +f69ff0ef +40a484b3 +00000513 +0004c863 +00842403 +f55ff0ef +40a40533 +000037b7 +f787a783 +00078663 +00a7d463 +00078513 +00c12083 +00812403 +00412483 +01010113 +00008067 +fe010113 +00812c23 +00912a23 +00112e23 +00050413 +00c12623 +00b52623 +00800493 +3004b4f3 +f01ff0ef +00c12603 +0084f493 +00c04463 +00100613 +000037b7 +cac7a703 +00a60633 +00c42423 +cac78793 +00f70663 +0047a583 +02071063 +0047a703 +00f42023 +00e42223 +0047a703 +00872023 +0087a223 +02c0006f +00872603 +00842683 +04c6d863 +40d606b3 +00d72423 +00472683 +00e42023 +00d42223 +0086a023 +00872223 +0007a703 +00f70a63 +00e41863 +ed5ff0ef +00000593 +c85fe0ef +3004a4f3 +01c12083 +01812403 +01412483 +02010113 +00008067 +40c686b3 +00d42423 +f8b702e3 +00072703 +f79ff06f +ff010113 +00812423 +00112623 +00800413 +30043473 +00052783 +00847413 +02078063 +e3dff0ef +00000513 +30042473 +00c12083 +00812403 +01010113 +00008067 +fea00513 +fe9ff06f +ff010113 +00112623 +00812423 +00800793 +3007b473 +e45ff0ef +00847793 +3007a7f3 +00c12083 +00812403 +01010113 +00008067 +fe010113 +00812c23 +00912a23 +00112e23 +00050493 +00b12623 +00800413 +30043473 +e09ff0ef +00847413 +00c12583 +00a4da63 +00100793 +00a7d663 +00048513 +ba5fe0ef +30042473 +01c12083 +01812403 +01412483 +02010113 +00008067 +fe010113 +00812c23 +00912a23 +00112e23 +01212823 +01312623 +01412423 +01512223 +00050493 +00800413 +d1cff0ef +30043473 +000039b7 +00003a37 +00003937 +da99a023 +00847413 +da098993 +caca0a13 +d7890913 +00800a93 +000a2483 +0009a783 +00092683 +00492503 +01448c63 +00048a63 +0084a703 +06e7d063 +40f70733 +00e4a423 +00d786b3 +41f7d713 +00a70733 +00f6b7b3 +00e787b3 +00d92023 +00f92223 +0009a023 +d35ff0ef +00000593 +ae5fe0ef +30042473 +01c12083 +01812403 +01412483 +01012903 +00c12983 +00812a03 +00412a83 +02010113 +00008067 +00d706b3 +41f75593 +00a585b3 +00e6b633 +00b60633 +40e787b3 +0004a423 +00048513 +00d92023 +00c92223 +00f9a023 +c95ff0ef +30042473 +00c4a783 +00048513 +000780e7 +300ab473 +00847413 +f3dff06f +000037b7 +d787a503 +00008067 +ff010113 +00812423 +00112623 +00800413 +300437f3 +e3dff0ef +00a04463 +00100513 +00100593 +e5dff0ef +865fe0ef +fe5ff06f +ff010113 +00812423 +00912223 +00003437 +000034b7 +00112623 +d4040413 +d4048493 +00946e63 +00c12083 +00812403 +00412483 +00000513 +01010113 +00008067 +01440793 +00040513 +00f42a23 +00f42c23 +81cfe0ef +01c40413 +fcdff06f +00008067 +00000000 +00000668 +00000000 +00000668 +00000000 +00000668 +00000000 +00000668 +00000000 +00000668 +00000000 +00000668 +00000000 +00000668 +00000000 +000010f8 +00002bf4 +000013cc +00002cc4 +00002914 +000010c8 +00000000 +00002c04 +000011a4 +00000000 +00002bfc +00001438 +00000000 +00002914 +000027ac +00000000 +76726573 +00656369 +203a7325 +6c6c6548 +6f57206f +20646c72 +6d6f7266 +21732520 +0000000a +65726874 +615f6461 +00000000 +65726874 +625f6461 +00000000 +00000540 +000005f8 +000005f8 +00000534 +00000540 +000005e0 +000005ec +00002968 +00002988 +000029a4 +000029b8 +000029c4 +000029dc +6e6b6e75 +006e776f +65637845 +6f697470 +6163206e +20657375 +28207325 +0a296425 +00000000 +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +deadbaad +74736e49 +74637572 +206e6f69 +72646461 +20737365 +6173696d +6e67696c +00006465 +74736e49 +74637572 +206e6f69 +65636341 +66207373 +746c7561 +00000000 +656c6c49 +206c6167 +74736e69 +74637572 +006e6f69 +61657242 +696f706b +0000746e +64616f4c +64646120 +73736572 +73696d20 +67696c61 +0064656e +64616f4c +63636120 +20737365 +6c756166 +00000074 +2a2a2a2a +72654b20 +206c656e +6f6c6c41 +69746163 +46206e6f +756c6961 +20216572 +2a2a2a2a +0000000a +2a2a2a2a +654b202a +6c656e72 +504f4f20 +2a202153 +2a2a2a2a +0000000a +2a2a2a2a +654b202a +6c656e72 +6e615020 +20216369 +2a2a2a2a +00000a2a +2a2a2a2a +6b6e5520 +6e776f6e +74614620 +45206c61 +726f7272 +21642520 +2a2a2a20 +00000a2a +72727543 +20746e65 +65726874 +49206461 +203d2044 +460a7025 +746c7561 +20676e69 +74736e69 +74637572 +206e6f69 +72646461 +20737365 +7830203d +200a7825 +3a617220 +25783020 +67202078 +30203a70 +20782578 +3a707420 +25783020 +74202078 +30203a30 +0a782578 +31742020 +7830203a +20207825 +203a3274 +78257830 +33742020 +7830203a +20207825 +203a3474 +78257830 +7420200a +30203a35 +20782578 +3a367420 +25783020 +61202078 +30203a30 +20782578 +3a316120 +25783020 +20200a78 +203a3261 +78257830 +33612020 +7830203a +20207825 +203a3461 +78257830 +35612020 +7830203a +200a7825 +3a366120 +25783020 +61202078 +30203a37 +0a782578 +00000000 +00525349 +65737365 +6169746e +6874206c +64616572 +00000000 +61746146 +6166206c +20746c75 +25206e69 +53202173 +6e6e6970 +2e676e69 +000a2e2e +61746146 +6166206c +20746c75 +74206e69 +61657268 +70252064 +62412021 +6974726f +0a2e676e +00000000 +72757053 +73756f69 +746e6920 +75727265 +64207470 +63657465 +21646574 +51524920 +6425203a +0000000a +3044454c +00000000 +74726175 +00000030 +5f737973 +636f6c63 +0000006b +000012a0 +0000130c +00001370 +00000000 +00000000 +00000000 +00000000 +00001424 +000013f0 +00000000 +00000000 +00000000 +00002cd4 +00002d04 +00002d10 +00002d10 +00002d10 +2a2a2a2a +6f42202a +6e69746f +655a2067 +72796870 +20534f20 +6870657a +762d7279 +34312e31 +342d312e +3763672d +36643263 +33313532 +2a206566 +2a2a2a2a +0000000a +6e69616d +00000000 +656c6469 +00000000 +00000980 +0000128c +00002cac +00002cac +65726874 +00426461 +65726874 +00416461 +40000000 +00000001 +fffffff5 +00002e88 +00002878 +00000000 +00000000 +00002848 +00000000 +00002d88 +0000286c +00002c2c +00000000 +00002854 +00000000 +00000000 +00002860 +00000000 +00000000 +00002da8 +000033a0 +00000400 +0000041c +00000000 +00000000 +00000000 +00000007 +00000000 +00000000 +00000000 +000028a8 +00002d40 +00002d40 +00000001 +00000001 +00002d50 +00002d50 +00000000 +00000001 +00002d60 +00002d60 +00000000 +00000000 +0000000f +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/pythondata_cpu_serv/verilog/zephyr b/pythondata_cpu_serv/verilog/zephyr new file mode 160000 index 0000000..a690d52 --- /dev/null +++ b/pythondata_cpu_serv/verilog/zephyr @@ -0,0 +1 @@ +Subproject commit a690d52fa69f812924aa38f20c45f707c64fa16f