From fae4b40d899f6c1e94487daf019692cb2c5d3e4d Mon Sep 17 00:00:00 2001 From: Zavier Aguila Date: Wed, 3 Jun 2020 20:39:35 +0000 Subject: [PATCH] DDR simulation --- core/amo_alu.sv | 5 +- core/fetch.sv | 27 +- core/icache.sv | 31 +- l2_arbiter/l2_arbiter.sv | 1 + test_benches/taiga_full_simulation.sv | 456 - test_benches/taiga_full_simulation.wcfg | 678 - .../verilator/AXI_DDR_simulation/DDR_init.txt | 10240 ++++++++++++++++ .../AXI_DDR_simulation/axi_ddr_sim.cc | 358 + .../AXI_DDR_simulation/axi_ddr_sim.h | 109 + .../AXI_DDR_simulation/axi_interface.h | 59 + .../AXI_DDR_simulation/axi_l2_test.cc | 212 + .../AXI_DDR_simulation/axi_l2_test.sv | 311 + .../verilator/AXI_DDR_simulation/ddr_page.cc | 10 + .../verilator/AXI_DDR_simulation/ddr_page.h | 13 + .../verilator/AXI_DDR_simulation/main.cc | 36 + test_benches/verilator/TaigaTracer.cc | 58 +- test_benches/verilator/TaigaTracer.h | 11 +- test_benches/verilator/taiga_full_sim.cc | 208 - test_benches/verilator/taiga_local_mem.cc | 9 +- test_benches/verilator/taiga_local_mem.sv | 97 +- tools/Makefile | 72 +- 21 files changed, 11553 insertions(+), 1448 deletions(-) delete mode 100644 test_benches/taiga_full_simulation.sv delete mode 100755 test_benches/taiga_full_simulation.wcfg create mode 100644 test_benches/verilator/AXI_DDR_simulation/DDR_init.txt create mode 100644 test_benches/verilator/AXI_DDR_simulation/axi_ddr_sim.cc create mode 100644 test_benches/verilator/AXI_DDR_simulation/axi_ddr_sim.h create mode 100644 test_benches/verilator/AXI_DDR_simulation/axi_interface.h create mode 100644 test_benches/verilator/AXI_DDR_simulation/axi_l2_test.cc create mode 100644 test_benches/verilator/AXI_DDR_simulation/axi_l2_test.sv create mode 100644 test_benches/verilator/AXI_DDR_simulation/ddr_page.cc create mode 100644 test_benches/verilator/AXI_DDR_simulation/ddr_page.h create mode 100644 test_benches/verilator/AXI_DDR_simulation/main.cc delete mode 100644 test_benches/verilator/taiga_full_sim.cc diff --git a/core/amo_alu.sv b/core/amo_alu.sv index 200443c..471f648 100755 --- a/core/amo_alu.sv +++ b/core/amo_alu.sv @@ -41,7 +41,7 @@ module amo_alu( /* verilator lint_off CASEINCOMPLETE */ always_comb begin - unique case (amo_alu_inputs.op)// <--unique as not all codes are in use + case (amo_alu_inputs.op)// <--unique as not all codes are in use AMO_SWAP : result = amo_alu_inputs.rs2; AMO_ADD : result = amo_alu_inputs.rs1_load + amo_alu_inputs.rs2; AMO_XOR : result = amo_alu_inputs.rs1_load ^ amo_alu_inputs.rs2; @@ -55,4 +55,5 @@ module amo_alu( end /* verilator lint_on CASEINCOMPLETE */ -endmodule + +endmodule \ No newline at end of file diff --git a/core/fetch.sv b/core/fetch.sv index 57e3c6f..e98d466 100755 --- a/core/fetch.sv +++ b/core/fetch.sv @@ -65,7 +65,6 @@ module fetch( //Subunit signals fetch_sub_unit_interface fetch_sub[NUM_SUB_UNITS-1:0](); logic [NUM_SUB_UNITS-1:0] sub_unit_address_match; - logic [NUM_SUB_UNITS-1:0] last_sub_unit_id; logic [NUM_SUB_UNITS-1:0] unit_ready; logic [NUM_SUB_UNITS-1:0] unit_data_valid; logic [31:0] unit_data_array [NUM_SUB_UNITS-1:0]; @@ -83,9 +82,7 @@ module fetch( logic new_mem_request; //Cache related - logic delayed_flush; logic [31:0] stage2_phys_address; - logic stage2_valid; genvar i; //////////////////////////////////////////////////// @@ -174,28 +171,6 @@ module fetch( icache i_cache (.*, .fetch_sub(fetch_sub[ICACHE_ID])); assign cache_address_match = tlb.physical_address[31:32-MEMORY_BIT_CHECK] == MEMORY_ADDR_L[31:32-MEMORY_BIT_CHECK]; assign sub_unit_address_match[ICACHE_ID] = cache_address_match; - - set_clr_reg_with_rst #(.SET_OVER_CLR(1), .WIDTH(1), .RST_VALUE(0)) stage2_valid_m ( - .clk, .rst(flush_or_rst), - .set(new_mem_request), - .clr(pre_decode_push), - .result(stage2_valid) - ); - - always_ff @(posedge clk) begin - if (new_mem_request) - last_sub_unit_id <= sub_unit_address_match; - end - //TODO potentially move support into cache so that we're not stalled on a request we no longer need due to a flush - //If the cache is processing a miss when a flush occurs we need to discard the result once complete - set_clr_reg_with_rst #(.SET_OVER_CLR(1), .WIDTH(1), .RST_VALUE(0)) delayed_flush_m ( - .clk, .rst, - .set(gc_fetch_flush & stage2_valid & last_sub_unit_id[ICACHE_ID] & ~fetch_sub[ICACHE_ID].data_valid), - .clr(fetch_sub[ICACHE_ID].data_valid), - .result(delayed_flush) - ); - end else begin - assign delayed_flush = 0; end endgenerate @@ -203,7 +178,7 @@ module fetch( //Pre-Decode Output assign pre_decode_instruction = unit_data_array[next_unit.data_out]; assign pre_decode_pc = stage2_phys_address; - assign pre_decode_push = (~delayed_flush) & units_data_valid;//FIFO is cleared on gc_fetch_flush + assign pre_decode_push = units_data_valid;//FIFO is cleared on gc_fetch_flush always_ff @(posedge clk) begin if (new_mem_request) begin diff --git a/core/icache.sv b/core/icache.sv index c91e8af..3357e27 100755 --- a/core/icache.sv +++ b/core/icache.sv @@ -48,6 +48,7 @@ module icache( logic [31:0] data_out [ICACHE_WAYS-1:0]; logic [31:0] miss_data; + logic miss_in_progress; logic miss_data_ready; logic second_cycle; @@ -67,10 +68,10 @@ module icache( end always_ff @ (posedge clk) begin - if (rst) + if (rst | fetch_sub.flush) tag_update <= 0; else if (second_cycle) - tag_update <= icache_on & ~tag_hit; //Cache enabled, read miss + tag_update <= icache_on & ~tag_hit; //Cache enabled, read miss else tag_update <= 0; end @@ -94,14 +95,27 @@ module icache( end //request registered + logic request; always_ff @ (posedge clk) begin - if (rst) - l1_request.request <= 0; + if (rst | fetch_sub.flush) + request <= 0; else if (second_cycle) - l1_request.request <= ~tag_hit | ~icache_on; + request <= ~tag_hit | ~icache_on; else if (l1_request.ack) - l1_request.request <= 0; + request <= 0; end + assign l1_request.request = request; + + + always_ff @ (posedge clk) begin + if (rst | fetch_sub.flush) + miss_in_progress <= 0; + else if (l1_request.ack) + miss_in_progress <= 1; + else if (line_complete) + miss_in_progress <= 0; + end + /************************************* @@ -118,6 +132,7 @@ module icache( //Tag banks itag_banks icache_tag_banks (.*, + .rst(rst | fetch_sub.flush), .stage1_addr(fetch_sub.stage1_addr), .stage2_addr(fetch_sub.stage2_addr), .update_way(tag_update_way), @@ -161,7 +176,7 @@ module icache( if (rst) miss_data_ready <= 0; else - miss_data_ready <= l1_response.data_valid & is_target_word; + miss_data_ready <= miss_in_progress & l1_response.data_valid & is_target_word & ~fetch_sub.flush; end @@ -193,7 +208,7 @@ module icache( idle <= 1; else if (fetch_sub.new_request & ~fetch_sub.flush) idle <= 0; - else if (memory_complete | tag_hit) //read miss OR write through complete + else if (memory_complete | tag_hit | (second_cycle & fetch_sub.flush) | (request & ~l1_request.ack & fetch_sub.flush)) //read miss OR write through complete idle <= 1; end diff --git a/l2_arbiter/l2_arbiter.sv b/l2_arbiter/l2_arbiter.sv index fe9cbf8..569280d 100755 --- a/l2_arbiter/l2_arbiter.sv +++ b/l2_arbiter/l2_arbiter.sv @@ -162,6 +162,7 @@ module l2_arbiter ( assign mem.be = mem_addr_fifo_data_out.be; assign mem.is_amo = mem_addr_fifo_data_out.is_amo; assign mem.amo_type_or_burst_size = mem_addr_fifo_data_out.amo_type_or_burst_size; + assign mem.id = mem_addr_fifo_data_out.id; l2_fifo #(.DATA_WIDTH($bits(l2_mem_request_t)), .FIFO_DEPTH(L2_MEM_ADDR_FIFO_DEPTH)) input_fifo (.*, .fifo(mem_addr_fifo)); diff --git a/test_benches/taiga_full_simulation.sv b/test_benches/taiga_full_simulation.sv deleted file mode 100644 index 66c6d18..0000000 --- a/test_benches/taiga_full_simulation.sv +++ /dev/null @@ -1,456 +0,0 @@ -/* - * Copyright © 2017 Eric Matthews, Lesley Shannon - * - * 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. - * - * Initial code developed under the supervision of Dr. Lesley Shannon, - * Reconfigurable Computing Lab, Simon Fraser University. - * - * Author(s): - * Eric Matthews - */ - -`timescale 1ns/1ns - -import tb_tools::*; -import taiga_config::*; -import taiga_types::*; -import l2_config_and_types::*; - -`define MEMORY_FILE "/home/ematthew/taiga/tools/cubic.sim_init" //change this to appropriate location "/home/ematthew/Downloads/dhrystone.riscv.sim_init" -`define UART_LOG "/home/ematthew/uart.log" //change this to appropriate location - -module taiga_full_simulation (); - logic [3:0] WRITE_COUNTER_MAX; - logic [3:0] READ_COUNTER_MAX; - assign READ_COUNTER_MAX = 4'b0101; - assign WRITE_COUNTER_MAX = 4'b0101; - - logic simulator_clk; - logic simulator_resetn; - logic peripheral_resetn; - logic interconnect_resetn; - //axi block diagram inputs - logic axi_clk; - logic resetn; - logic sin; - - //AXI memory - logic [31:0]axi_araddr; - logic [1:0]axi_arburst; - logic [3:0]axi_arcache; - logic [5:0]axi_arid; - logic [7:0]axi_arlen; - logic [0:0]axi_arlock; - logic [2:0]axi_arprot; - logic [3:0]axi_arqos; - logic axi_arready; - logic [3:0]axi_arregion; - logic [2:0]axi_arsize; - logic axi_arvalid; - logic [31:0]axi_awaddr; - logic [1:0]axi_awburst; - logic [3:0]axi_awcache; - logic [5:0]axi_awid; - logic [7:0]axi_awlen; - logic [0:0]axi_awlock; - logic [2:0]axi_awprot; - logic [3:0]axi_awqos; - logic axi_awready; - logic [3:0]axi_awregion; - logic [2:0]axi_awsize; - logic axi_awvalid; - logic [5:0]axi_bid; - logic axi_bready; - logic [1:0]axi_bresp; - logic axi_bvalid; - logic [31:0]axi_rdata; - logic [5:0]axi_rid; - logic axi_rlast; - logic axi_rready; - logic [1:0]axi_rresp; - logic axi_rvalid; - logic [31:0]axi_wdata; - logic axi_wlast; - logic axi_wready; - logic [3:0]axi_wstrb; - logic axi_wvalid; - logic [5:0]axi_wid; - - - axi_interface ddr_axi(); - - //axi block diagram outputs - logic processor_reset; - logic processor_clk; - logic sout; - - logic clk; - logic rst; - logic placer_rseed; - - - //***************************** - - assign axi_clk = simulator_clk; - assign processor_clk = simulator_clk; - assign resetn = simulator_resetn; - - assign clk = simulator_clk; - assign rst = processor_reset; - - local_memory_interface instruction_bram(); - local_memory_interface data_bram(); - - axi_interface m_axi(); - avalon_interface m_avalon(); - wishbone_interface m_wishbone(); - - l2_requester_interface l2[L2_NUM_PORTS-1:0](); - l2_memory_interface mem(); - - trace_outputs_t tr; - - logic [63:0] operand_stall; - logic [63:0] unit_stall; - logic [63:0] no_id_stall; - logic [63:0] no_instruction_stall; - logic [63:0] other_stall; - - logic [63:0] instruction_issued_dec; - - //Register File - logic [63:0] rs1_forwarding_needed; - logic [63:0] rs2_forwarding_needed; - logic [63:0] rs1_and_rs2_forwarding_needed; - - //Branch Unit - logic [63:0] branch_misspredict; - logic [63:0] return_misspredict; - - //Writeback - logic [63:0] wb_mux_contention; - - - - - - - logic interrupt; - logic timer_interrupt; - - logic[31:0] dec_pc_debug; - logic[31:0] if2_pc_debug; - logic dec_advance_debug; - - logic[31:0] dec_instruction2; - logic[31:0] dec_instruction; - - - integer output_file; - integer output_file2; - - //assign l2[1].request = 0; - assign l2[1].request_push = 0; - assign l2[1].wr_data_push = 0; - assign l2[1].inv_ack = l2[1].inv_valid; - assign l2[1].rd_data_ack = l2[1].rd_data_valid; - - sim_mem simulation_mem = new(); - - - //RAM Block - assign instruction_bram.data_in = '0; - always_ff @(posedge processor_clk) begin - if (instruction_bram.en) begin - instruction_bram.data_out <= simulation_mem.readw(instruction_bram.addr); - simulation_mem.writew(instruction_bram.addr,instruction_bram.data_in, instruction_bram.be); - end - else begin - instruction_bram.data_out <= 0; - end - end - - always_ff @(posedge processor_clk) begin - if (data_bram.en) begin - data_bram.data_out <= simulation_mem.readw(data_bram.addr); - simulation_mem.writew(data_bram.addr,data_bram.data_in, data_bram.be); - end - else begin - data_bram.data_out <= 0; - end - end - - taiga uut (.*, .l2(l2[0])); - - //design_2 infra(.*); - - l2_arbiter l2_arb (.*, .request(l2)); - - axi_to_arb l2_to_mem (.*, .l2(mem)); - - axi_mem_sim #(`MEMORY_FILE) ddr_interface (.*, .axi(ddr_axi), .if_pc(if2_pc_debug), .dec_pc(tr.instruction_pc_dec)); - - always - #1 simulator_clk = ~simulator_clk; - - initial begin - simulator_clk = 0; - interrupt = 0; - timer_interrupt = 0; - simulator_resetn = 0; - - simulation_mem.load_program(`MEMORY_FILE, RESET_VEC); - - output_file = $fopen(`UART_LOG, "w"); - if (output_file == 0) begin - $error ("couldn't open log file"); - $finish; - end - -// output_file2 = $fopen("/home/ematthew/trace", "w"); -// if (output_file2 == 0) begin -// $error ("couldn't open log file"); -// $finish; -// end - - do_reset(); - - //#1200000; - //$fclose(output_file); - //$fclose(output_file2); - - //$finish; - end - - - - - task do_reset; - begin - interconnect_resetn = 1'b0; - #100 interconnect_resetn = 1'b1; - peripheral_resetn = 1'b0; - #100 peripheral_resetn = 1'b1; - processor_reset = 1'b1; - #100 processor_reset = 1'b0; - end - endtask - - //read channel - logic[3:0] read_counter; - logic begin_read_counter; - - always_ff @(posedge simulator_clk) begin - if (!peripheral_resetn) begin - m_axi.rvalid <= 0; - m_axi.arready <= 1; //You want it to start at ready - m_axi.rresp <= 0; - read_counter <= READ_COUNTER_MAX; - end - else begin - if(m_axi.arready == 1 && m_axi.arvalid == 1) begin - m_axi.arready <= 0; - begin_read_counter <= 1; - m_axi.rdata <= 32'hFFFFFF21; - end - - if(begin_read_counter) begin - if(read_counter == 0) begin - m_axi.rvalid <= 1; - m_axi.arready <= 1; - read_counter <= READ_COUNTER_MAX; - begin_read_counter <= 0; - end - else begin - read_counter <= read_counter - 1; - m_axi.rvalid <= 0; - end - end - - if(m_axi.rvalid && m_axi.rready) begin - m_axi.rvalid <= 0; - end - - end - end - - //Write channel - //write address - logic[3:0] write_counter; - logic begin_write_counter; - - always_ff @(posedge simulator_clk) begin - if (!peripheral_resetn) begin - m_axi.wready <= 0; - m_axi.awready <= 1; //You want it to start at ready - m_axi.bresp <= 0; - write_counter <= WRITE_COUNTER_MAX; - end - else begin - if(m_axi.awready == 1 && m_axi.awvalid == 1) begin - m_axi.awready <= 0; - begin_write_counter <= 1; - end - - if(begin_write_counter) begin - if(write_counter == 0) begin - m_axi.awready <= 1; - m_axi.wready <= 1; - write_counter <= WRITE_COUNTER_MAX; - begin_write_counter <= 0; - end - else begin - write_counter <= write_counter - 1; - m_axi.wready <= 0; - end - end - - if(m_axi.bready == 1 && m_axi.wready) begin - m_axi.bvalid <= 1; - m_axi.bresp = 0; - end - else begin - m_axi.bvalid <= 0; - m_axi.bresp = 0; - end - - if(m_axi.wready & m_axi.wvalid) begin - m_axi.wready <= 0; - end - end - end - - assign ddr_axi.araddr = axi_araddr; - assign ddr_axi.arburst = axi_arburst; - assign ddr_axi.arcache = axi_arcache; - assign ddr_axi.arid = axi_arid; - assign ddr_axi.arlen = {4'b0, axi_arlen[3:0]}; - assign axi_arready = ddr_axi.arready; - assign ddr_axi.arsize = axi_arsize; - assign ddr_axi.arvalid = axi_arvalid; - - assign ddr_axi.awaddr = axi_awaddr; - assign ddr_axi.awburst = axi_awburst; - assign ddr_axi.awcache = axi_awcache; - assign ddr_axi.awid = axi_awid; - assign ddr_axi.awlen = axi_awlen; - assign axi_awready = ddr_axi.awready; - assign ddr_axi.awvalid = axi_awvalid; - - assign axi_bid = ddr_axi.bid; - assign ddr_axi.bready = axi_bready; - assign axi_bresp = ddr_axi.bresp; - assign axi_bvalid = ddr_axi.bvalid; - - assign axi_rdata = ddr_axi.rdata; - assign axi_rid = ddr_axi.rid; - assign axi_rlast = ddr_axi.rlast; - assign ddr_axi.rready = axi_rready; - assign axi_rresp = ddr_axi.rresp; - assign axi_rvalid = ddr_axi.rvalid; - - assign ddr_axi.wdata = axi_wdata; - assign ddr_axi.wlast = axi_wlast; - assign axi_wready = ddr_axi.wready; - assign ddr_axi.wstrb = axi_wstrb; - assign ddr_axi.wvalid = axi_wvalid; - - - //Capture writes to UART - always_ff @(posedge simulator_clk) begin - //if (m_axi.awready && m_axi.awaddr[13:0] == 4096) begin - if (m_axi.wvalid && m_axi.wready && m_axi.awaddr[13:0] == 4096) begin - $fwrite(output_file, "%c",m_axi.wdata[7:0]); - $fflush(output_file); - end - end - - - assign sin = 0; - - assign dec_instruction2 = simulation_mem.readw(tr.instruction_pc_dec[31:2]); - - always_ff @(posedge simulator_clk) begin - //addi r0 r0 1 - if (dec_instruction2 == 32'h00a00013) begin - $fwrite(output_file, "\noperand_stall %d\n",operand_stall); - $fwrite(output_file, "unit_stall %d\n",unit_stall); - $fwrite(output_file, "no_id_stall %d\n",no_id_stall); - $fwrite(output_file, "no_instruction_stall %d\n",no_instruction_stall); - $fwrite(output_file, "other_stall %d\n",other_stall); - $fwrite(output_file, "instruction_issued_dec %d\n",instruction_issued_dec); - $fwrite(output_file, "branch_misspredict %d\n",branch_misspredict); - $fwrite(output_file, "return_misspredict %d\n",return_misspredict); - $fwrite(output_file, "rs1_forwarding_needed %d\n",rs1_forwarding_needed); - $fwrite(output_file, "rs2_forwarding_needed %d\n",rs2_forwarding_needed); - $fwrite(output_file, "rs1_OR_rs2_forwarding_needed %d\n",rs1_forwarding_needed + rs2_forwarding_needed); - $fwrite(output_file, "rs1_AND_rs2_forwarding_needed %d\n",rs1_and_rs2_forwarding_needed); - $fclose(output_file); - $fclose(output_file2); - $finish; - end - end - - always_ff @(posedge simulator_clk) begin - if (rst) begin - operand_stall = 0; - unit_stall = 0; - no_id_stall = 0; - no_instruction_stall = 0; - other_stall = 0; - instruction_issued_dec = 0; - rs1_forwarding_needed = 0; - rs2_forwarding_needed = 0; - rs1_and_rs2_forwarding_needed = 0; - branch_misspredict = 0; - return_misspredict = 0; - end - - if (tr.events.operand_stall) - operand_stall <= operand_stall + 1; - if (tr.events.unit_stall) - unit_stall <= unit_stall + 1; - if (tr.events.no_id_stall) - no_id_stall <= no_id_stall + 1; - if (tr.events.no_instruction_stall) - no_instruction_stall <= no_instruction_stall + 1; - if (tr.events.other_stall) - other_stall <= other_stall + 1; - if (tr.events.instruction_issued_dec) - instruction_issued_dec <= instruction_issued_dec + 1; - if (tr.events.rs1_forwarding_needed) - rs1_forwarding_needed <= rs1_forwarding_needed + 1; - if (tr.events.rs2_forwarding_needed) - rs2_forwarding_needed <= rs2_forwarding_needed + 1; - if (tr.events.rs1_and_rs2_forwarding_needed) - rs1_and_rs2_forwarding_needed <= rs1_and_rs2_forwarding_needed + 1; - if (tr.events.branch_misspredict) - branch_misspredict <= branch_misspredict + 1; - if (tr.events.return_misspredict) - return_misspredict <= return_misspredict + 1; - end - - - //////////////////////////////////////////////////// - -// always_ff @(posedge clk) begin -// if (dec_advance_debug) begin -// $fwrite(output_file2, simulation_mem.readopcode(instruction_bram.addr)); -// $fwrite(output_file2, "\n"); -// end -// end - - - -endmodule diff --git a/test_benches/taiga_full_simulation.wcfg b/test_benches/taiga_full_simulation.wcfg deleted file mode 100755 index 78e06b1..0000000 --- a/test_benches/taiga_full_simulation.wcfg +++ /dev/null @@ -1,678 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - clk - clk - - - rst - rst - - - Fetch - label - - - next_pc[31:0] - next_pc[31:0] - - - if_pc[31:0] - if_pc[31:0] - - - stage2_phys_address[31:0] - stage2_phys_address[31:0] - - - inflight_count[2:0] - inflight_count[2:0] - - - space_in_inst_buffer - space_in_inst_buffer - - - gc_fetch_flush - gc_fetch_flush - - - new_issue - new_issue - - - new_mem_request - new_mem_request - - - delayed_flush - delayed_flush - - - exception - exception - - - mem_valid - mem_valid - - - I Cache - label - - - new_issue - new_issue - - - data_valid - data_valid - - - Global Control - label - - - clk - clk - - - rst - rst - - - state[31:0] - state[31:0] - - - next_state[31:0] - next_state[31:0] - - - gc_issue_hold - gc_issue_hold - - - gc_issue_flush - gc_issue_flush - - - gc_fetch_flush - gc_fetch_flush - - - Decode/Issue - label - - - clk - clk - - - .instruction[31:0] - .instruction[31:0] - - - .pc[31:0] - .pc[31:0] - - - dec_inst_text[0:511] - dec_inst_text[0:511] - ASCIIRADIX - - - issue_valid - issue_valid - - - load_store_operands_ready - load_store_operands_ready - - - operands_ready - operands_ready - - - load_store_forward_possible - load_store_forward_possible - - - instruction_issued - instruction_issued - - - new_request[5:0] - new_request[5:0] - - - issue_ready[5:0] - issue_ready[5:0] - - - issue[5:0] - issue[5:0] - - - rs1_feedforward - rs1_feedforward - - - rs2_feedforward - rs2_feedforward - - - uses_rs1 - uses_rs1 - - - uses_rs2 - uses_rs2 - - - uses_rd - uses_rd - - - future_rd_addr[4:0] - future_rd_addr[4:0] - UNSIGNEDDECRADIX - - - Register File - label - - - clr - clr - - - sim_register - sim_register - - - reg_inuse_A[31:0] - reg_inuse_A[31:0] - - - reg_inuse_B[31:0] - reg_inuse_B[31:0] - - - sim_inuse[31:0] - sim_inuse[31:0] - - - in_use_by[31:0][1:0] - in_use_by[31:0][1:0] - UNSIGNEDDECRADIX - - - WB & Inst queue - label - - - dec_inst_text[0:511] - dec_inst_text[0:511] - ASCIIRADIX - - - id_done_new[3:0] - id_done_new[3:0] - - - id_done[3:0] - id_done[3:0] - - - id_done_r[3:0] - id_done_r[3:0] - - - id_available - id_available - - - issue_id[1:0] - issue_id[1:0] - - - issued - issued - - - unit_instruction_id[3:0][1:0] - unit_instruction_id[3:0][1:0] - - - unit_rd[3:0][31:0] - unit_rd[3:0][31:0] - - - retired_id[1:0] - retired_id[1:0] - - - retired - retired - - - retired_instruction_packet - retired_instruction_packet - - - Div Unit - label - - - computation_complete - computation_complete - - - div_done - div_done - - - start_algorithm - start_algorithm - - - in_progress - in_progress - - - .reuse_result - .reuse_result - - - LS Unit - label - - - clk - clk - - - valid - valid - - - push - push - - - pop - pop - - - full - full - - - last_unit[1:0] - last_unit[1:0] - - - sub_unit_address_match[1:0] - sub_unit_address_match[1:0] - - - current_unit[1:0] - current_unit[1:0] - - - unit_stall - unit_stall - - - issue_request - issue_request - - - ls_inputs - ls_inputs - - - stage1 - stage1 - - - unit_ready[1:0] - unit_ready[1:0] - - - unit_data_valid[1:0] - unit_data_valid[1:0] - #00FF00 - true - - - load_complete - load_complete - - - unit_data_valid[1:0] - unit_data_valid[1:0] - - - unit_data_array[1:0][31:0] - unit_data_array[1:0][31:0] - - - final_load_data[31:0] - final_load_data[31:0] - - - DCache - label - - - clk - clk - - - valid - valid - - - L2 - label - - - request_push - request_push - - - requests[1:0] - requests[1:0] - - - grantee_i[0:0] - grantee_i[0:0] - - - grantee_v[1:0] - grantee_v[1:0] - - - grantee_valid - grantee_valid - - - strobe - strobe - - - pop - pop - - - request_full - request_full - - - advance - advance - - - inv_valid - inv_valid - - - inv_ack - inv_ack - - - con_result - con_result - - - con_valid - con_valid - - - wr_data[31:0] - wr_data[31:0] - - - wr_data_push - wr_data_push - - - data_full - data_full - - - rd_data[31:0] - rd_data[31:0] - - - rd_sub_id[1:0] - rd_sub_id[1:0] - - - rd_data_valid - rd_data_valid - - - rd_data_ack - rd_data_ack - - - request_pop - request_pop - - - request_valid - request_valid - - - abort - abort - - - wr_data[31:0] - wr_data[31:0] - - - wr_data_valid - wr_data_valid - - - wr_data_read - wr_data_read - - - rd_data[31:0] - rd_data[31:0] - - - rd_id[2:0] - rd_id[2:0] - - - rd_data_valid - rd_data_valid - - - reserv_valid - reserv_valid - - - reserv_request - reserv_request - - - reserv_id[0:0] - reserv_id[0:0] - - - reserv_id_v[1:0] - reserv_id_v[1:0] - - - new_attr - new_attr - - - \genblk1.genblk1.lut_ram [15:0][6:0] - \genblk1.genblk1.lut_ram [15:0][6:0] - - - \genblk1.genblk1.read_index [3:0] - \genblk1.genblk1.read_index [3:0] - - - \genblk1.genblk1.write_index [3:0] - \genblk1.genblk1.write_index [3:0] - - - current_attr - current_attr - - - valid - valid - - - push - push - - - pop - pop - - - Mem AXI - label - - - clk - clk - - - axi_araddr[31:0] - axi_araddr[31:0] - - - axi_arready - axi_arready - - - axi_arvalid - axi_arvalid - - - axi_rready - axi_rready - - - axi_rvalid - axi_rvalid - - - axi_awburst[1:0] - axi_awburst[1:0] - - - axi_rdata[31:0] - axi_rdata[31:0] - - - axi_awaddr[31:0] - axi_awaddr[31:0] - - - axi_awready - axi_awready - - - axi_awvalid - axi_awvalid - - - axi_wready - axi_wready - - - axi_wvalid - axi_wvalid - - - axi_wlast - axi_wlast - - - axi_wdata[31:0] - axi_wdata[31:0] - - - axi_wstrb[3:0] - axi_wstrb[3:0] - - - write_in_progress - write_in_progress - - - write_transfer_complete - write_transfer_complete - - - write_request_count[47:0] - write_request_count[47:0] - - - read_request_count[47:0] - read_request_count[47:0] - - - read_burst_count[31:0] - read_burst_count[31:0] - - - arlen[7:0] - arlen[7:0] - - - FIFOs - label - - - label - full - full - load_store_input_full - - - label - full - full - divider_input_full - - diff --git a/test_benches/verilator/AXI_DDR_simulation/DDR_init.txt b/test_benches/verilator/AXI_DDR_simulation/DDR_init.txt new file mode 100644 index 0000000..c9a0d14 --- /dev/null +++ b/test_benches/verilator/AXI_DDR_simulation/DDR_init.txt @@ -0,0 +1,10240 @@ +00000000 +00000001 +00000002 +00000003 +00000004 +00000005 +00000006 +00000007 +00000008 +00000009 +0000000a +0000000b +0000000c +0000000d +0000000e +0000000f +00000010 +00000011 +00000012 +00000013 +00000014 +00000015 +00000016 +00000017 +00000018 +00000019 +0000001a +0000001b +0000001c +0000001d +0000001e +0000001f +00000020 +00000021 +00000022 +00000023 +00000024 +00000025 +00000026 +00000027 +00000028 +00000029 +0000002a +0000002b +0000002c +0000002d +0000002e +0000002f +00000030 +00000031 +00000032 +00000033 +00000034 +00000035 +00000036 +00000037 +00000038 +00000039 +0000003a +0000003b +0000003c +0000003d +0000003e +0000003f +00000040 +00000041 +00000042 +00000043 +00000044 +00000045 +00000046 +00000047 +00000048 +00000049 +0000004a +0000004b +0000004c +0000004d +0000004e +0000004f +00000050 +00000051 +00000052 +00000053 +00000054 +00000055 +00000056 +00000057 +00000058 +00000059 +0000005a +0000005b +0000005c +0000005d +0000005e +0000005f +00000060 +00000061 +00000062 +00000063 +00000064 +00000065 +00000066 +00000067 +00000068 +00000069 +0000006a +0000006b +0000006c +0000006d +0000006e +0000006f +00000070 +00000071 +00000072 +00000073 +00000074 +00000075 +00000076 +00000077 +00000078 +00000079 +0000007a +0000007b +0000007c +0000007d +0000007e +0000007f +00000080 +00000081 +00000082 +00000083 +00000084 +00000085 +00000086 +00000087 +00000088 +00000089 +0000008a +0000008b +0000008c +0000008d +0000008e +0000008f +00000090 +00000091 +00000092 +00000093 +00000094 +00000095 +00000096 +00000097 +00000098 +00000099 +0000009a +0000009b +0000009c +0000009d +0000009e +0000009f +000000a0 +000000a1 +000000a2 +000000a3 +000000a4 +000000a5 +000000a6 +000000a7 +000000a8 +000000a9 +000000aa +000000ab +000000ac +000000ad +000000ae +000000af +000000b0 +000000b1 +000000b2 +000000b3 +000000b4 +000000b5 +000000b6 +000000b7 +000000b8 +000000b9 +000000ba +000000bb +000000bc +000000bd +000000be +000000bf +000000c0 +000000c1 +000000c2 +000000c3 +000000c4 +000000c5 +000000c6 +000000c7 +000000c8 +000000c9 +000000ca +000000cb +000000cc +000000cd +000000ce +000000cf +000000d0 +000000d1 +000000d2 +000000d3 +000000d4 +000000d5 +000000d6 +000000d7 +000000d8 +000000d9 +000000da +000000db +000000dc +000000dd +000000de +000000df +000000e0 +000000e1 +000000e2 +000000e3 +000000e4 +000000e5 +000000e6 +000000e7 +000000e8 +000000e9 +000000ea +000000eb +000000ec +000000ed +000000ee +000000ef +000000f0 +000000f1 +000000f2 +000000f3 +000000f4 +000000f5 +000000f6 +000000f7 +000000f8 +000000f9 +000000fa +000000fb +000000fc +000000fd +000000fe +000000ff +00000100 +00000101 +00000102 +00000103 +00000104 +00000105 +00000106 +00000107 +00000108 +00000109 +0000010a +0000010b +0000010c +0000010d +0000010e +0000010f +00000110 +00000111 +00000112 +00000113 +00000114 +00000115 +00000116 +00000117 +00000118 +00000119 +0000011a +0000011b +0000011c +0000011d +0000011e +0000011f +00000120 +00000121 +00000122 +00000123 +00000124 +00000125 +00000126 +00000127 +00000128 +00000129 +0000012a +0000012b +0000012c +0000012d +0000012e +0000012f +00000130 +00000131 +00000132 +00000133 +00000134 +00000135 +00000136 +00000137 +00000138 +00000139 +0000013a +0000013b +0000013c +0000013d +0000013e +0000013f +00000140 +00000141 +00000142 +00000143 +00000144 +00000145 +00000146 +00000147 +00000148 +00000149 +0000014a +0000014b +0000014c +0000014d +0000014e +0000014f +00000150 +00000151 +00000152 +00000153 +00000154 +00000155 +00000156 +00000157 +00000158 +00000159 +0000015a +0000015b +0000015c +0000015d +0000015e +0000015f +00000160 +00000161 +00000162 +00000163 +00000164 +00000165 +00000166 +00000167 +00000168 +00000169 +0000016a +0000016b +0000016c +0000016d +0000016e +0000016f +00000170 +00000171 +00000172 +00000173 +00000174 +00000175 +00000176 +00000177 +00000178 +00000179 +0000017a +0000017b +0000017c +0000017d +0000017e +0000017f +00000180 +00000181 +00000182 +00000183 +00000184 +00000185 +00000186 +00000187 +00000188 +00000189 +0000018a +0000018b +0000018c +0000018d +0000018e +0000018f +00000190 +00000191 +00000192 +00000193 +00000194 +00000195 +00000196 +00000197 +00000198 +00000199 +0000019a +0000019b +0000019c +0000019d +0000019e +0000019f +000001a0 +000001a1 +000001a2 +000001a3 +000001a4 +000001a5 +000001a6 +000001a7 +000001a8 +000001a9 +000001aa +000001ab +000001ac +000001ad +000001ae +000001af +000001b0 +000001b1 +000001b2 +000001b3 +000001b4 +000001b5 +000001b6 +000001b7 +000001b8 +000001b9 +000001ba +000001bb +000001bc +000001bd +000001be +000001bf +000001c0 +000001c1 +000001c2 +000001c3 +000001c4 +000001c5 +000001c6 +000001c7 +000001c8 +000001c9 +000001ca +000001cb +000001cc +000001cd +000001ce +000001cf +000001d0 +000001d1 +000001d2 +000001d3 +000001d4 +000001d5 +000001d6 +000001d7 +000001d8 +000001d9 +000001da +000001db +000001dc +000001dd +000001de +000001df +000001e0 +000001e1 +000001e2 +000001e3 +000001e4 +000001e5 +000001e6 +000001e7 +000001e8 +000001e9 +000001ea +000001eb +000001ec +000001ed +000001ee +000001ef +000001f0 +000001f1 +000001f2 +000001f3 +000001f4 +000001f5 +000001f6 +000001f7 +000001f8 +000001f9 +000001fa +000001fb +000001fc +000001fd +000001fe +000001ff +00000200 +00000201 +00000202 +00000203 +00000204 +00000205 +00000206 +00000207 +00000208 +00000209 +0000020a +0000020b +0000020c +0000020d +0000020e +0000020f +00000210 +00000211 +00000212 +00000213 +00000214 +00000215 +00000216 +00000217 +00000218 +00000219 +0000021a +0000021b +0000021c +0000021d +0000021e +0000021f +00000220 +00000221 +00000222 +00000223 +00000224 +00000225 +00000226 +00000227 +00000228 +00000229 +0000022a +0000022b +0000022c +0000022d +0000022e +0000022f +00000230 +00000231 +00000232 +00000233 +00000234 +00000235 +00000236 +00000237 +00000238 +00000239 +0000023a +0000023b +0000023c +0000023d +0000023e +0000023f +00000240 +00000241 +00000242 +00000243 +00000244 +00000245 +00000246 +00000247 +00000248 +00000249 +0000024a +0000024b +0000024c +0000024d +0000024e +0000024f +00000250 +00000251 +00000252 +00000253 +00000254 +00000255 +00000256 +00000257 +00000258 +00000259 +0000025a +0000025b +0000025c +0000025d +0000025e +0000025f +00000260 +00000261 +00000262 +00000263 +00000264 +00000265 +00000266 +00000267 +00000268 +00000269 +0000026a +0000026b +0000026c +0000026d +0000026e +0000026f +00000270 +00000271 +00000272 +00000273 +00000274 +00000275 +00000276 +00000277 +00000278 +00000279 +0000027a +0000027b +0000027c +0000027d +0000027e +0000027f +00000280 +00000281 +00000282 +00000283 +00000284 +00000285 +00000286 +00000287 +00000288 +00000289 +0000028a +0000028b +0000028c +0000028d +0000028e +0000028f +00000290 +00000291 +00000292 +00000293 +00000294 +00000295 +00000296 +00000297 +00000298 +00000299 +0000029a +0000029b +0000029c +0000029d +0000029e +0000029f +000002a0 +000002a1 +000002a2 +000002a3 +000002a4 +000002a5 +000002a6 +000002a7 +000002a8 +000002a9 +000002aa +000002ab +000002ac +000002ad +000002ae +000002af +000002b0 +000002b1 +000002b2 +000002b3 +000002b4 +000002b5 +000002b6 +000002b7 +000002b8 +000002b9 +000002ba +000002bb +000002bc +000002bd +000002be +000002bf +000002c0 +000002c1 +000002c2 +000002c3 +000002c4 +000002c5 +000002c6 +000002c7 +000002c8 +000002c9 +000002ca +000002cb +000002cc +000002cd +000002ce +000002cf +000002d0 +000002d1 +000002d2 +000002d3 +000002d4 +000002d5 +000002d6 +000002d7 +000002d8 +000002d9 +000002da +000002db +000002dc +000002dd +000002de +000002df +000002e0 +000002e1 +000002e2 +000002e3 +000002e4 +000002e5 +000002e6 +000002e7 +000002e8 +000002e9 +000002ea +000002eb +000002ec +000002ed +000002ee +000002ef +000002f0 +000002f1 +000002f2 +000002f3 +000002f4 +000002f5 +000002f6 +000002f7 +000002f8 +000002f9 +000002fa +000002fb +000002fc +000002fd +000002fe +000002ff +00000300 +00000301 +00000302 +00000303 +00000304 +00000305 +00000306 +00000307 +00000308 +00000309 +0000030a +0000030b +0000030c +0000030d +0000030e +0000030f +00000310 +00000311 +00000312 +00000313 +00000314 +00000315 +00000316 +00000317 +00000318 +00000319 +0000031a +0000031b +0000031c +0000031d +0000031e +0000031f +00000320 +00000321 +00000322 +00000323 +00000324 +00000325 +00000326 +00000327 +00000328 +00000329 +0000032a +0000032b +0000032c +0000032d +0000032e +0000032f +00000330 +00000331 +00000332 +00000333 +00000334 +00000335 +00000336 +00000337 +00000338 +00000339 +0000033a +0000033b +0000033c +0000033d +0000033e +0000033f +00000340 +00000341 +00000342 +00000343 +00000344 +00000345 +00000346 +00000347 +00000348 +00000349 +0000034a +0000034b +0000034c +0000034d +0000034e +0000034f +00000350 +00000351 +00000352 +00000353 +00000354 +00000355 +00000356 +00000357 +00000358 +00000359 +0000035a +0000035b +0000035c +0000035d +0000035e +0000035f +00000360 +00000361 +00000362 +00000363 +00000364 +00000365 +00000366 +00000367 +00000368 +00000369 +0000036a +0000036b +0000036c +0000036d +0000036e +0000036f +00000370 +00000371 +00000372 +00000373 +00000374 +00000375 +00000376 +00000377 +00000378 +00000379 +0000037a +0000037b +0000037c +0000037d +0000037e +0000037f +00000380 +00000381 +00000382 +00000383 +00000384 +00000385 +00000386 +00000387 +00000388 +00000389 +0000038a +0000038b +0000038c +0000038d +0000038e +0000038f +00000390 +00000391 +00000392 +00000393 +00000394 +00000395 +00000396 +00000397 +00000398 +00000399 +0000039a +0000039b +0000039c +0000039d +0000039e +0000039f +000003a0 +000003a1 +000003a2 +000003a3 +000003a4 +000003a5 +000003a6 +000003a7 +000003a8 +000003a9 +000003aa +000003ab +000003ac +000003ad +000003ae +000003af +000003b0 +000003b1 +000003b2 +000003b3 +000003b4 +000003b5 +000003b6 +000003b7 +000003b8 +000003b9 +000003ba +000003bb +000003bc +000003bd +000003be +000003bf +000003c0 +000003c1 +000003c2 +000003c3 +000003c4 +000003c5 +000003c6 +000003c7 +000003c8 +000003c9 +000003ca +000003cb +000003cc +000003cd +000003ce +000003cf +000003d0 +000003d1 +000003d2 +000003d3 +000003d4 +000003d5 +000003d6 +000003d7 +000003d8 +000003d9 +000003da +000003db +000003dc +000003dd +000003de +000003df +000003e0 +000003e1 +000003e2 +000003e3 +000003e4 +000003e5 +000003e6 +000003e7 +000003e8 +000003e9 +000003ea +000003eb +000003ec +000003ed +000003ee +000003ef +000003f0 +000003f1 +000003f2 +000003f3 +000003f4 +000003f5 +000003f6 +000003f7 +000003f8 +000003f9 +000003fa +000003fb +000003fc +000003fd +000003fe +000003ff +00000400 +00000401 +00000402 +00000403 +00000404 +00000405 +00000406 +00000407 +00000408 +00000409 +0000040a +0000040b +0000040c +0000040d +0000040e +0000040f +00000410 +00000411 +00000412 +00000413 +00000414 +00000415 +00000416 +00000417 +00000418 +00000419 +0000041a +0000041b +0000041c +0000041d +0000041e +0000041f +00000420 +00000421 +00000422 +00000423 +00000424 +00000425 +00000426 +00000427 +00000428 +00000429 +0000042a +0000042b +0000042c +0000042d +0000042e +0000042f +00000430 +00000431 +00000432 +00000433 +00000434 +00000435 +00000436 +00000437 +00000438 +00000439 +0000043a +0000043b +0000043c +0000043d +0000043e +0000043f +00000440 +00000441 +00000442 +00000443 +00000444 +00000445 +00000446 +00000447 +00000448 +00000449 +0000044a +0000044b +0000044c +0000044d +0000044e +0000044f +00000450 +00000451 +00000452 +00000453 +00000454 +00000455 +00000456 +00000457 +00000458 +00000459 +0000045a +0000045b +0000045c +0000045d +0000045e +0000045f +00000460 +00000461 +00000462 +00000463 +00000464 +00000465 +00000466 +00000467 +00000468 +00000469 +0000046a +0000046b +0000046c +0000046d +0000046e +0000046f +00000470 +00000471 +00000472 +00000473 +00000474 +00000475 +00000476 +00000477 +00000478 +00000479 +0000047a +0000047b +0000047c +0000047d +0000047e +0000047f +00000480 +00000481 +00000482 +00000483 +00000484 +00000485 +00000486 +00000487 +00000488 +00000489 +0000048a +0000048b +0000048c +0000048d +0000048e +0000048f +00000490 +00000491 +00000492 +00000493 +00000494 +00000495 +00000496 +00000497 +00000498 +00000499 +0000049a +0000049b +0000049c +0000049d +0000049e +0000049f +000004a0 +000004a1 +000004a2 +000004a3 +000004a4 +000004a5 +000004a6 +000004a7 +000004a8 +000004a9 +000004aa +000004ab +000004ac +000004ad +000004ae +000004af +000004b0 +000004b1 +000004b2 +000004b3 +000004b4 +000004b5 +000004b6 +000004b7 +000004b8 +000004b9 +000004ba +000004bb +000004bc +000004bd +000004be +000004bf +000004c0 +000004c1 +000004c2 +000004c3 +000004c4 +000004c5 +000004c6 +000004c7 +000004c8 +000004c9 +000004ca +000004cb +000004cc +000004cd +000004ce +000004cf +000004d0 +000004d1 +000004d2 +000004d3 +000004d4 +000004d5 +000004d6 +000004d7 +000004d8 +000004d9 +000004da +000004db +000004dc +000004dd +000004de +000004df +000004e0 +000004e1 +000004e2 +000004e3 +000004e4 +000004e5 +000004e6 +000004e7 +000004e8 +000004e9 +000004ea +000004eb +000004ec +000004ed +000004ee +000004ef +000004f0 +000004f1 +000004f2 +000004f3 +000004f4 +000004f5 +000004f6 +000004f7 +000004f8 +000004f9 +000004fa +000004fb +000004fc +000004fd +000004fe +000004ff +00000500 +00000501 +00000502 +00000503 +00000504 +00000505 +00000506 +00000507 +00000508 +00000509 +0000050a +0000050b +0000050c +0000050d +0000050e +0000050f +00000510 +00000511 +00000512 +00000513 +00000514 +00000515 +00000516 +00000517 +00000518 +00000519 +0000051a +0000051b +0000051c +0000051d +0000051e +0000051f +00000520 +00000521 +00000522 +00000523 +00000524 +00000525 +00000526 +00000527 +00000528 +00000529 +0000052a +0000052b +0000052c +0000052d +0000052e +0000052f +00000530 +00000531 +00000532 +00000533 +00000534 +00000535 +00000536 +00000537 +00000538 +00000539 +0000053a +0000053b +0000053c +0000053d +0000053e +0000053f +00000540 +00000541 +00000542 +00000543 +00000544 +00000545 +00000546 +00000547 +00000548 +00000549 +0000054a +0000054b +0000054c +0000054d +0000054e +0000054f +00000550 +00000551 +00000552 +00000553 +00000554 +00000555 +00000556 +00000557 +00000558 +00000559 +0000055a +0000055b +0000055c +0000055d +0000055e +0000055f +00000560 +00000561 +00000562 +00000563 +00000564 +00000565 +00000566 +00000567 +00000568 +00000569 +0000056a +0000056b +0000056c +0000056d +0000056e +0000056f +00000570 +00000571 +00000572 +00000573 +00000574 +00000575 +00000576 +00000577 +00000578 +00000579 +0000057a +0000057b +0000057c +0000057d +0000057e +0000057f +00000580 +00000581 +00000582 +00000583 +00000584 +00000585 +00000586 +00000587 +00000588 +00000589 +0000058a +0000058b +0000058c +0000058d +0000058e +0000058f +00000590 +00000591 +00000592 +00000593 +00000594 +00000595 +00000596 +00000597 +00000598 +00000599 +0000059a +0000059b +0000059c +0000059d +0000059e +0000059f +000005a0 +000005a1 +000005a2 +000005a3 +000005a4 +000005a5 +000005a6 +000005a7 +000005a8 +000005a9 +000005aa +000005ab +000005ac +000005ad +000005ae +000005af +000005b0 +000005b1 +000005b2 +000005b3 +000005b4 +000005b5 +000005b6 +000005b7 +000005b8 +000005b9 +000005ba +000005bb +000005bc +000005bd +000005be +000005bf +000005c0 +000005c1 +000005c2 +000005c3 +000005c4 +000005c5 +000005c6 +000005c7 +000005c8 +000005c9 +000005ca +000005cb +000005cc +000005cd +000005ce +000005cf +000005d0 +000005d1 +000005d2 +000005d3 +000005d4 +000005d5 +000005d6 +000005d7 +000005d8 +000005d9 +000005da +000005db +000005dc +000005dd +000005de +000005df +000005e0 +000005e1 +000005e2 +000005e3 +000005e4 +000005e5 +000005e6 +000005e7 +000005e8 +000005e9 +000005ea +000005eb +000005ec +000005ed +000005ee +000005ef +000005f0 +000005f1 +000005f2 +000005f3 +000005f4 +000005f5 +000005f6 +000005f7 +000005f8 +000005f9 +000005fa +000005fb +000005fc +000005fd +000005fe +000005ff +00000600 +00000601 +00000602 +00000603 +00000604 +00000605 +00000606 +00000607 +00000608 +00000609 +0000060a +0000060b +0000060c +0000060d +0000060e +0000060f +00000610 +00000611 +00000612 +00000613 +00000614 +00000615 +00000616 +00000617 +00000618 +00000619 +0000061a +0000061b +0000061c +0000061d +0000061e +0000061f +00000620 +00000621 +00000622 +00000623 +00000624 +00000625 +00000626 +00000627 +00000628 +00000629 +0000062a +0000062b +0000062c +0000062d +0000062e +0000062f +00000630 +00000631 +00000632 +00000633 +00000634 +00000635 +00000636 +00000637 +00000638 +00000639 +0000063a +0000063b +0000063c +0000063d +0000063e +0000063f +00000640 +00000641 +00000642 +00000643 +00000644 +00000645 +00000646 +00000647 +00000648 +00000649 +0000064a +0000064b +0000064c +0000064d +0000064e +0000064f +00000650 +00000651 +00000652 +00000653 +00000654 +00000655 +00000656 +00000657 +00000658 +00000659 +0000065a +0000065b +0000065c +0000065d +0000065e +0000065f +00000660 +00000661 +00000662 +00000663 +00000664 +00000665 +00000666 +00000667 +00000668 +00000669 +0000066a +0000066b +0000066c +0000066d +0000066e +0000066f +00000670 +00000671 +00000672 +00000673 +00000674 +00000675 +00000676 +00000677 +00000678 +00000679 +0000067a +0000067b +0000067c +0000067d +0000067e +0000067f +00000680 +00000681 +00000682 +00000683 +00000684 +00000685 +00000686 +00000687 +00000688 +00000689 +0000068a +0000068b +0000068c +0000068d +0000068e +0000068f +00000690 +00000691 +00000692 +00000693 +00000694 +00000695 +00000696 +00000697 +00000698 +00000699 +0000069a +0000069b +0000069c +0000069d +0000069e +0000069f +000006a0 +000006a1 +000006a2 +000006a3 +000006a4 +000006a5 +000006a6 +000006a7 +000006a8 +000006a9 +000006aa +000006ab +000006ac +000006ad +000006ae +000006af +000006b0 +000006b1 +000006b2 +000006b3 +000006b4 +000006b5 +000006b6 +000006b7 +000006b8 +000006b9 +000006ba +000006bb +000006bc +000006bd +000006be +000006bf +000006c0 +000006c1 +000006c2 +000006c3 +000006c4 +000006c5 +000006c6 +000006c7 +000006c8 +000006c9 +000006ca +000006cb +000006cc +000006cd +000006ce +000006cf +000006d0 +000006d1 +000006d2 +000006d3 +000006d4 +000006d5 +000006d6 +000006d7 +000006d8 +000006d9 +000006da +000006db +000006dc +000006dd +000006de +000006df +000006e0 +000006e1 +000006e2 +000006e3 +000006e4 +000006e5 +000006e6 +000006e7 +000006e8 +000006e9 +000006ea +000006eb +000006ec +000006ed +000006ee +000006ef +000006f0 +000006f1 +000006f2 +000006f3 +000006f4 +000006f5 +000006f6 +000006f7 +000006f8 +000006f9 +000006fa +000006fb +000006fc +000006fd +000006fe +000006ff +00000700 +00000701 +00000702 +00000703 +00000704 +00000705 +00000706 +00000707 +00000708 +00000709 +0000070a +0000070b +0000070c +0000070d +0000070e +0000070f +00000710 +00000711 +00000712 +00000713 +00000714 +00000715 +00000716 +00000717 +00000718 +00000719 +0000071a +0000071b +0000071c +0000071d +0000071e +0000071f +00000720 +00000721 +00000722 +00000723 +00000724 +00000725 +00000726 +00000727 +00000728 +00000729 +0000072a +0000072b +0000072c +0000072d +0000072e +0000072f +00000730 +00000731 +00000732 +00000733 +00000734 +00000735 +00000736 +00000737 +00000738 +00000739 +0000073a +0000073b +0000073c +0000073d +0000073e +0000073f +00000740 +00000741 +00000742 +00000743 +00000744 +00000745 +00000746 +00000747 +00000748 +00000749 +0000074a +0000074b +0000074c +0000074d +0000074e +0000074f +00000750 +00000751 +00000752 +00000753 +00000754 +00000755 +00000756 +00000757 +00000758 +00000759 +0000075a +0000075b +0000075c +0000075d +0000075e +0000075f +00000760 +00000761 +00000762 +00000763 +00000764 +00000765 +00000766 +00000767 +00000768 +00000769 +0000076a +0000076b +0000076c +0000076d +0000076e +0000076f +00000770 +00000771 +00000772 +00000773 +00000774 +00000775 +00000776 +00000777 +00000778 +00000779 +0000077a +0000077b +0000077c +0000077d +0000077e +0000077f +00000780 +00000781 +00000782 +00000783 +00000784 +00000785 +00000786 +00000787 +00000788 +00000789 +0000078a +0000078b +0000078c +0000078d +0000078e +0000078f +00000790 +00000791 +00000792 +00000793 +00000794 +00000795 +00000796 +00000797 +00000798 +00000799 +0000079a +0000079b +0000079c +0000079d +0000079e +0000079f +000007a0 +000007a1 +000007a2 +000007a3 +000007a4 +000007a5 +000007a6 +000007a7 +000007a8 +000007a9 +000007aa +000007ab +000007ac +000007ad +000007ae +000007af +000007b0 +000007b1 +000007b2 +000007b3 +000007b4 +000007b5 +000007b6 +000007b7 +000007b8 +000007b9 +000007ba +000007bb +000007bc +000007bd +000007be +000007bf +000007c0 +000007c1 +000007c2 +000007c3 +000007c4 +000007c5 +000007c6 +000007c7 +000007c8 +000007c9 +000007ca +000007cb +000007cc +000007cd +000007ce +000007cf +000007d0 +000007d1 +000007d2 +000007d3 +000007d4 +000007d5 +000007d6 +000007d7 +000007d8 +000007d9 +000007da +000007db +000007dc +000007dd +000007de +000007df +000007e0 +000007e1 +000007e2 +000007e3 +000007e4 +000007e5 +000007e6 +000007e7 +000007e8 +000007e9 +000007ea +000007eb +000007ec +000007ed +000007ee +000007ef +000007f0 +000007f1 +000007f2 +000007f3 +000007f4 +000007f5 +000007f6 +000007f7 +000007f8 +000007f9 +000007fa +000007fb +000007fc +000007fd +000007fe +000007ff +00000800 +00000801 +00000802 +00000803 +00000804 +00000805 +00000806 +00000807 +00000808 +00000809 +0000080a +0000080b +0000080c +0000080d +0000080e +0000080f +00000810 +00000811 +00000812 +00000813 +00000814 +00000815 +00000816 +00000817 +00000818 +00000819 +0000081a +0000081b +0000081c +0000081d +0000081e +0000081f +00000820 +00000821 +00000822 +00000823 +00000824 +00000825 +00000826 +00000827 +00000828 +00000829 +0000082a +0000082b +0000082c +0000082d +0000082e +0000082f +00000830 +00000831 +00000832 +00000833 +00000834 +00000835 +00000836 +00000837 +00000838 +00000839 +0000083a +0000083b +0000083c +0000083d +0000083e +0000083f +00000840 +00000841 +00000842 +00000843 +00000844 +00000845 +00000846 +00000847 +00000848 +00000849 +0000084a +0000084b +0000084c +0000084d +0000084e +0000084f +00000850 +00000851 +00000852 +00000853 +00000854 +00000855 +00000856 +00000857 +00000858 +00000859 +0000085a +0000085b +0000085c +0000085d +0000085e +0000085f +00000860 +00000861 +00000862 +00000863 +00000864 +00000865 +00000866 +00000867 +00000868 +00000869 +0000086a +0000086b +0000086c +0000086d +0000086e +0000086f +00000870 +00000871 +00000872 +00000873 +00000874 +00000875 +00000876 +00000877 +00000878 +00000879 +0000087a +0000087b +0000087c +0000087d +0000087e +0000087f +00000880 +00000881 +00000882 +00000883 +00000884 +00000885 +00000886 +00000887 +00000888 +00000889 +0000088a +0000088b +0000088c +0000088d +0000088e +0000088f +00000890 +00000891 +00000892 +00000893 +00000894 +00000895 +00000896 +00000897 +00000898 +00000899 +0000089a +0000089b +0000089c +0000089d +0000089e +0000089f +000008a0 +000008a1 +000008a2 +000008a3 +000008a4 +000008a5 +000008a6 +000008a7 +000008a8 +000008a9 +000008aa +000008ab +000008ac +000008ad +000008ae +000008af +000008b0 +000008b1 +000008b2 +000008b3 +000008b4 +000008b5 +000008b6 +000008b7 +000008b8 +000008b9 +000008ba +000008bb +000008bc +000008bd +000008be +000008bf +000008c0 +000008c1 +000008c2 +000008c3 +000008c4 +000008c5 +000008c6 +000008c7 +000008c8 +000008c9 +000008ca +000008cb +000008cc +000008cd +000008ce +000008cf +000008d0 +000008d1 +000008d2 +000008d3 +000008d4 +000008d5 +000008d6 +000008d7 +000008d8 +000008d9 +000008da +000008db +000008dc +000008dd +000008de +000008df +000008e0 +000008e1 +000008e2 +000008e3 +000008e4 +000008e5 +000008e6 +000008e7 +000008e8 +000008e9 +000008ea +000008eb +000008ec +000008ed +000008ee +000008ef +000008f0 +000008f1 +000008f2 +000008f3 +000008f4 +000008f5 +000008f6 +000008f7 +000008f8 +000008f9 +000008fa +000008fb +000008fc +000008fd +000008fe +000008ff +00000900 +00000901 +00000902 +00000903 +00000904 +00000905 +00000906 +00000907 +00000908 +00000909 +0000090a +0000090b +0000090c +0000090d +0000090e +0000090f +00000910 +00000911 +00000912 +00000913 +00000914 +00000915 +00000916 +00000917 +00000918 +00000919 +0000091a +0000091b +0000091c +0000091d +0000091e +0000091f +00000920 +00000921 +00000922 +00000923 +00000924 +00000925 +00000926 +00000927 +00000928 +00000929 +0000092a +0000092b +0000092c +0000092d +0000092e +0000092f +00000930 +00000931 +00000932 +00000933 +00000934 +00000935 +00000936 +00000937 +00000938 +00000939 +0000093a +0000093b +0000093c +0000093d +0000093e +0000093f +00000940 +00000941 +00000942 +00000943 +00000944 +00000945 +00000946 +00000947 +00000948 +00000949 +0000094a +0000094b +0000094c +0000094d +0000094e +0000094f +00000950 +00000951 +00000952 +00000953 +00000954 +00000955 +00000956 +00000957 +00000958 +00000959 +0000095a +0000095b +0000095c +0000095d +0000095e +0000095f +00000960 +00000961 +00000962 +00000963 +00000964 +00000965 +00000966 +00000967 +00000968 +00000969 +0000096a +0000096b +0000096c +0000096d +0000096e +0000096f +00000970 +00000971 +00000972 +00000973 +00000974 +00000975 +00000976 +00000977 +00000978 +00000979 +0000097a +0000097b +0000097c +0000097d +0000097e +0000097f +00000980 +00000981 +00000982 +00000983 +00000984 +00000985 +00000986 +00000987 +00000988 +00000989 +0000098a +0000098b +0000098c +0000098d +0000098e +0000098f +00000990 +00000991 +00000992 +00000993 +00000994 +00000995 +00000996 +00000997 +00000998 +00000999 +0000099a +0000099b +0000099c +0000099d +0000099e +0000099f +000009a0 +000009a1 +000009a2 +000009a3 +000009a4 +000009a5 +000009a6 +000009a7 +000009a8 +000009a9 +000009aa +000009ab +000009ac +000009ad +000009ae +000009af +000009b0 +000009b1 +000009b2 +000009b3 +000009b4 +000009b5 +000009b6 +000009b7 +000009b8 +000009b9 +000009ba +000009bb +000009bc +000009bd +000009be +000009bf +000009c0 +000009c1 +000009c2 +000009c3 +000009c4 +000009c5 +000009c6 +000009c7 +000009c8 +000009c9 +000009ca +000009cb +000009cc +000009cd +000009ce +000009cf +000009d0 +000009d1 +000009d2 +000009d3 +000009d4 +000009d5 +000009d6 +000009d7 +000009d8 +000009d9 +000009da +000009db +000009dc +000009dd +000009de +000009df +000009e0 +000009e1 +000009e2 +000009e3 +000009e4 +000009e5 +000009e6 +000009e7 +000009e8 +000009e9 +000009ea +000009eb +000009ec +000009ed +000009ee +000009ef +000009f0 +000009f1 +000009f2 +000009f3 +000009f4 +000009f5 +000009f6 +000009f7 +000009f8 +000009f9 +000009fa +000009fb +000009fc +000009fd +000009fe +000009ff +00000a00 +00000a01 +00000a02 +00000a03 +00000a04 +00000a05 +00000a06 +00000a07 +00000a08 +00000a09 +00000a0a +00000a0b +00000a0c +00000a0d +00000a0e +00000a0f +00000a10 +00000a11 +00000a12 +00000a13 +00000a14 +00000a15 +00000a16 +00000a17 +00000a18 +00000a19 +00000a1a +00000a1b +00000a1c +00000a1d +00000a1e +00000a1f +00000a20 +00000a21 +00000a22 +00000a23 +00000a24 +00000a25 +00000a26 +00000a27 +00000a28 +00000a29 +00000a2a +00000a2b +00000a2c +00000a2d +00000a2e +00000a2f +00000a30 +00000a31 +00000a32 +00000a33 +00000a34 +00000a35 +00000a36 +00000a37 +00000a38 +00000a39 +00000a3a +00000a3b +00000a3c +00000a3d +00000a3e +00000a3f +00000a40 +00000a41 +00000a42 +00000a43 +00000a44 +00000a45 +00000a46 +00000a47 +00000a48 +00000a49 +00000a4a +00000a4b +00000a4c +00000a4d +00000a4e +00000a4f +00000a50 +00000a51 +00000a52 +00000a53 +00000a54 +00000a55 +00000a56 +00000a57 +00000a58 +00000a59 +00000a5a +00000a5b +00000a5c +00000a5d +00000a5e +00000a5f +00000a60 +00000a61 +00000a62 +00000a63 +00000a64 +00000a65 +00000a66 +00000a67 +00000a68 +00000a69 +00000a6a +00000a6b +00000a6c +00000a6d +00000a6e +00000a6f +00000a70 +00000a71 +00000a72 +00000a73 +00000a74 +00000a75 +00000a76 +00000a77 +00000a78 +00000a79 +00000a7a +00000a7b +00000a7c +00000a7d +00000a7e +00000a7f +00000a80 +00000a81 +00000a82 +00000a83 +00000a84 +00000a85 +00000a86 +00000a87 +00000a88 +00000a89 +00000a8a +00000a8b +00000a8c +00000a8d +00000a8e +00000a8f +00000a90 +00000a91 +00000a92 +00000a93 +00000a94 +00000a95 +00000a96 +00000a97 +00000a98 +00000a99 +00000a9a +00000a9b +00000a9c +00000a9d +00000a9e +00000a9f +00000aa0 +00000aa1 +00000aa2 +00000aa3 +00000aa4 +00000aa5 +00000aa6 +00000aa7 +00000aa8 +00000aa9 +00000aaa +00000aab +00000aac +00000aad +00000aae +00000aaf +00000ab0 +00000ab1 +00000ab2 +00000ab3 +00000ab4 +00000ab5 +00000ab6 +00000ab7 +00000ab8 +00000ab9 +00000aba +00000abb +00000abc +00000abd +00000abe +00000abf +00000ac0 +00000ac1 +00000ac2 +00000ac3 +00000ac4 +00000ac5 +00000ac6 +00000ac7 +00000ac8 +00000ac9 +00000aca +00000acb +00000acc +00000acd +00000ace +00000acf +00000ad0 +00000ad1 +00000ad2 +00000ad3 +00000ad4 +00000ad5 +00000ad6 +00000ad7 +00000ad8 +00000ad9 +00000ada +00000adb +00000adc +00000add +00000ade +00000adf +00000ae0 +00000ae1 +00000ae2 +00000ae3 +00000ae4 +00000ae5 +00000ae6 +00000ae7 +00000ae8 +00000ae9 +00000aea +00000aeb +00000aec +00000aed +00000aee +00000aef +00000af0 +00000af1 +00000af2 +00000af3 +00000af4 +00000af5 +00000af6 +00000af7 +00000af8 +00000af9 +00000afa +00000afb +00000afc +00000afd +00000afe +00000aff +00000b00 +00000b01 +00000b02 +00000b03 +00000b04 +00000b05 +00000b06 +00000b07 +00000b08 +00000b09 +00000b0a +00000b0b +00000b0c +00000b0d +00000b0e +00000b0f +00000b10 +00000b11 +00000b12 +00000b13 +00000b14 +00000b15 +00000b16 +00000b17 +00000b18 +00000b19 +00000b1a +00000b1b +00000b1c +00000b1d +00000b1e +00000b1f +00000b20 +00000b21 +00000b22 +00000b23 +00000b24 +00000b25 +00000b26 +00000b27 +00000b28 +00000b29 +00000b2a +00000b2b +00000b2c +00000b2d +00000b2e +00000b2f +00000b30 +00000b31 +00000b32 +00000b33 +00000b34 +00000b35 +00000b36 +00000b37 +00000b38 +00000b39 +00000b3a +00000b3b +00000b3c +00000b3d +00000b3e +00000b3f +00000b40 +00000b41 +00000b42 +00000b43 +00000b44 +00000b45 +00000b46 +00000b47 +00000b48 +00000b49 +00000b4a +00000b4b +00000b4c +00000b4d +00000b4e +00000b4f +00000b50 +00000b51 +00000b52 +00000b53 +00000b54 +00000b55 +00000b56 +00000b57 +00000b58 +00000b59 +00000b5a +00000b5b +00000b5c +00000b5d +00000b5e +00000b5f +00000b60 +00000b61 +00000b62 +00000b63 +00000b64 +00000b65 +00000b66 +00000b67 +00000b68 +00000b69 +00000b6a +00000b6b +00000b6c +00000b6d +00000b6e +00000b6f +00000b70 +00000b71 +00000b72 +00000b73 +00000b74 +00000b75 +00000b76 +00000b77 +00000b78 +00000b79 +00000b7a +00000b7b +00000b7c +00000b7d +00000b7e +00000b7f +00000b80 +00000b81 +00000b82 +00000b83 +00000b84 +00000b85 +00000b86 +00000b87 +00000b88 +00000b89 +00000b8a +00000b8b +00000b8c +00000b8d +00000b8e +00000b8f +00000b90 +00000b91 +00000b92 +00000b93 +00000b94 +00000b95 +00000b96 +00000b97 +00000b98 +00000b99 +00000b9a +00000b9b +00000b9c +00000b9d +00000b9e +00000b9f +00000ba0 +00000ba1 +00000ba2 +00000ba3 +00000ba4 +00000ba5 +00000ba6 +00000ba7 +00000ba8 +00000ba9 +00000baa +00000bab +00000bac +00000bad +00000bae +00000baf +00000bb0 +00000bb1 +00000bb2 +00000bb3 +00000bb4 +00000bb5 +00000bb6 +00000bb7 +00000bb8 +00000bb9 +00000bba +00000bbb +00000bbc +00000bbd +00000bbe +00000bbf +00000bc0 +00000bc1 +00000bc2 +00000bc3 +00000bc4 +00000bc5 +00000bc6 +00000bc7 +00000bc8 +00000bc9 +00000bca +00000bcb +00000bcc +00000bcd +00000bce +00000bcf +00000bd0 +00000bd1 +00000bd2 +00000bd3 +00000bd4 +00000bd5 +00000bd6 +00000bd7 +00000bd8 +00000bd9 +00000bda +00000bdb +00000bdc +00000bdd +00000bde +00000bdf +00000be0 +00000be1 +00000be2 +00000be3 +00000be4 +00000be5 +00000be6 +00000be7 +00000be8 +00000be9 +00000bea +00000beb +00000bec +00000bed +00000bee +00000bef +00000bf0 +00000bf1 +00000bf2 +00000bf3 +00000bf4 +00000bf5 +00000bf6 +00000bf7 +00000bf8 +00000bf9 +00000bfa +00000bfb +00000bfc +00000bfd +00000bfe +00000bff +00000c00 +00000c01 +00000c02 +00000c03 +00000c04 +00000c05 +00000c06 +00000c07 +00000c08 +00000c09 +00000c0a +00000c0b +00000c0c +00000c0d +00000c0e +00000c0f +00000c10 +00000c11 +00000c12 +00000c13 +00000c14 +00000c15 +00000c16 +00000c17 +00000c18 +00000c19 +00000c1a +00000c1b +00000c1c +00000c1d +00000c1e +00000c1f +00000c20 +00000c21 +00000c22 +00000c23 +00000c24 +00000c25 +00000c26 +00000c27 +00000c28 +00000c29 +00000c2a +00000c2b +00000c2c +00000c2d +00000c2e +00000c2f +00000c30 +00000c31 +00000c32 +00000c33 +00000c34 +00000c35 +00000c36 +00000c37 +00000c38 +00000c39 +00000c3a +00000c3b +00000c3c +00000c3d +00000c3e +00000c3f +00000c40 +00000c41 +00000c42 +00000c43 +00000c44 +00000c45 +00000c46 +00000c47 +00000c48 +00000c49 +00000c4a +00000c4b +00000c4c +00000c4d +00000c4e +00000c4f +00000c50 +00000c51 +00000c52 +00000c53 +00000c54 +00000c55 +00000c56 +00000c57 +00000c58 +00000c59 +00000c5a +00000c5b +00000c5c +00000c5d +00000c5e +00000c5f +00000c60 +00000c61 +00000c62 +00000c63 +00000c64 +00000c65 +00000c66 +00000c67 +00000c68 +00000c69 +00000c6a +00000c6b +00000c6c +00000c6d +00000c6e +00000c6f +00000c70 +00000c71 +00000c72 +00000c73 +00000c74 +00000c75 +00000c76 +00000c77 +00000c78 +00000c79 +00000c7a +00000c7b +00000c7c +00000c7d +00000c7e +00000c7f +00000c80 +00000c81 +00000c82 +00000c83 +00000c84 +00000c85 +00000c86 +00000c87 +00000c88 +00000c89 +00000c8a +00000c8b +00000c8c +00000c8d +00000c8e +00000c8f +00000c90 +00000c91 +00000c92 +00000c93 +00000c94 +00000c95 +00000c96 +00000c97 +00000c98 +00000c99 +00000c9a +00000c9b +00000c9c +00000c9d +00000c9e +00000c9f +00000ca0 +00000ca1 +00000ca2 +00000ca3 +00000ca4 +00000ca5 +00000ca6 +00000ca7 +00000ca8 +00000ca9 +00000caa +00000cab +00000cac +00000cad +00000cae +00000caf +00000cb0 +00000cb1 +00000cb2 +00000cb3 +00000cb4 +00000cb5 +00000cb6 +00000cb7 +00000cb8 +00000cb9 +00000cba +00000cbb +00000cbc +00000cbd +00000cbe +00000cbf +00000cc0 +00000cc1 +00000cc2 +00000cc3 +00000cc4 +00000cc5 +00000cc6 +00000cc7 +00000cc8 +00000cc9 +00000cca +00000ccb +00000ccc +00000ccd +00000cce +00000ccf +00000cd0 +00000cd1 +00000cd2 +00000cd3 +00000cd4 +00000cd5 +00000cd6 +00000cd7 +00000cd8 +00000cd9 +00000cda +00000cdb +00000cdc +00000cdd +00000cde +00000cdf +00000ce0 +00000ce1 +00000ce2 +00000ce3 +00000ce4 +00000ce5 +00000ce6 +00000ce7 +00000ce8 +00000ce9 +00000cea +00000ceb +00000cec +00000ced +00000cee +00000cef +00000cf0 +00000cf1 +00000cf2 +00000cf3 +00000cf4 +00000cf5 +00000cf6 +00000cf7 +00000cf8 +00000cf9 +00000cfa +00000cfb +00000cfc +00000cfd +00000cfe +00000cff +00000d00 +00000d01 +00000d02 +00000d03 +00000d04 +00000d05 +00000d06 +00000d07 +00000d08 +00000d09 +00000d0a +00000d0b +00000d0c +00000d0d +00000d0e +00000d0f +00000d10 +00000d11 +00000d12 +00000d13 +00000d14 +00000d15 +00000d16 +00000d17 +00000d18 +00000d19 +00000d1a +00000d1b +00000d1c +00000d1d +00000d1e +00000d1f +00000d20 +00000d21 +00000d22 +00000d23 +00000d24 +00000d25 +00000d26 +00000d27 +00000d28 +00000d29 +00000d2a +00000d2b +00000d2c +00000d2d +00000d2e +00000d2f +00000d30 +00000d31 +00000d32 +00000d33 +00000d34 +00000d35 +00000d36 +00000d37 +00000d38 +00000d39 +00000d3a +00000d3b +00000d3c +00000d3d +00000d3e +00000d3f +00000d40 +00000d41 +00000d42 +00000d43 +00000d44 +00000d45 +00000d46 +00000d47 +00000d48 +00000d49 +00000d4a +00000d4b +00000d4c +00000d4d +00000d4e +00000d4f +00000d50 +00000d51 +00000d52 +00000d53 +00000d54 +00000d55 +00000d56 +00000d57 +00000d58 +00000d59 +00000d5a +00000d5b +00000d5c +00000d5d +00000d5e +00000d5f +00000d60 +00000d61 +00000d62 +00000d63 +00000d64 +00000d65 +00000d66 +00000d67 +00000d68 +00000d69 +00000d6a +00000d6b +00000d6c +00000d6d +00000d6e +00000d6f +00000d70 +00000d71 +00000d72 +00000d73 +00000d74 +00000d75 +00000d76 +00000d77 +00000d78 +00000d79 +00000d7a +00000d7b +00000d7c +00000d7d +00000d7e +00000d7f +00000d80 +00000d81 +00000d82 +00000d83 +00000d84 +00000d85 +00000d86 +00000d87 +00000d88 +00000d89 +00000d8a +00000d8b +00000d8c +00000d8d +00000d8e +00000d8f +00000d90 +00000d91 +00000d92 +00000d93 +00000d94 +00000d95 +00000d96 +00000d97 +00000d98 +00000d99 +00000d9a +00000d9b +00000d9c +00000d9d +00000d9e +00000d9f +00000da0 +00000da1 +00000da2 +00000da3 +00000da4 +00000da5 +00000da6 +00000da7 +00000da8 +00000da9 +00000daa +00000dab +00000dac +00000dad +00000dae +00000daf +00000db0 +00000db1 +00000db2 +00000db3 +00000db4 +00000db5 +00000db6 +00000db7 +00000db8 +00000db9 +00000dba +00000dbb +00000dbc +00000dbd +00000dbe +00000dbf +00000dc0 +00000dc1 +00000dc2 +00000dc3 +00000dc4 +00000dc5 +00000dc6 +00000dc7 +00000dc8 +00000dc9 +00000dca +00000dcb +00000dcc +00000dcd +00000dce +00000dcf +00000dd0 +00000dd1 +00000dd2 +00000dd3 +00000dd4 +00000dd5 +00000dd6 +00000dd7 +00000dd8 +00000dd9 +00000dda +00000ddb +00000ddc +00000ddd +00000dde +00000ddf +00000de0 +00000de1 +00000de2 +00000de3 +00000de4 +00000de5 +00000de6 +00000de7 +00000de8 +00000de9 +00000dea +00000deb +00000dec +00000ded +00000dee +00000def +00000df0 +00000df1 +00000df2 +00000df3 +00000df4 +00000df5 +00000df6 +00000df7 +00000df8 +00000df9 +00000dfa +00000dfb +00000dfc +00000dfd +00000dfe +00000dff +00000e00 +00000e01 +00000e02 +00000e03 +00000e04 +00000e05 +00000e06 +00000e07 +00000e08 +00000e09 +00000e0a +00000e0b +00000e0c +00000e0d +00000e0e +00000e0f +00000e10 +00000e11 +00000e12 +00000e13 +00000e14 +00000e15 +00000e16 +00000e17 +00000e18 +00000e19 +00000e1a +00000e1b +00000e1c +00000e1d +00000e1e +00000e1f +00000e20 +00000e21 +00000e22 +00000e23 +00000e24 +00000e25 +00000e26 +00000e27 +00000e28 +00000e29 +00000e2a +00000e2b +00000e2c +00000e2d +00000e2e +00000e2f +00000e30 +00000e31 +00000e32 +00000e33 +00000e34 +00000e35 +00000e36 +00000e37 +00000e38 +00000e39 +00000e3a +00000e3b +00000e3c +00000e3d +00000e3e +00000e3f +00000e40 +00000e41 +00000e42 +00000e43 +00000e44 +00000e45 +00000e46 +00000e47 +00000e48 +00000e49 +00000e4a +00000e4b +00000e4c +00000e4d +00000e4e +00000e4f +00000e50 +00000e51 +00000e52 +00000e53 +00000e54 +00000e55 +00000e56 +00000e57 +00000e58 +00000e59 +00000e5a +00000e5b +00000e5c +00000e5d +00000e5e +00000e5f +00000e60 +00000e61 +00000e62 +00000e63 +00000e64 +00000e65 +00000e66 +00000e67 +00000e68 +00000e69 +00000e6a +00000e6b +00000e6c +00000e6d +00000e6e +00000e6f +00000e70 +00000e71 +00000e72 +00000e73 +00000e74 +00000e75 +00000e76 +00000e77 +00000e78 +00000e79 +00000e7a +00000e7b +00000e7c +00000e7d +00000e7e +00000e7f +00000e80 +00000e81 +00000e82 +00000e83 +00000e84 +00000e85 +00000e86 +00000e87 +00000e88 +00000e89 +00000e8a +00000e8b +00000e8c +00000e8d +00000e8e +00000e8f +00000e90 +00000e91 +00000e92 +00000e93 +00000e94 +00000e95 +00000e96 +00000e97 +00000e98 +00000e99 +00000e9a +00000e9b +00000e9c +00000e9d +00000e9e +00000e9f +00000ea0 +00000ea1 +00000ea2 +00000ea3 +00000ea4 +00000ea5 +00000ea6 +00000ea7 +00000ea8 +00000ea9 +00000eaa +00000eab +00000eac +00000ead +00000eae +00000eaf +00000eb0 +00000eb1 +00000eb2 +00000eb3 +00000eb4 +00000eb5 +00000eb6 +00000eb7 +00000eb8 +00000eb9 +00000eba +00000ebb +00000ebc +00000ebd +00000ebe +00000ebf +00000ec0 +00000ec1 +00000ec2 +00000ec3 +00000ec4 +00000ec5 +00000ec6 +00000ec7 +00000ec8 +00000ec9 +00000eca +00000ecb +00000ecc +00000ecd +00000ece +00000ecf +00000ed0 +00000ed1 +00000ed2 +00000ed3 +00000ed4 +00000ed5 +00000ed6 +00000ed7 +00000ed8 +00000ed9 +00000eda +00000edb +00000edc +00000edd +00000ede +00000edf +00000ee0 +00000ee1 +00000ee2 +00000ee3 +00000ee4 +00000ee5 +00000ee6 +00000ee7 +00000ee8 +00000ee9 +00000eea +00000eeb +00000eec +00000eed +00000eee +00000eef +00000ef0 +00000ef1 +00000ef2 +00000ef3 +00000ef4 +00000ef5 +00000ef6 +00000ef7 +00000ef8 +00000ef9 +00000efa +00000efb +00000efc +00000efd +00000efe +00000eff +00000f00 +00000f01 +00000f02 +00000f03 +00000f04 +00000f05 +00000f06 +00000f07 +00000f08 +00000f09 +00000f0a +00000f0b +00000f0c +00000f0d +00000f0e +00000f0f +00000f10 +00000f11 +00000f12 +00000f13 +00000f14 +00000f15 +00000f16 +00000f17 +00000f18 +00000f19 +00000f1a +00000f1b +00000f1c +00000f1d +00000f1e +00000f1f +00000f20 +00000f21 +00000f22 +00000f23 +00000f24 +00000f25 +00000f26 +00000f27 +00000f28 +00000f29 +00000f2a +00000f2b +00000f2c +00000f2d +00000f2e +00000f2f +00000f30 +00000f31 +00000f32 +00000f33 +00000f34 +00000f35 +00000f36 +00000f37 +00000f38 +00000f39 +00000f3a +00000f3b +00000f3c +00000f3d +00000f3e +00000f3f +00000f40 +00000f41 +00000f42 +00000f43 +00000f44 +00000f45 +00000f46 +00000f47 +00000f48 +00000f49 +00000f4a +00000f4b +00000f4c +00000f4d +00000f4e +00000f4f +00000f50 +00000f51 +00000f52 +00000f53 +00000f54 +00000f55 +00000f56 +00000f57 +00000f58 +00000f59 +00000f5a +00000f5b +00000f5c +00000f5d +00000f5e +00000f5f +00000f60 +00000f61 +00000f62 +00000f63 +00000f64 +00000f65 +00000f66 +00000f67 +00000f68 +00000f69 +00000f6a +00000f6b +00000f6c +00000f6d +00000f6e +00000f6f +00000f70 +00000f71 +00000f72 +00000f73 +00000f74 +00000f75 +00000f76 +00000f77 +00000f78 +00000f79 +00000f7a +00000f7b +00000f7c +00000f7d +00000f7e +00000f7f +00000f80 +00000f81 +00000f82 +00000f83 +00000f84 +00000f85 +00000f86 +00000f87 +00000f88 +00000f89 +00000f8a +00000f8b +00000f8c +00000f8d +00000f8e +00000f8f +00000f90 +00000f91 +00000f92 +00000f93 +00000f94 +00000f95 +00000f96 +00000f97 +00000f98 +00000f99 +00000f9a +00000f9b +00000f9c +00000f9d +00000f9e +00000f9f +00000fa0 +00000fa1 +00000fa2 +00000fa3 +00000fa4 +00000fa5 +00000fa6 +00000fa7 +00000fa8 +00000fa9 +00000faa +00000fab +00000fac +00000fad +00000fae +00000faf +00000fb0 +00000fb1 +00000fb2 +00000fb3 +00000fb4 +00000fb5 +00000fb6 +00000fb7 +00000fb8 +00000fb9 +00000fba +00000fbb +00000fbc +00000fbd +00000fbe +00000fbf +00000fc0 +00000fc1 +00000fc2 +00000fc3 +00000fc4 +00000fc5 +00000fc6 +00000fc7 +00000fc8 +00000fc9 +00000fca +00000fcb +00000fcc +00000fcd +00000fce +00000fcf +00000fd0 +00000fd1 +00000fd2 +00000fd3 +00000fd4 +00000fd5 +00000fd6 +00000fd7 +00000fd8 +00000fd9 +00000fda +00000fdb +00000fdc +00000fdd +00000fde +00000fdf +00000fe0 +00000fe1 +00000fe2 +00000fe3 +00000fe4 +00000fe5 +00000fe6 +00000fe7 +00000fe8 +00000fe9 +00000fea +00000feb +00000fec +00000fed +00000fee +00000fef +00000ff0 +00000ff1 +00000ff2 +00000ff3 +00000ff4 +00000ff5 +00000ff6 +00000ff7 +00000ff8 +00000ff9 +00000ffa +00000ffb +00000ffc +00000ffd +00000ffe +00000fff +00001000 +00001001 +00001002 +00001003 +00001004 +00001005 +00001006 +00001007 +00001008 +00001009 +0000100a +0000100b +0000100c +0000100d +0000100e +0000100f +00001010 +00001011 +00001012 +00001013 +00001014 +00001015 +00001016 +00001017 +00001018 +00001019 +0000101a +0000101b +0000101c +0000101d +0000101e +0000101f +00001020 +00001021 +00001022 +00001023 +00001024 +00001025 +00001026 +00001027 +00001028 +00001029 +0000102a +0000102b +0000102c +0000102d +0000102e +0000102f +00001030 +00001031 +00001032 +00001033 +00001034 +00001035 +00001036 +00001037 +00001038 +00001039 +0000103a +0000103b +0000103c +0000103d +0000103e +0000103f +00001040 +00001041 +00001042 +00001043 +00001044 +00001045 +00001046 +00001047 +00001048 +00001049 +0000104a +0000104b +0000104c +0000104d +0000104e +0000104f +00001050 +00001051 +00001052 +00001053 +00001054 +00001055 +00001056 +00001057 +00001058 +00001059 +0000105a +0000105b +0000105c +0000105d +0000105e +0000105f +00001060 +00001061 +00001062 +00001063 +00001064 +00001065 +00001066 +00001067 +00001068 +00001069 +0000106a +0000106b +0000106c +0000106d +0000106e +0000106f +00001070 +00001071 +00001072 +00001073 +00001074 +00001075 +00001076 +00001077 +00001078 +00001079 +0000107a +0000107b +0000107c +0000107d +0000107e +0000107f +00001080 +00001081 +00001082 +00001083 +00001084 +00001085 +00001086 +00001087 +00001088 +00001089 +0000108a +0000108b +0000108c +0000108d +0000108e +0000108f +00001090 +00001091 +00001092 +00001093 +00001094 +00001095 +00001096 +00001097 +00001098 +00001099 +0000109a +0000109b +0000109c +0000109d +0000109e +0000109f +000010a0 +000010a1 +000010a2 +000010a3 +000010a4 +000010a5 +000010a6 +000010a7 +000010a8 +000010a9 +000010aa +000010ab +000010ac +000010ad +000010ae +000010af +000010b0 +000010b1 +000010b2 +000010b3 +000010b4 +000010b5 +000010b6 +000010b7 +000010b8 +000010b9 +000010ba +000010bb +000010bc +000010bd +000010be +000010bf +000010c0 +000010c1 +000010c2 +000010c3 +000010c4 +000010c5 +000010c6 +000010c7 +000010c8 +000010c9 +000010ca +000010cb +000010cc +000010cd +000010ce +000010cf +000010d0 +000010d1 +000010d2 +000010d3 +000010d4 +000010d5 +000010d6 +000010d7 +000010d8 +000010d9 +000010da +000010db +000010dc +000010dd +000010de +000010df +000010e0 +000010e1 +000010e2 +000010e3 +000010e4 +000010e5 +000010e6 +000010e7 +000010e8 +000010e9 +000010ea +000010eb +000010ec +000010ed +000010ee +000010ef +000010f0 +000010f1 +000010f2 +000010f3 +000010f4 +000010f5 +000010f6 +000010f7 +000010f8 +000010f9 +000010fa +000010fb +000010fc +000010fd +000010fe +000010ff +00001100 +00001101 +00001102 +00001103 +00001104 +00001105 +00001106 +00001107 +00001108 +00001109 +0000110a +0000110b +0000110c +0000110d +0000110e +0000110f +00001110 +00001111 +00001112 +00001113 +00001114 +00001115 +00001116 +00001117 +00001118 +00001119 +0000111a +0000111b +0000111c +0000111d +0000111e +0000111f +00001120 +00001121 +00001122 +00001123 +00001124 +00001125 +00001126 +00001127 +00001128 +00001129 +0000112a +0000112b +0000112c +0000112d +0000112e +0000112f +00001130 +00001131 +00001132 +00001133 +00001134 +00001135 +00001136 +00001137 +00001138 +00001139 +0000113a +0000113b +0000113c +0000113d +0000113e +0000113f +00001140 +00001141 +00001142 +00001143 +00001144 +00001145 +00001146 +00001147 +00001148 +00001149 +0000114a +0000114b +0000114c +0000114d +0000114e +0000114f +00001150 +00001151 +00001152 +00001153 +00001154 +00001155 +00001156 +00001157 +00001158 +00001159 +0000115a +0000115b +0000115c +0000115d +0000115e +0000115f +00001160 +00001161 +00001162 +00001163 +00001164 +00001165 +00001166 +00001167 +00001168 +00001169 +0000116a +0000116b +0000116c +0000116d +0000116e +0000116f +00001170 +00001171 +00001172 +00001173 +00001174 +00001175 +00001176 +00001177 +00001178 +00001179 +0000117a +0000117b +0000117c +0000117d +0000117e +0000117f +00001180 +00001181 +00001182 +00001183 +00001184 +00001185 +00001186 +00001187 +00001188 +00001189 +0000118a +0000118b +0000118c +0000118d +0000118e +0000118f +00001190 +00001191 +00001192 +00001193 +00001194 +00001195 +00001196 +00001197 +00001198 +00001199 +0000119a +0000119b +0000119c +0000119d +0000119e +0000119f +000011a0 +000011a1 +000011a2 +000011a3 +000011a4 +000011a5 +000011a6 +000011a7 +000011a8 +000011a9 +000011aa +000011ab +000011ac +000011ad +000011ae +000011af +000011b0 +000011b1 +000011b2 +000011b3 +000011b4 +000011b5 +000011b6 +000011b7 +000011b8 +000011b9 +000011ba +000011bb +000011bc +000011bd +000011be +000011bf +000011c0 +000011c1 +000011c2 +000011c3 +000011c4 +000011c5 +000011c6 +000011c7 +000011c8 +000011c9 +000011ca +000011cb +000011cc +000011cd +000011ce +000011cf +000011d0 +000011d1 +000011d2 +000011d3 +000011d4 +000011d5 +000011d6 +000011d7 +000011d8 +000011d9 +000011da +000011db +000011dc +000011dd +000011de +000011df +000011e0 +000011e1 +000011e2 +000011e3 +000011e4 +000011e5 +000011e6 +000011e7 +000011e8 +000011e9 +000011ea +000011eb +000011ec +000011ed +000011ee +000011ef +000011f0 +000011f1 +000011f2 +000011f3 +000011f4 +000011f5 +000011f6 +000011f7 +000011f8 +000011f9 +000011fa +000011fb +000011fc +000011fd +000011fe +000011ff +00001200 +00001201 +00001202 +00001203 +00001204 +00001205 +00001206 +00001207 +00001208 +00001209 +0000120a +0000120b +0000120c +0000120d +0000120e +0000120f +00001210 +00001211 +00001212 +00001213 +00001214 +00001215 +00001216 +00001217 +00001218 +00001219 +0000121a +0000121b +0000121c +0000121d +0000121e +0000121f +00001220 +00001221 +00001222 +00001223 +00001224 +00001225 +00001226 +00001227 +00001228 +00001229 +0000122a +0000122b +0000122c +0000122d +0000122e +0000122f +00001230 +00001231 +00001232 +00001233 +00001234 +00001235 +00001236 +00001237 +00001238 +00001239 +0000123a +0000123b +0000123c +0000123d +0000123e +0000123f +00001240 +00001241 +00001242 +00001243 +00001244 +00001245 +00001246 +00001247 +00001248 +00001249 +0000124a +0000124b +0000124c +0000124d +0000124e +0000124f +00001250 +00001251 +00001252 +00001253 +00001254 +00001255 +00001256 +00001257 +00001258 +00001259 +0000125a +0000125b +0000125c +0000125d +0000125e +0000125f +00001260 +00001261 +00001262 +00001263 +00001264 +00001265 +00001266 +00001267 +00001268 +00001269 +0000126a +0000126b +0000126c +0000126d +0000126e +0000126f +00001270 +00001271 +00001272 +00001273 +00001274 +00001275 +00001276 +00001277 +00001278 +00001279 +0000127a +0000127b +0000127c +0000127d +0000127e +0000127f +00001280 +00001281 +00001282 +00001283 +00001284 +00001285 +00001286 +00001287 +00001288 +00001289 +0000128a +0000128b +0000128c +0000128d +0000128e +0000128f +00001290 +00001291 +00001292 +00001293 +00001294 +00001295 +00001296 +00001297 +00001298 +00001299 +0000129a +0000129b +0000129c +0000129d +0000129e +0000129f +000012a0 +000012a1 +000012a2 +000012a3 +000012a4 +000012a5 +000012a6 +000012a7 +000012a8 +000012a9 +000012aa +000012ab +000012ac +000012ad +000012ae +000012af +000012b0 +000012b1 +000012b2 +000012b3 +000012b4 +000012b5 +000012b6 +000012b7 +000012b8 +000012b9 +000012ba +000012bb +000012bc +000012bd +000012be +000012bf +000012c0 +000012c1 +000012c2 +000012c3 +000012c4 +000012c5 +000012c6 +000012c7 +000012c8 +000012c9 +000012ca +000012cb +000012cc +000012cd +000012ce +000012cf +000012d0 +000012d1 +000012d2 +000012d3 +000012d4 +000012d5 +000012d6 +000012d7 +000012d8 +000012d9 +000012da +000012db +000012dc +000012dd +000012de +000012df +000012e0 +000012e1 +000012e2 +000012e3 +000012e4 +000012e5 +000012e6 +000012e7 +000012e8 +000012e9 +000012ea +000012eb +000012ec +000012ed +000012ee +000012ef +000012f0 +000012f1 +000012f2 +000012f3 +000012f4 +000012f5 +000012f6 +000012f7 +000012f8 +000012f9 +000012fa +000012fb +000012fc +000012fd +000012fe +000012ff +00001300 +00001301 +00001302 +00001303 +00001304 +00001305 +00001306 +00001307 +00001308 +00001309 +0000130a +0000130b +0000130c +0000130d +0000130e +0000130f +00001310 +00001311 +00001312 +00001313 +00001314 +00001315 +00001316 +00001317 +00001318 +00001319 +0000131a +0000131b +0000131c +0000131d +0000131e +0000131f +00001320 +00001321 +00001322 +00001323 +00001324 +00001325 +00001326 +00001327 +00001328 +00001329 +0000132a +0000132b +0000132c +0000132d +0000132e +0000132f +00001330 +00001331 +00001332 +00001333 +00001334 +00001335 +00001336 +00001337 +00001338 +00001339 +0000133a +0000133b +0000133c +0000133d +0000133e +0000133f +00001340 +00001341 +00001342 +00001343 +00001344 +00001345 +00001346 +00001347 +00001348 +00001349 +0000134a +0000134b +0000134c +0000134d +0000134e +0000134f +00001350 +00001351 +00001352 +00001353 +00001354 +00001355 +00001356 +00001357 +00001358 +00001359 +0000135a +0000135b +0000135c +0000135d +0000135e +0000135f +00001360 +00001361 +00001362 +00001363 +00001364 +00001365 +00001366 +00001367 +00001368 +00001369 +0000136a +0000136b +0000136c +0000136d +0000136e +0000136f +00001370 +00001371 +00001372 +00001373 +00001374 +00001375 +00001376 +00001377 +00001378 +00001379 +0000137a +0000137b +0000137c +0000137d +0000137e +0000137f +00001380 +00001381 +00001382 +00001383 +00001384 +00001385 +00001386 +00001387 +00001388 +00001389 +0000138a +0000138b +0000138c +0000138d +0000138e +0000138f +00001390 +00001391 +00001392 +00001393 +00001394 +00001395 +00001396 +00001397 +00001398 +00001399 +0000139a +0000139b +0000139c +0000139d +0000139e +0000139f +000013a0 +000013a1 +000013a2 +000013a3 +000013a4 +000013a5 +000013a6 +000013a7 +000013a8 +000013a9 +000013aa +000013ab +000013ac +000013ad +000013ae +000013af +000013b0 +000013b1 +000013b2 +000013b3 +000013b4 +000013b5 +000013b6 +000013b7 +000013b8 +000013b9 +000013ba +000013bb +000013bc +000013bd +000013be +000013bf +000013c0 +000013c1 +000013c2 +000013c3 +000013c4 +000013c5 +000013c6 +000013c7 +000013c8 +000013c9 +000013ca +000013cb +000013cc +000013cd +000013ce +000013cf +000013d0 +000013d1 +000013d2 +000013d3 +000013d4 +000013d5 +000013d6 +000013d7 +000013d8 +000013d9 +000013da +000013db +000013dc +000013dd +000013de +000013df +000013e0 +000013e1 +000013e2 +000013e3 +000013e4 +000013e5 +000013e6 +000013e7 +000013e8 +000013e9 +000013ea +000013eb +000013ec +000013ed +000013ee +000013ef +000013f0 +000013f1 +000013f2 +000013f3 +000013f4 +000013f5 +000013f6 +000013f7 +000013f8 +000013f9 +000013fa +000013fb +000013fc +000013fd +000013fe +000013ff +00001400 +00001401 +00001402 +00001403 +00001404 +00001405 +00001406 +00001407 +00001408 +00001409 +0000140a +0000140b +0000140c +0000140d +0000140e +0000140f +00001410 +00001411 +00001412 +00001413 +00001414 +00001415 +00001416 +00001417 +00001418 +00001419 +0000141a +0000141b +0000141c +0000141d +0000141e +0000141f +00001420 +00001421 +00001422 +00001423 +00001424 +00001425 +00001426 +00001427 +00001428 +00001429 +0000142a +0000142b +0000142c +0000142d +0000142e +0000142f +00001430 +00001431 +00001432 +00001433 +00001434 +00001435 +00001436 +00001437 +00001438 +00001439 +0000143a +0000143b +0000143c +0000143d +0000143e +0000143f +00001440 +00001441 +00001442 +00001443 +00001444 +00001445 +00001446 +00001447 +00001448 +00001449 +0000144a +0000144b +0000144c +0000144d +0000144e +0000144f +00001450 +00001451 +00001452 +00001453 +00001454 +00001455 +00001456 +00001457 +00001458 +00001459 +0000145a +0000145b +0000145c +0000145d +0000145e +0000145f +00001460 +00001461 +00001462 +00001463 +00001464 +00001465 +00001466 +00001467 +00001468 +00001469 +0000146a +0000146b +0000146c +0000146d +0000146e +0000146f +00001470 +00001471 +00001472 +00001473 +00001474 +00001475 +00001476 +00001477 +00001478 +00001479 +0000147a +0000147b +0000147c +0000147d +0000147e +0000147f +00001480 +00001481 +00001482 +00001483 +00001484 +00001485 +00001486 +00001487 +00001488 +00001489 +0000148a +0000148b +0000148c +0000148d +0000148e +0000148f +00001490 +00001491 +00001492 +00001493 +00001494 +00001495 +00001496 +00001497 +00001498 +00001499 +0000149a +0000149b +0000149c +0000149d +0000149e +0000149f +000014a0 +000014a1 +000014a2 +000014a3 +000014a4 +000014a5 +000014a6 +000014a7 +000014a8 +000014a9 +000014aa +000014ab +000014ac +000014ad +000014ae +000014af +000014b0 +000014b1 +000014b2 +000014b3 +000014b4 +000014b5 +000014b6 +000014b7 +000014b8 +000014b9 +000014ba +000014bb +000014bc +000014bd +000014be +000014bf +000014c0 +000014c1 +000014c2 +000014c3 +000014c4 +000014c5 +000014c6 +000014c7 +000014c8 +000014c9 +000014ca +000014cb +000014cc +000014cd +000014ce +000014cf +000014d0 +000014d1 +000014d2 +000014d3 +000014d4 +000014d5 +000014d6 +000014d7 +000014d8 +000014d9 +000014da +000014db +000014dc +000014dd +000014de +000014df +000014e0 +000014e1 +000014e2 +000014e3 +000014e4 +000014e5 +000014e6 +000014e7 +000014e8 +000014e9 +000014ea +000014eb +000014ec +000014ed +000014ee +000014ef +000014f0 +000014f1 +000014f2 +000014f3 +000014f4 +000014f5 +000014f6 +000014f7 +000014f8 +000014f9 +000014fa +000014fb +000014fc +000014fd +000014fe +000014ff +00001500 +00001501 +00001502 +00001503 +00001504 +00001505 +00001506 +00001507 +00001508 +00001509 +0000150a +0000150b +0000150c +0000150d +0000150e +0000150f +00001510 +00001511 +00001512 +00001513 +00001514 +00001515 +00001516 +00001517 +00001518 +00001519 +0000151a +0000151b +0000151c +0000151d +0000151e +0000151f +00001520 +00001521 +00001522 +00001523 +00001524 +00001525 +00001526 +00001527 +00001528 +00001529 +0000152a +0000152b +0000152c +0000152d +0000152e +0000152f +00001530 +00001531 +00001532 +00001533 +00001534 +00001535 +00001536 +00001537 +00001538 +00001539 +0000153a +0000153b +0000153c +0000153d +0000153e +0000153f +00001540 +00001541 +00001542 +00001543 +00001544 +00001545 +00001546 +00001547 +00001548 +00001549 +0000154a +0000154b +0000154c +0000154d +0000154e +0000154f +00001550 +00001551 +00001552 +00001553 +00001554 +00001555 +00001556 +00001557 +00001558 +00001559 +0000155a +0000155b +0000155c +0000155d +0000155e +0000155f +00001560 +00001561 +00001562 +00001563 +00001564 +00001565 +00001566 +00001567 +00001568 +00001569 +0000156a +0000156b +0000156c +0000156d +0000156e +0000156f +00001570 +00001571 +00001572 +00001573 +00001574 +00001575 +00001576 +00001577 +00001578 +00001579 +0000157a +0000157b +0000157c +0000157d +0000157e +0000157f +00001580 +00001581 +00001582 +00001583 +00001584 +00001585 +00001586 +00001587 +00001588 +00001589 +0000158a +0000158b +0000158c +0000158d +0000158e +0000158f +00001590 +00001591 +00001592 +00001593 +00001594 +00001595 +00001596 +00001597 +00001598 +00001599 +0000159a +0000159b +0000159c +0000159d +0000159e +0000159f +000015a0 +000015a1 +000015a2 +000015a3 +000015a4 +000015a5 +000015a6 +000015a7 +000015a8 +000015a9 +000015aa +000015ab +000015ac +000015ad +000015ae +000015af +000015b0 +000015b1 +000015b2 +000015b3 +000015b4 +000015b5 +000015b6 +000015b7 +000015b8 +000015b9 +000015ba +000015bb +000015bc +000015bd +000015be +000015bf +000015c0 +000015c1 +000015c2 +000015c3 +000015c4 +000015c5 +000015c6 +000015c7 +000015c8 +000015c9 +000015ca +000015cb +000015cc +000015cd +000015ce +000015cf +000015d0 +000015d1 +000015d2 +000015d3 +000015d4 +000015d5 +000015d6 +000015d7 +000015d8 +000015d9 +000015da +000015db +000015dc +000015dd +000015de +000015df +000015e0 +000015e1 +000015e2 +000015e3 +000015e4 +000015e5 +000015e6 +000015e7 +000015e8 +000015e9 +000015ea +000015eb +000015ec +000015ed +000015ee +000015ef +000015f0 +000015f1 +000015f2 +000015f3 +000015f4 +000015f5 +000015f6 +000015f7 +000015f8 +000015f9 +000015fa +000015fb +000015fc +000015fd +000015fe +000015ff +00001600 +00001601 +00001602 +00001603 +00001604 +00001605 +00001606 +00001607 +00001608 +00001609 +0000160a +0000160b +0000160c +0000160d +0000160e +0000160f +00001610 +00001611 +00001612 +00001613 +00001614 +00001615 +00001616 +00001617 +00001618 +00001619 +0000161a +0000161b +0000161c +0000161d +0000161e +0000161f +00001620 +00001621 +00001622 +00001623 +00001624 +00001625 +00001626 +00001627 +00001628 +00001629 +0000162a +0000162b +0000162c +0000162d +0000162e +0000162f +00001630 +00001631 +00001632 +00001633 +00001634 +00001635 +00001636 +00001637 +00001638 +00001639 +0000163a +0000163b +0000163c +0000163d +0000163e +0000163f +00001640 +00001641 +00001642 +00001643 +00001644 +00001645 +00001646 +00001647 +00001648 +00001649 +0000164a +0000164b +0000164c +0000164d +0000164e +0000164f +00001650 +00001651 +00001652 +00001653 +00001654 +00001655 +00001656 +00001657 +00001658 +00001659 +0000165a +0000165b +0000165c +0000165d +0000165e +0000165f +00001660 +00001661 +00001662 +00001663 +00001664 +00001665 +00001666 +00001667 +00001668 +00001669 +0000166a +0000166b +0000166c +0000166d +0000166e +0000166f +00001670 +00001671 +00001672 +00001673 +00001674 +00001675 +00001676 +00001677 +00001678 +00001679 +0000167a +0000167b +0000167c +0000167d +0000167e +0000167f +00001680 +00001681 +00001682 +00001683 +00001684 +00001685 +00001686 +00001687 +00001688 +00001689 +0000168a +0000168b +0000168c +0000168d +0000168e +0000168f +00001690 +00001691 +00001692 +00001693 +00001694 +00001695 +00001696 +00001697 +00001698 +00001699 +0000169a +0000169b +0000169c +0000169d +0000169e +0000169f +000016a0 +000016a1 +000016a2 +000016a3 +000016a4 +000016a5 +000016a6 +000016a7 +000016a8 +000016a9 +000016aa +000016ab +000016ac +000016ad +000016ae +000016af +000016b0 +000016b1 +000016b2 +000016b3 +000016b4 +000016b5 +000016b6 +000016b7 +000016b8 +000016b9 +000016ba +000016bb +000016bc +000016bd +000016be +000016bf +000016c0 +000016c1 +000016c2 +000016c3 +000016c4 +000016c5 +000016c6 +000016c7 +000016c8 +000016c9 +000016ca +000016cb +000016cc +000016cd +000016ce +000016cf +000016d0 +000016d1 +000016d2 +000016d3 +000016d4 +000016d5 +000016d6 +000016d7 +000016d8 +000016d9 +000016da +000016db +000016dc +000016dd +000016de +000016df +000016e0 +000016e1 +000016e2 +000016e3 +000016e4 +000016e5 +000016e6 +000016e7 +000016e8 +000016e9 +000016ea +000016eb +000016ec +000016ed +000016ee +000016ef +000016f0 +000016f1 +000016f2 +000016f3 +000016f4 +000016f5 +000016f6 +000016f7 +000016f8 +000016f9 +000016fa +000016fb +000016fc +000016fd +000016fe +000016ff +00001700 +00001701 +00001702 +00001703 +00001704 +00001705 +00001706 +00001707 +00001708 +00001709 +0000170a +0000170b +0000170c +0000170d +0000170e +0000170f +00001710 +00001711 +00001712 +00001713 +00001714 +00001715 +00001716 +00001717 +00001718 +00001719 +0000171a +0000171b +0000171c +0000171d +0000171e +0000171f +00001720 +00001721 +00001722 +00001723 +00001724 +00001725 +00001726 +00001727 +00001728 +00001729 +0000172a +0000172b +0000172c +0000172d +0000172e +0000172f +00001730 +00001731 +00001732 +00001733 +00001734 +00001735 +00001736 +00001737 +00001738 +00001739 +0000173a +0000173b +0000173c +0000173d +0000173e +0000173f +00001740 +00001741 +00001742 +00001743 +00001744 +00001745 +00001746 +00001747 +00001748 +00001749 +0000174a +0000174b +0000174c +0000174d +0000174e +0000174f +00001750 +00001751 +00001752 +00001753 +00001754 +00001755 +00001756 +00001757 +00001758 +00001759 +0000175a +0000175b +0000175c +0000175d +0000175e +0000175f +00001760 +00001761 +00001762 +00001763 +00001764 +00001765 +00001766 +00001767 +00001768 +00001769 +0000176a +0000176b +0000176c +0000176d +0000176e +0000176f +00001770 +00001771 +00001772 +00001773 +00001774 +00001775 +00001776 +00001777 +00001778 +00001779 +0000177a +0000177b +0000177c +0000177d +0000177e +0000177f +00001780 +00001781 +00001782 +00001783 +00001784 +00001785 +00001786 +00001787 +00001788 +00001789 +0000178a +0000178b +0000178c +0000178d +0000178e +0000178f +00001790 +00001791 +00001792 +00001793 +00001794 +00001795 +00001796 +00001797 +00001798 +00001799 +0000179a +0000179b +0000179c +0000179d +0000179e +0000179f +000017a0 +000017a1 +000017a2 +000017a3 +000017a4 +000017a5 +000017a6 +000017a7 +000017a8 +000017a9 +000017aa +000017ab +000017ac +000017ad +000017ae +000017af +000017b0 +000017b1 +000017b2 +000017b3 +000017b4 +000017b5 +000017b6 +000017b7 +000017b8 +000017b9 +000017ba +000017bb +000017bc +000017bd +000017be +000017bf +000017c0 +000017c1 +000017c2 +000017c3 +000017c4 +000017c5 +000017c6 +000017c7 +000017c8 +000017c9 +000017ca +000017cb +000017cc +000017cd +000017ce +000017cf +000017d0 +000017d1 +000017d2 +000017d3 +000017d4 +000017d5 +000017d6 +000017d7 +000017d8 +000017d9 +000017da +000017db +000017dc +000017dd +000017de +000017df +000017e0 +000017e1 +000017e2 +000017e3 +000017e4 +000017e5 +000017e6 +000017e7 +000017e8 +000017e9 +000017ea +000017eb +000017ec +000017ed +000017ee +000017ef +000017f0 +000017f1 +000017f2 +000017f3 +000017f4 +000017f5 +000017f6 +000017f7 +000017f8 +000017f9 +000017fa +000017fb +000017fc +000017fd +000017fe +000017ff +00001800 +00001801 +00001802 +00001803 +00001804 +00001805 +00001806 +00001807 +00001808 +00001809 +0000180a +0000180b +0000180c +0000180d +0000180e +0000180f +00001810 +00001811 +00001812 +00001813 +00001814 +00001815 +00001816 +00001817 +00001818 +00001819 +0000181a +0000181b +0000181c +0000181d +0000181e +0000181f +00001820 +00001821 +00001822 +00001823 +00001824 +00001825 +00001826 +00001827 +00001828 +00001829 +0000182a +0000182b +0000182c +0000182d +0000182e +0000182f +00001830 +00001831 +00001832 +00001833 +00001834 +00001835 +00001836 +00001837 +00001838 +00001839 +0000183a +0000183b +0000183c +0000183d +0000183e +0000183f +00001840 +00001841 +00001842 +00001843 +00001844 +00001845 +00001846 +00001847 +00001848 +00001849 +0000184a +0000184b +0000184c +0000184d +0000184e +0000184f +00001850 +00001851 +00001852 +00001853 +00001854 +00001855 +00001856 +00001857 +00001858 +00001859 +0000185a +0000185b +0000185c +0000185d +0000185e +0000185f +00001860 +00001861 +00001862 +00001863 +00001864 +00001865 +00001866 +00001867 +00001868 +00001869 +0000186a +0000186b +0000186c +0000186d +0000186e +0000186f +00001870 +00001871 +00001872 +00001873 +00001874 +00001875 +00001876 +00001877 +00001878 +00001879 +0000187a +0000187b +0000187c +0000187d +0000187e +0000187f +00001880 +00001881 +00001882 +00001883 +00001884 +00001885 +00001886 +00001887 +00001888 +00001889 +0000188a +0000188b +0000188c +0000188d +0000188e +0000188f +00001890 +00001891 +00001892 +00001893 +00001894 +00001895 +00001896 +00001897 +00001898 +00001899 +0000189a +0000189b +0000189c +0000189d +0000189e +0000189f +000018a0 +000018a1 +000018a2 +000018a3 +000018a4 +000018a5 +000018a6 +000018a7 +000018a8 +000018a9 +000018aa +000018ab +000018ac +000018ad +000018ae +000018af +000018b0 +000018b1 +000018b2 +000018b3 +000018b4 +000018b5 +000018b6 +000018b7 +000018b8 +000018b9 +000018ba +000018bb +000018bc +000018bd +000018be +000018bf +000018c0 +000018c1 +000018c2 +000018c3 +000018c4 +000018c5 +000018c6 +000018c7 +000018c8 +000018c9 +000018ca +000018cb +000018cc +000018cd +000018ce +000018cf +000018d0 +000018d1 +000018d2 +000018d3 +000018d4 +000018d5 +000018d6 +000018d7 +000018d8 +000018d9 +000018da +000018db +000018dc +000018dd +000018de +000018df +000018e0 +000018e1 +000018e2 +000018e3 +000018e4 +000018e5 +000018e6 +000018e7 +000018e8 +000018e9 +000018ea +000018eb +000018ec +000018ed +000018ee +000018ef +000018f0 +000018f1 +000018f2 +000018f3 +000018f4 +000018f5 +000018f6 +000018f7 +000018f8 +000018f9 +000018fa +000018fb +000018fc +000018fd +000018fe +000018ff +00001900 +00001901 +00001902 +00001903 +00001904 +00001905 +00001906 +00001907 +00001908 +00001909 +0000190a +0000190b +0000190c +0000190d +0000190e +0000190f +00001910 +00001911 +00001912 +00001913 +00001914 +00001915 +00001916 +00001917 +00001918 +00001919 +0000191a +0000191b +0000191c +0000191d +0000191e +0000191f +00001920 +00001921 +00001922 +00001923 +00001924 +00001925 +00001926 +00001927 +00001928 +00001929 +0000192a +0000192b +0000192c +0000192d +0000192e +0000192f +00001930 +00001931 +00001932 +00001933 +00001934 +00001935 +00001936 +00001937 +00001938 +00001939 +0000193a +0000193b +0000193c +0000193d +0000193e +0000193f +00001940 +00001941 +00001942 +00001943 +00001944 +00001945 +00001946 +00001947 +00001948 +00001949 +0000194a +0000194b +0000194c +0000194d +0000194e +0000194f +00001950 +00001951 +00001952 +00001953 +00001954 +00001955 +00001956 +00001957 +00001958 +00001959 +0000195a +0000195b +0000195c +0000195d +0000195e +0000195f +00001960 +00001961 +00001962 +00001963 +00001964 +00001965 +00001966 +00001967 +00001968 +00001969 +0000196a +0000196b +0000196c +0000196d +0000196e +0000196f +00001970 +00001971 +00001972 +00001973 +00001974 +00001975 +00001976 +00001977 +00001978 +00001979 +0000197a +0000197b +0000197c +0000197d +0000197e +0000197f +00001980 +00001981 +00001982 +00001983 +00001984 +00001985 +00001986 +00001987 +00001988 +00001989 +0000198a +0000198b +0000198c +0000198d +0000198e +0000198f +00001990 +00001991 +00001992 +00001993 +00001994 +00001995 +00001996 +00001997 +00001998 +00001999 +0000199a +0000199b +0000199c +0000199d +0000199e +0000199f +000019a0 +000019a1 +000019a2 +000019a3 +000019a4 +000019a5 +000019a6 +000019a7 +000019a8 +000019a9 +000019aa +000019ab +000019ac +000019ad +000019ae +000019af +000019b0 +000019b1 +000019b2 +000019b3 +000019b4 +000019b5 +000019b6 +000019b7 +000019b8 +000019b9 +000019ba +000019bb +000019bc +000019bd +000019be +000019bf +000019c0 +000019c1 +000019c2 +000019c3 +000019c4 +000019c5 +000019c6 +000019c7 +000019c8 +000019c9 +000019ca +000019cb +000019cc +000019cd +000019ce +000019cf +000019d0 +000019d1 +000019d2 +000019d3 +000019d4 +000019d5 +000019d6 +000019d7 +000019d8 +000019d9 +000019da +000019db +000019dc +000019dd +000019de +000019df +000019e0 +000019e1 +000019e2 +000019e3 +000019e4 +000019e5 +000019e6 +000019e7 +000019e8 +000019e9 +000019ea +000019eb +000019ec +000019ed +000019ee +000019ef +000019f0 +000019f1 +000019f2 +000019f3 +000019f4 +000019f5 +000019f6 +000019f7 +000019f8 +000019f9 +000019fa +000019fb +000019fc +000019fd +000019fe +000019ff +00001a00 +00001a01 +00001a02 +00001a03 +00001a04 +00001a05 +00001a06 +00001a07 +00001a08 +00001a09 +00001a0a +00001a0b +00001a0c +00001a0d +00001a0e +00001a0f +00001a10 +00001a11 +00001a12 +00001a13 +00001a14 +00001a15 +00001a16 +00001a17 +00001a18 +00001a19 +00001a1a +00001a1b +00001a1c +00001a1d +00001a1e +00001a1f +00001a20 +00001a21 +00001a22 +00001a23 +00001a24 +00001a25 +00001a26 +00001a27 +00001a28 +00001a29 +00001a2a +00001a2b +00001a2c +00001a2d +00001a2e +00001a2f +00001a30 +00001a31 +00001a32 +00001a33 +00001a34 +00001a35 +00001a36 +00001a37 +00001a38 +00001a39 +00001a3a +00001a3b +00001a3c +00001a3d +00001a3e +00001a3f +00001a40 +00001a41 +00001a42 +00001a43 +00001a44 +00001a45 +00001a46 +00001a47 +00001a48 +00001a49 +00001a4a +00001a4b +00001a4c +00001a4d +00001a4e +00001a4f +00001a50 +00001a51 +00001a52 +00001a53 +00001a54 +00001a55 +00001a56 +00001a57 +00001a58 +00001a59 +00001a5a +00001a5b +00001a5c +00001a5d +00001a5e +00001a5f +00001a60 +00001a61 +00001a62 +00001a63 +00001a64 +00001a65 +00001a66 +00001a67 +00001a68 +00001a69 +00001a6a +00001a6b +00001a6c +00001a6d +00001a6e +00001a6f +00001a70 +00001a71 +00001a72 +00001a73 +00001a74 +00001a75 +00001a76 +00001a77 +00001a78 +00001a79 +00001a7a +00001a7b +00001a7c +00001a7d +00001a7e +00001a7f +00001a80 +00001a81 +00001a82 +00001a83 +00001a84 +00001a85 +00001a86 +00001a87 +00001a88 +00001a89 +00001a8a +00001a8b +00001a8c +00001a8d +00001a8e +00001a8f +00001a90 +00001a91 +00001a92 +00001a93 +00001a94 +00001a95 +00001a96 +00001a97 +00001a98 +00001a99 +00001a9a +00001a9b +00001a9c +00001a9d +00001a9e +00001a9f +00001aa0 +00001aa1 +00001aa2 +00001aa3 +00001aa4 +00001aa5 +00001aa6 +00001aa7 +00001aa8 +00001aa9 +00001aaa +00001aab +00001aac +00001aad +00001aae +00001aaf +00001ab0 +00001ab1 +00001ab2 +00001ab3 +00001ab4 +00001ab5 +00001ab6 +00001ab7 +00001ab8 +00001ab9 +00001aba +00001abb +00001abc +00001abd +00001abe +00001abf +00001ac0 +00001ac1 +00001ac2 +00001ac3 +00001ac4 +00001ac5 +00001ac6 +00001ac7 +00001ac8 +00001ac9 +00001aca +00001acb +00001acc +00001acd +00001ace +00001acf +00001ad0 +00001ad1 +00001ad2 +00001ad3 +00001ad4 +00001ad5 +00001ad6 +00001ad7 +00001ad8 +00001ad9 +00001ada +00001adb +00001adc +00001add +00001ade +00001adf +00001ae0 +00001ae1 +00001ae2 +00001ae3 +00001ae4 +00001ae5 +00001ae6 +00001ae7 +00001ae8 +00001ae9 +00001aea +00001aeb +00001aec +00001aed +00001aee +00001aef +00001af0 +00001af1 +00001af2 +00001af3 +00001af4 +00001af5 +00001af6 +00001af7 +00001af8 +00001af9 +00001afa +00001afb +00001afc +00001afd +00001afe +00001aff +00001b00 +00001b01 +00001b02 +00001b03 +00001b04 +00001b05 +00001b06 +00001b07 +00001b08 +00001b09 +00001b0a +00001b0b +00001b0c +00001b0d +00001b0e +00001b0f +00001b10 +00001b11 +00001b12 +00001b13 +00001b14 +00001b15 +00001b16 +00001b17 +00001b18 +00001b19 +00001b1a +00001b1b +00001b1c +00001b1d +00001b1e +00001b1f +00001b20 +00001b21 +00001b22 +00001b23 +00001b24 +00001b25 +00001b26 +00001b27 +00001b28 +00001b29 +00001b2a +00001b2b +00001b2c +00001b2d +00001b2e +00001b2f +00001b30 +00001b31 +00001b32 +00001b33 +00001b34 +00001b35 +00001b36 +00001b37 +00001b38 +00001b39 +00001b3a +00001b3b +00001b3c +00001b3d +00001b3e +00001b3f +00001b40 +00001b41 +00001b42 +00001b43 +00001b44 +00001b45 +00001b46 +00001b47 +00001b48 +00001b49 +00001b4a +00001b4b +00001b4c +00001b4d +00001b4e +00001b4f +00001b50 +00001b51 +00001b52 +00001b53 +00001b54 +00001b55 +00001b56 +00001b57 +00001b58 +00001b59 +00001b5a +00001b5b +00001b5c +00001b5d +00001b5e +00001b5f +00001b60 +00001b61 +00001b62 +00001b63 +00001b64 +00001b65 +00001b66 +00001b67 +00001b68 +00001b69 +00001b6a +00001b6b +00001b6c +00001b6d +00001b6e +00001b6f +00001b70 +00001b71 +00001b72 +00001b73 +00001b74 +00001b75 +00001b76 +00001b77 +00001b78 +00001b79 +00001b7a +00001b7b +00001b7c +00001b7d +00001b7e +00001b7f +00001b80 +00001b81 +00001b82 +00001b83 +00001b84 +00001b85 +00001b86 +00001b87 +00001b88 +00001b89 +00001b8a +00001b8b +00001b8c +00001b8d +00001b8e +00001b8f +00001b90 +00001b91 +00001b92 +00001b93 +00001b94 +00001b95 +00001b96 +00001b97 +00001b98 +00001b99 +00001b9a +00001b9b +00001b9c +00001b9d +00001b9e +00001b9f +00001ba0 +00001ba1 +00001ba2 +00001ba3 +00001ba4 +00001ba5 +00001ba6 +00001ba7 +00001ba8 +00001ba9 +00001baa +00001bab +00001bac +00001bad +00001bae +00001baf +00001bb0 +00001bb1 +00001bb2 +00001bb3 +00001bb4 +00001bb5 +00001bb6 +00001bb7 +00001bb8 +00001bb9 +00001bba +00001bbb +00001bbc +00001bbd +00001bbe +00001bbf +00001bc0 +00001bc1 +00001bc2 +00001bc3 +00001bc4 +00001bc5 +00001bc6 +00001bc7 +00001bc8 +00001bc9 +00001bca +00001bcb +00001bcc +00001bcd +00001bce +00001bcf +00001bd0 +00001bd1 +00001bd2 +00001bd3 +00001bd4 +00001bd5 +00001bd6 +00001bd7 +00001bd8 +00001bd9 +00001bda +00001bdb +00001bdc +00001bdd +00001bde +00001bdf +00001be0 +00001be1 +00001be2 +00001be3 +00001be4 +00001be5 +00001be6 +00001be7 +00001be8 +00001be9 +00001bea +00001beb +00001bec +00001bed +00001bee +00001bef +00001bf0 +00001bf1 +00001bf2 +00001bf3 +00001bf4 +00001bf5 +00001bf6 +00001bf7 +00001bf8 +00001bf9 +00001bfa +00001bfb +00001bfc +00001bfd +00001bfe +00001bff +00001c00 +00001c01 +00001c02 +00001c03 +00001c04 +00001c05 +00001c06 +00001c07 +00001c08 +00001c09 +00001c0a +00001c0b +00001c0c +00001c0d +00001c0e +00001c0f +00001c10 +00001c11 +00001c12 +00001c13 +00001c14 +00001c15 +00001c16 +00001c17 +00001c18 +00001c19 +00001c1a +00001c1b +00001c1c +00001c1d +00001c1e +00001c1f +00001c20 +00001c21 +00001c22 +00001c23 +00001c24 +00001c25 +00001c26 +00001c27 +00001c28 +00001c29 +00001c2a +00001c2b +00001c2c +00001c2d +00001c2e +00001c2f +00001c30 +00001c31 +00001c32 +00001c33 +00001c34 +00001c35 +00001c36 +00001c37 +00001c38 +00001c39 +00001c3a +00001c3b +00001c3c +00001c3d +00001c3e +00001c3f +00001c40 +00001c41 +00001c42 +00001c43 +00001c44 +00001c45 +00001c46 +00001c47 +00001c48 +00001c49 +00001c4a +00001c4b +00001c4c +00001c4d +00001c4e +00001c4f +00001c50 +00001c51 +00001c52 +00001c53 +00001c54 +00001c55 +00001c56 +00001c57 +00001c58 +00001c59 +00001c5a +00001c5b +00001c5c +00001c5d +00001c5e +00001c5f +00001c60 +00001c61 +00001c62 +00001c63 +00001c64 +00001c65 +00001c66 +00001c67 +00001c68 +00001c69 +00001c6a +00001c6b +00001c6c +00001c6d +00001c6e +00001c6f +00001c70 +00001c71 +00001c72 +00001c73 +00001c74 +00001c75 +00001c76 +00001c77 +00001c78 +00001c79 +00001c7a +00001c7b +00001c7c +00001c7d +00001c7e +00001c7f +00001c80 +00001c81 +00001c82 +00001c83 +00001c84 +00001c85 +00001c86 +00001c87 +00001c88 +00001c89 +00001c8a +00001c8b +00001c8c +00001c8d +00001c8e +00001c8f +00001c90 +00001c91 +00001c92 +00001c93 +00001c94 +00001c95 +00001c96 +00001c97 +00001c98 +00001c99 +00001c9a +00001c9b +00001c9c +00001c9d +00001c9e +00001c9f +00001ca0 +00001ca1 +00001ca2 +00001ca3 +00001ca4 +00001ca5 +00001ca6 +00001ca7 +00001ca8 +00001ca9 +00001caa +00001cab +00001cac +00001cad +00001cae +00001caf +00001cb0 +00001cb1 +00001cb2 +00001cb3 +00001cb4 +00001cb5 +00001cb6 +00001cb7 +00001cb8 +00001cb9 +00001cba +00001cbb +00001cbc +00001cbd +00001cbe +00001cbf +00001cc0 +00001cc1 +00001cc2 +00001cc3 +00001cc4 +00001cc5 +00001cc6 +00001cc7 +00001cc8 +00001cc9 +00001cca +00001ccb +00001ccc +00001ccd +00001cce +00001ccf +00001cd0 +00001cd1 +00001cd2 +00001cd3 +00001cd4 +00001cd5 +00001cd6 +00001cd7 +00001cd8 +00001cd9 +00001cda +00001cdb +00001cdc +00001cdd +00001cde +00001cdf +00001ce0 +00001ce1 +00001ce2 +00001ce3 +00001ce4 +00001ce5 +00001ce6 +00001ce7 +00001ce8 +00001ce9 +00001cea +00001ceb +00001cec +00001ced +00001cee +00001cef +00001cf0 +00001cf1 +00001cf2 +00001cf3 +00001cf4 +00001cf5 +00001cf6 +00001cf7 +00001cf8 +00001cf9 +00001cfa +00001cfb +00001cfc +00001cfd +00001cfe +00001cff +00001d00 +00001d01 +00001d02 +00001d03 +00001d04 +00001d05 +00001d06 +00001d07 +00001d08 +00001d09 +00001d0a +00001d0b +00001d0c +00001d0d +00001d0e +00001d0f +00001d10 +00001d11 +00001d12 +00001d13 +00001d14 +00001d15 +00001d16 +00001d17 +00001d18 +00001d19 +00001d1a +00001d1b +00001d1c +00001d1d +00001d1e +00001d1f +00001d20 +00001d21 +00001d22 +00001d23 +00001d24 +00001d25 +00001d26 +00001d27 +00001d28 +00001d29 +00001d2a +00001d2b +00001d2c +00001d2d +00001d2e +00001d2f +00001d30 +00001d31 +00001d32 +00001d33 +00001d34 +00001d35 +00001d36 +00001d37 +00001d38 +00001d39 +00001d3a +00001d3b +00001d3c +00001d3d +00001d3e +00001d3f +00001d40 +00001d41 +00001d42 +00001d43 +00001d44 +00001d45 +00001d46 +00001d47 +00001d48 +00001d49 +00001d4a +00001d4b +00001d4c +00001d4d +00001d4e +00001d4f +00001d50 +00001d51 +00001d52 +00001d53 +00001d54 +00001d55 +00001d56 +00001d57 +00001d58 +00001d59 +00001d5a +00001d5b +00001d5c +00001d5d +00001d5e +00001d5f +00001d60 +00001d61 +00001d62 +00001d63 +00001d64 +00001d65 +00001d66 +00001d67 +00001d68 +00001d69 +00001d6a +00001d6b +00001d6c +00001d6d +00001d6e +00001d6f +00001d70 +00001d71 +00001d72 +00001d73 +00001d74 +00001d75 +00001d76 +00001d77 +00001d78 +00001d79 +00001d7a +00001d7b +00001d7c +00001d7d +00001d7e +00001d7f +00001d80 +00001d81 +00001d82 +00001d83 +00001d84 +00001d85 +00001d86 +00001d87 +00001d88 +00001d89 +00001d8a +00001d8b +00001d8c +00001d8d +00001d8e +00001d8f +00001d90 +00001d91 +00001d92 +00001d93 +00001d94 +00001d95 +00001d96 +00001d97 +00001d98 +00001d99 +00001d9a +00001d9b +00001d9c +00001d9d +00001d9e +00001d9f +00001da0 +00001da1 +00001da2 +00001da3 +00001da4 +00001da5 +00001da6 +00001da7 +00001da8 +00001da9 +00001daa +00001dab +00001dac +00001dad +00001dae +00001daf +00001db0 +00001db1 +00001db2 +00001db3 +00001db4 +00001db5 +00001db6 +00001db7 +00001db8 +00001db9 +00001dba +00001dbb +00001dbc +00001dbd +00001dbe +00001dbf +00001dc0 +00001dc1 +00001dc2 +00001dc3 +00001dc4 +00001dc5 +00001dc6 +00001dc7 +00001dc8 +00001dc9 +00001dca +00001dcb +00001dcc +00001dcd +00001dce +00001dcf +00001dd0 +00001dd1 +00001dd2 +00001dd3 +00001dd4 +00001dd5 +00001dd6 +00001dd7 +00001dd8 +00001dd9 +00001dda +00001ddb +00001ddc +00001ddd +00001dde +00001ddf +00001de0 +00001de1 +00001de2 +00001de3 +00001de4 +00001de5 +00001de6 +00001de7 +00001de8 +00001de9 +00001dea +00001deb +00001dec +00001ded +00001dee +00001def +00001df0 +00001df1 +00001df2 +00001df3 +00001df4 +00001df5 +00001df6 +00001df7 +00001df8 +00001df9 +00001dfa +00001dfb +00001dfc +00001dfd +00001dfe +00001dff +00001e00 +00001e01 +00001e02 +00001e03 +00001e04 +00001e05 +00001e06 +00001e07 +00001e08 +00001e09 +00001e0a +00001e0b +00001e0c +00001e0d +00001e0e +00001e0f +00001e10 +00001e11 +00001e12 +00001e13 +00001e14 +00001e15 +00001e16 +00001e17 +00001e18 +00001e19 +00001e1a +00001e1b +00001e1c +00001e1d +00001e1e +00001e1f +00001e20 +00001e21 +00001e22 +00001e23 +00001e24 +00001e25 +00001e26 +00001e27 +00001e28 +00001e29 +00001e2a +00001e2b +00001e2c +00001e2d +00001e2e +00001e2f +00001e30 +00001e31 +00001e32 +00001e33 +00001e34 +00001e35 +00001e36 +00001e37 +00001e38 +00001e39 +00001e3a +00001e3b +00001e3c +00001e3d +00001e3e +00001e3f +00001e40 +00001e41 +00001e42 +00001e43 +00001e44 +00001e45 +00001e46 +00001e47 +00001e48 +00001e49 +00001e4a +00001e4b +00001e4c +00001e4d +00001e4e +00001e4f +00001e50 +00001e51 +00001e52 +00001e53 +00001e54 +00001e55 +00001e56 +00001e57 +00001e58 +00001e59 +00001e5a +00001e5b +00001e5c +00001e5d +00001e5e +00001e5f +00001e60 +00001e61 +00001e62 +00001e63 +00001e64 +00001e65 +00001e66 +00001e67 +00001e68 +00001e69 +00001e6a +00001e6b +00001e6c +00001e6d +00001e6e +00001e6f +00001e70 +00001e71 +00001e72 +00001e73 +00001e74 +00001e75 +00001e76 +00001e77 +00001e78 +00001e79 +00001e7a +00001e7b +00001e7c +00001e7d +00001e7e +00001e7f +00001e80 +00001e81 +00001e82 +00001e83 +00001e84 +00001e85 +00001e86 +00001e87 +00001e88 +00001e89 +00001e8a +00001e8b +00001e8c +00001e8d +00001e8e +00001e8f +00001e90 +00001e91 +00001e92 +00001e93 +00001e94 +00001e95 +00001e96 +00001e97 +00001e98 +00001e99 +00001e9a +00001e9b +00001e9c +00001e9d +00001e9e +00001e9f +00001ea0 +00001ea1 +00001ea2 +00001ea3 +00001ea4 +00001ea5 +00001ea6 +00001ea7 +00001ea8 +00001ea9 +00001eaa +00001eab +00001eac +00001ead +00001eae +00001eaf +00001eb0 +00001eb1 +00001eb2 +00001eb3 +00001eb4 +00001eb5 +00001eb6 +00001eb7 +00001eb8 +00001eb9 +00001eba +00001ebb +00001ebc +00001ebd +00001ebe +00001ebf +00001ec0 +00001ec1 +00001ec2 +00001ec3 +00001ec4 +00001ec5 +00001ec6 +00001ec7 +00001ec8 +00001ec9 +00001eca +00001ecb +00001ecc +00001ecd +00001ece +00001ecf +00001ed0 +00001ed1 +00001ed2 +00001ed3 +00001ed4 +00001ed5 +00001ed6 +00001ed7 +00001ed8 +00001ed9 +00001eda +00001edb +00001edc +00001edd +00001ede +00001edf +00001ee0 +00001ee1 +00001ee2 +00001ee3 +00001ee4 +00001ee5 +00001ee6 +00001ee7 +00001ee8 +00001ee9 +00001eea +00001eeb +00001eec +00001eed +00001eee +00001eef +00001ef0 +00001ef1 +00001ef2 +00001ef3 +00001ef4 +00001ef5 +00001ef6 +00001ef7 +00001ef8 +00001ef9 +00001efa +00001efb +00001efc +00001efd +00001efe +00001eff +00001f00 +00001f01 +00001f02 +00001f03 +00001f04 +00001f05 +00001f06 +00001f07 +00001f08 +00001f09 +00001f0a +00001f0b +00001f0c +00001f0d +00001f0e +00001f0f +00001f10 +00001f11 +00001f12 +00001f13 +00001f14 +00001f15 +00001f16 +00001f17 +00001f18 +00001f19 +00001f1a +00001f1b +00001f1c +00001f1d +00001f1e +00001f1f +00001f20 +00001f21 +00001f22 +00001f23 +00001f24 +00001f25 +00001f26 +00001f27 +00001f28 +00001f29 +00001f2a +00001f2b +00001f2c +00001f2d +00001f2e +00001f2f +00001f30 +00001f31 +00001f32 +00001f33 +00001f34 +00001f35 +00001f36 +00001f37 +00001f38 +00001f39 +00001f3a +00001f3b +00001f3c +00001f3d +00001f3e +00001f3f +00001f40 +00001f41 +00001f42 +00001f43 +00001f44 +00001f45 +00001f46 +00001f47 +00001f48 +00001f49 +00001f4a +00001f4b +00001f4c +00001f4d +00001f4e +00001f4f +00001f50 +00001f51 +00001f52 +00001f53 +00001f54 +00001f55 +00001f56 +00001f57 +00001f58 +00001f59 +00001f5a +00001f5b +00001f5c +00001f5d +00001f5e +00001f5f +00001f60 +00001f61 +00001f62 +00001f63 +00001f64 +00001f65 +00001f66 +00001f67 +00001f68 +00001f69 +00001f6a +00001f6b +00001f6c +00001f6d +00001f6e +00001f6f +00001f70 +00001f71 +00001f72 +00001f73 +00001f74 +00001f75 +00001f76 +00001f77 +00001f78 +00001f79 +00001f7a +00001f7b +00001f7c +00001f7d +00001f7e +00001f7f +00001f80 +00001f81 +00001f82 +00001f83 +00001f84 +00001f85 +00001f86 +00001f87 +00001f88 +00001f89 +00001f8a +00001f8b +00001f8c +00001f8d +00001f8e +00001f8f +00001f90 +00001f91 +00001f92 +00001f93 +00001f94 +00001f95 +00001f96 +00001f97 +00001f98 +00001f99 +00001f9a +00001f9b +00001f9c +00001f9d +00001f9e +00001f9f +00001fa0 +00001fa1 +00001fa2 +00001fa3 +00001fa4 +00001fa5 +00001fa6 +00001fa7 +00001fa8 +00001fa9 +00001faa +00001fab +00001fac +00001fad +00001fae +00001faf +00001fb0 +00001fb1 +00001fb2 +00001fb3 +00001fb4 +00001fb5 +00001fb6 +00001fb7 +00001fb8 +00001fb9 +00001fba +00001fbb +00001fbc +00001fbd +00001fbe +00001fbf +00001fc0 +00001fc1 +00001fc2 +00001fc3 +00001fc4 +00001fc5 +00001fc6 +00001fc7 +00001fc8 +00001fc9 +00001fca +00001fcb +00001fcc +00001fcd +00001fce +00001fcf +00001fd0 +00001fd1 +00001fd2 +00001fd3 +00001fd4 +00001fd5 +00001fd6 +00001fd7 +00001fd8 +00001fd9 +00001fda +00001fdb +00001fdc +00001fdd +00001fde +00001fdf +00001fe0 +00001fe1 +00001fe2 +00001fe3 +00001fe4 +00001fe5 +00001fe6 +00001fe7 +00001fe8 +00001fe9 +00001fea +00001feb +00001fec +00001fed +00001fee +00001fef +00001ff0 +00001ff1 +00001ff2 +00001ff3 +00001ff4 +00001ff5 +00001ff6 +00001ff7 +00001ff8 +00001ff9 +00001ffa +00001ffb +00001ffc +00001ffd +00001ffe +00001fff +00002000 +00002001 +00002002 +00002003 +00002004 +00002005 +00002006 +00002007 +00002008 +00002009 +0000200a +0000200b +0000200c +0000200d +0000200e +0000200f +00002010 +00002011 +00002012 +00002013 +00002014 +00002015 +00002016 +00002017 +00002018 +00002019 +0000201a +0000201b +0000201c +0000201d +0000201e +0000201f +00002020 +00002021 +00002022 +00002023 +00002024 +00002025 +00002026 +00002027 +00002028 +00002029 +0000202a +0000202b +0000202c +0000202d +0000202e +0000202f +00002030 +00002031 +00002032 +00002033 +00002034 +00002035 +00002036 +00002037 +00002038 +00002039 +0000203a +0000203b +0000203c +0000203d +0000203e +0000203f +00002040 +00002041 +00002042 +00002043 +00002044 +00002045 +00002046 +00002047 +00002048 +00002049 +0000204a +0000204b +0000204c +0000204d +0000204e +0000204f +00002050 +00002051 +00002052 +00002053 +00002054 +00002055 +00002056 +00002057 +00002058 +00002059 +0000205a +0000205b +0000205c +0000205d +0000205e +0000205f +00002060 +00002061 +00002062 +00002063 +00002064 +00002065 +00002066 +00002067 +00002068 +00002069 +0000206a +0000206b +0000206c +0000206d +0000206e +0000206f +00002070 +00002071 +00002072 +00002073 +00002074 +00002075 +00002076 +00002077 +00002078 +00002079 +0000207a +0000207b +0000207c +0000207d +0000207e +0000207f +00002080 +00002081 +00002082 +00002083 +00002084 +00002085 +00002086 +00002087 +00002088 +00002089 +0000208a +0000208b +0000208c +0000208d +0000208e +0000208f +00002090 +00002091 +00002092 +00002093 +00002094 +00002095 +00002096 +00002097 +00002098 +00002099 +0000209a +0000209b +0000209c +0000209d +0000209e +0000209f +000020a0 +000020a1 +000020a2 +000020a3 +000020a4 +000020a5 +000020a6 +000020a7 +000020a8 +000020a9 +000020aa +000020ab +000020ac +000020ad +000020ae +000020af +000020b0 +000020b1 +000020b2 +000020b3 +000020b4 +000020b5 +000020b6 +000020b7 +000020b8 +000020b9 +000020ba +000020bb +000020bc +000020bd +000020be +000020bf +000020c0 +000020c1 +000020c2 +000020c3 +000020c4 +000020c5 +000020c6 +000020c7 +000020c8 +000020c9 +000020ca +000020cb +000020cc +000020cd +000020ce +000020cf +000020d0 +000020d1 +000020d2 +000020d3 +000020d4 +000020d5 +000020d6 +000020d7 +000020d8 +000020d9 +000020da +000020db +000020dc +000020dd +000020de +000020df +000020e0 +000020e1 +000020e2 +000020e3 +000020e4 +000020e5 +000020e6 +000020e7 +000020e8 +000020e9 +000020ea +000020eb +000020ec +000020ed +000020ee +000020ef +000020f0 +000020f1 +000020f2 +000020f3 +000020f4 +000020f5 +000020f6 +000020f7 +000020f8 +000020f9 +000020fa +000020fb +000020fc +000020fd +000020fe +000020ff +00002100 +00002101 +00002102 +00002103 +00002104 +00002105 +00002106 +00002107 +00002108 +00002109 +0000210a +0000210b +0000210c +0000210d +0000210e +0000210f +00002110 +00002111 +00002112 +00002113 +00002114 +00002115 +00002116 +00002117 +00002118 +00002119 +0000211a +0000211b +0000211c +0000211d +0000211e +0000211f +00002120 +00002121 +00002122 +00002123 +00002124 +00002125 +00002126 +00002127 +00002128 +00002129 +0000212a +0000212b +0000212c +0000212d +0000212e +0000212f +00002130 +00002131 +00002132 +00002133 +00002134 +00002135 +00002136 +00002137 +00002138 +00002139 +0000213a +0000213b +0000213c +0000213d +0000213e +0000213f +00002140 +00002141 +00002142 +00002143 +00002144 +00002145 +00002146 +00002147 +00002148 +00002149 +0000214a +0000214b +0000214c +0000214d +0000214e +0000214f +00002150 +00002151 +00002152 +00002153 +00002154 +00002155 +00002156 +00002157 +00002158 +00002159 +0000215a +0000215b +0000215c +0000215d +0000215e +0000215f +00002160 +00002161 +00002162 +00002163 +00002164 +00002165 +00002166 +00002167 +00002168 +00002169 +0000216a +0000216b +0000216c +0000216d +0000216e +0000216f +00002170 +00002171 +00002172 +00002173 +00002174 +00002175 +00002176 +00002177 +00002178 +00002179 +0000217a +0000217b +0000217c +0000217d +0000217e +0000217f +00002180 +00002181 +00002182 +00002183 +00002184 +00002185 +00002186 +00002187 +00002188 +00002189 +0000218a +0000218b +0000218c +0000218d +0000218e +0000218f +00002190 +00002191 +00002192 +00002193 +00002194 +00002195 +00002196 +00002197 +00002198 +00002199 +0000219a +0000219b +0000219c +0000219d +0000219e +0000219f +000021a0 +000021a1 +000021a2 +000021a3 +000021a4 +000021a5 +000021a6 +000021a7 +000021a8 +000021a9 +000021aa +000021ab +000021ac +000021ad +000021ae +000021af +000021b0 +000021b1 +000021b2 +000021b3 +000021b4 +000021b5 +000021b6 +000021b7 +000021b8 +000021b9 +000021ba +000021bb +000021bc +000021bd +000021be +000021bf +000021c0 +000021c1 +000021c2 +000021c3 +000021c4 +000021c5 +000021c6 +000021c7 +000021c8 +000021c9 +000021ca +000021cb +000021cc +000021cd +000021ce +000021cf +000021d0 +000021d1 +000021d2 +000021d3 +000021d4 +000021d5 +000021d6 +000021d7 +000021d8 +000021d9 +000021da +000021db +000021dc +000021dd +000021de +000021df +000021e0 +000021e1 +000021e2 +000021e3 +000021e4 +000021e5 +000021e6 +000021e7 +000021e8 +000021e9 +000021ea +000021eb +000021ec +000021ed +000021ee +000021ef +000021f0 +000021f1 +000021f2 +000021f3 +000021f4 +000021f5 +000021f6 +000021f7 +000021f8 +000021f9 +000021fa +000021fb +000021fc +000021fd +000021fe +000021ff +00002200 +00002201 +00002202 +00002203 +00002204 +00002205 +00002206 +00002207 +00002208 +00002209 +0000220a +0000220b +0000220c +0000220d +0000220e +0000220f +00002210 +00002211 +00002212 +00002213 +00002214 +00002215 +00002216 +00002217 +00002218 +00002219 +0000221a +0000221b +0000221c +0000221d +0000221e +0000221f +00002220 +00002221 +00002222 +00002223 +00002224 +00002225 +00002226 +00002227 +00002228 +00002229 +0000222a +0000222b +0000222c +0000222d +0000222e +0000222f +00002230 +00002231 +00002232 +00002233 +00002234 +00002235 +00002236 +00002237 +00002238 +00002239 +0000223a +0000223b +0000223c +0000223d +0000223e +0000223f +00002240 +00002241 +00002242 +00002243 +00002244 +00002245 +00002246 +00002247 +00002248 +00002249 +0000224a +0000224b +0000224c +0000224d +0000224e +0000224f +00002250 +00002251 +00002252 +00002253 +00002254 +00002255 +00002256 +00002257 +00002258 +00002259 +0000225a +0000225b +0000225c +0000225d +0000225e +0000225f +00002260 +00002261 +00002262 +00002263 +00002264 +00002265 +00002266 +00002267 +00002268 +00002269 +0000226a +0000226b +0000226c +0000226d +0000226e +0000226f +00002270 +00002271 +00002272 +00002273 +00002274 +00002275 +00002276 +00002277 +00002278 +00002279 +0000227a +0000227b +0000227c +0000227d +0000227e +0000227f +00002280 +00002281 +00002282 +00002283 +00002284 +00002285 +00002286 +00002287 +00002288 +00002289 +0000228a +0000228b +0000228c +0000228d +0000228e +0000228f +00002290 +00002291 +00002292 +00002293 +00002294 +00002295 +00002296 +00002297 +00002298 +00002299 +0000229a +0000229b +0000229c +0000229d +0000229e +0000229f +000022a0 +000022a1 +000022a2 +000022a3 +000022a4 +000022a5 +000022a6 +000022a7 +000022a8 +000022a9 +000022aa +000022ab +000022ac +000022ad +000022ae +000022af +000022b0 +000022b1 +000022b2 +000022b3 +000022b4 +000022b5 +000022b6 +000022b7 +000022b8 +000022b9 +000022ba +000022bb +000022bc +000022bd +000022be +000022bf +000022c0 +000022c1 +000022c2 +000022c3 +000022c4 +000022c5 +000022c6 +000022c7 +000022c8 +000022c9 +000022ca +000022cb +000022cc +000022cd +000022ce +000022cf +000022d0 +000022d1 +000022d2 +000022d3 +000022d4 +000022d5 +000022d6 +000022d7 +000022d8 +000022d9 +000022da +000022db +000022dc +000022dd +000022de +000022df +000022e0 +000022e1 +000022e2 +000022e3 +000022e4 +000022e5 +000022e6 +000022e7 +000022e8 +000022e9 +000022ea +000022eb +000022ec +000022ed +000022ee +000022ef +000022f0 +000022f1 +000022f2 +000022f3 +000022f4 +000022f5 +000022f6 +000022f7 +000022f8 +000022f9 +000022fa +000022fb +000022fc +000022fd +000022fe +000022ff +00002300 +00002301 +00002302 +00002303 +00002304 +00002305 +00002306 +00002307 +00002308 +00002309 +0000230a +0000230b +0000230c +0000230d +0000230e +0000230f +00002310 +00002311 +00002312 +00002313 +00002314 +00002315 +00002316 +00002317 +00002318 +00002319 +0000231a +0000231b +0000231c +0000231d +0000231e +0000231f +00002320 +00002321 +00002322 +00002323 +00002324 +00002325 +00002326 +00002327 +00002328 +00002329 +0000232a +0000232b +0000232c +0000232d +0000232e +0000232f +00002330 +00002331 +00002332 +00002333 +00002334 +00002335 +00002336 +00002337 +00002338 +00002339 +0000233a +0000233b +0000233c +0000233d +0000233e +0000233f +00002340 +00002341 +00002342 +00002343 +00002344 +00002345 +00002346 +00002347 +00002348 +00002349 +0000234a +0000234b +0000234c +0000234d +0000234e +0000234f +00002350 +00002351 +00002352 +00002353 +00002354 +00002355 +00002356 +00002357 +00002358 +00002359 +0000235a +0000235b +0000235c +0000235d +0000235e +0000235f +00002360 +00002361 +00002362 +00002363 +00002364 +00002365 +00002366 +00002367 +00002368 +00002369 +0000236a +0000236b +0000236c +0000236d +0000236e +0000236f +00002370 +00002371 +00002372 +00002373 +00002374 +00002375 +00002376 +00002377 +00002378 +00002379 +0000237a +0000237b +0000237c +0000237d +0000237e +0000237f +00002380 +00002381 +00002382 +00002383 +00002384 +00002385 +00002386 +00002387 +00002388 +00002389 +0000238a +0000238b +0000238c +0000238d +0000238e +0000238f +00002390 +00002391 +00002392 +00002393 +00002394 +00002395 +00002396 +00002397 +00002398 +00002399 +0000239a +0000239b +0000239c +0000239d +0000239e +0000239f +000023a0 +000023a1 +000023a2 +000023a3 +000023a4 +000023a5 +000023a6 +000023a7 +000023a8 +000023a9 +000023aa +000023ab +000023ac +000023ad +000023ae +000023af +000023b0 +000023b1 +000023b2 +000023b3 +000023b4 +000023b5 +000023b6 +000023b7 +000023b8 +000023b9 +000023ba +000023bb +000023bc +000023bd +000023be +000023bf +000023c0 +000023c1 +000023c2 +000023c3 +000023c4 +000023c5 +000023c6 +000023c7 +000023c8 +000023c9 +000023ca +000023cb +000023cc +000023cd +000023ce +000023cf +000023d0 +000023d1 +000023d2 +000023d3 +000023d4 +000023d5 +000023d6 +000023d7 +000023d8 +000023d9 +000023da +000023db +000023dc +000023dd +000023de +000023df +000023e0 +000023e1 +000023e2 +000023e3 +000023e4 +000023e5 +000023e6 +000023e7 +000023e8 +000023e9 +000023ea +000023eb +000023ec +000023ed +000023ee +000023ef +000023f0 +000023f1 +000023f2 +000023f3 +000023f4 +000023f5 +000023f6 +000023f7 +000023f8 +000023f9 +000023fa +000023fb +000023fc +000023fd +000023fe +000023ff +00002400 +00002401 +00002402 +00002403 +00002404 +00002405 +00002406 +00002407 +00002408 +00002409 +0000240a +0000240b +0000240c +0000240d +0000240e +0000240f +00002410 +00002411 +00002412 +00002413 +00002414 +00002415 +00002416 +00002417 +00002418 +00002419 +0000241a +0000241b +0000241c +0000241d +0000241e +0000241f +00002420 +00002421 +00002422 +00002423 +00002424 +00002425 +00002426 +00002427 +00002428 +00002429 +0000242a +0000242b +0000242c +0000242d +0000242e +0000242f +00002430 +00002431 +00002432 +00002433 +00002434 +00002435 +00002436 +00002437 +00002438 +00002439 +0000243a +0000243b +0000243c +0000243d +0000243e +0000243f +00002440 +00002441 +00002442 +00002443 +00002444 +00002445 +00002446 +00002447 +00002448 +00002449 +0000244a +0000244b +0000244c +0000244d +0000244e +0000244f +00002450 +00002451 +00002452 +00002453 +00002454 +00002455 +00002456 +00002457 +00002458 +00002459 +0000245a +0000245b +0000245c +0000245d +0000245e +0000245f +00002460 +00002461 +00002462 +00002463 +00002464 +00002465 +00002466 +00002467 +00002468 +00002469 +0000246a +0000246b +0000246c +0000246d +0000246e +0000246f +00002470 +00002471 +00002472 +00002473 +00002474 +00002475 +00002476 +00002477 +00002478 +00002479 +0000247a +0000247b +0000247c +0000247d +0000247e +0000247f +00002480 +00002481 +00002482 +00002483 +00002484 +00002485 +00002486 +00002487 +00002488 +00002489 +0000248a +0000248b +0000248c +0000248d +0000248e +0000248f +00002490 +00002491 +00002492 +00002493 +00002494 +00002495 +00002496 +00002497 +00002498 +00002499 +0000249a +0000249b +0000249c +0000249d +0000249e +0000249f +000024a0 +000024a1 +000024a2 +000024a3 +000024a4 +000024a5 +000024a6 +000024a7 +000024a8 +000024a9 +000024aa +000024ab +000024ac +000024ad +000024ae +000024af +000024b0 +000024b1 +000024b2 +000024b3 +000024b4 +000024b5 +000024b6 +000024b7 +000024b8 +000024b9 +000024ba +000024bb +000024bc +000024bd +000024be +000024bf +000024c0 +000024c1 +000024c2 +000024c3 +000024c4 +000024c5 +000024c6 +000024c7 +000024c8 +000024c9 +000024ca +000024cb +000024cc +000024cd +000024ce +000024cf +000024d0 +000024d1 +000024d2 +000024d3 +000024d4 +000024d5 +000024d6 +000024d7 +000024d8 +000024d9 +000024da +000024db +000024dc +000024dd +000024de +000024df +000024e0 +000024e1 +000024e2 +000024e3 +000024e4 +000024e5 +000024e6 +000024e7 +000024e8 +000024e9 +000024ea +000024eb +000024ec +000024ed +000024ee +000024ef +000024f0 +000024f1 +000024f2 +000024f3 +000024f4 +000024f5 +000024f6 +000024f7 +000024f8 +000024f9 +000024fa +000024fb +000024fc +000024fd +000024fe +000024ff +00002500 +00002501 +00002502 +00002503 +00002504 +00002505 +00002506 +00002507 +00002508 +00002509 +0000250a +0000250b +0000250c +0000250d +0000250e +0000250f +00002510 +00002511 +00002512 +00002513 +00002514 +00002515 +00002516 +00002517 +00002518 +00002519 +0000251a +0000251b +0000251c +0000251d +0000251e +0000251f +00002520 +00002521 +00002522 +00002523 +00002524 +00002525 +00002526 +00002527 +00002528 +00002529 +0000252a +0000252b +0000252c +0000252d +0000252e +0000252f +00002530 +00002531 +00002532 +00002533 +00002534 +00002535 +00002536 +00002537 +00002538 +00002539 +0000253a +0000253b +0000253c +0000253d +0000253e +0000253f +00002540 +00002541 +00002542 +00002543 +00002544 +00002545 +00002546 +00002547 +00002548 +00002549 +0000254a +0000254b +0000254c +0000254d +0000254e +0000254f +00002550 +00002551 +00002552 +00002553 +00002554 +00002555 +00002556 +00002557 +00002558 +00002559 +0000255a +0000255b +0000255c +0000255d +0000255e +0000255f +00002560 +00002561 +00002562 +00002563 +00002564 +00002565 +00002566 +00002567 +00002568 +00002569 +0000256a +0000256b +0000256c +0000256d +0000256e +0000256f +00002570 +00002571 +00002572 +00002573 +00002574 +00002575 +00002576 +00002577 +00002578 +00002579 +0000257a +0000257b +0000257c +0000257d +0000257e +0000257f +00002580 +00002581 +00002582 +00002583 +00002584 +00002585 +00002586 +00002587 +00002588 +00002589 +0000258a +0000258b +0000258c +0000258d +0000258e +0000258f +00002590 +00002591 +00002592 +00002593 +00002594 +00002595 +00002596 +00002597 +00002598 +00002599 +0000259a +0000259b +0000259c +0000259d +0000259e +0000259f +000025a0 +000025a1 +000025a2 +000025a3 +000025a4 +000025a5 +000025a6 +000025a7 +000025a8 +000025a9 +000025aa +000025ab +000025ac +000025ad +000025ae +000025af +000025b0 +000025b1 +000025b2 +000025b3 +000025b4 +000025b5 +000025b6 +000025b7 +000025b8 +000025b9 +000025ba +000025bb +000025bc +000025bd +000025be +000025bf +000025c0 +000025c1 +000025c2 +000025c3 +000025c4 +000025c5 +000025c6 +000025c7 +000025c8 +000025c9 +000025ca +000025cb +000025cc +000025cd +000025ce +000025cf +000025d0 +000025d1 +000025d2 +000025d3 +000025d4 +000025d5 +000025d6 +000025d7 +000025d8 +000025d9 +000025da +000025db +000025dc +000025dd +000025de +000025df +000025e0 +000025e1 +000025e2 +000025e3 +000025e4 +000025e5 +000025e6 +000025e7 +000025e8 +000025e9 +000025ea +000025eb +000025ec +000025ed +000025ee +000025ef +000025f0 +000025f1 +000025f2 +000025f3 +000025f4 +000025f5 +000025f6 +000025f7 +000025f8 +000025f9 +000025fa +000025fb +000025fc +000025fd +000025fe +000025ff +00002600 +00002601 +00002602 +00002603 +00002604 +00002605 +00002606 +00002607 +00002608 +00002609 +0000260a +0000260b +0000260c +0000260d +0000260e +0000260f +00002610 +00002611 +00002612 +00002613 +00002614 +00002615 +00002616 +00002617 +00002618 +00002619 +0000261a +0000261b +0000261c +0000261d +0000261e +0000261f +00002620 +00002621 +00002622 +00002623 +00002624 +00002625 +00002626 +00002627 +00002628 +00002629 +0000262a +0000262b +0000262c +0000262d +0000262e +0000262f +00002630 +00002631 +00002632 +00002633 +00002634 +00002635 +00002636 +00002637 +00002638 +00002639 +0000263a +0000263b +0000263c +0000263d +0000263e +0000263f +00002640 +00002641 +00002642 +00002643 +00002644 +00002645 +00002646 +00002647 +00002648 +00002649 +0000264a +0000264b +0000264c +0000264d +0000264e +0000264f +00002650 +00002651 +00002652 +00002653 +00002654 +00002655 +00002656 +00002657 +00002658 +00002659 +0000265a +0000265b +0000265c +0000265d +0000265e +0000265f +00002660 +00002661 +00002662 +00002663 +00002664 +00002665 +00002666 +00002667 +00002668 +00002669 +0000266a +0000266b +0000266c +0000266d +0000266e +0000266f +00002670 +00002671 +00002672 +00002673 +00002674 +00002675 +00002676 +00002677 +00002678 +00002679 +0000267a +0000267b +0000267c +0000267d +0000267e +0000267f +00002680 +00002681 +00002682 +00002683 +00002684 +00002685 +00002686 +00002687 +00002688 +00002689 +0000268a +0000268b +0000268c +0000268d +0000268e +0000268f +00002690 +00002691 +00002692 +00002693 +00002694 +00002695 +00002696 +00002697 +00002698 +00002699 +0000269a +0000269b +0000269c +0000269d +0000269e +0000269f +000026a0 +000026a1 +000026a2 +000026a3 +000026a4 +000026a5 +000026a6 +000026a7 +000026a8 +000026a9 +000026aa +000026ab +000026ac +000026ad +000026ae +000026af +000026b0 +000026b1 +000026b2 +000026b3 +000026b4 +000026b5 +000026b6 +000026b7 +000026b8 +000026b9 +000026ba +000026bb +000026bc +000026bd +000026be +000026bf +000026c0 +000026c1 +000026c2 +000026c3 +000026c4 +000026c5 +000026c6 +000026c7 +000026c8 +000026c9 +000026ca +000026cb +000026cc +000026cd +000026ce +000026cf +000026d0 +000026d1 +000026d2 +000026d3 +000026d4 +000026d5 +000026d6 +000026d7 +000026d8 +000026d9 +000026da +000026db +000026dc +000026dd +000026de +000026df +000026e0 +000026e1 +000026e2 +000026e3 +000026e4 +000026e5 +000026e6 +000026e7 +000026e8 +000026e9 +000026ea +000026eb +000026ec +000026ed +000026ee +000026ef +000026f0 +000026f1 +000026f2 +000026f3 +000026f4 +000026f5 +000026f6 +000026f7 +000026f8 +000026f9 +000026fa +000026fb +000026fc +000026fd +000026fe +000026ff +00002700 +00002701 +00002702 +00002703 +00002704 +00002705 +00002706 +00002707 +00002708 +00002709 +0000270a +0000270b +0000270c +0000270d +0000270e +0000270f +00002710 +00002711 +00002712 +00002713 +00002714 +00002715 +00002716 +00002717 +00002718 +00002719 +0000271a +0000271b +0000271c +0000271d +0000271e +0000271f +00002720 +00002721 +00002722 +00002723 +00002724 +00002725 +00002726 +00002727 +00002728 +00002729 +0000272a +0000272b +0000272c +0000272d +0000272e +0000272f +00002730 +00002731 +00002732 +00002733 +00002734 +00002735 +00002736 +00002737 +00002738 +00002739 +0000273a +0000273b +0000273c +0000273d +0000273e +0000273f +00002740 +00002741 +00002742 +00002743 +00002744 +00002745 +00002746 +00002747 +00002748 +00002749 +0000274a +0000274b +0000274c +0000274d +0000274e +0000274f +00002750 +00002751 +00002752 +00002753 +00002754 +00002755 +00002756 +00002757 +00002758 +00002759 +0000275a +0000275b +0000275c +0000275d +0000275e +0000275f +00002760 +00002761 +00002762 +00002763 +00002764 +00002765 +00002766 +00002767 +00002768 +00002769 +0000276a +0000276b +0000276c +0000276d +0000276e +0000276f +00002770 +00002771 +00002772 +00002773 +00002774 +00002775 +00002776 +00002777 +00002778 +00002779 +0000277a +0000277b +0000277c +0000277d +0000277e +0000277f +00002780 +00002781 +00002782 +00002783 +00002784 +00002785 +00002786 +00002787 +00002788 +00002789 +0000278a +0000278b +0000278c +0000278d +0000278e +0000278f +00002790 +00002791 +00002792 +00002793 +00002794 +00002795 +00002796 +00002797 +00002798 +00002799 +0000279a +0000279b +0000279c +0000279d +0000279e +0000279f +000027a0 +000027a1 +000027a2 +000027a3 +000027a4 +000027a5 +000027a6 +000027a7 +000027a8 +000027a9 +000027aa +000027ab +000027ac +000027ad +000027ae +000027af +000027b0 +000027b1 +000027b2 +000027b3 +000027b4 +000027b5 +000027b6 +000027b7 +000027b8 +000027b9 +000027ba +000027bb +000027bc +000027bd +000027be +000027bf +000027c0 +000027c1 +000027c2 +000027c3 +000027c4 +000027c5 +000027c6 +000027c7 +000027c8 +000027c9 +000027ca +000027cb +000027cc +000027cd +000027ce +000027cf +000027d0 +000027d1 +000027d2 +000027d3 +000027d4 +000027d5 +000027d6 +000027d7 +000027d8 +000027d9 +000027da +000027db +000027dc +000027dd +000027de +000027df +000027e0 +000027e1 +000027e2 +000027e3 +000027e4 +000027e5 +000027e6 +000027e7 +000027e8 +000027e9 +000027ea +000027eb +000027ec +000027ed +000027ee +000027ef +000027f0 +000027f1 +000027f2 +000027f3 +000027f4 +000027f5 +000027f6 +000027f7 +000027f8 +000027f9 +000027fa +000027fb +000027fc +000027fd +000027fe +000027ff diff --git a/test_benches/verilator/AXI_DDR_simulation/axi_ddr_sim.cc b/test_benches/verilator/AXI_DDR_simulation/axi_ddr_sim.cc new file mode 100644 index 0000000..cdd39d9 --- /dev/null +++ b/test_benches/verilator/AXI_DDR_simulation/axi_ddr_sim.cc @@ -0,0 +1,358 @@ +#include "axi_ddr_sim.h" +#include "ddr_page.h" +#include +#include +#include +#include +using namespace std; + +template +axi_ddr_sim::axi_ddr_sim(TB * tb){ + this->tb = tb; +} +template +void axi_ddr_sim::init_signals(){ + tb->ddr_axi_bresp = 0; + tb->ddr_axi_bvalid = 0; + tb->ddr_axi_rvalid = 0; + tb->ddr_axi_rdata = 0; + tb->ddr_axi_rid = 0; + tb->ddr_axi_rlast = 0; + tb->ddr_axi_rresp = 0; + tb->ddr_axi_rvalid = 0; +} + +template +axi_ddr_sim::axi_ddr_sim(string filepath, uint32_t starting_memory_location, int number_of_bytes, TB * tb){ + ifstream input_memory_file; + input_memory_file.open(filepath); + string line; + + + uint32_t max_pages = starting_memory_location/PAGE_SIZE + number_of_bytes/PAGE_SIZE; + //Parse the uniform pages + uint32_t page_index = starting_memory_location/PAGE_SIZE; + for (; page_index < max_pages; page_index++){ + ddr_page page; + for(int data_index = 0; data_index < PAGE_SIZE/4; data_index++){ + getline(input_memory_file, line); + //Read 32-bit number represented through hexidecimals + page.write_data(data_index, stoul(line, 0, 16)); + } + ddr_pages.insert(pair((uint32_t)(page_index*PAGE_SIZE), page)); + } + generator = default_random_engine(DELAY_SEED); + read_distribution = uniform_int_distribution(MIN_DELAY_RD,MAX_DELAY_RD); + write_distribution = uniform_int_distribution(MIN_DELAY_WR,MAX_DELAY_WR); + this->tb = tb; + init_signals(); + printf("Done AXI Initialization: %d Pages intialized\n", page_index); + fflush(stdout); +} + + +template +axi_ddr_sim::axi_ddr_sim(ifstream & input_memory_file, TB * tb){ + string line; + + uint32_t max_pages = DDR_SIZE/PAGE_SIZE; + //Parse the uniform pages + bool not_finished = true; + uint32_t page_index = starting_location/PAGE_SIZE; + for (; page_index < max_pages; page_index++){ + ddr_page page; + + for(int data_index = 0; data_index < PAGE_SIZE/4; data_index++){ + not_finished = (bool)getline(input_memory_file, line); + if(!not_finished) + break; + //Read 32-bit number represented through hexidecimals + page.write_data(data_index, stoul(line, 0, 16)); + } + if(!not_finished) + break; + ddr_pages.insert(pair((uint32_t)(page_index*PAGE_SIZE), page)); + fflush(stdout); + } + + generator = default_random_engine(DELAY_SEED); + read_distribution = uniform_int_distribution(MIN_DELAY_RD,MAX_DELAY_RD); + write_distribution = uniform_int_distribution(MIN_DELAY_WR,MAX_DELAY_WR); + this->tb = tb; + init_signals(); + printf("Done AXI Initialization: Started from %u\n", starting_location); + fflush(stdout); +} + +template +int axi_ddr_sim::get_data(uint32_t data_address){ + uint32_t starting_address = (data_address / PAGE_SIZE) * PAGE_SIZE; + if(ddr_pages.count(starting_address)){ //If page exists + return ddr_pages[starting_address].return_data(data_address%PAGE_SIZE/4); + } + else{//If it doesn't, instantiate a new page + ddr_page page; + ddr_pages.insert(pair(starting_address, page)); + assert(ddr_pages.count(starting_address)); //Check if it was intialized + return ddr_pages[starting_address].return_data(data_address%PAGE_SIZE/4); + } +} +template +void axi_ddr_sim::set_data(uint32_t data_address, uint32_t set_data, uint32_t byte_enable){ + uint32_t data = get_data(data_address); + uint32_t starting_address = (data_address / PAGE_SIZE) * PAGE_SIZE; + data = (data & ~byte_enable) | (set_data & byte_enable); + ddr_pages[starting_address].write_data(data_address%PAGE_SIZE/4, data); + +}; + +template +ddr_page axi_ddr_sim::get_page(uint32_t page_address){ + return ddr_pages[page_address]; +} +template +void axi_ddr_sim::parse_input_signals(){ + //If the master has a write requests + if(tb->ddr_axi_awvalid && wd_ad_channel_queue.size() < MAX_INFLIGHT_WD_REQ){ + AXI_write_address_channel_signals elem{tb->ddr_axi_awaddr, tb->ddr_axi_awlen, tb->ddr_axi_awsize, tb->ddr_axi_awburst,tb->ddr_axi_awcache,tb->ddr_axi_awid}; + wd_ad_channel_queue.push(elem); + } + //If the master has write data + if(tb->ddr_axi_wvalid){ + AXI_write_data_channel_signals elem{tb->ddr_axi_wid, tb->ddr_axi_wdata, tb->ddr_axi_wstrb, tb->ddr_axi_wlast}; + w_data_channel_queue.push(elem); + } + //If the master has a read request + if(tb->ddr_axi_arvalid && rd_ad_channel_queue.size() < MAX_INFLIGHT_RD_REQ){ + AXI_read_address_channel_signals elem{tb->ddr_axi_araddr, tb->ddr_axi_arlen, tb->ddr_axi_arsize, tb->ddr_axi_arburst, tb->ddr_axi_arcache, tb->ddr_axi_arid}; + rd_ad_channel_queue.push(elem); + } +} +template +void axi_ddr_sim::parse_output_signals(){ + if(tb->rst ==1){ + tb->ddr_axi_wready = 0; + tb->ddr_axi_arready = 0; + + tb->ddr_axi_bid = 0; + tb->ddr_axi_bresp = 0; + tb->ddr_axi_bvalid = 0; + tb->ddr_axi_rid = 0; + tb->ddr_axi_rdata = 0; + tb->ddr_axi_rresp = 0; + tb->ddr_axi_rlast = 0; + //tb->ddr_axi_ruser = 0; + tb->ddr_axi_rvalid = 0; + + } + else { + tb->ddr_axi_wready = 1; + + //Write Req + if(wd_ad_channel_queue.size() < MAX_INFLIGHT_WD_REQ) + tb->ddr_axi_awready = 1; + else + tb->ddr_axi_awready = 0; + + //Read Req + if(rd_ad_channel_queue.size() < MAX_INFLIGHT_RD_REQ) + tb->ddr_axi_arready = 1; + else + tb->ddr_axi_arready = 0; + + //If we the write_response + if(w_res_channel_queue.size() > 0){ + AXI_write_response_channel_signals elem = w_res_channel_queue.front(); + if(tb->ddr_axi_bready) + w_res_channel_queue.pop(); + + tb->ddr_axi_bid = elem.bid; + tb->ddr_axi_bresp = elem.bresp; + tb->ddr_axi_bvalid = 1; + } + else{ + tb->ddr_axi_bid = rand(); + tb->ddr_axi_bresp = rand(); + //tb->ddr_axi_buser = rand(); + tb->ddr_axi_bvalid = 0; + } + + //If we have the read data + if(r_data_channel_queue.size() > 0){ + AXI_read_data_channel_signals elem = r_data_channel_queue.front(); + if(tb->ddr_axi_rready){ + //cout << "Before: " << r_data_channel_queue.size() << endl; + r_data_channel_queue.pop(); + //cout << "After: " << r_data_channel_queue.size() << endl; + } + tb->ddr_axi_rid = elem.rid; + tb->ddr_axi_rdata = elem.rdata; + tb->ddr_axi_rresp = elem.rresp; + tb->ddr_axi_rlast = elem.rlast; + //tb->ddr_axi_ruser = elem.ruser; + tb->ddr_axi_rvalid = 1; + } + else{ + tb->ddr_axi_rid = rand(); + tb->ddr_axi_rdata = rand(); + tb->ddr_axi_rresp = rand(); + tb->ddr_axi_rlast = 0; + //tb->ddr_axi_ruser = rand(); + tb->ddr_axi_rvalid = 0; + } + } +} +template +void axi_ddr_sim::handle_read_req(){ + if(rd_ad_channel_queue.size() > 0 ){ + if(current_read_parameters.delay_cycles_left == 0){ + AXI_read_data_channel_signals elem; + elem.rid = rd_ad_channel_queue.front().arid; + elem.rdata = get_data(current_read_parameters.address); + current_read_parameters.number_of_bursts_left--; + + if(rd_ad_channel_queue.front().arburst == 0 ){//FIXED + //do nothing + } + else if(rd_ad_channel_queue.front().arburst == 1){ //INCR + //Increment Address by number of bytes in a burst(arsize) + current_read_parameters.address += current_read_parameters.increment; + + } + else if(rd_ad_channel_queue.front().arburst == 2){ //WRAP + current_read_parameters.address += current_read_parameters.increment; + if(current_read_parameters.address == current_read_parameters.wrap_boundary + current_read_parameters.number_bytes * current_read_parameters.burst_length){ + current_read_parameters.address = current_read_parameters.wrap_boundary; + } + } + elem.rresp = 0; //OKAY bx00 + //elem.ruser = rd_ad_channel_queue.front().aruser; + if(current_read_parameters.number_of_bursts_left == 0){ + elem.rlast = 1; + rd_ad_channel_queue.pop(); + } + else + elem.rlast = 0; + r_data_channel_queue.push(elem); + } + else{ + current_read_parameters.delay_cycles_left--; + } + } + +} +template +void axi_ddr_sim::handle_write_req(){ + //cout << "w_data_channel_queue size: " << w_data_channel_queue.size() << endl; + //cout << "current_write_parameters.number_of_bursts_left: " << current_write_parameters.number_of_bursts_left << endl; + if(w_data_channel_queue.size() > 0 && current_write_parameters.number_of_bursts_left > 0){ + if(current_write_parameters.delay_cycles_left == 0){ + AXI_write_data_channel_signals elem = w_data_channel_queue.front(); + w_data_channel_queue.pop(); + //Calculate Byte Enable + uint32_t byte_enable = 0; + if(elem.wstrb >= 8){ + byte_enable = byte_enable | 0xFF000000; + elem.wstrb -= 8; + } + if(elem.wstrb >= 4){ + byte_enable = byte_enable | 0x00FF0000; + elem.wstrb -= 4; + } + if(elem.wstrb >= 2){ + byte_enable = byte_enable | 0x0000FF00; + elem.wstrb -= 2; + } + if(elem.wstrb == 1){ + byte_enable = byte_enable | 0x000000FF; + elem.wstrb -= 1; + } + set_data(current_write_parameters.address, elem.wdata, byte_enable); + current_write_parameters.number_of_bursts_left--; + + if(wd_ad_channel_queue.front().awburst == 0 ){//FIXED + //do nothing + } + else if(wd_ad_channel_queue.front().awburst == 1){ //INCR + //Increment Address by number of bytes in a burst(arsize) + current_write_parameters.address += current_write_parameters.increment; + + } + else if(wd_ad_channel_queue.front().awburst == 2){ //WRAP + current_write_parameters.address += current_write_parameters.increment; + if(current_write_parameters.address == current_write_parameters.wrap_boundary + current_write_parameters.number_bytes * current_write_parameters.burst_length){ + current_write_parameters.address = current_write_parameters.wrap_boundary; + } + } + //If the Write is done + if(current_write_parameters.number_of_bursts_left == 0){ + AXI_write_response_channel_signals resp_elem; + resp_elem.bid = elem.wid; + resp_elem.bresp = 0; + wd_ad_channel_queue.pop(); + w_res_channel_queue.push(resp_elem); + } + } + else{ + current_write_parameters.delay_cycles_left--; + } + } +} + +template +void axi_ddr_sim::update_current_read_parameters(){ + //If I can serve a new read request + if(rd_ad_channel_queue.size() > 0 && current_read_parameters.number_of_bursts_left == 0){ + current_read_parameters.address = rd_ad_channel_queue.front().araddr; + current_read_parameters.number_of_bursts_left = rd_ad_channel_queue.front().arlen +1; + current_read_parameters.delay_cycles_left = read_distribution(generator); + if(rd_ad_channel_queue.front().arburst == 0 ){//FIXED + current_read_parameters.increment = 0; + } + else if(rd_ad_channel_queue.front().arburst == 1){ //INCR + //Increment Address by number of bytes in a burst(arsize) + current_read_parameters.increment = pow(2,rd_ad_channel_queue.front().arsize); + + } + else if(rd_ad_channel_queue.front().arburst == 2){ //WRAP + current_read_parameters.increment = pow(2,rd_ad_channel_queue.front().arsize); + current_read_parameters.number_bytes = pow(2,rd_ad_channel_queue.front().arsize); + current_read_parameters.burst_length = rd_ad_channel_queue.front().arlen +1; + current_read_parameters.wrap_boundary = (int)(current_read_parameters.address/(current_read_parameters.number_bytes * current_read_parameters.burst_length)) * (current_read_parameters.number_bytes * current_read_parameters.burst_length); + } + } +} +template +void axi_ddr_sim::update_current_write_parameters(){ + //If I can serve a new read request + if(wd_ad_channel_queue.size() > 0 && current_write_parameters.number_of_bursts_left == 0){ + current_write_parameters.address = wd_ad_channel_queue.front().awaddr; + current_write_parameters.number_of_bursts_left = wd_ad_channel_queue.front().awlen +1; + current_write_parameters.delay_cycles_left = write_distribution(generator); + if(wd_ad_channel_queue.front().awburst == 0 ){//FIXED + current_write_parameters.increment = 0; + } + else if(wd_ad_channel_queue.front().awburst == 1){ //INCR + //Increment Address by number of bytes in a burst(arsize) + current_write_parameters.increment = pow(2,wd_ad_channel_queue.front().awsize); + + } + else if(wd_ad_channel_queue.front().awburst == 2){ //WRAP + current_write_parameters.increment = pow(2,wd_ad_channel_queue.front().awsize); + current_write_parameters.number_bytes = pow(2,wd_ad_channel_queue.front().awsize); + current_write_parameters.burst_length = wd_ad_channel_queue.front().awlen +1; + current_write_parameters.wrap_boundary = (int)(current_write_parameters.address/(current_write_parameters.number_bytes * current_write_parameters.burst_length)) * (current_write_parameters.number_bytes * current_write_parameters.burst_length); + } + } +} + +template +void axi_ddr_sim::step(){ + + parse_input_signals(); + update_current_read_parameters(); + update_current_write_parameters(); + handle_read_req(); + handle_write_req(); + parse_output_signals(); +} \ No newline at end of file diff --git a/test_benches/verilator/AXI_DDR_simulation/axi_ddr_sim.h b/test_benches/verilator/AXI_DDR_simulation/axi_ddr_sim.h new file mode 100644 index 0000000..9bcb3cc --- /dev/null +++ b/test_benches/verilator/AXI_DDR_simulation/axi_ddr_sim.h @@ -0,0 +1,109 @@ +/* + * Copyright © 2019 Eric Matthews,Zavier Aguila Lesley Shannon + * + * 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. + * + * Initial code developed under the supervision of Dr. Lesley Shannon, + * Reconfigurable Computing Lab, Simon Fraser University. + * + * Author(s): + * Eric Matthews + * Zavier Aguila + */ + +#ifndef AXIDDR_H +#define AXIDDR_H +#include +#include +#include +#include +#include +#include +#include +#include "axi_interface.h" +#include "ddr_page.h" +using namespace std; + + +struct addr_calculation_parameters{ + uint32_t address; + uint32_t increment; + uint32_t wrap_boundary; + int number_bytes; + int burst_length; + int number_of_bursts_left; + int delay_cycles_left; +}; +template + class axi_ddr_sim{ + public: + //Functions-------------------------------------------------------------- + //Init instructions----------------- + axi_ddr_sim(); + //Initialize DDR + axi_ddr_sim(TB * tb); + + //Initialize DDR from file + axi_ddr_sim(string filepath, uint32_t starting_memory_location, int number_of_bytes, TB * tb); + axi_ddr_sim(ifstream & input_memory_file, TB * tb); + void step(); + int get_data(uint32_t data_address); + + ddr_page get_page(uint32_t page_address); + + void set_data(uint32_t data_address, uint32_t set_data, uint32_t byte_enable); + + //Queue Handling Functions------------------------------------- + + + //AXI Functions------------------------------------- + //Latency Randomizer + //Byte Enable Handler + //Burst Handler + + //Base AXI Read Reply + //BASE AXI Write Reply + private: + default_random_engine generator; + uniform_int_distribution read_distribution; + uniform_int_distribution write_distribution; + //Pointers to Data + map ddr_pages; + TB *tb; + void parse_output_signals(); + + void parse_input_signals(); + void update_current_read_parameters(); + void update_current_write_parameters(); + void handle_write_req(); + void handle_read_req(); + void init_signals(); + + addr_calculation_parameters current_read_parameters{0,0,0,0}; + addr_calculation_parameters current_write_parameters{0,0,0,0}; + //Read Request Queue + queue rd_ad_channel_queue; + //Write Request Queue + queue wd_ad_channel_queue; + //Read Data Queue + queue r_data_channel_queue; + //Write Data Queue + queue w_data_channel_queue; + //Write Response Queue + queue w_res_channel_queue; + + unsigned starting_location = 0x80000000; +}; + +#include "axi_ddr_sim.cc" +#endif \ No newline at end of file diff --git a/test_benches/verilator/AXI_DDR_simulation/axi_interface.h b/test_benches/verilator/AXI_DDR_simulation/axi_interface.h new file mode 100644 index 0000000..99ecf4c --- /dev/null +++ b/test_benches/verilator/AXI_DDR_simulation/axi_interface.h @@ -0,0 +1,59 @@ +#ifndef AXIINTERFACE_H +#define AXIINTERFACE_H +#include + +using namespace std; +struct AXI_write_address_channel_signals{ + uint32_t awaddr; + uint32_t awlen; + uint32_t awsize; + uint32_t awburst; + uint32_t awcache; + uint32_t awid; + //uint32_t awready; +}; +struct AXI_read_address_channel_signals{ + + uint32_t araddr; + uint32_t arlen; + uint32_t arsize; + uint32_t arburst; + uint32_t arcache; + uint32_t arid; + +}; +struct AXI_write_data_channel_signals{ + uint32_t wid; + uint32_t wdata; + uint32_t wstrb; + uint32_t wlast; + //uint32_t wuser; + //uint32_t wvalid; + //uint32_t wready; +}; +struct AXI_write_response_channel_signals{ + uint32_t bid; + uint32_t bresp; + //uint32_t buser; + uint32_t bvalid; + //uint32_t bready; +}; +struct AXI_read_data_channel_signals{ + uint32_t rid; + uint32_t rdata; + uint32_t rresp; + uint32_t rlast; + //uint32_t ruser; + //uint32_t rvalid; + //uint32_t rready; +}; + + +struct AXI_channels{ + AXI_read_address_channel_signals rd_ad_channel; + AXI_write_address_channel_signals wd_ad_channel; + AXI_read_data_channel_signals r_data_channel; + AXI_write_data_channel_signals w_data_channel; + AXI_write_response_channel_signals w_res_channel; +}; +#endif \ No newline at end of file diff --git a/test_benches/verilator/AXI_DDR_simulation/axi_l2_test.cc b/test_benches/verilator/AXI_DDR_simulation/axi_l2_test.cc new file mode 100644 index 0000000..9e0eb31 --- /dev/null +++ b/test_benches/verilator/AXI_DDR_simulation/axi_l2_test.cc @@ -0,0 +1,212 @@ +#include +#include +#include +#include +#include "Vaxi_l2_test.h" +#include "verilated.h" +#include "verilated_vcd_c.h" + +//////////////////////////////////////////////////// +//Trace Interface Counters +int num_entries = PAGE_SIZE * 5; +uint32_t starting_location = PAGE_SIZE*0; +struct l2_arb_inputs{ + uint32_t address; + uint32_t rnw; + uint32_t burst_length; + uint32_t sub_id; + uint32_t be; +}; +struct l2_arb_expected_output{ + uint32_t rd_data; + uint32_t rd_sub_id; +}; + +queue test_inputs; +queue test_expected_output; +queue test_data_inputs; + +void assign_read_input(uint32_t address, uint32_t burst_length, uint32_t sub_id){ + l2_arb_inputs in_elem{address, 1, burst_length, sub_id}; + test_inputs.push(in_elem); +}; + +void assign_write_input(uint32_t address, uint32_t burst_length, uint32_t sub_id, uint32_t be){ + l2_arb_inputs in_elem{address, 0, burst_length, sub_id, be}; + test_inputs.push(in_elem); + for(int i = burst_length-1 ; i >= 0; i--){ + test_data_inputs.push(i+71); + } +}; + +void assign_single_write_input(uint32_t address, uint32_t sub_id, uint32_t data, uint32_t be){ + l2_arb_inputs in_elem{address, 0, 1, sub_id, be}; + test_inputs.push(in_elem); + test_data_inputs.push(data); + +}; +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 +} + +using namespace std; +int main(int argc, char **argv) { + //assign_single_write_input(0,1, 1 ,0xF); + //assign_single_write_input(0,0, 21 ,0xF); + assign_single_write_input(4,0, 22 ,0xF); + //assign_single_write_input(4,0, 23 ,0xF); + //assign_single_write_input(4,0, 25 ,0xF); + //assign_write_input(0, 4, 0, 0xF); + assign_read_input(4, 4, 0); + //assign_read_input(4, 8, 0);; + ofstream logFile, sigFile; + uint64_t cycle_cout = 0; + + // Initialize Verilators variables + Verilated::commandArgs(argc, argv); + #ifdef TRACE_ON + Verilated::traceEverOn(true); + #endif + + if (!argv[1]) { + cout << "Missing log file name.\n"; + exit(EXIT_FAILURE); + } + + if (!argv[2]) { + cout << "Missing signature file name.\n"; + exit(EXIT_FAILURE); + } + + logFile.open (argv[1]); + sigFile.open (argv[2]); + // Create an instance of our module under test + Vaxi_l2_test *tb = new Vaxi_l2_test; + axi_ddr_sim axi_ddr("DDR_init.txt", starting_location, num_entries, tb); + #ifdef TRACE_ON + VerilatedVcdC *verilatorWaveformTracer; + verilatorWaveformTracer = new VerilatedVcdC; + tb->trace(verilatorWaveformTracer, 99); + verilatorWaveformTracer->open("/data/sim-logs/sim_results.vcd"); + #endif + + cout << "--------------------------------------------------------------\n"; + cout << " Starting Simulation, logging to: " << argv[1] << "\n"; + cout << "--------------------------------------------------------------\n"; + + //Reset + for(int i = 0; i < 50;i++){ + tb->rst = 1; + + tb->clk = 1; + tb->eval(); + tb->clk = 0; + tb->eval(); + } + tb->rst = 0; + tb->clk = 1; + tb->eval(); + tb->clk = 0; + tb->eval(); + // Tick the clock until we are done + int number_of_data_left = 0; + while(!Verilated::gotFinish()) { + tb->clk = 1; + tb->eval(); + + //Specify Inputs + //Note: Current doesn't give the arbiter the address and data separate + //READ Input + if(test_inputs.size() > 0 && !tb->request_full && test_inputs.front().rnw){ + l2_arb_inputs elem; + elem = test_inputs.front(); + test_inputs.pop(); + tb->addr = elem.address; + tb->rnw = elem.rnw; + tb->is_amo = 0; + tb->amo_type_or_burst_size = elem.burst_length; + tb->sub_id = elem.sub_id; + + tb->request_push = 1; + tb->wr_data_push = 0; + } + else if(test_inputs.size() > 0 && !tb->request_full && !test_inputs.front().rnw && number_of_data_left == 0){ + l2_arb_inputs elem; + elem = test_inputs.front(); + tb->addr = elem.address; + tb->rnw = elem.rnw; + tb->is_amo = 0; + tb->amo_type_or_burst_size = elem.burst_length - 1; + tb->sub_id = elem.sub_id; + tb->be = elem.be; + number_of_data_left = elem.burst_length; + tb->request_push = 1; + tb->wr_data_push = 0; + } + else if(number_of_data_left > 0){ + tb->request_push = 0; + + if(!tb->data_full){ + uint32_t data = test_data_inputs.front(); + test_data_inputs.pop(); + tb->wr_data = data; + tb->wr_data_push = 1; + + number_of_data_left--; + if(number_of_data_left == 0) + test_inputs.pop(); + } + else{ + tb->wr_data_push = 0; + } + + } + else{ + tb->addr = rand(); + tb->rnw = rand() % 2; + tb->is_amo = rand() % 2; + tb->amo_type_or_burst_size = rand(); + tb->sub_id = rand(); + tb->wr_data = rand(); + + tb->request_push = 0; + tb->wr_data_push = 0; + } + + if(tb->rd_data_valid){ + tb->rd_data_ack = 1; + cout << "Data Recieved: " << tb->rd_data << endl; + } + else{ + tb->rd_data_ack = 0; + } + //Step + axi_ddr.step(); + + tb->clk = 0; + tb->eval(); + cycle_cout++; + #ifdef TRACE_ON + verilatorWaveformTracer->dump(vluint32_t(cycle_cout)); + #endif + + } + + #ifdef TRACE_ON + verilatorWaveformTracer->flush(); + verilatorWaveformTracer->close(); + #endif + + cout << "--------------------------------------------------------------\n"; + cout << " Simulation Completed\n"; + + logFile.close(); + sigFile.close(); + delete tb; + exit(EXIT_SUCCESS); + +} diff --git a/test_benches/verilator/AXI_DDR_simulation/axi_l2_test.sv b/test_benches/verilator/AXI_DDR_simulation/axi_l2_test.sv new file mode 100644 index 0000000..c6db2a9 --- /dev/null +++ b/test_benches/verilator/AXI_DDR_simulation/axi_l2_test.sv @@ -0,0 +1,311 @@ +/* + * Copyright © 2017 Eric Matthews, Lesley Shannon + * + * 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. + * + * Initial code developed under the supervision of Dr. Lesley Shannon, + * Reconfigurable Computing Lab, Simon Fraser University. + * + * Author(s): + * Eric Matthews + */ + +import taiga_config::*; +import taiga_types::*; +import l2_config_and_types::*; + + +module axi_l2_test # ( + parameter MEMORY_FILE = "/home/ematthew/Research/RISCV/software/riscv-tools/riscv-tests/benchmarks/dhrystone.riscv.hw_init" //change this to appropriate location "/home/ematthew/Downloads/dhrystone.riscv.sim_init" + ) + ( + input logic clk, + input logic rst, + + //DDR AXI + output logic [31:0]ddr_axi_araddr, + output logic [1:0]ddr_axi_arburst, + output logic [3:0]ddr_axi_arcache, + output logic [5:0]ddr_axi_arid, + output logic [7:0]ddr_axi_arlen, + output logic [0:0]ddr_axi_arlock, + output logic [2:0]ddr_axi_arprot, + output logic [3:0]ddr_axi_arqos, + input logic ddr_axi_arready, + output logic [3:0]ddr_axi_arregion, + output logic [2:0]ddr_axi_arsize, + output logic ddr_axi_arvalid, + output logic [31:0]ddr_axi_awaddr, + output logic [1:0]ddr_axi_awburst, + output logic [3:0]ddr_axi_awcache, + output logic [5:0]ddr_axi_awid, + output logic [7:0]ddr_axi_awlen, + output logic [0:0]ddr_axi_awlock, + output logic [2:0]ddr_axi_awprot, + output logic [3:0]ddr_axi_awqos, + input logic ddr_axi_awready, + output logic [3:0]ddr_axi_awregion, + output logic [2:0]ddr_axi_awsize, + output logic ddr_axi_awvalid, + output logic [5:0]ddr_axi_bid, + output logic ddr_axi_bready, + input logic [1:0]ddr_axi_bresp, + input logic ddr_axi_bvalid, + input logic [31:0]ddr_axi_rdata, + input logic [5:0]ddr_axi_rid, + input logic ddr_axi_rlast, + output logic ddr_axi_rready, + input logic [1:0]ddr_axi_rresp, + input logic ddr_axi_rvalid, + output logic [31:0]ddr_axi_wdata, + output logic ddr_axi_wlast, + input logic ddr_axi_wready, + output logic [3:0]ddr_axi_wstrb, + output logic ddr_axi_wvalid, + output logic [5:0]ddr_axi_wid, + + + //L2 interface + input logic [29:0] addr, + input logic [3:0] be, + input logic rnw, + input logic is_amo, + input logic [4:0] amo_type_or_burst_size, + input logic [L2_SUB_ID_W-1:0] sub_id, + + input logic request_push, + output logic request_full, + + output logic [31:2] inv_addr, + output logic inv_valid, + input logic inv_ack, + + output logic con_result, + output logic con_valid, + + input logic [31:0] wr_data, + input logic wr_data_push, + output logic data_full, + + output logic [31:0] rd_data, + output logic [L2_SUB_ID_W-1:0] rd_sub_id, + output logic rd_data_valid, + input logic rd_data_ack, + + //Local Memory + output logic [29:0] instruction_bram_addr, + output logic instruction_bram_en, + output logic [3:0] instruction_bram_be, + output logic [31:0] instruction_bram_data_in, + input logic [31:0] instruction_bram_data_out, + + output logic [29:0] data_bram_addr, + output logic data_bram_en, + output logic [3:0] data_bram_be, + output logic [31:0] data_bram_data_in, + input logic [31:0] data_bram_data_out, + + //Used by verilator + output logic write_uart, + output logic [7:0] uart_byte, + + //Trace Interface + output logic instruction_issued, + output logic taiga_events [0:$bits(taiga_trace_events_t)-1], + output logic [31:0] instruction_pc_dec, + output logic [31:0] instruction_data_dec + ); + + logic [3:0] WRITE_COUNTER_MAX; + logic [3:0] READ_COUNTER_MAX; + assign READ_COUNTER_MAX = 4'b0101; + assign WRITE_COUNTER_MAX = 4'b0101; + + //AXI memory + logic [31:0]axi_araddr; + logic [1:0]axi_arburst; + logic [3:0]axi_arcache; + logic [5:0]axi_arid; + logic [7:0]axi_arlen; + logic [0:0]axi_arlock; + logic [2:0]axi_arprot; + logic [3:0]axi_arqos; + logic axi_arready; + logic [3:0]axi_arregion; + logic [2:0]axi_arsize; + logic axi_arvalid; + logic [31:0]axi_awaddr; + logic [1:0]axi_awburst; + logic [3:0]axi_awcache; + logic [5:0]axi_awid; + logic [7:0]axi_awlen; + logic [0:0]axi_awlock; + logic [2:0]axi_awprot; + logic [3:0]axi_awqos; + logic axi_awready; + logic [3:0]axi_awregion; + logic [2:0]axi_awsize; + logic axi_awvalid; + logic [5:0]axi_bid; + logic axi_bready; + logic [1:0]axi_bresp; + logic axi_bvalid; + logic [31:0]axi_rdata; + logic [5:0]axi_rid; + logic axi_rlast; + logic axi_rready; + logic [1:0]axi_rresp; + logic axi_rvalid; + logic [31:0]axi_wdata; + logic axi_wlast; + logic axi_wready; + logic [3:0]axi_wstrb; + logic axi_wvalid; + logic [5:0]axi_wid; + + parameter SCRATCH_MEM_KB = 128; + parameter MEM_LINES = (SCRATCH_MEM_KB*1024)/4; + + logic interrupt; + logic timer_interrupt; + + assign interrupt = 0; + + axi_interface m_axi(); + //axi_interface ddr_axi(); + avalon_interface m_avalon(); + wishbone_interface m_wishbone(); + + trace_outputs_t tr; + + l2_requester_interface l2[L2_NUM_PORTS-1:0](); + l2_memory_interface mem(); + + local_memory_interface instruction_bram(); + local_memory_interface data_bram(); + + // assign m_axi.arready = bus_axi_arready; + // assign bus_axi_arvalid = m_axi.arvalid; + // assign bus_axi_araddr = m_axi.araddr; + // + // + // //read data + // assign bus_axi_rready = m_axi.rready; + // assign m_axi.rvalid = bus_axi_rvalid; + // assign m_axi.rdata = bus_axi_rdata; + // assign m_axi.rresp = bus_axi_rresp; + // + // //Write channel + // //write address + // assign m_axi.awready = bus_axi_awready; + // assign bus_axi_awaddr = m_axi.awaddr; + // assign bus_axi_awvalid = m_axi.awvalid; + // + // + // //write data + // assign m_axi.wready = bus_axi_wready; + // assign bus_axi_wvalid = m_axi. wvalid; + // assign bus_axi_wdata = m_axi.wdata; + // assign bus_axi_wstrb = m_axi.wstrb; + // + // //write response + // assign bus_axi_bready = m_axi.bready; + // assign m_axi.bvalid = bus_axi_bvalid; + // assign m_axi.bresp = bus_axi_bresp; + + assign l2[0].addr = addr; + assign l2[0].be = be; + assign l2[0].rnw = rnw; + assign l2[0].is_amo = is_amo; + assign l2[0].amo_type_or_burst_size = amo_type_or_burst_size; + assign l2[0].sub_id = sub_id; + + assign l2[0].request_push = request_push; + assign request_full = l2[0].request_full; + + assign inv_addr = l2[0].inv_addr; + assign inv_valid = l2[0].inv_valid; + assign l2[0].inv_ack = inv_ack; + + assign con_result = l2[0].con_result; + assign con_valid = l2[0].con_valid; + + assign l2[0].wr_data = wr_data; + assign l2[0].wr_data_push = wr_data_push; + assign data_full = l2[0].data_full; + + assign rd_data = l2[0].rd_data; + assign rd_sub_id = l2[0].rd_sub_id; + assign rd_data_valid = l2[0].rd_data_valid; + assign l2[0].rd_data_ack = rd_data_ack; + + + assign l2[1].request_push = 0; + assign l2[1].wr_data_push = 0; + assign l2[1].inv_ack = l2[1].inv_valid; + assign l2[1].rd_data_ack = l2[1].rd_data_valid; + + axi_to_arb l2_to_mem (.*, .l2(mem)); + l2_arbiter l2_arb (.*, .request(l2)); + + //////////////////////////////////////////////////// + //DDR AXI interface + assign ddr_axi_araddr = axi_araddr; + assign ddr_axi_arburst = axi_arburst; + assign ddr_axi_arcache = axi_arcache; + assign ddr_axi_arid = axi_arid; + assign ddr_axi_arlen = axi_arlen; + assign axi_arready = ddr_axi_arready; + assign ddr_axi_arsize = axi_arsize; + assign ddr_axi_arvalid = axi_arvalid; + + assign ddr_axi_awaddr = axi_awaddr; + assign ddr_axi_awburst = axi_awburst; + assign ddr_axi_awcache = axi_awcache; + assign ddr_axi_awid = axi_awid; + assign ddr_axi_awlen = axi_awlen; + assign axi_awready = ddr_axi_awready; + assign ddr_axi_awvalid = axi_awvalid; + + assign axi_bid = ddr_axi_bid; + assign ddr_axi_bready = axi_bready; + assign axi_bresp = ddr_axi_bresp; + assign axi_bvalid = ddr_axi_bvalid; + + assign axi_rdata = ddr_axi_rdata; + assign axi_rid = ddr_axi_rid; + assign axi_rlast = ddr_axi_rlast; + assign ddr_axi_rready = axi_rready; + assign axi_rresp = ddr_axi_rresp; + assign axi_rvalid = ddr_axi_rvalid; + + assign ddr_axi_wdata = axi_wdata; + assign ddr_axi_wlast = axi_wlast; + assign axi_wready = ddr_axi_wready; + assign ddr_axi_wstrb = axi_wstrb; + assign ddr_axi_wvalid = axi_wvalid; + + + //////////////////////////////////////////////////// + //Trace Interface + assign instruction_pc_dec = tr.instruction_pc_dec; + assign instruction_data_dec = tr.instruction_data_dec; + assign instruction_issued = tr.events.instruction_issued_dec; + logic [$bits(taiga_trace_events_t)-1:0] taiga_events_packed; + assign taiga_events_packed = tr.events; + always_comb begin + foreach(taiga_events_packed[i]) + taiga_events[$bits(taiga_trace_events_t)-1-i] = taiga_events_packed[i]; + end + +endmodule diff --git a/test_benches/verilator/AXI_DDR_simulation/ddr_page.cc b/test_benches/verilator/AXI_DDR_simulation/ddr_page.cc new file mode 100644 index 0000000..c1d2982 --- /dev/null +++ b/test_benches/verilator/AXI_DDR_simulation/ddr_page.cc @@ -0,0 +1,10 @@ +#include "ddr_page.h" + +ddr_page::ddr_page(){ +} +uint32_t ddr_page::return_data(int data_address){ + return data[data_address]; +} +void ddr_page::write_data(int data_address, int data_input){ + data[data_address] = data_input; +} \ No newline at end of file diff --git a/test_benches/verilator/AXI_DDR_simulation/ddr_page.h b/test_benches/verilator/AXI_DDR_simulation/ddr_page.h new file mode 100644 index 0000000..94186a1 --- /dev/null +++ b/test_benches/verilator/AXI_DDR_simulation/ddr_page.h @@ -0,0 +1,13 @@ +#ifndef DDR_PAGEH +#define DDR_PAGEH +#include + +class ddr_page{ + public: + ddr_page(); + uint32_t return_data(int data_address); + void write_data(int data_address, int data); + private: + uint32_t data[PAGE_SIZE/4]; +}; +#endif \ No newline at end of file diff --git a/test_benches/verilator/AXI_DDR_simulation/main.cc b/test_benches/verilator/AXI_DDR_simulation/main.cc new file mode 100644 index 0000000..bbcb30e --- /dev/null +++ b/test_benches/verilator/AXI_DDR_simulation/main.cc @@ -0,0 +1,36 @@ +#include "axi_ddr_sim.h" +#include +#include +#include +using namespace std; + + +void DDR_file_init(string filename,int num_entries){ + ofstream init_file; + init_file.open(filename); + for (int i = 0; i < num_entries; i++ ){ + init_file << setfill('0') << setw(8) << hex << i << endl; + } +}; +int print_DDR_init(string filepath,uint32_t starting_memory_location, int number_of_bytes){ + axi_ddr_sim AXI_DDR(filepath, starting_memory_location, number_of_bytes); + + ifstream input_memory_file; + input_memory_file.open(filepath); + string line; + for(int data_index = starting_memory_location; data_index < int(starting_memory_location + number_of_bytes); data_index+=4){ + cout << "[" << data_index << "]: " << AXI_DDR.get_data(data_index) << endl; + + } + cout << "Starting Location: " << starting_memory_location << endl; + cout << "Final value should be: " << number_of_bytes/4 - 1 << endl; + return 0; +}; + +int main(){ + int num_entries = PAGE_SIZE * 5; + uint32_t starting_location = PAGE_SIZE*0; + DDR_file_init("DDR_init.txt",num_entries); + print_DDR_init("DDR_init.txt", starting_location, num_entries*4); + return 0; +} \ No newline at end of file diff --git a/test_benches/verilator/TaigaTracer.cc b/test_benches/verilator/TaigaTracer.cc index d8d9fea..f87a3f5 100644 --- a/test_benches/verilator/TaigaTracer.cc +++ b/test_benches/verilator/TaigaTracer.cc @@ -23,6 +23,8 @@ #include #include "TaigaTracer.h" + + //#define TRACE_ON template bool TaigaTracer::check_instruction_issued(uint32_t inst) { @@ -46,16 +48,17 @@ bool TaigaTracer::has_terminated() { template bool TaigaTracer::has_stalled() { if (!tb->instruction_issued) { - stall_count++; if (stall_count > stall_limit) { stall_count = 0; std::cout << "\n\nError!!!!\n"; std::cout << "Stall of " << stall_limit << " cycles detected!\n\n"; return true; } else { - stall_count = 0; + stall_count++; } } + else + stall_count=0; return false; } @@ -86,14 +89,17 @@ void TaigaTracer::print_stats() { template void TaigaTracer::reset() { + tb->clk = 0; tb->rst = 1; - tb->eval(); - - for (int i=0; i rst = 0; reset_stats(); + std::cout << "DONE System reset \n" << std::flush; + + } template void TaigaTracer::set_log_file(std::ofstream* logFile) { @@ -123,13 +129,21 @@ void TaigaTracer::update_memory() { template void TaigaTracer::tick() { - tb->eval(); + cycle_count++; + tb->clk = 1; tb->eval(); - tb->clk = 0; - tb->eval(); + #ifdef TRACE_ON + verilatorWaveformTracer->dump(vluint32_t(10*cycle_count-2)); + #endif + cycle_count++; + + tb->clk = 0; + tb->eval(); + #ifdef TRACE_ON + verilatorWaveformTracer->dump(vluint32_t(10*cycle_count)); + #endif - cycle_count++; if (check_instruction_issued(BENCHMARK_START_COLLECTION_NOP)) { collect_stats = true; @@ -138,13 +152,14 @@ void TaigaTracer::tick() { if (check_instruction_issued(BENCHMARK_END_COLLECTION_NOP)) { collect_stats = false; } - update_stats(); - update_UART(); - update_memory(); - #ifdef TRACE_ON - verilatorWaveformTracer->dump(vluint32_t(cycle_count)); - #endif + + tb->clk = 1; + tb->eval(); + axi_ddr->step(); + update_stats(); + update_UART(); + update_memory(); } template @@ -168,10 +183,19 @@ TaigaTracer::TaigaTracer(std::ifstream& programFile) { Verilated::traceEverOn(true); #endif - mem = new SimMem(programFile, 128); + tb = new TB; - tb->clk = 0; + #ifdef DDR_LOAD_FILE + axi_ddr = new axi_ddr_sim(DDR_INIT_FILE,DDR_FILE_STARTING_LOCATION,DDR_FILE_NUM_BYTES); + #else + axi_ddr = new axi_ddr_sim(programFile, tb); + + #endif + programFile.clear(); + programFile.seekg(0, ios::beg); + mem = new SimMem(programFile, 128); + instruction_r = mem->read(tb->instruction_bram_addr); data_out_r = 0; } diff --git a/test_benches/verilator/TaigaTracer.h b/test_benches/verilator/TaigaTracer.h index 4fbe9dc..a15cd7f 100644 --- a/test_benches/verilator/TaigaTracer.h +++ b/test_benches/verilator/TaigaTracer.h @@ -26,7 +26,7 @@ #include #include #include "SimMem.h" - +#include "axi_ddr_sim.h" //#define TRACE_ON #define COMPLIANCE_SIG_PHASE_NOP 0x00B00013U @@ -82,11 +82,15 @@ public: void reset_stats(); void reset(); void tick(); + void set_log_file(std::ofstream* logFile); void start_tracer(const char *trace_file); uint64_t get_cycle_count(); -private: + + //DDR Simulation TB *tb; +private: + axi_ddr_sim * axi_ddr; SimMem *mem; #ifdef TRACE_ON VerilatedVcdC *verilatorWaveformTracer; @@ -105,8 +109,9 @@ private: void update_memory(); uint32_t instruction_r; uint32_t data_out_r; -}; +}; #include "TaigaTracer.cc" + #endif diff --git a/test_benches/verilator/taiga_full_sim.cc b/test_benches/verilator/taiga_full_sim.cc deleted file mode 100644 index 30c2521..0000000 --- a/test_benches/verilator/taiga_full_sim.cc +++ /dev/null @@ -1,208 +0,0 @@ -#include -#include -#include -#include "Vtaiga_full_sim.h" -#include "verilated.h" -#include "verilated_vcd_c.h" - -//#define TRACE_ON - -#define COMPLIANCE_SIG_PHASE_NOP 0x00B00013U -#define ERROR_TERMINATION_NOP 0x00F00013U -#define SUCCESS_TERMINATION_NOP 0x00A00013U -//////////////////////////////////////////////////// -//Trace Interface Counters - -struct TaigaTrace { - static void TaigaTrace::update_stats(Vtaiga_full_sim *tb) { - operand_stall += tb->operand_stall; - unit_stall += tb->unit_stall; - no_id_stall += tb->no_id_stall; - no_instruction_stall += tb->no_instruction_stall; - other_stall += tb->other_stall; - - instruction_issued_dec += tb->instruction_issued_dec; - branch_misspredict += tb->branch_misspredict; - return_misspredict += tb->return_misspredict; - wb_mux_contention += tb->wb_mux_contention; - - rs1_forwarding_needed += tb->rs1_forwarding_needed; - rs2_forwarding_needed += tb->rs2_forwarding_needed; - rs1_and_rs2_forwarding_needed += tb->rs1_and_rs2_forwarding_needed; - } - - static void print_stats(std::ostream& os) { - os << " Taiga trace stats:\n"; - os << "--------------------------------------------------------------\n"; - os << " operand_stall: " << operand_stall << "\n"; - os << " unit_stall: " << unit_stall << "\n"; - os << " no_id_stall: " << no_id_stall << "\n"; - os << " no_instruction_stall: " << no_instruction_stall << "\n"; - os << " other_stall: " << other_stall << "\n"; - os << " instruction_issued_dec: " << instruction_issued_dec << "\n"; - os << " branch_misspredict: " << branch_misspredict << "\n"; - os << " return_misspredict: " << return_misspredict << "\n"; - os << " wb_mux_contention: " << wb_mux_contention << "\n"; - os << " rs1_forwarding_needed: " << rs1_forwarding_needed << "\n"; - os << " rs2_forwarding_needed: " << rs2_forwarding_needed << "\n"; - os << " rs1_OR_rs2_forwarding_needed: " << rs1_forwarding_needed + rs2_forwarding_needed << "\n"; - os << " rs1_AND_rs2_forwarding_needed: " << rs1_and_rs2_forwarding_needed << "\n"; - os << "--------------------------------------------------------------\n\n"; - } - - static uint64_t operand_stall; - static uint64_t unit_stall; - static uint64_t no_id_stall; - static uint64_t no_instruction_stall; - static uint64_t other_stall; - static uint64_t instruction_issued_dec; - static uint64_t branch_misspredict; - static uint64_t return_misspredict; - static uint64_t wb_mux_contention; - static uint64_t rs1_forwarding_needed; - static uint64_t rs2_forwarding_needed; - static uint64_t rs1_and_rs2_forwarding_needed; -}; -Vtaiga_local_mem -#define STALL_LIMIT 2000 - -bool hasStalled(Vtaiga_full_sim *tb) { - if (!tb->instruction_issued_dec) { - stall_cycles++; - if (stall_cycles > STALL_LIMIT) { - stall_cycles = 0; - std::cout << "\n\nError!!!!\n"; - std::cout << "PC unchanged for at least " << STALL_LIMIT << " cycles!\n\n"; - return true; - } else { - stall_cycles = 0; - } - } - return false; -} - -bool complianceTestsLogPhase; //Log phase vs signature phase used for compliance tests -bool checkForControlNOPs(Vtaiga_full_sim *tb) { - //Custom nop to change to signature phase for compliance tests - if (tb->instruction_data_dec == COMPLIANCE_SIG_PHASE_NOP && tb->instruction_issued_dec) { - complianceTestsLogPhase = false; - std::cout << "\n--------------------------------------------------------------\n"; - std::cout << " Signature\n"; - std::cout << "--------------------------------------------------------------\n"; - return false; - }//Custom nop for error termination - else if (tb->instruction_data_dec == ERROR_TERMINATION_NOP && tb->instruction_issued_dec) { - std::cout << "\n\nError!!!!\n\n"; - }//Custom nop for regular termination - else if (tb->instruction_data_dec == SUCCESS_TERMINATION_NOP && tb->instruction_issued_dec) { - } - - return true; -} - -void performReset(Vtaiga_full_sim *tb, int numCycles) { - int reset_count = 0; - tb->rst = 1; - - while(!Verilated::gotFinish()) { - if (reset_count > numCycles) { - tb->rst = 0; - return; - } - else { - reset_count++; - } - - tb->clk = 1; - tb->eval(); - tb->clk = 0; - tb->eval(); - } -} - -void handleUART(Vtaiga_full_sim *tb, bool logPhase, ofstream& logFile, ofstream& sigFile) { - if (tb->write_uart) { - std::cout << tb->uart_byte; - if (logPhase) { - logFile << tb->uart_byte; - } else { - sigFile << tb->uart_byte; - } - } -} - -using namespace std; -int main(int argc, char **argv) { - uint64_t cycle_cout = 0; - TaigaTrace taigaTracer = { };//Zero initialize - ofstream logFile, sigFile; - - // Initialize Verilators variables - Verilated::commandArgs(argc, argv); - #ifdef TRACE_ON - Verilated::traceEverOn(true); - #endif - - if (!argv[1]) { - cout << "Missing log file name.\n"; - exit(EXIT_FAILURE); - } - - if (!argv[2]) { - cout << "Missing signature file name.\n"; - exit(EXIT_FAILURE); - } - - logFile.open (argv[1]); - sigFile.open (argv[2]); - // Create an instance of our module under test - Vtaiga_full_sim *tb = new Vtaiga_full_sim; - - #ifdef TRACE_ON - VerilatedVcdC *verilatorWaveformTracer; - verilatorWaveformTracer = new VerilatedVcdC; - tb->trace(verilatorWaveformTracer, 99); - verilatorWaveformTracer->open("/data/sim-logs/sim_results.vcd"); - #endif - - cout << "--------------------------------------------------------------\n"; - cout << " Starting Simulation, logging to: " << argv[1] << "\n"; - cout << "--------------------------------------------------------------\n"; - - complianceTestsLogPhase = true; - performReset(tb, 64); - - // Tick the clock until we are done - while(!Verilated::gotFinish()) { - tb->clk = 1; - tb->eval(); - tb->clk = 0; - tb->eval(); - - cycle_cout++; - taigaTracer.update_stats(tb); - - if (hasStalled(tb, cout)) break; - if (checkForControlNOPs(tb)) break; - handleUART(tb, complianceTestsLogPhase, logFile, sigFile); - - #ifdef TRACE_ON - verilatorWaveformTracer->dump(vluint32_t(cycle_cout)); - #endif - } - - #ifdef TRACE_ON - verilatorWaveformTracer->flush(); - verilatorWaveformTracer->close(); - #endif - - cout << "--------------------------------------------------------------\n"; - cout << " Simulation Completed: " << cycle_cout << " cycles.\n"; - taigaTracer.print_stats(cout); - - logFile.close(); - sigFile.close(); - delete tb; - exit(EXIT_SUCCESS); - -} diff --git a/test_benches/verilator/taiga_local_mem.cc b/test_benches/verilator/taiga_local_mem.cc index 6f81430..12984e7 100644 --- a/test_benches/verilator/taiga_local_mem.cc +++ b/test_benches/verilator/taiga_local_mem.cc @@ -1,3 +1,4 @@ + #include #include #include @@ -16,7 +17,6 @@ TaigaTracer *taigaTracer; //#define TRACE_ON using namespace std; int main(int argc, char **argv) { - ofstream logFile, sigFile; ifstream programFile; @@ -45,6 +45,7 @@ int main(int argc, char **argv) { logFile.open (argv[1]); sigFile.open (argv[2]); + //printf("HW INIT:%s \n", argv[3]); programFile.open (argv[3]); if (!logFile.is_open()) { @@ -68,13 +69,13 @@ int main(int argc, char **argv) { #endif taigaTracer->reset(); cout << "--------------------------------------------------------------\n"; - cout << " Starting Simulation, logging to " << argv[1] << "\n"; + cout << " Starting Simulation, logging to: " << argv[1] << "\n"; cout << "--------------------------------------------------------------\n"; + cout << flush; // Tick the clock until we are done while(!(taigaTracer->has_stalled() || taigaTracer->has_terminated())) { taigaTracer->tick(); - //Compliance Tests Signature Printing Phase if (taigaTracer->check_instruction_issued(COMPLIANCE_SIG_PHASE_NOP)) { std::cout << "\n--------------------------------------------------------------\n"; @@ -85,7 +86,7 @@ int main(int argc, char **argv) { } cout << "--------------------------------------------------------------\n"; - cout << " Simulation Completed. " << taigaTracer->get_cycle_count() << " cycles.\n"; + cout << " Simulation Completed: " << taigaTracer->get_cycle_count() << " cycles.\n"; taigaTracer->print_stats(); logFile.close(); diff --git a/test_benches/verilator/taiga_local_mem.sv b/test_benches/verilator/taiga_local_mem.sv index 5c260c7..e4bf753 100644 --- a/test_benches/verilator/taiga_local_mem.sv +++ b/test_benches/verilator/taiga_local_mem.sv @@ -41,10 +41,10 @@ module taiga_local_mem # ( output logic [0:0]ddr_axi_arlock, output logic [2:0]ddr_axi_arprot, output logic [3:0]ddr_axi_arqos, - output logic ddr_axi_arready, + input logic ddr_axi_arready, output logic [3:0]ddr_axi_arregion, output logic [2:0]ddr_axi_arsize, - input logic ddr_axi_arvalid, + output logic ddr_axi_arvalid, output logic [31:0]ddr_axi_awaddr, output logic [1:0]ddr_axi_awburst, output logic [3:0]ddr_axi_awcache, @@ -74,6 +74,33 @@ module taiga_local_mem # ( output logic ddr_axi_wvalid, output logic [5:0]ddr_axi_wid, + //L2 interface + input logic [29:0] addr, + input logic [3:0] be, + input logic rnw, + input logic is_amo, + input logic [4:0] amo_type_or_burst_size, + input logic [L2_SUB_ID_W-1:0] sub_id, + + input logic request_push, + output logic request_full, + + output logic [31:2] inv_addr, + output logic inv_valid, + input logic inv_ack, + + output logic con_result, + output logic con_valid, + + input logic [31:0] wr_data, + input logic wr_data_push, + output logic data_full, + + output logic [31:0] rd_data, + output logic [L2_SUB_ID_W-1:0] rd_sub_id, + output logic rd_data_valid, + input logic rd_data_ack, + // //AXI bus // output logic [31:0]bus_axi_araddr, // output logic [1:0]bus_axi_arburst, @@ -196,7 +223,7 @@ module taiga_local_mem # ( assign interrupt = 0; axi_interface m_axi(); - axi_interface ddr_axi(); + //axi_interface ddr_axi(); avalon_interface m_avalon(); wishbone_interface m_wishbone(); @@ -357,40 +384,40 @@ module taiga_local_mem # ( //////////////////////////////////////////////////// //DDR AXI interface - assign ddr_axi.araddr = ddr_axi_araddr; - assign ddr_axi.arburst = ddr_axi_arburst; - assign ddr_axi.arcache = ddr_axi_arcache; - assign ddr_axi.arid = ddr_axi_arid; - assign ddr_axi.arlen = ddr_axi_arlen; - assign ddr_axi_arready = ddr_axi.arready; - assign ddr_axi.arsize = ddr_axi_arsize; - assign ddr_axi.arvalid = ddr_axi_arvalid; + assign ddr_axi_araddr = axi_araddr; + assign ddr_axi_arburst = axi_arburst; + assign ddr_axi_arcache = axi_arcache; + assign ddr_axi_arid = axi_arid; + assign ddr_axi_arlen = axi_arlen; + assign axi_arready = ddr_axi_arready; + assign ddr_axi_arsize = axi_arsize; + assign ddr_axi_arvalid = axi_arvalid; - assign ddr_axi.awaddr = ddr_axi_awaddr; - assign ddr_axi.awburst = ddr_axi_awburst; - assign ddr_axi.awcache = ddr_axi_awcache; - assign ddr_axi.awid = ddr_axi_awid; - assign ddr_axi.awlen = ddr_axi_awlen; - assign ddr_axi.awready = ddr_axi_awready; - assign ddr_axi.awvalid = ddr_axi_awvalid; + assign ddr_axi_awaddr = axi_awaddr; + assign ddr_axi_awburst = axi_awburst; + assign ddr_axi_awcache = axi_awcache; + assign ddr_axi_awid = axi_awid; + assign ddr_axi_awlen = axi_awlen; + assign axi_awready = ddr_axi_awready; + assign ddr_axi_awvalid = axi_awvalid; + + assign axi_bid = ddr_axi_bid; + assign ddr_axi_bready = axi_bready; + assign axi_bresp = ddr_axi_bresp; + assign axi_bvalid = ddr_axi_bvalid; - assign ddr_axi.bid = ddr_axi_bid; - assign ddr_axi_bready = ddr_axi.bready; - assign ddr_axi.bresp = ddr_axi_bresp; - assign ddr_axi.bvalid = ddr_axi_bvalid; + assign axi_rdata = ddr_axi_rdata; + assign axi_rid = ddr_axi_rid; + assign axi_rlast = ddr_axi_rlast; + assign ddr_axi_rready = axi_rready; + assign axi_rresp = ddr_axi_rresp; + assign axi_rvalid = ddr_axi_rvalid; - assign ddr_axi.rdata = ddr_axi_rdata; - assign ddr_axi.rid = ddr_axi_rid; - assign ddr_axi.rlast = ddr_axi_rlast; - assign ddr_axi_rready = ddr_axi.rready; - assign ddr_axi.rresp = ddr_axi_rresp; - assign ddr_axi.rvalid = ddr_axi_rvalid; - - assign ddr_axi_wdata = ddr_axi.wdata; - assign ddr_axi_wlast = ddr_axi.wlast; - assign ddr_axi.wready = ddr_axi_wready; - assign ddr_axi_wstrb = ddr_axi.wstrb; - assign ddr_axi_wvalid = ddr_axi.wvalid; + assign ddr_axi_wdata = axi_wdata; + assign ddr_axi_wlast = axi_wlast; + assign axi_wready = ddr_axi_wready; + assign ddr_axi_wstrb = axi_wstrb; + assign ddr_axi_wvalid = axi_wvalid; //////////////////////////////////////////////////// //Trace Interface @@ -404,4 +431,4 @@ module taiga_local_mem # ( taiga_events[$bits(taiga_trace_events_t)-1-i] = taiga_events_packed[i]; end -endmodule +endmodule \ No newline at end of file diff --git a/tools/Makefile b/tools/Makefile index c17cfab..2cc1bde 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -3,7 +3,7 @@ #MAKEFLAGS += --silent -include internal.mak MAKEFILE_DIR=$(pwd) -TAIGA_DIR=/home/ematthew/taiga +TAIGA_DIR=/home/zaguila/Documents/Research/AXI_DDR_simulation/Taiga-dev RISCV_PREFIX ?= riscv32-unknown-elf- @@ -14,29 +14,73 @@ VERILATOR_DIR=$(TAIGA_DIR)/test_benches/verilator TAIGA_SRCS = $(shell cat taiga_compile_order) -#Set to True or False -TRACE_ENABLE=False -VERILATOR_TRACE_FILE="/data/sim-logs/sim_results.vcd" +#Tracing: Set to True or False +TRACE_ENABLE=False +VERILATOR_TRACE_FILE="/home/zaguila/Tools/RISCV/sim-logs/sim_results.vcd" + +#DDR Pre-Initialization +LOAD_DDR_FROM_FILE = False +DDR_FILE = "\"path_to_DDR_init_file\"" +DDR_FILE_STARTING_LOCATION = 0 +DDR_FILE_NUM_BYTES = 0 + +#AXI DDR Parameters +DDR_SIZE_GB = 4 +PAGE_SIZE_KB = 2 +MAX_READ_REQ = 8 +MAX_WRITE_REQ = $(MAX_READ_REQ) +MIN_RD_DELAY = 1 +MAX_RD_DELAY = 1 +MIN_WR_DELAY = 1 +MAX_WR_DELAY = 1 +DELAY_SEED = 867583 +###################################################################### +ddr_size_def = DDR_SIZE=\(long\)$(DDR_SIZE_GB)*\(long\)1073741824 +page_size_def = PAGE_SIZE=\($(PAGE_SIZE_KB)*1024\) +max_inflight_read_requests = MAX_INFLIGHT_RD_REQ=$(MAX_READ_REQ) +max_inflight_write_requests = MAX_INFLIGHT_WD_REQ=$(MAX_WRITE_REQ) +mix_delay_read = MIN_DELAY_RD=$(MIN_RD_DELAY) +max_delay_read = MAX_DELAY_RD=$(MAX_RD_DELAY) +min_delay_write = MIN_DELAY_WR=$(MIN_WR_DELAY) +max_delay_write = MAX_DELAY_WR=$(MAX_WR_DELAY) +delay_seed = DELAY_SEED=$(DELAY_SEED) +ddr_init_file = DDR_INIT_FILE=$(DDR_FILE) +ddr_start_loc = DDR_FILE_STARTING_LOCATION=$(DDR_FILE_STARTING_LOCATION) +ddr_num_bytes = DDR_FILE_NUM_BYTES=$(DDR_FILE_NUM_BYTES) + +CFLAGS = -g0 -O3 -march=native -D$(ddr_size_def) -D$(page_size_def) -D$(max_inflight_read_requests) -D$(max_inflight_write_requests)\ + -D$(mix_delay_read) -D$(max_delay_read) -D$(min_delay_write) -D$(max_delay_write) -D$(delay_seed)\ + -D$(ddr_init_file) -D$(ddr_start_loc) -D$(ddr_num_bytes) + +#Verilator +################################################################################ VERILATOR_LINT_IGNORE= -Wno-LITENDIAN -Wno-SYMRSVDWORD ifeq ($(TRACE_ENABLE), True) - VERILATOR_CFLAGS = --trace -CFLAGS "-g0 -O3 -march=native -D TRACE_ON" + VERILATOR_CFLAGS = --trace --CFLAGS "$(CFLAGS) -D TRACE_ON" else - VERILATOR_CFLAGS = -CFLAGS "-g0 -O3 -march=native" + VERILATOR_CFLAGS = --CFLAGS "$(CFLAGS)" endif -############################################################### + +VERILATOR_LINT_IGNORE= -Wno-LITENDIAN -Wno-SYMRSVDWORD +ifeq ($(LOAD_DDR_FROM_FILE), True) + VERILATOR_CFLAGS := $(VERILATOR_CFLAGS) -D LOAD_DDR_FROM_FILE" +endif + +################################################################################## + #Compiance parameters ############################################################### -COMPLIANCE_DIR=/home/ematthew/Research/RISCV/sfu-rcl/taiga-riscv-compliance/ +COMPLIANCE_DIR=/home/zaguila/Tools/RISCV/taiga-riscv-compliance/ COMPLIANCE_TARGET=rv32im ############################################################### #Benchmark parameters #Assumes binaries are in the BENCHMARK_DIR ############################################################### -EMBENCH_DIR=/home/ematthew/Research/RISCV/sfu-rcl/taiga-embench -EMBENCH_BENCHMARKS = \ +EMBENCH_DIR=/home/zaguila/Tools/RISCV/taiga-embench +EMBENCH_BENCHMARKS = \ aha-mont64 \ crc32 \ cubic \ @@ -56,6 +100,7 @@ st \ statemate \ ud \ wikisort \ + embench_logs = $(addsuffix _full.log, $(EMBENCH_BENCHMARKS)) embench_hw = $(addsuffix .hw_init, $(EMBENCH_BENCHMARKS)) @@ -118,8 +163,13 @@ build_taiga_sim: $(TAIGA_SRCS) cp $(VERILATOR_DIR)/SimMem.h $@/ cp $(VERILATOR_DIR)/SimMem.cc $@/ cp $(VERILATOR_DIR)/taiga_local_mem.cc $@/ + cp $(VERILATOR_DIR)/AXI_DDR_simulation/axi_ddr_sim.cc $@/ + cp $(VERILATOR_DIR)/AXI_DDR_simulation/axi_ddr_sim.h $@/ + cp $(VERILATOR_DIR)/AXI_DDR_simulation/ddr_page.cc $@/ + cp $(VERILATOR_DIR)/AXI_DDR_simulation/ddr_page.h $@/ + cp $(VERILATOR_DIR)/AXI_DDR_simulation/axi_interface.h $@/ verilator --cc --exe --Mdir $@ --assert $(VERILATOR_LINT_IGNORE) $(VERILATOR_CFLAGS) $(TAIGA_SRCS) \ - ../test_benches/verilator/taiga_local_mem.sv --top-module taiga_local_mem taiga_local_mem.cc SimMem.cc + ../test_benches/verilator/taiga_local_mem.sv --top-module taiga_local_mem taiga_local_mem.cc ddr_page.cc SimMem.cc $(MAKE) -C $@ -f Vtaiga_local_mem.mk #Run verilator