OpenCores
URL https://opencores.org/ocsvn/qaz_libs/qaz_libs/trunk

Subversion Repositories qaz_libs

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /qaz_libs
    from Rev 49 to Rev 50
    Reverse comparison

Rev 49 → Rev 50

/trunk/BFM/sim/tests/tb_video_frame_dpi/py_raw_to_frame.py File deleted \ No newline at end of file
/trunk/BFM/src/SPI/spi_agent.svh
25,32 → 25,24
//// ////
//////////////////////////////////////////////////////////////////////
 
class spi_agent
class spi_agent #(N=1)
extends uvm_agent;
`uvm_component_utils(spi_agent)
`uvm_component_param_utils(spi_agent #(N))
 
// --------------------------------------------------------------------
virtual spi_if vif;
spi_driver driver_h;
virtual spi_if #(N) vif;
spi_driver #(N) driver_h;
spi_sequencer sequencer_h;
// spi_monitor monitor_h;
 
// --------------------------------------------------------------------
virtual function void build_phase(uvm_phase phase);
// super.build_phase(phase);
driver_h = spi_driver::type_id::create("driver_h", this);
// monitor_h = spi_monitor ::type_id::create("monitor_h", this);
driver_h = spi_driver #(N)::type_id::create("driver_h", this);
sequencer_h = spi_sequencer::type_id::create("sequencer_h", this);
 
endfunction
 
// --------------------------------------------------------------------
virtual function void connect_phase(uvm_phase phase);
// super.connect_phase(phase);
 
driver_h.vif = vif;
// monitor_h.vif = vif;
 
driver_h.seq_item_port.connect(sequencer_h.seq_item_export);
endfunction
 
60,4 → 52,4
endfunction
 
// --------------------------------------------------------------------
endclass : spi_agent
endclass
/trunk/BFM/src/SPI/spi_driver.svh
25,17 → 25,17
//// ////
//////////////////////////////////////////////////////////////////////
 
class spi_driver
class spi_driver #(N)
extends uvm_driver #(spi_sequence_item);
`uvm_component_utils(spi_driver)
`uvm_component_param_utils(spi_driver #(N))
 
// --------------------------------------------------------------------
virtual spi_if vif;
virtual spi_if #(N) vif;
 
//--------------------------------------------------------------------
function void set_default;
vif.sclk <= 0;
vif.ss_n <= 1;
vif.ss_n <= '1;
vif.mosi <= 'x;
endfunction: set_default
 
51,7 → 51,8
index = 0;
seq_item_port.get_next_item(item);
 
vif.ss_n <= 0;
vif.ss_n <= ~(1 << item.ss_index);
 
vif.mosi <= item.mosi_data[index];
#(vif.period / 2);
 
75,7 → 76,7
end
 
#(vif.period / 2);
vif.ss_n <= 1;
vif.ss_n <= '1;
 
set_default();
seq_item_port.item_done();
89,4 → 90,4
endfunction
 
// --------------------------------------------------------------------
endclass : spi_driver
endclass
/trunk/BFM/src/SPI/spi_if.sv
25,8 → 25,7
//// ////
//////////////////////////////////////////////////////////////////////
 
interface
spi_if();
interface spi_if #(N=1);
import uvm_pkg::*;
`include "uvm_macros.svh"
import tb_spi_pkg::*;
33,7 → 32,7
 
// --------------------------------------------------------------------
logic sclk;
logic ss_n;
logic [N-1:0] ss_n;
logic mosi;
logic miso;
 
/trunk/BFM/src/SPI/spi_sequence_item.svh
35,6 → 35,7
// --------------------------------------------------------------------
logic miso_data[]; // data from slave to master
logic mosi_data[]; // data from master to slave
int ss_index = 0;
bit read;
bit write;
 
56,38 → 57,34
mosi_data[i] = 0;
endfunction : init
 
// // --------------------------------------------------------------------
// function bit do_compare(uvm_object rhs, uvm_comparer comparer);
// spi_sequence_item tested;
// bit same;
// --------------------------------------------------------------------
function void load_mosi_from_file(string file_name);
byte buffer;
integer fd;
integer code;
integer size;
 
// if (rhs==null)
// `uvm_fatal(get_type_name(), "| %m | comparison to a null pointer");
fd = $fopen(file_name, "rb");
code = $fseek(fd, 0, 2); // SEEK_END
size = $ftell(fd);
code = $rewind(fd);
data_width = size*8;
mosi_data = new[data_width];
write = 1;
 
// if (!$cast(tested,rhs))
// same = 0;
// else
// same = super.do_compare(rhs, comparer);
for(int i = 0; i < size; i++) begin
code = $fread(buffer, fd);
mosi_data[i*8 +: 8] = {>>{buffer}};
end
 
// return same;
// endfunction : do_compare
$fclose(fd);
endfunction
 
// // --------------------------------------------------------------------
// function void do_copy(uvm_object rhs);
// spi_sequence_item item;
// assert(rhs != null) else
// `uvm_fatal(get_type_name(), "| %m | copy null transaction");
// super.do_copy(rhs);
// assert($cast(item,rhs)) else
// `uvm_fatal(get_type_name(), "| %m | failed cast");
// delay = item.delay;
// command = item.command;
// wr_full = item.wr_full;
// rd_empty = item.rd_empty;
// wr_data = item.wr_data;
// rd_data = item.rd_data;
// count = item.count;
// endfunction : do_copy
// --------------------------------------------------------------------
function void load_mosi_from_byte_array(byte byte_array[]);
foreach(byte_array[i])
mosi_data[i*8 +: 8] = {>>{byte_array[i]}};
endfunction
 
// --------------------------------------------------------------------
function string convert2string();
102,8 → 99,7
);
s0 = {s0, s1};
 
if(read)
begin
if(read) begin
data = {>>{miso_data}};
 
foreach(data[i])
113,8 → 109,7
s0 = {s0, s2};
end
 
if(write)
begin
if(write) begin
data = {>>{mosi_data}};
 
foreach(data[i])
128,4 → 123,4
endfunction : convert2string
 
// --------------------------------------------------------------------
endclass : spi_sequence_item
endclass
/trunk/BFM/src/SPI/tb_spi_pkg.sv
28,28 → 28,12
package tb_spi_pkg;
import uvm_pkg::*;
`include "uvm_macros.svh"
import bfm_pkg::*;
 
// // --------------------------------------------------------------------
// localparam W = 16;
// localparam D = 8;
// localparam UB = $clog2(D);
 
// --------------------------------------------------------------------
// typedef enum {FIFO_RD, FIFO_WR, FIFO_BOTH, FIFO_NULL} fifo_command_t;
 
// --------------------------------------------------------------------
`include "spi_sequence_item.svh"
typedef uvm_sequencer #(spi_sequence_item) spi_sequencer;
`include "spi_driver.svh"
// `include "spi_monitor.svh"
// `include "spi_scoreboard.svh"
`include "spi_agent.svh"
// `include "tb_env.svh"
// `include "s_debug.svh"
// `include "t_top_base.svh"
// `include "t_debug.svh"
 
// --------------------------------------------------------------------
endpackage : tb_spi_pkg
endpackage
/trunk/BFM/src/tb/legacy/bfm_pkg.sv
0,0 → 1,106
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2015 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
 
package bfm_pkg;
 
// --------------------------------------------------------------------
//
typedef enum
{
NONE,
REGULAR
// BURSTY
} traffic_type_e;
 
// --------------------------------------------------------------------
//
class delay_class;
 
rand int unsigned delay = 0;
 
// --------------------------------------------------------------------
//
virtual function void set_delay(traffic_type_e kind = REGULAR);
case(kind)
NONE: delay = 0;
REGULAR: assert(this.randomize() with{delay dist {0 := 60, [1:3] := 30, [4:7] := 10};});
default: delay = 0;
endcase
endfunction: set_delay
 
// --------------------------------------------------------------------
//
virtual function int next(traffic_type_e kind = REGULAR);
set_delay(kind);
return(delay);
endfunction: next
 
// --------------------------------------------------------------------
//
endclass: delay_class
 
// --------------------------------------------------------------------
//
virtual class transaction_class #(parameter type TR_T);
 
delay_class delay_h;
 
// --------------------------------------------------------------------
//
function void random;
assert(this.randomize());
endfunction: random
 
//--------------------------------------------------------------------
//
function new;
delay_h = new();
endfunction: new
 
// --------------------------------------------------------------------
//
pure virtual function void copy(TR_T from);
 
// --------------------------------------------------------------------
//
function automatic TR_T clone;
TR_T child;
clone = new();
$cast(child, this);
clone.copy(child);
return(clone);
endfunction: clone
 
// --------------------------------------------------------------------
//
endclass: transaction_class
 
//--------------------------------------------------------------------
//
endpackage: bfm_pkg
 
/trunk/BFM/src/tb/legacy/logger_pkg.sv
0,0 → 1,136
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2015 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
 
package logger_pkg;
 
// --------------------------------------------------------------------
//
typedef enum
{
FATAL,
ERROR,
WARNING,
INFO
} logger_severity_t;
 
 
// --------------------------------------------------------------------
//
class logger_class;
 
logger_severity_t verbosity = WARNING;
bit log_debug = 0;
string time_string;
int error_count = 0;
int max_error_display = 8;
bit stop_at_max_error = 1;
 
// --------------------------------------------------------------------
//
function void
set_verbosity(logger_severity_t level);
verbosity = level;
endfunction: set_verbosity
 
 
// --------------------------------------------------------------------
//
function void
debug_enable;
log_debug = 1;
endfunction: debug_enable
 
 
// --------------------------------------------------------------------
//
function void debug(string message);
time_string = $sformatf("??? %16.t | ", $time);
if(log_debug == 1)
$display({time_string, message});
endfunction: debug
 
 
// --------------------------------------------------------------------
//
function void display(string message);
time_string = $sformatf("--- %16.t | ", $time);
$display({time_string, message});
endfunction: display
 
 
// --------------------------------------------------------------------
//
function void info(string message);
time_string = $sformatf("^^^ %16.t | ", $time);
if(verbosity >= INFO)
$display({time_string, message});
endfunction: info
 
 
// --------------------------------------------------------------------
//
function void warning(string message);
time_string = $sformatf("*** %16.t | ", $time);
if(verbosity >= WARNING)
$display({time_string, message});
endfunction: warning
 
 
// --------------------------------------------------------------------
//
function void error(string message);
time_string = $sformatf("!!! %16.t | ", $time);
error_count++;
if(error_count > max_error_display)
if(stop_at_max_error)
$stop;
else
return;
if(verbosity >= ERROR)
$display({time_string, message});
endfunction: error
 
 
// --------------------------------------------------------------------
//
function void fatal(string message);
if(verbosity >= FATAL)
$fatal(1, message);
endfunction: fatal
 
 
//--------------------------------------------------------------------
//
endclass: logger_class
 
 
//--------------------------------------------------------------------
//
endpackage: logger_pkg
 
/trunk/BFM/src/tb/legacy/q_pkg.sv
0,0 → 1,147
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2015 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
 
package q_pkg;
 
// --------------------------------------------------------------------
//
virtual class q_base_class #(parameter type Q_T = logic);
 
Q_T tr_h;
mailbox #(Q_T) q;
 
// --------------------------------------------------------------------
//
pure virtual task run_q;
 
 
// --------------------------------------------------------------------
//
task put(ref Q_T tr_h);
q.put(tr_h);
endtask: put
 
 
// --------------------------------------------------------------------
//
task get(ref Q_T tr_h);
q.get(tr_h);
endtask: get
 
 
//--------------------------------------------------------------------
function new;
this.q = new();
fork
forever
run_q();
join_none
endfunction: new
 
 
// --------------------------------------------------------------------
//
endclass: q_base_class
 
 
// --------------------------------------------------------------------
//
virtual class nonblocking_transmission_q_class #(parameter type Q_T = logic)
extends q_base_class #(Q_T);
 
// --------------------------------------------------------------------
//
pure virtual task transmit(ref Q_T tr_h);
pure virtual task idle();
 
 
// --------------------------------------------------------------------
//
task automatic run_q;
if(q.try_get(tr_h) != 0)
transmit(tr_h);
else
idle();
endtask: run_q
 
 
// --------------------------------------------------------------------
//
endclass: nonblocking_transmission_q_class
 
 
// --------------------------------------------------------------------
//
virtual class blocking_transmission_q_class #(parameter type Q_T = logic)
extends q_base_class #(Q_T);
 
// --------------------------------------------------------------------
//
pure virtual task transmit(ref Q_T tr_h);
 
 
// --------------------------------------------------------------------
//
task run_q;
q.get(tr_h);
transmit(tr_h);
endtask: run_q
 
 
// --------------------------------------------------------------------
//
endclass: blocking_transmission_q_class
 
 
// --------------------------------------------------------------------
//
virtual class blocking_receiver_q_class #(parameter type Q_T = logic)
extends q_base_class #(Q_T);
 
// --------------------------------------------------------------------
//
pure virtual task receive(ref Q_T tr_h);
 
 
// --------------------------------------------------------------------
//
task run_q;
receive(tr_h);
q.put(tr_h);
endtask: run_q
 
 
//--------------------------------------------------------------------
//
endclass: blocking_receiver_q_class
 
 
//--------------------------------------------------------------------
//
endpackage: q_pkg
 
/trunk/BFM/src/tb/legacy/tb_base.sv
0,0 → 1,106
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2015 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
`timescale 1ps/1ps
 
import tb_clk_pkg::*;
 
 
module
tb_base
#(
parameter PERIOD = 0,
parameter ASSERT_TIME = 0
)
(
output clock,
output reg reset
);
 
// --------------------------------------------------------------------
//
task assert_reset
(
input time reset_assert
);
 
reset = 1;
$display( "-#- %16.t | %m | reset asserted!", $time );
 
#reset_assert;
 
reset = 0;
$display( "-#- %16.t | %m | reset deasserted!", $time );
 
endtask
 
 
// --------------------------------------------------------------------
//
task timeout_stop
(
input time timeout
);
 
$display("-#- %16.t | %m | timeout_stop at %t", $time, timeout);
 
fork
#(timeout) $stop;
join_none
 
endtask
 
 
// --------------------------------------------------------------------
//
tb_clk_class tb_clk_c;
tb_clk_if tb_clk_driver();
assign clock = tb_clk_driver.clk;
time reset_assert = (PERIOD * 5) + (PERIOD / 3);
logic init_done = 0;
 
initial
begin
 
reset = 1;
 
tb_clk_c = new( tb_clk_driver );
 
if( PERIOD != 0 )
tb_clk_c.init_basic_clock( PERIOD );
 
if( ASSERT_TIME != 0 )
assert_reset( ASSERT_TIME );
else if( reset_assert != 0 )
assert_reset( reset_assert );
 
init_done = 1;
 
end
endmodule
 
 
/trunk/BFM/src/tb/legacy/tb_bfm_pkg.sv
0,0 → 1,230
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2015 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
 
package tb_bfm_pkg;
 
// --------------------------------------------------------------------
//
class tb_nonblocking_transaction_q_class #(parameter type T = logic);
 
T tr_h;
mailbox #(T) q;
semaphore q_semaphore;
 
//--------------------------------------------------------------------
function new;
 
this.q = new();
this.q_semaphore = new(1);
 
endfunction: new
 
 
// --------------------------------------------------------------------
//
event start;
event done;
 
virtual task automatic
transaction
(
ref T tr_h
);
 
->start;
 
$display("^^^ %16.t | %m | ERROR! Task not defined |", $time);
 
->done;
 
endtask: transaction
 
 
// --------------------------------------------------------------------
//
virtual task automatic
idle;
 
$display("^^^ %16.t | %m | ERROR! Task not defined |", $time);
 
endtask: idle
 
 
// --------------------------------------------------------------------
//
task
put
(
ref T tr_h
);
 
$display("^^^ %16.t | %m | ", $time);
 
q.put(tr_h);
 
endtask: put
 
 
// --------------------------------------------------------------------
//
task automatic
run_q;
 
if(q_semaphore.try_get() == 0)
begin
$display("^^^ %16.t | %m | ERROR! Aready active |", $time);
return;
end
 
$display("^^^ %16.t | %m is active |", $time);
 
run_q_fork : fork
forever
if(q.try_get(tr_h) != 0)
transaction(tr_h);
else
idle();
join_none
 
#0;
 
endtask: run_q
 
 
// --------------------------------------------------------------------
//
function void
init;
 
fork
run_q();
join_none
 
$display("^^^ %16.t | %m | initialization", $time);
 
endfunction: init
 
endclass: tb_nonblocking_transaction_q_class
 
 
// --------------------------------------------------------------------
//
class tb_blocking_transaction_q_class #(parameter type T = logic);
 
T tr_h;
mailbox #(T) q;
semaphore q_semaphore;
 
//--------------------------------------------------------------------
function new;
 
this.q = new();
this.q_semaphore = new(1);
 
endfunction: new
 
 
// --------------------------------------------------------------------
//
event start;
event done;
 
virtual task automatic
transaction
(
ref T tr_h
);
 
->start;
 
$display("^^^ %16.t | %m | ERROR! Task not defined |", $time);
 
->done;
 
endtask: transaction
 
 
// --------------------------------------------------------------------
//
task
put
(
ref T tr_h
);
 
q.put(tr_h);
 
endtask: put
 
 
// --------------------------------------------------------------------
//
task automatic
run_q;
 
if(q_semaphore.try_get() == 0)
begin
$display("^^^ %16.t | %m | ERROR! Aready active |", $time);
return;
end
 
$display("^^^ %16.t | %m is active |", $time);
 
this.q = new();
 
run_q_fork : fork
forever
begin
q.get(tr_h);
transaction(tr_h);
end
join_none
 
#0;
 
endtask: run_q
 
 
// --------------------------------------------------------------------
//
function void
init;
 
fork
run_q();
join_none
 
$display("^^^ %16.t | %m | initialization", $time);
 
endfunction: init
 
endclass: tb_blocking_transaction_q_class
 
 
endpackage: tb_bfm_pkg
 
/trunk/BFM/src/tb/legacy/tb_clk.sv
0,0 → 1,55
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2015 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
import tb_clk_pkg::*;
 
module
tb_clk
#(
parameter PERIOD = 0
)
(
output clock
);
 
tb_clk_class tb_clk_c;
tb_clk_if tb_clk_driver();
assign clock = tb_clk_driver.clk;
 
initial
begin
 
tb_clk_c = new( tb_clk_driver );
 
if( PERIOD != 0 )
tb_clk_c.init_basic_clock( PERIOD );
 
end
 
endmodule
 
 
/trunk/BFM/src/tb/legacy/tb_clk_class.sv
0,0 → 1,110
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2015 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
`timescale 1ps/1ps
 
 
// --------------------------------------------------------------------
//
interface tb_clk_if;
logic clk = 0;
logic enable = 0;
time period;
event clk_rise;
event clk_fall;
modport tb_m
(
output clk
);
endinterface: tb_clk_if
 
 
// --------------------------------------------------------------------
//
class
tb_clk_class;
virtual tb_clk_if tb;
 
// --------------------------------------------------------------------
//
function
new
(
virtual tb_clk_if tb
);
this.tb = tb;
endfunction: new
 
// --------------------------------------------------------------------
//
task
init_basic_clock
(
time period
);
tb.period = period;
tb.enable = 1;
$display( "^^^ %16.t | %m | Starting clock with period %t.", $time, period );
fork
forever
if( tb.enable )
begin
#(period/2) tb.clk = 1;
-> tb.clk_rise;
#(period/2) tb.clk = 0;
-> tb.clk_fall;
end
join_none
endtask: init_basic_clock
// --------------------------------------------------------------------
//
task
enable_clock
(
logic enable
);
tb.enable = enable;
$display( "^^^ %16.t | %m | Clock Enable = %h.", $time, enable );
endtask: enable_clock
endclass: tb_clk_class
 
 
/trunk/BFM/src/tb/legacy/tb_clk_pkg.sv
0,0 → 1,118
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2015 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
`timescale 1ps/1ps
 
 
// --------------------------------------------------------------------
//
interface tb_clk_if;
logic clk = 0;
logic enable = 0;
time period;
event clk_rise;
event clk_fall;
modport tb_m
(
output clk
);
endinterface: tb_clk_if
 
 
// --------------------------------------------------------------------
//
package tb_clk_pkg;
 
// --------------------------------------------------------------------
//
class
tb_clk_class;
virtual tb_clk_if tb;
 
// --------------------------------------------------------------------
//
function
new
(
virtual tb_clk_if tb
);
this.tb = tb;
endfunction: new
 
// --------------------------------------------------------------------
//
task
init_basic_clock
(
time period
);
tb.period = period;
tb.enable = 1;
$display( "^^^ %16.t | %m | Starting clock with period %t.", $time, period );
fork
forever
if( tb.enable )
begin
#(period/2) tb.clk = 1;
-> tb.clk_rise;
#(period/2) tb.clk = 0;
-> tb.clk_fall;
end
join_none
endtask: init_basic_clock
// --------------------------------------------------------------------
//
task
enable_clock
(
logic enable
);
tb.enable = enable;
$display( "^^^ %16.t | %m | Clock Enable = %h.", $time, enable );
endtask: enable_clock
// --------------------------------------------------------------------
//
endclass: tb_clk_class
//--------------------------------------------------------------------
//
endpackage: tb_clk_pkg
 
/trunk/BFM/src/tb/tb_base.sv
1,6 → 1,6
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2015 Authors and OPENCORES.ORG ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
25,82 → 25,62
//// ////
//////////////////////////////////////////////////////////////////////
 
`timescale 1ps/1ps
 
import tb_clk_pkg::*;
 
 
module
tb_base
#(
parameter PERIOD = 0,
parameter ASSERT_TIME = 0
N = 1,
realtime PERIODS[N],
realtime ASSERT_TIME = (PERIODS[0] * 5) + (PERIODS[0] / 3)
)
(
output clock,
output reg reset
output bit tb_clk[N],
output bit tb_aresetn,
output bit tb_reset[N]
);
timeunit 1ns;
timeprecision 100ps;
 
// --------------------------------------------------------------------
//
task assert_reset
(
input time reset_assert
);
function void assert_reset(realtime reset_assert=ASSERT_TIME);
fork
begin
tb_aresetn = 0;
#reset_assert;
tb_aresetn = 1;
end
join_none
endfunction
 
reset = 1;
$display( "-#- %16.t | %m | reset asserted!", $time );
// --------------------------------------------------------------------
bit disable_clks[N];
 
#reset_assert;
generate
for(genvar j = 0; j < N; j++) begin
always
if(disable_clks[j])
tb_clk[j] = 0;
else
#(PERIODS[j]/2) tb_clk[j] = ~tb_clk[j];
end
endgenerate
 
reset = 0;
$display( "-#- %16.t | %m | reset deasserted!", $time );
 
endtask
 
 
// --------------------------------------------------------------------
//
task timeout_stop
(
input time timeout
);
generate
for(genvar j = 0; j < N; j++) begin
bit reset = 1;
assign tb_reset[j] = reset;
 
$display("-#- %16.t | %m | timeout_stop at %t", $time, timeout);
always @(posedge tb_clk[j] or negedge tb_aresetn)
if(~tb_aresetn)
reset = 1;
else
reset = 0;
end
endgenerate
 
fork
#(timeout) $stop;
join_none
 
endtask
 
 
// --------------------------------------------------------------------
//
tb_clk_class tb_clk_c;
tb_clk_if tb_clk_driver();
assign clock = tb_clk_driver.clk;
time reset_assert = (PERIOD * 5) + (PERIOD / 3);
logic init_done = 0;
 
initial
begin
assert_reset();
 
reset = 1;
 
tb_clk_c = new( tb_clk_driver );
 
if( PERIOD != 0 )
tb_clk_c.init_basic_clock( PERIOD );
 
if( ASSERT_TIME != 0 )
assert_reset( ASSERT_TIME );
else if( reset_assert != 0 )
assert_reset( reset_assert );
 
init_done = 1;
 
end
// --------------------------------------------------------------------
endmodule
 
 
/trunk/BFM/src/tb/tb_pkg.sv
31,4 → 31,4
`include "random_delay.svh"
 
// --------------------------------------------------------------------
endpackage : tb_pkg
endpackage
/trunk/BFM/src/video_frame/video_frame_class.svh
27,7 → 27,6
 
// --------------------------------------------------------------------
class video_frame_class;
logger_class log;
rand int frame_id;
rand int pixels_per_line;
rand int lines_per_frame;
59,7 → 58,6
 
//--------------------------------------------------------------------
function new;
this.log = new;
this.frame_id = 0;
endfunction: new
 
72,7 → 70,6
int pixels_per_clk = 1,
string name = ""
);
log.info($sformatf("%m"));
this.pixels_per_line = pixels_per_line;
this.lines_per_frame = lines_per_frame;
this.bits_per_pixel = bits_per_pixel;
113,7 → 110,6
 
// --------------------------------------------------------------------
function void make_constant(int pixel);
log.info($sformatf("%m"));
this.lines = new[lines_per_frame];
 
foreach(this.lines[l])
129,7 → 125,6
 
// --------------------------------------------------------------------
function void make_counting(int offset = 0);
log.info($sformatf("%m"));
this.lines = new[lines_per_frame];
 
foreach(this.lines[l])
145,7 → 140,6
 
// --------------------------------------------------------------------
function void make_horizontal();
log.info($sformatf("%m"));
this.lines = new[lines_per_frame];
 
foreach(this.lines[l])
161,7 → 155,6
 
// --------------------------------------------------------------------
function void make_vertical();
log.info($sformatf("%m"));
this.lines = new[lines_per_frame];
 
foreach(this.lines[l])
177,7 → 170,6
 
// --------------------------------------------------------------------
function void make_random();
log.info($sformatf("%m"));
this.lines = new[lines_per_frame];
 
foreach(this.lines[l])
193,7 → 185,6
 
// --------------------------------------------------------------------
function void copy(video_frame_class from);
log.info($sformatf("%m"));
this.frame_id = from.frame_id;
this.pixels_per_line = from.pixels_per_line;
this.lines_per_frame = from.lines_per_frame;
212,7 → 203,6
 
// --------------------------------------------------------------------
virtual function video_frame_class clone;
log.info($sformatf("%m"));
clone = new();
clone.copy(this);
endfunction: clone
219,7 → 209,6
 
// --------------------------------------------------------------------
function video_frame_class catenate_horizontally(video_frame_class tail);
log.info($sformatf("%m"));
 
if(this.lines_per_frame != tail.lines_per_frame)
return(null);
248,7 → 237,6
 
// --------------------------------------------------------------------
function void shift_right(ref line_s column);
log.info($sformatf("%m"));
 
foreach(this.lines[l])
for(int p = pixels_per_line - 1; p > 0; p--)
258,114 → 246,127
this.lines[l].pixel[0] = column.pixel[l];
endfunction: shift_right
 
// --------------------------------------------------------------------
function int compare_line
( int line
, int max_mismatches
, video_frame_class to
);
int mismatch_count = 0;
// // --------------------------------------------------------------------
// function int compare_line
// ( int line
// , int max_mismatches
// , video_frame_class to
// );
// int mismatch_count = 0;
 
if(to.bits_per_pixel != this.bits_per_pixel)
begin
log.error($sformatf("to.bits_per_pixel != this.bits_per_pixel | %s", name));
return(-3);
end
// if(to.bits_per_pixel != this.bits_per_pixel)
// begin
// log.error($sformatf("to.bits_per_pixel != this.bits_per_pixel | %s", name));
// return(-3);
// end
 
foreach(this.lines[line].pixel[p])
if(to.lines[line].pixel[p] != this.lines[line].pixel[p])
begin
// foreach(this.lines[line].pixel[p])
// if(to.lines[line].pixel[p] != this.lines[line].pixel[p])
// begin
 
if(max_mismatches > 0)
mismatch_count++;
// if(max_mismatches > 0)
// mismatch_count++;
 
log.error($sformatf("mismatch @ frame[%4h][%4h] | to == %4h | this == %4h | %s",
line, p, to.lines[line].pixel[p], this.lines[line].pixel[p], name));
// log.error($sformatf("mismatch @ frame[%4h][%4h] | to == %4h | this == %4h | %s",
// line, p, to.lines[line].pixel[p], this.lines[line].pixel[p], name));
 
if(mismatch_count > max_mismatches)
return(mismatch_count);
end
// if(mismatch_count > max_mismatches)
// return(mismatch_count);
// end
 
return(mismatch_count);
endfunction: compare_line
// return(mismatch_count);
// endfunction: compare_line
 
// --------------------------------------------------------------------
function int compare(int max_mismatches, video_frame_class to);
int mismatch_count = 0;
log.info($sformatf("%m"));
// // --------------------------------------------------------------------
// function int compare(int max_mismatches, video_frame_class to);
// int mismatch_count = 0;
// log.info($sformatf("%m"));
 
if(to.pixels_per_line != this.pixels_per_line)
begin
log.error($sformatf("to.pixels_per_line != this.pixels_per_line | %s", name));
return(-1);
end
// if(to.pixels_per_line != this.pixels_per_line)
// begin
// log.error($sformatf("to.pixels_per_line != this.pixels_per_line | %s", name));
// return(-1);
// end
 
if(to.lines_per_frame != this.lines_per_frame)
begin
log.error($sformatf("to.lines_per_frame != this.lines_per_frame | %s", name));
return(-2);
end
// if(to.lines_per_frame != this.lines_per_frame)
// begin
// log.error($sformatf("to.lines_per_frame != this.lines_per_frame | %s", name));
// return(-2);
// end
 
if(to.bits_per_pixel != this.bits_per_pixel)
begin
log.error($sformatf("to.bits_per_pixel != this.bits_per_pixel | %s", name));
return(-3);
end
// if(to.bits_per_pixel != this.bits_per_pixel)
// begin
// log.error($sformatf("to.bits_per_pixel != this.bits_per_pixel | %s", name));
// return(-3);
// end
 
foreach(this.lines[l])
begin
foreach(this.lines[l].pixel[p])
if(to.lines[l].pixel[p] != this.lines[l].pixel[p])
begin
if(max_mismatches > 0)
mismatch_count++;
// foreach(this.lines[l])
// begin
// foreach(this.lines[l].pixel[p])
// if(to.lines[l].pixel[p] != this.lines[l].pixel[p])
// begin
// if(max_mismatches > 0)
// mismatch_count++;
 
log.error($sformatf("mismatch @ frame[%4h][%4h] | to == %4h | this == %4h | %s", l, p, to.lines[l].pixel[p], this.lines[l].pixel[p], name));
// log.error($sformatf("mismatch @ frame[%4h][%4h] | to == %4h | this == %4h | %s", l, p, to.lines[l].pixel[p], this.lines[l].pixel[p], name));
 
if(mismatch_count > max_mismatches)
return(mismatch_count);
end
end
// if(mismatch_count > max_mismatches)
// return(mismatch_count);
// end
// end
 
return(mismatch_count);
endfunction: compare
// return(mismatch_count);
// endfunction: compare
 
// --------------------------------------------------------------------
function void print_line(int line, int pixel, int count);
log.info($sformatf("%m"));
// // --------------------------------------------------------------------
// function void print_line(int line, int pixel, int count);
// log.info($sformatf("%m"));
 
for(int i = 0; i < count; i++)
log.display($sformatf("%4h @ frame[%4h][%4h] | %s", this.lines[line].pixel[(pixel + i)], line, (pixel + i), name));
endfunction: print_line
// for(int i = 0; i < count; i++)
// log.display($sformatf("%4h @ frame[%4h][%4h] | %s", this.lines[line].pixel[(pixel + i)], line, (pixel + i), name));
// endfunction: print_line
 
// // --------------------------------------------------------------------
// function void print_config();
// log.display($sformatf("%m | frame_id = %06d | %s", frame_id, name));
// log.display($sformatf("%m | pixels_per_line = %06d | %s", pixels_per_line, name));
// log.display($sformatf("%m | lines_per_frame = %06d | %s", lines_per_frame, name));
// log.display($sformatf("%m | bits_per_pixel = %06d | %s", bits_per_pixel, name));
// log.display($sformatf("%m | pixels_per_clk = %06d | %s", pixels_per_clk, name));
// log.display($sformatf("%m | pattern = %s | %s", pattern, name));
// endfunction: print_config
 
// --------------------------------------------------------------------
function void print_config();
log.display($sformatf("%m | frame_id = %06d | %s", frame_id, name));
log.display($sformatf("%m | pixels_per_line = %06d | %s", pixels_per_line, name));
log.display($sformatf("%m | lines_per_frame = %06d | %s", lines_per_frame, name));
log.display($sformatf("%m | bits_per_pixel = %06d | %s", bits_per_pixel, name));
log.display($sformatf("%m | pixels_per_clk = %06d | %s", pixels_per_clk, name));
log.display($sformatf("%m | pattern = %s | %s", pattern, name));
$display($sformatf("%m | frame_id = %06d | %s", frame_id, name));
$display($sformatf("%m | pixels_per_line = %06d | %s", pixels_per_line, name));
$display($sformatf("%m | lines_per_frame = %06d | %s", lines_per_frame, name));
$display($sformatf("%m | bits_per_pixel = %06d | %s", bits_per_pixel, name));
$display($sformatf("%m | pixels_per_clk = %06d | %s", pixels_per_clk, name));
$display($sformatf("%m | pattern = %s | %s", pattern, name));
endfunction: print_config
 
// --------------------------------------------------------------------
function string convert2string(int grid=8);
string s;
string s0, s1;
string f ="";
string fs = $sformatf("%%s%%%0d.h" , (bits_per_pixel % 4 == 0)
? bits_per_pixel / 4
: (bits_per_pixel / 4) + 1
);
foreach(this.lines[l])
begin
s = $sformatf("[%4.d]", l);
foreach(this.lines[l].pixel[p])
s = {s, $sformatf(fs, (p % grid == 0) ? "!" : "|", this.lines[l].pixel[p])};
int nibbles = ( bits_per_pixel % 4 == 0)
? bits_per_pixel / 4
: (bits_per_pixel / 4) + 1;
 
f = {f, s, "|\n"};
foreach(this.lines[l]) begin
s0 = $sformatf("[%4.d]", l);
foreach(this.lines[l].pixel[p]) begin
s1 = $sformatf("%.h", this.lines[l].pixel[p]);
s1 = s1.substr(nibbles, s1.len()-1);
s0 = {s0, (p % grid == 0) ? "!" : "|", s1};
end
 
f = {f, s0, "|\n"};
end
 
return f;
endfunction: convert2string
 
// --------------------------------------------------------------------
endclass: video_frame_class
endclass
/trunk/BFM/src/video_frame/video_frame_config.svh
57,4 → 57,4
endfunction : init
 
// --------------------------------------------------------------------
endclass: video_frame_config
endclass
/trunk/BFM/src/video_frame/video_frame_pkg.sv
26,7 → 26,6
//////////////////////////////////////////////////////////////////////
 
package video_frame_pkg;
import logger_pkg::*;
 
// --------------------------------------------------------------------
typedef struct
50,4 → 49,4
`include "video_frame_class.svh"
 
// --------------------------------------------------------------------
endpackage: video_frame_pkg
endpackage
/trunk/PCIe/sim/src/RIFFA/riffa_agent.svh
0,0 → 1,65
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
class riffa_agent #(N) extends uvm_agent;
`uvm_component_param_utils(riffa_agent #(N))
 
// --------------------------------------------------------------------
virtual riffa_chnl_if #(N) vif;
riffa_rp_tx_driver #(N) rp_tx_driver_h;
riffa_rp_rx_driver #(N) rp_rx_driver_h;
riffa_rp_tx_sequencer rp_tx_sequencer_h;
riffa_rp_rx_sequencer rp_rx_sequencer_h;
// fifo_monitor monitor_h;
 
// --------------------------------------------------------------------
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
rp_tx_driver_h = riffa_rp_tx_driver #(N)::type_id::create("rp_tx_driver_h", this);
rp_rx_driver_h = riffa_rp_rx_driver #(N)::type_id::create("rp_rx_driver_h", this);
rp_tx_sequencer_h = riffa_rp_tx_sequencer::type_id::create("rp_tx_sequencer_h", this);
rp_rx_sequencer_h = riffa_rp_rx_sequencer::type_id::create("rp_rx_sequencer_h", this);
// monitor_h = fifo_monitor ::type_id::create("monitor_h", this);
endfunction
 
// --------------------------------------------------------------------
virtual function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
rp_tx_driver_h.vif = vif;
rp_rx_driver_h.vif = vif;
// monitor_h.vif = vif;
rp_tx_driver_h.seq_item_port.connect(rp_tx_sequencer_h.seq_item_export);
rp_rx_driver_h.seq_item_port.connect(rp_rx_sequencer_h.seq_item_export);
endfunction
 
// --------------------------------------------------------------------
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/src/RIFFA/riffa_config.svh
0,0 → 1,49
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
class riffa_config #(N);
 
virtual riffa_chnl_if #(N) vif;
 
// --------------------------------------------------------------------
uvm_active_passive_enum is_active;
 
function uvm_active_passive_enum get_is_active();
return is_active;
endfunction : get_is_active
 
// --------------------------------------------------------------------
function new
( virtual riffa_chnl_if #(N) vif
, uvm_active_passive_enum is_active = UVM_ACTIVE
);
this.vif = vif;
this.is_active = is_active;
endfunction : new
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/src/RIFFA/riffa_env.svh
0,0 → 1,54
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
class riffa_env #(N) extends uvm_env;
`uvm_component_param_utils(riffa_env #(N));
 
// --------------------------------------------------------------------
riffa_config #(N) cfg_h;
// riffa_scoreboard scoreboard_h;
riffa_agent #(N) agent_h;
 
// --------------------------------------------------------------------
function new (string name, uvm_component parent);
super.new(name,parent);
endfunction : new
 
// --------------------------------------------------------------------
function void build_phase(uvm_phase phase);
agent_h = riffa_agent #(N)::type_id::create("agent_h", this);
agent_h.vif = cfg_h.vif;
// scoreboard_h = riffa_scoreboard::type_id::create("scoreboard_h", this);
endfunction : build_phase
 
// // --------------------------------------------------------------------
// function void connect_phase(uvm_phase phase);
// agent_h.monitor_h.ap.connect(scoreboard_h.analysis_export);
// endfunction : connect_phase
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/src/RIFFA/riffa_pkg.sv
0,0 → 1,50
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
package riffa_pkg;
import uvm_pkg::*;
`include "uvm_macros.svh"
 
// --------------------------------------------------------------------
typedef enum { RIFFA_TX_PAYLOAD // PCIe root RX from RIFFA
, RIFFA_RX_PAYLOAD // PCIe root TX to RIFFA
} riffa_transaction_t;
 
// --------------------------------------------------------------------
`include "riffa_config.svh"
`include "riffa_sequence_item.svh"
typedef uvm_sequencer #(riffa_sequence_item) riffa_rp_tx_sequencer;
typedef uvm_sequencer #(riffa_sequence_item) riffa_rp_rx_sequencer;
`include "riffa_rp_tx_driver.svh"
`include "riffa_rp_rx_driver.svh"
`include "riffa_agent.svh"
`include "riffa_env.svh"
`include "s_riffa_rp_tx_api.svh"
`include "s_riffa_rp_rx_api.svh"
 
// --------------------------------------------------------------------
endpackage
/trunk/PCIe/sim/src/RIFFA/riffa_rp_rx_driver.svh
0,0 → 1,86
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
class riffa_rp_rx_driver #(N) extends uvm_driver #(riffa_sequence_item);
`uvm_component_param_utils(riffa_rp_rx_driver #(N))
 
// --------------------------------------------------------------------
virtual riffa_chnl_if #(N) vif;
 
//--------------------------------------------------------------------
function void set_default;
vif.cb_rp_rx.tx_ack <= 0;
vif.cb_rp_rx.tx_data_ren <= 0;
endfunction: set_default
 
//--------------------------------------------------------------------
virtual task run_phase(uvm_phase phase);
riffa_sequence_item item;
super.run_phase(phase);
 
set_default();
 
forever
begin
wait(~vif.tx_reset);
seq_item_port.get_next_item(item);
 
@(vif.cb_rp_rx iff vif.cb_rp_rx.tx);
 
item.init( N
, vif.cb_rp_rx.tx_len
, vif.cb_rp_rx.tx_off
, vif.cb_rp_rx.tx_last);
 
vif.cb_rp_rx.tx_ack <= 1;
vif.cb_rp_rx.tx_data_ren <= 1;
 
fork
@(vif.cb_rp_rx)
vif.cb_rp_rx.tx_ack <= 0;
join_none
 
for(int i = 0; i < item.beats; i++)
begin
@(vif.cb_rp_rx iff vif.cb_rp_rx.tx_data_valid)
{<<byte{item.data[i*N +: N]}} = vif.cb_rp_rx.tx_data;
 
// $display("^^^^^ %16.t | TX | %d | %h", $time, i, vif.cb_rp_rx.tx_data);
end
 
set_default();
seq_item_port.item_done();
end
endtask : run_phase
 
//--------------------------------------------------------------------
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/src/RIFFA/riffa_rp_tx_driver.svh
0,0 → 1,85
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
class riffa_rp_tx_driver #(N) extends uvm_driver #(riffa_sequence_item);
`uvm_component_param_utils(riffa_rp_tx_driver #(N))
 
// --------------------------------------------------------------------
virtual riffa_chnl_if #(N) vif;
 
//--------------------------------------------------------------------
function void set_default;
vif.cb_rp_tx.rx <= 0;
vif.cb_rp_tx.rx_last <= 'bx;
vif.cb_rp_tx.rx_len <= 'bx;
vif.cb_rp_tx.rx_off <= 'bx;
vif.cb_rp_tx.rx_data <= 'bx;
vif.cb_rp_tx.rx_data_valid <= 0;
endfunction: set_default
 
//--------------------------------------------------------------------
virtual task run_phase(uvm_phase phase);
riffa_sequence_item item;
reg [(8*N)-1:0] rx_data;
super.run_phase(phase);
 
set_default();
 
forever
begin
wait(~vif.rx_reset);
seq_item_port.get_next_item(item);
 
@(vif.cb_rp_tx);
vif.cb_rp_tx.rx_len <= item.len; // must be => 4
vif.cb_rp_tx.rx_off <= item.off;
vif.cb_rp_tx.rx_last <= item.last;
vif.cb_rp_tx.rx <= 1;
 
@(vif.cb_rp_tx iff vif.cb_rp_tx.rx_ack);
vif.cb_rp_tx.rx_data_valid <= 1;
 
for(int i = 0; i < item.beats; i++)
begin
{<<byte{rx_data}} = item.data[i*N +: N];
vif.cb_rp_tx.rx_data <= rx_data;
@(vif.cb_rp_tx iff vif.cb_rp_tx.rx_data_ren);
// $display("^^^^^ %16.t | RX | %d | %h", $time, i, vif.cb_rp_tx.rx_data);
end
 
set_default();
seq_item_port.item_done();
end
endtask : run_phase
 
//--------------------------------------------------------------------
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/src/RIFFA/riffa_sequence_item.svh
0,0 → 1,118
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
class riffa_sequence_item extends uvm_sequence_item;
`uvm_object_utils(riffa_sequence_item)
 
// --------------------------------------------------------------------
riffa_transaction_t tr;
int dwidth;
bit [31:0] len; // length in 4 byte words
bit [30:0] off;
bit last;
byte data[];
int beats;
 
// --------------------------------------------------------------------
int size;
int index = 0;
 
// --------------------------------------------------------------------
function void init(int dwidth, bit [31:0] len, bit [30:0] off, bit last);
this.dwidth = dwidth;
this.len = len;
this.size = len * 4;
this.data = new[size];
this.beats = ((size % dwidth) == 0) ? (size / dwidth) : (size / dwidth) + 1;
endfunction : init
 
// // --------------------------------------------------------------------
// function bit do_compare(uvm_object rhs, uvm_comparer comparer);
// riffa_sequence_item tested;
// bit same;
 
// if (rhs==null)
// `uvm_fatal(get_type_name(), "| %m | comparison to a null pointer");
 
// if (!$cast(tested,rhs))
// same = 0;
// else
// same = super.do_compare(rhs, comparer);
 
// return same;
// endfunction : do_compare
 
// --------------------------------------------------------------------
function void do_copy(uvm_object rhs);
riffa_sequence_item item;
assert(rhs != null) else
`uvm_fatal(get_type_name(), "| %m | copy null transaction");
super.do_copy(rhs);
assert($cast(item,rhs)) else
`uvm_fatal(get_type_name(), "| %m | failed cast");
 
tr = item.tr ;
dwidth = item.dwidth;
len = item.len ;
off = item.off ;
last = item.last ;
data = item.data ;
beats = item.beats ;
size = item.size ;
index = item.index ;
endfunction : do_copy
 
// // --------------------------------------------------------------------
// function string convert2string();
// string s0, s1, s2, s3;
// s0 = $sformatf( "| %m | wr | rd | full | empty |\n");
// s1 = $sformatf( "| %m | %1h | %1h | %1h | %1h |\n"
// , (command == FIFO_WR) || (command == FIFO_BOTH)
// , (command == FIFO_RD) || (command == FIFO_BOTH)
// , wr_full
// , rd_empty
// );
// s2 = $sformatf("| %m | wr_data: %h\n" , wr_data);
// s3 = $sformatf("| %m | rd_data: %h\n" , rd_data);
 
// if(command == FIFO_NULL)
// return {s1, s0};
// else if(command == FIFO_BOTH)
// return {s3, s2, s1, s0};
// else if(command == FIFO_WR)
// return {s2, s1, s0};
// else if(command == FIFO_RD)
// return {s3, s1, s0};
// endfunction : convert2string
 
// --------------------------------------------------------------------
function new(string name = "");
super.new(name);
endfunction : new
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/src/RIFFA/s_riffa_rp_rx_api.svh
0,0 → 1,50
// --------------------------------------------------------------------
class s_riffa_rp_rx_api extends uvm_sequence #(riffa_sequence_item);
`uvm_object_utils(s_riffa_rp_rx_api)
 
// --------------------------------------------------------------------
riffa_sequence_item item;
int dwidth;
// mailbox #(riffa_sequence_item) q;
 
// --------------------------------------------------------------------
uvm_sequencer_base o_seqr;
uvm_sequence_base o_parent;
 
function void init(uvm_sequencer_base o_seqr, uvm_sequence_base o_parent, int dwidth);
this.o_seqr = o_seqr;
this.o_parent = o_parent;
this.dwidth = dwidth;
endfunction : init
 
// --------------------------------------------------------------------
task display(bit [31:0] len, bit [30:0] off, bit last=1);
item = riffa_sequence_item::type_id::create("riffa_sequence_item");
item.tr = RIFFA_TX_PAYLOAD;
this.start(o_seqr, o_parent);
 
foreach(item.data[i])
$display("##### %d | 0x%h", i, item.data[i]);
endtask
 
// --------------------------------------------------------------------
task get(bit [31:0] len, bit [30:0] off, bit last=1);
item = riffa_sequence_item::type_id::create("riffa_sequence_item");
item.tr = RIFFA_TX_PAYLOAD;
this.start(o_seqr, o_parent);
endtask
 
// --------------------------------------------------------------------
task body();
start_item(item);
finish_item(item);
endtask
 
// --------------------------------------------------------------------
function new(string name = "s_riffa_rp_rx_api");
super.new(name);
// q = new;
endfunction
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/src/RIFFA/s_riffa_rp_tx_api.svh
0,0 → 1,66
// --------------------------------------------------------------------
class s_riffa_rp_tx_api extends uvm_sequence #(riffa_sequence_item);
`uvm_object_utils(s_riffa_rp_tx_api)
 
// --------------------------------------------------------------------
riffa_sequence_item item;
int dwidth;
// mailbox #(riffa_sequence_item) q;
 
// --------------------------------------------------------------------
uvm_sequencer_base o_seqr;
uvm_sequence_base o_parent;
 
function void init(uvm_sequencer_base o_seqr, uvm_sequence_base o_parent, int dwidth);
this.o_seqr = o_seqr;
this.o_parent = o_parent;
this.dwidth = dwidth;
endfunction : init
 
// --------------------------------------------------------------------
task counting(bit [31:0] len, bit [30:0] off, bit last=1);
item = riffa_sequence_item::type_id::create("riffa_sequence_item");
item.tr = RIFFA_RX_PAYLOAD;
item.init(dwidth, len, off, last);
 
foreach(item.data[i])
item.data[i] = i + 1;
 
this.start(o_seqr, o_parent);
endtask
 
// --------------------------------------------------------------------
task binary_file
( string file_name
, bit [31:0] len
, bit [30:0] off
, bit last=1);
 
integer fd;
integer code;
item = riffa_sequence_item::type_id::create("riffa_sequence_item");
item.tr = RIFFA_RX_PAYLOAD;
item.init(dwidth, len, off, last);
 
fd = $fopen(file_name, "rb");
code = $fread(item.data, fd);
$display("##### code = %x #####", code);
$fclose(fd);
 
this.start(o_seqr, o_parent);
endtask
 
// --------------------------------------------------------------------
task body();
start_item(item);
finish_item(item);
endtask
 
// --------------------------------------------------------------------
function new(string name = "s_riffa_rp_tx_api");
super.new(name);
// q = new;
endfunction
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/src/tb_riffa_debug/t_debug.svh
0,0 → 1,59
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
class t_debug extends t_top_base;
`uvm_component_utils(t_debug)
 
// --------------------------------------------------------------------
function new(string name = "t_debug", uvm_component parent);
super.new(name, parent);
endfunction
 
// --------------------------------------------------------------------
function void end_of_elaboration_phase(uvm_phase phase);
uvm_phase run_phase = uvm_run_phase::get();
run_phase.phase_done.set_drain_time(this, 100ns);
endfunction
 
// --------------------------------------------------------------------
function void final_phase(uvm_phase phase);
super.final_phase(phase);
$display("^^^ %16.t | %m | Test Done!!!", $time);
$stop;
endfunction : final_phase
 
// --------------------------------------------------------------------
virtual task run_phase(uvm_phase phase);
vs_debug vseq = vs_debug::type_id::create("vseq");
phase.raise_objection(this);
vseq.init(env_h.riffa_env_h);
vseq.start(null);
phase.drop_objection(this);
endtask : run_phase
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/src/tb_riffa_debug/t_top_base.svh
0,0 → 1,43
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
virtual class t_top_base extends uvm_test;
`uvm_component_utils(t_top_base);
tb_env env_h;
 
// --------------------------------------------------------------------
function new (string name, uvm_component parent);
super.new(name,parent);
endfunction : new
 
// --------------------------------------------------------------------
function void build_phase(uvm_phase phase);
env_h = tb_env::type_id::create("env_h",this);
endfunction : build_phase
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/src/tb_riffa_debug/tb_env.svh
0,0 → 1,50
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
class tb_env extends uvm_env;
`uvm_component_utils(tb_env);
 
// --------------------------------------------------------------------
riffa_env #(N) riffa_env_h;
riffa_config #(N) cfg_h;
 
// --------------------------------------------------------------------
function new (string name, uvm_component parent);
super.new(name,parent);
endfunction : new
 
// --------------------------------------------------------------------
function void build_phase(uvm_phase phase);
if (!uvm_config_db#(riffa_config #(N))::get(this, "", "riffa_config", cfg_h))
`uvm_fatal(get_name(), "Couldn't get config object!")
 
riffa_env_h = riffa_env #(N)::type_id::create("riffa_env_h", this);
riffa_env_h.cfg_h = cfg_h;
endfunction : build_phase
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/src/tb_riffa_debug/vs_top_base.svh
0,0 → 1,26
// --------------------------------------------------------------------
class vs_top_base
extends uvm_sequence #(uvm_sequence_item);
`uvm_object_utils(vs_top_base)
 
// --------------------------------------------------------------------
riffa_rp_tx_sequencer tx_h;
riffa_rp_rx_sequencer rx_h;
s_riffa_rp_rx_api rx_api_h;
s_riffa_rp_tx_api tx_api_h;
 
// --------------------------------------------------------------------
task init(riffa_env #(N) env_h);
this.tx_h = env_h.agent_h.rp_tx_sequencer_h;
this.rx_h = env_h.agent_h.rp_rx_sequencer_h;
this.rx_api_h = s_riffa_rp_rx_api::type_id::create("rx_api_h");
this.tx_api_h = s_riffa_rp_tx_api::type_id::create("tx_api_h");
endtask: init
 
// --------------------------------------------------------------------
function new(string name = "vs_top_base");
super.new(name);
endfunction
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/tests/tb_riffa_register_file/files.f
0,0 → 1,14
#
 
# ${PROJECT_DIR}/sim/src/riffa_bfm_class_pkg.sv
# ${PROJECT_DIR}/sim/src/riffa_agent_class_pkg.sv
 
${PROJECT_DIR}/src/RIFFA/riffa_chnl_if.sv
${PROJECT_DIR}/src/RIFFA/riffa_register_if.sv
 
${PROJECT_DIR}/src/RIFFA/riffa_chnl_tx_fsm.sv
${PROJECT_DIR}/src/RIFFA/riffa_chnl_tx.sv
${PROJECT_DIR}/src/RIFFA/riffa_chnl_rx_fsm.sv
${PROJECT_DIR}/src/RIFFA/riffa_chnl_rx.sv
${PROJECT_DIR}/src/RIFFA/riffa_register_file.sv
 
/trunk/PCIe/sim/tests/tb_riffa_register_file/init_test.do
7,7 → 7,6
# setup environment
do ../../../../scripts/sim_env.do
set env(SIM_TARGET) fpga
set env(SIM_TB) tb_riffa_register_file
 
radix -hexadecimal
 
19,18 → 18,8
sim_compile_lib $env(LIB_BASE_DIR) qaz_lib
sim_compile_lib $env(LIB_BASE_DIR) sim
 
vlog -f ./tb_files.f
vlog -f ./files.f
 
# compile simulation files
vlog -f ./$env(SIM_TB).f
 
# simulation $root
vlog ./$env(SIM_TB)_pkg.sv
vlog ./$env(SIM_TB).sv
 
# compile test last
vlog ./the_test.sv
 
# run the sim
sim_run_test
 
 
/trunk/PCIe/sim/tests/tb_riffa_register_file/sim.do
3,9 → 3,8
 
quit -sim
 
vsim -novopt work.tb_top
# vsim -suppress 12110 -novopt work.tb_top
vsim -f ./sim.f work.tb_top
 
# log all signals
log -r *
 
 
log /* -r
/trunk/PCIe/sim/tests/tb_riffa_register_file/sim.f
0,0 → 1,10
#
#
 
# +UVM_VERBOSITY=UVM_DEBUG
+UVM_VERBOSITY=UVM_HIGH
 
-voptargs=+acc=npr+/tb_top
-voptargs=+acc=npr+/tb_top/dut
 
 
/trunk/PCIe/sim/tests/tb_riffa_register_file/tb_files.f
0,0 → 1,9
#
 
# +incdir+../../src/RIFFA
 
../../src/RIFFA/riffa_pkg.sv
 
./tb_top_pkg.sv
 
./tb_top.sv
/trunk/PCIe/sim/tests/tb_riffa_register_file/tb_top.sv
0,0 → 1,69
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
module tb_top;
import uvm_pkg::*;
import tb_top_pkg::*;
import riffa_pkg::*;
`include "uvm_macros.svh"
 
// --------------------------------------------------------------------
wire clk_100mhz;
wire tb_clk = clk_100mhz;
wire tb_rst;
wire clk_1000mhz;
 
tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst);
 
// --------------------------------------------------------------------
wire clk = clk_100mhz;
wire reset;
 
sync_reset sync_reset_i(tb_clk, tb_rst, reset);
 
// --------------------------------------------------------------------
riffa_chnl_if #(N) chnl_bus(.*);
riffa_register_if #(.N(N), .B(B)) r_if(.*); // dword sized (32 bit) registers
 
riffa_register_file #(.N(N), .B(B))
dut(.*);
 
// --------------------------------------------------------------------
for(genvar j = 0; j < r_if.RC; j++)
assign r_if.register_in[j] = r_if.register_out[j];
 
// --------------------------------------------------------------------
riffa_config #(N) cfg_h = new(chnl_bus);
 
initial
begin
uvm_config_db #(riffa_config #(N))::set(null, "*", "riffa_config", cfg_h);
run_test("t_debug");
end
 
// --------------------------------------------------------------------
endmodule
/trunk/PCIe/sim/tests/tb_riffa_register_file/tb_top_pkg.sv
0,0 → 1,47
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2018 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
package tb_top_pkg;
import uvm_pkg::*;
`include "uvm_macros.svh"
import riffa_pkg::*;
 
// --------------------------------------------------------------------
localparam N = 16; // width of the bus in bytes
localparam RW = (N/4); // width of the bus in 32 bit words
localparam B = 5; // number of register banks
 
// --------------------------------------------------------------------
`include "../../src/tb_riffa_debug/vs_top_base.svh"
`include "vs_debug.svh"
`include "../../src/tb_riffa_debug/tb_env.svh"
`include "../../src/tb_riffa_debug/t_top_base.svh"
`include "../../src/tb_riffa_debug/t_debug.svh"
 
 
// --------------------------------------------------------------------
endpackage
/trunk/PCIe/sim/tests/tb_riffa_register_file/vs_debug.svh
0,0 → 1,22
// --------------------------------------------------------------------
class vs_debug extends vs_top_base;
`uvm_object_utils(vs_debug)
 
// --------------------------------------------------------------------
function new(string name = "vs_debug");
super.new(name);
endfunction
 
// --------------------------------------------------------------------
task body();
int size = B * (N / 4);
tx_api_h.init(tx_h, this, N);
rx_api_h.init(rx_h, this, N);
 
tx_api_h.counting(N , size, 0);
// rx_api_h.display(N , size, 0);
rx_api_h.get(N , size, 0);
endtask: body
 
// --------------------------------------------------------------------
endclass
/trunk/PCIe/sim/tests/tb_riffa_register_file/wip.do
1,13 → 1,5
#
 
# compile simulation files
vlog -f ./$env(SIM_TB).f
vlog -f ./tb_files.f
vlog -f ./files.f
 
# simulation $root
vlog ./$env(SIM_TB)_pkg.sv
vlog ./$env(SIM_TB).sv
 
# compile test last
vlog ./the_test.sv
 
/trunk/avalon_lib/docs/Avalon Verification IP Suite User Guide .pdf Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
trunk/avalon_lib/docs/Avalon Verification IP Suite User Guide .pdf Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: trunk/avalon_lib/docs/mnl_avalon_spec.pdf =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: trunk/avalon_lib/docs/mnl_avalon_spec.pdf =================================================================== --- trunk/avalon_lib/docs/mnl_avalon_spec.pdf (revision 49) +++ trunk/avalon_lib/docs/mnl_avalon_spec.pdf (nonexistent)
trunk/avalon_lib/docs/mnl_avalon_spec.pdf Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: trunk/avalon_lib/src/ast_ready_cycle_fsm.sv =================================================================== --- trunk/avalon_lib/src/ast_ready_cycle_fsm.sv (revision 49) +++ trunk/avalon_lib/src/ast_ready_cycle_fsm.sv (nonexistent) @@ -1,106 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -module - ast_ready_cycle_fsm - ( - input axis_en, - output axis_tvalid, - input axis_tready, - - input fifo_watermark, // OK to use fifo_almost_full if FIFO is synchronous, assert to flush also - input fifo_empty, - output fifo_rd_en, - - output data_to_axis_fsm_error, - - input aclk, - input aresetn - ); - - //--------------------------------------------------- - // state machine binary definitions - enum reg [3:0] { - IDLE_STATE = 4'b0001, - TVALID = 4'b0010, - TREADY = 4'b0100, - ERROR_STATE = 4'b1000 - } state, next_state; - - - //--------------------------------------------------- - // state machine flop - always_ff @(posedge aclk) - if(~aresetn) - state <= IDLE_STATE; - else - state <= next_state; - - - //--------------------------------------------------- - // state machine - always_comb - case(state) - IDLE_STATE: if(axis_en & fifo_watermark & ~fifo_empty) - if(axis_tready) - next_state <= TREADY; - else - next_state <= TVALID; - else - next_state <= IDLE_STATE; - - TVALID: if(axis_tready) // wait for slave to be ready - next_state <= TREADY; - else - next_state <= TVALID; - - TREADY: if(fifo_empty) // slave can accept data - next_state <= IDLE_STATE; - else if(axis_tready) - next_state <= TREADY; - else - next_state <= TVALID; - - ERROR_STATE: next_state <= IDLE_STATE; - - default: next_state <= ERROR_STATE; - - endcase - - - //--------------------------------------------------- - // outputs - assign axis_tvalid = (next_state == TVALID) | (next_state == TREADY); - assign fifo_rd_en = axis_tvalid & axis_tready; - assign data_to_axis_fsm_error = (state == ERROR_STATE); - - -//--------------------------------------------------- -// -endmodule - Index: trunk/avalon_lib/syn/ast_source/altera_avalon_st_source_bfm_171/sim/verbosity_pkg.sv =================================================================== --- trunk/avalon_lib/syn/ast_source/altera_avalon_st_source_bfm_171/sim/verbosity_pkg.sv (revision 49) +++ trunk/avalon_lib/syn/ast_source/altera_avalon_st_source_bfm_171/sim/verbosity_pkg.sv (nonexistent) @@ -1,193 +0,0 @@ -// (C) 2001-2017 Intel Corporation. All rights reserved. -// Your use of Intel Corporation's design tools, logic functions and other -// software and tools, and its AMPP partner logic functions, and any output -// files from any of the foregoing (including device programming or simulation -// files), and any associated documentation or information are expressly subject -// to the terms and conditions of the Intel Program License Subscription -// Agreement, Intel FPGA IP License Agreement, or other applicable -// license agreement, including, without limitation, that your use is for the -// sole purpose of programming logic devices manufactured by Intel and sold by -// Intel or its authorized distributors. Please refer to the applicable -// agreement for further details. - - -// $Id: //acds/rel/17.1std/ip/sopc/components/verification/lib/verbosity_pkg.sv#1 $ -// $Revision: #1 $ -// $Date: 2017/07/30 $ -//----------------------------------------------------------------------------- -// =head1 NAME -// verbosity_pkg -// =head1 SYNOPSIS -// Package for controlling verbosity of messages sent to the console -//----------------------------------------------------------------------------- -// =head1 COPYRIGHT -// Copyright (c) 2008 Altera Corporation. All Rights Reserved. -// The information contained in this file is the property of Altera -// Corporation. Except as specifically authorized in writing by Altera -// Corporation, the holder of this file shall keep all information -// contained herein confidential and shall protect same in whole or in part -// from disclosure and dissemination to all third parties. Use of this -// program confirms your agreement with the terms of this license. -//----------------------------------------------------------------------------- -// =head1 DESCRIPTION -// This module will dump diagnostic messages to the console during -// simulation. The level of verbosity can be controlled in the test -// bench by using the *set_verbosity* method in the imported package -// verbosity_pkg. For a given setting, message at that level and all -// lower levels are dumped. For example, setting VERBOSITY_DEBUG level -// causes all messages to be dumped, while VERBOSITY_FAILURE restricts -// only failure messages and those tagged as VERBOSITY_NONE to be -// dumped. -// The different levels are: -// =over 4 -// =item 1 VERBOSITY_NONE -// Messages tagged with this level are always dumped to the console. -// =item 2 VERBOSITY_FAILURE -// A fatal simulation error has occurred and the simulator will exit. -// =item 3 VERBOSITY_ERROR -// A non-fatal error has occured. An example is a data comparison mismatch. -// =item 4 VERBOSITY_WARNING -// Warn the user that a potential error has occurred. -// =item 5 VERBOSITY_INFO -// Informational message. -// =item 6 VERBOSITY_DEBUG -// Dump enough state to diagnose problem scenarios. -// =back - - -`ifndef _AVALON_VERBOSITY_PKG_ -`define _AVALON_VERBOSITY_PKG_ - -package verbosity_pkg; - - timeunit 1ps; - timeprecision 1ps; - - typedef enum int {VERBOSITY_NONE, - VERBOSITY_FAILURE, - VERBOSITY_ERROR, - VERBOSITY_WARNING, - VERBOSITY_INFO, - VERBOSITY_DEBUG} Verbosity_t; - - Verbosity_t verbosity = VERBOSITY_INFO; - string message = ""; - int dump_file; - int dump = 0; - - //-------------------------------------------------------------------------- - // =head1 Public Methods API - // =pod - // This section describes the public methods in the application programming - // interface (API). In this case the application program is the test bench - // or component which imports this package. - // =cut - //-------------------------------------------------------------------------- - - function automatic Verbosity_t get_verbosity(); // public - // Returns the global verbosity setting. - return verbosity; - endfunction - - function automatic void set_verbosity ( // public - Verbosity_t v - ); - // Sets the global verbosity setting. - - string verbosity_str; - verbosity = v; - - case(verbosity) - VERBOSITY_NONE: verbosity_str = "VERBOSITY_"; - VERBOSITY_FAILURE: verbosity_str = "VERBOSITY_FAILURE"; - VERBOSITY_ERROR: verbosity_str = "VERBOSITY_ERROR"; - VERBOSITY_WARNING: verbosity_str = "VERBOSITY_WARNING"; - VERBOSITY_INFO: verbosity_str = "VERBOSITY_INFO"; - VERBOSITY_DEBUG: verbosity_str = "VERBOSITY_DEBUG"; - default: verbosity_str = "UNKNOWN"; - endcase - $sformat(message, "%m: Setting Verbosity level=%0d (%s)", - verbosity, verbosity_str); - print(VERBOSITY_NONE, message); - endfunction - - function automatic void print( // public - Verbosity_t level, - string message - ); - // Print a message to the console if the verbosity argument - // is less than or equal to the global verbosity setting. - string level_str; - - if (level <= verbosity) begin - case(level) - VERBOSITY_NONE: level_str = ""; - VERBOSITY_FAILURE: level_str = "FAILURE:"; - VERBOSITY_ERROR: level_str = "ERROR:"; - VERBOSITY_WARNING: level_str = "WARNING:"; - VERBOSITY_INFO: level_str = "INFO:"; - VERBOSITY_DEBUG: level_str = "DEBUG:"; - default: level_str = "UNKNOWN:"; - endcase - - $display("%t: %s %s",$time, level_str, message); - if (dump) begin - $fdisplay(dump_file, "%t: %s %s",$time, level_str, message); - end - end - endfunction - - function automatic void print_divider( // public - Verbosity_t level - ); - // Prints a divider line to the console to make a block of related text - // easier to identify and read. - string message; - $sformat(message, - "------------------------------------------------------------"); - print(level, message); - endfunction - - function automatic void open_dump_file ( // public - string dump_file_name = "avalon_bfm_sim.log" - ); - // Opens a dump file which collects console messages. - - if (dump) begin - $sformat(message, "%m: Dump file already open - ignoring open."); - print(VERBOSITY_ERROR, message); - end else begin - dump_file = $fopen(dump_file_name, "w"); - $fdisplay(dump_file, "testing dump file"); - $sformat(message, "%m: Opening dump file: %s", dump_file_name); - print(VERBOSITY_INFO, message); - dump = 1; - end - endfunction - - function automatic void close_dump_file(); // public - // Close the console message dump file. - if (!dump) begin - $sformat(message, "%m: No open dump file - ignoring close."); - print(VERBOSITY_ERROR, message); - end else begin - dump = 0; - $fclose(dump_file); - $sformat(message, "%m: Closing dump file"); - print(VERBOSITY_INFO, message); - end - endfunction - - function automatic void abort_simulation(); - string message; - $sformat(message, "%m: Abort the simulation due to fatal error incident."); - print(VERBOSITY_FAILURE, message); - $stop; - endfunction - -endpackage - -// =cut - -`endif - Index: trunk/avalon_lib/syn/ast_source/altera_avalon_st_source_bfm_171/sim/avalon_utilities_pkg.sv =================================================================== --- trunk/avalon_lib/syn/ast_source/altera_avalon_st_source_bfm_171/sim/avalon_utilities_pkg.sv (revision 49) +++ trunk/avalon_lib/syn/ast_source/altera_avalon_st_source_bfm_171/sim/avalon_utilities_pkg.sv (nonexistent) @@ -1,80 +0,0 @@ -// (C) 2001-2017 Intel Corporation. All rights reserved. -// Your use of Intel Corporation's design tools, logic functions and other -// software and tools, and its AMPP partner logic functions, and any output -// files from any of the foregoing (including device programming or simulation -// files), and any associated documentation or information are expressly subject -// to the terms and conditions of the Intel Program License Subscription -// Agreement, Intel FPGA IP License Agreement, or other applicable -// license agreement, including, without limitation, that your use is for the -// sole purpose of programming logic devices manufactured by Intel and sold by -// Intel or its authorized distributors. Please refer to the applicable -// agreement for further details. - - -// $Id: //acds/rel/17.1std/ip/sopc/components/verification/lib/avalon_utilities_pkg.sv#1 $ -// $Revision: #1 $ -// $Date: 2017/07/30 $ -//----------------------------------------------------------------------------- -// =head1 NAME -// avalon_utilities_pkg -// =head1 SYNOPSIS -// Package for shared types and functions -//----------------------------------------------------------------------------- -// =head1 COPYRIGHT -// Copyright (c) 2008 Altera Corporation. All Rights Reserved. -// The information contained in this file is the property of Altera -// Corporation. Except as specifically authorized in writing by Altera -// Corporation, the holder of this file shall keep all information -// contained herein confidential and shall protect same in whole or in part -// from disclosure and dissemination to all third parties. Use of this -// program confirms your agreement with the terms of this license. -//----------------------------------------------------------------------------- -// =head1 DESCRIPTION -// This package contains shared types and functions. -// =cut -`timescale 1ns / 1ns - -`ifndef _AVALON_UTILITIES_PKG_ -`define _AVALON_UTILITIES_PKG_ - -package avalon_utilities_pkg; - - function automatic int clog2( - bit [31:0] Depth - ); - int i= Depth; - for(clog2 = 0; i > 0; clog2 = clog2 + 1) - i = i >> 1; - - return clog2; - endfunction - - function automatic int max( - bit [31:0] one, - bit [31:0] two - ); - if(one > two) - return one; - else - return two; - endfunction - - function automatic int lindex( - bit [31:0] width - ); - // returns the left index for a vector having a declared width - // when width is 0, then the left index is set to 0 rather than -1 - lindex = (width > 0) ? (width-1) : 0; - endfunction - - typedef enum int { - LOW = 0, - HIGH = 1, - RANDOM = 2, - UNKNOWN = 3 - } IdleOutputValue_t; - -endpackage - -`endif - Index: trunk/avalon_lib/syn/ast_source/altera_avalon_st_source_bfm_171/sim/altera_avalon_st_source_bfm.sv =================================================================== --- trunk/avalon_lib/syn/ast_source/altera_avalon_st_source_bfm_171/sim/altera_avalon_st_source_bfm.sv (revision 49) +++ trunk/avalon_lib/syn/ast_source/altera_avalon_st_source_bfm_171/sim/altera_avalon_st_source_bfm.sv (nonexistent) @@ -1,908 +0,0 @@ -// (C) 2001-2017 Intel Corporation. All rights reserved. -// Your use of Intel Corporation's design tools, logic functions and other -// software and tools, and its AMPP partner logic functions, and any output -// files from any of the foregoing (including device programming or simulation -// files), and any associated documentation or information are expressly subject -// to the terms and conditions of the Intel Program License Subscription -// Agreement, Intel FPGA IP License Agreement, or other applicable -// license agreement, including, without limitation, that your use is for the -// sole purpose of programming logic devices manufactured by Intel and sold by -// Intel or its authorized distributors. Please refer to the applicable -// agreement for further details. - - -// $File: //acds/rel/17.1std/ip/sopc/components/verification/altera_avalon_st_source_bfm/altera_avalon_st_source_bfm.sv $ -// $Revision: #1 $ -// $Date: 2017/07/30 $ -// $Author: swbranch $ -//----------------------------------------------------------------------------- -// =head1 NAME -// altera_avalon_st_source_bfm -// =head1 SYNOPSIS -// Bus Functional Model (BFM) for a Avalon Streaming Source -//----------------------------------------------------------------------------- -// =head1 DESCRIPTION -// This is a Bus Functional Model (BFM) for a Avalon Streaming Source. -// The behavior of each clock cycle of the ST protocol on the interface -// is governed by a transaction. Transactions are constructed using the -// the public API methods provided and are then pushed into a dispatch -// queue, either one at a time or as entire sequences. Response transactions -// are popped out of a separate response queue and inform the client of -// statistics such as back pressure latency. -//----------------------------------------------------------------------------- -`timescale 1ps / 1ps - -module altera_avalon_st_source_bfm ( - clk, - reset, - - src_data, - src_channel, - src_valid, - src_startofpacket, - src_endofpacket, - src_error, - src_empty, - src_ready - ); - - // =head1 PARAMETERS - parameter ST_SYMBOL_W = 8; // Data symbol width in bits - parameter ST_NUMSYMBOLS = 4; // Number of symbols per word - parameter ST_CHANNEL_W = 0; // Channel width in bits - parameter ST_ERROR_W = 0; // Error width in bits - parameter ST_EMPTY_W = 0; // Empty width in bits - - parameter ST_READY_LATENCY = 0; // Number of cycles latency after ready - parameter ST_MAX_CHANNELS = 1; // Maximum number of channels - - parameter USE_PACKET = 0; // Use packet pins on interface - parameter USE_CHANNEL = 0; // Use channel pins on interface - parameter USE_ERROR = 0; // Use error pin on interface - parameter USE_READY = 1; // Use ready pin on interface - parameter USE_VALID = 1; // Use valid pin on interface - parameter USE_EMPTY = 0; // Use empty pin on interface - - parameter ST_BEATSPERCYCLE = 1; // Max number of packets per cycle - parameter VHDL_ID = 0; // VHDL BFM ID number - - localparam ST_DATA_W = ST_SYMBOL_W * ST_NUMSYMBOLS; - localparam ST_MDATA_W = ST_BEATSPERCYCLE * ST_DATA_W; - localparam ST_MCHANNEL_W = ST_BEATSPERCYCLE * ST_CHANNEL_W; - localparam ST_MERROR_W = ST_BEATSPERCYCLE * ST_ERROR_W; - localparam ST_MEMPTY_W = ST_BEATSPERCYCLE * ST_EMPTY_W; - - // =head1 PINS - // =head2 Clock Interface - input clk; - input reset; - - // =head2 Avalon Streaming Source Interface - output [lindex(ST_MDATA_W): 0] src_data; - output [lindex(ST_MCHANNEL_W): 0] src_channel; - output [ST_BEATSPERCYCLE-1: 0] src_valid; - output [ST_BEATSPERCYCLE-1: 0] src_startofpacket; - output [ST_BEATSPERCYCLE-1: 0] src_endofpacket; - output [lindex(ST_MERROR_W): 0] src_error; - output [lindex(ST_MEMPTY_W): 0] src_empty; - input src_ready; - - // =cut - - function int lindex; - // returns the left index for a vector having a declared width - // when width is 0, then the left index is set to 0 rather than -1 - input [31:0] width; - lindex = (width > 0) ? (width-1) : 0; - endfunction - -// synthesis translate_off - import verbosity_pkg::*; - import avalon_utilities_pkg::*; - - typedef logic [lindex(ST_DATA_W) :0] STData_t; - typedef logic [lindex(ST_CHANNEL_W) :0] STChannel_t; - typedef logic [lindex(ST_EMPTY_W) :0] STEmpty_t; - typedef logic [lindex(ST_ERROR_W) :0] STError_t; - typedef logic [ST_BEATSPERCYCLE-1 :0] STBeats_t; - - logic [ST_BEATSPERCYCLE-1 :0] src_valid; - logic [lindex(ST_MDATA_W) :0] src_data; - logic [lindex(ST_MCHANNEL_W) :0] src_channel; - logic [lindex(ST_MERROR_W) :0] src_error; - logic [lindex(ST_MEMPTY_W) :0] src_empty; - logic [ST_BEATSPERCYCLE-1 :0] src_startofpacket; - logic [ST_BEATSPERCYCLE-1 :0] src_endofpacket; - - logic [ST_BEATSPERCYCLE-1 :0] src_valid_temp; - logic [lindex(ST_MDATA_W) :0] src_data_temp, src_data_slices; - logic [lindex(ST_MCHANNEL_W) :0] src_channel_temp, src_channel_slices; - logic [lindex(ST_MERROR_W) :0] src_error_temp, src_error_slices; - logic [lindex(ST_MEMPTY_W) :0] src_empty_temp, src_empty_slices; - logic [ST_BEATSPERCYCLE-1 :0] src_startofpacket_temp; - logic [ST_BEATSPERCYCLE-1 :0] src_endofpacket_temp; - - //-------------------------------------------------------------------------- - // Private Types and Variables - //-------------------------------------------------------------------------- - typedef struct packed - { - bit [31:0] idles; - logic startofpacket; - logic endofpacket; - STChannel_t channel; - STData_t data; - STError_t error; - STEmpty_t empty; - bit valid; - } Transaction_t; - - typedef struct packed - { - int latency; - int count; - } Response_t; - - Transaction_t new_transaction; - Transaction_t current_transaction[ST_BEATSPERCYCLE]; - Transaction_t transaction_queue[$]; - - Response_t current_response; - Response_t new_response; - Response_t response_queue[$]; - - int response_timeout = 100; - string message = ""; - - int idle_ctr = 0; - bit idle_state = 0; - int ready_latency_ctr = 0; - bit transaction_pending = 0; - int transaction_queue_size = 0; - int transaction_ctr = 0; - int max_transaction_queue_size = 256; - int min_transaction_queue_size = 2; - - bit start = 0; - bit complete = 0; - - logic src_ready_qualified; - logic src_is_now_ready; - logic load_transaction = 0; - STBeats_t src_valid_local; - - IdleOutputValue_t idle_output_config = UNKNOWN; - - localparam MAX_READY_DELAY = 8; - logic [MAX_READY_DELAY-1:0] src_ready_delayed; - - //-------------------------------------------------------------------------- - // Private Methods - //-------------------------------------------------------------------------- - function int __floor( - int arg - ); - // returns the arg if it is greater than 0, else returns 0 - return (arg > 0) ? arg : 0; - endfunction - - task __drive_temp_interface_idle(); - case (idle_output_config) - LOW: begin - src_valid_temp <= 0; - src_startofpacket_temp <= '0; - src_endofpacket_temp <= '0; - src_channel_temp <= '0; - src_data_temp <= '0; - src_error_temp <= '0; - src_empty_temp <= '0; - end - HIGH: begin - src_valid_temp <= 0; - src_startofpacket_temp <= '1; - src_endofpacket_temp <= '1; - src_channel_temp <= '1; - src_data_temp <= '1; - src_error_temp <= '1; - src_empty_temp <= '1; - end - RANDOM: begin - src_valid_temp <= 0; - src_startofpacket_temp <= $random; - src_endofpacket_temp <= $random; - src_channel_temp <= $random; - src_data_temp <= $random; - src_error_temp <= $random; - src_empty_temp <= $random; - end - UNKNOWN: begin - src_valid_temp <= 0; - src_startofpacket_temp <= 'x; - src_endofpacket_temp <= 'x; - src_channel_temp <= 'x; - src_data_temp <= 'x; - src_error_temp <= 'x; - src_empty_temp <= 'x; - end - default: begin - src_valid_temp <= 0; - src_startofpacket_temp <= 'x; - src_endofpacket_temp <= 'x; - src_channel_temp <= 'x; - src_data_temp <= 'x; - src_error_temp <= 'x; - src_empty_temp <= 'x; - end - endcase - endtask - - task __drive_interface_idle(); - case (idle_output_config) - LOW: begin - src_valid = '0; - src_startofpacket = '0; - src_endofpacket = '0; - src_data = '0; - src_channel = '0; - src_error = '0; - src_empty = '0; - end - HIGH: begin - src_valid = '0; - src_startofpacket = '1; - src_endofpacket = '1; - src_data = '1; - src_channel = '1; - src_error = '1; - src_empty = '1; - end - RANDOM: begin - src_valid = '0; - src_startofpacket = $random; - src_endofpacket = $random; - src_data = $random; - src_channel = $random; - src_error = $random; - src_empty = $random; - end - UNKNOWN: begin - src_valid = '0; - src_startofpacket = 'x; - src_endofpacket = 'x; - src_data = 'x; - src_channel = 'x; - src_error = 'x; - src_empty = 'x; - end - default: begin - src_valid = '0; - src_startofpacket = 'x; - src_endofpacket = 'x; - src_data = 'x; - src_channel = 'x; - src_error = 'x; - src_empty = 'x; - end - endcase - endtask - - function automatic void __hello(); - // Introduction Message to console - $sformat(message, "%m: - Hello from altera_avalon_st_source_bfm."); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - $Revision: #1 $"); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - $Date: 2017/07/30 $"); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_SYMBOL_W = %0d", - ST_SYMBOL_W); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_NUMSYMBOLS = %0d", - ST_NUMSYMBOLS); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_CHANNEL_W = %0d", - ST_CHANNEL_W); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_ERROR_W = %0d", - ST_ERROR_W); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_EMPTY_W = %0d", - ST_EMPTY_W); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_READY_LATENCY = %0d", - ST_READY_LATENCY); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_MAX_CHANNELS = %0d", - ST_MAX_CHANNELS); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_BEATSPERCYCLE = %0d", - ST_BEATSPERCYCLE); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_PACKET = %0d", - USE_PACKET); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_CHANNEL = %0d", - USE_CHANNEL); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_ERROR = %0d", - USE_ERROR); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_READY = %0d", - USE_READY); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_VALID = %0d", - USE_VALID); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_EMPTY = %0d", - USE_EMPTY); - print(VERBOSITY_INFO, message); - print_divider(VERBOSITY_INFO); - endfunction - - //-------------------------------------------------------------------------- - // =head1 Public Methods API - // =pod - // This section describes the public methods in the application programming - // interface (API). In this case the application program is the test bench - // which instantiates and controls and queries state in this BFM component. - // Test programs must only use these public access methods and events to - // communicate with this BFM component. The API and the module pins - // are the only interfaces in this component that are guaranteed to be - // stable. The API will be maintained for the life of the product. - // While we cannot prevent a test program from directly accessing local - // tasks, functions, or data private to the BFM, there is no guarantee that - // these will be present in the future. In fact, it is best for the user - // to assume that the underlying implementation of this component can - // and will change. - // =cut - //-------------------------------------------------------------------------- - event signal_fatal_error; // public - // Signal that a fatal error has occurred. Terminates simulation. - - event signal_response_done; // public - // Signal - - event signal_src_ready; // public - // Signal the assertion of the src_ready port. - - event signal_src_not_ready; // public - // Signal the deassertion of the src_ready port implying sink backpressure - - event signal_src_transaction_complete; // public - // Signal that all pending transactions have completed - - event signal_src_transaction_almost_complete; // public - // Signal that BFM is driving the last pending transaction - - event signal_src_driving_transaction; // public - // Signal that the source is driving the transaction onto the bus - - event signal_max_transaction_queue_size; // public - // This event signals that the pending transaction queue size - // threshold has been exceeded - - event signal_min_transaction_queue_size; // public - // This event signals that the pending transaction queue size - // is below the minimum threshold - - function automatic string get_version(); // public - // Return BFM version string. For example, version 9.1 sp1 is "9.1sp1" - string ret_version = "17.1"; - return ret_version; - endfunction - - function automatic void set_idle_state_output_configuration( // public - // Set the configuration of output signal value during interface idle - IdleOutputValue_t output_config - ); - $sformat(message, "%m: method called"); - print(VERBOSITY_DEBUG, message); - - idle_output_config = output_config; - endfunction - - function automatic IdleOutputValue_t get_idle_state_output_configuration(); - // Get the configuration of output signal value during interface idle - $sformat(message, "%m: method called"); - print(VERBOSITY_DEBUG, message); - - return idle_output_config; - endfunction - - function automatic bit get_src_transaction_complete(); // public - // Return the transaction complete status - $sformat(message, "%m: called get_src_transaction_complete"); - print(VERBOSITY_DEBUG, message); - return complete; - endfunction - - function automatic logic get_src_ready(); // public - // Return the value of the src_ready port. - $sformat(message, "%m: called get_src_ready"); - print(VERBOSITY_DEBUG, message); - return src_ready; - endfunction - - function automatic void set_response_timeout( // public - int cycles = 100 - ); - // Set the number of cycles that may elapse during backpressure before - // the time out error is asserted. Disable the timeout by setting - // the cycles argument to zero. - response_timeout = cycles; - $sformat(message, "%m: called set_response_timeout"); - print(VERBOSITY_DEBUG, message); - - $sformat(message, "%m: Response timeout set to %0d cycles", response_timeout); - print(VERBOSITY_INFO, message); - endfunction - - task automatic init(); // public - // Drive interface to idle state. - $sformat(message, "%m: called init"); - print(VERBOSITY_DEBUG, message); - __drive_temp_interface_idle(); - endtask - - function automatic void push_transaction(); // public - // Push a new transaction into the local transaction queue. - // The BFM will drive the appropriate signals on the ST bus - // according to the transaction field values. - Transaction_t idle_transaction; - - $sformat(message, "%m: called push_transaction"); - print(VERBOSITY_DEBUG, message); - - if (reset) begin - $sformat(message, "%m: Illegal command while reset asserted"); - print(VERBOSITY_ERROR, message); - ->signal_fatal_error; - end - - // Idle cycles, defined as preceding the actual transaction are - // converted to an equal number of dummy transactions with the - // valid field set to 0. These are pushed into the queue before - // the actual transaction. - - if (USE_VALID == 1) begin - idle_transaction.idles = 0; - idle_transaction.valid = 1'b0; - for (int i=0; i 0) begin - $sformat(message, "%m: called set_transaction_idles - %h", - idle_cycles); - print(VERBOSITY_DEBUG, message); - new_transaction.idles = idle_cycles; - end else begin - $sformat(message, "%m: Ignored. Idles set to 0 when USE_VALID == 0"); - print(VERBOSITY_WARNING, message); - new_transaction.idles = 0; - end - endfunction - - function automatic void set_transaction_sop( // public - bit sop - ); - // Set the transaction start of packet value - $sformat(message, "%m: called set_transaction_sop - %b", sop); - print(VERBOSITY_DEBUG, message); - new_transaction.startofpacket = sop; - endfunction - - function automatic void set_transaction_eop( // public - bit eop - ); - // Set the transaction end of packet value - $sformat(message, "%m: called set_transaction_eop - %b", eop); - print(VERBOSITY_DEBUG, message); - new_transaction.endofpacket = eop; - endfunction - - function automatic void set_transaction_error( // public - bit [ST_ERROR_W-1:0] error - ); - // Set the transaction error value - $sformat(message, "%m: called set_transaction_error - %h", error); - print(VERBOSITY_DEBUG, message); - new_transaction.error = error; - endfunction - - function automatic void set_transaction_empty( // public - bit [ST_EMPTY_W-1:0] empty - ); - // Set the transaction empty value - $sformat(message, "%m: called set_transaction_empty - %h", empty); - print(VERBOSITY_DEBUG, message); - new_transaction.empty = empty; - endfunction - - function automatic void pop_response(); // public - // Pop the response transaction from the queue before querying contents - string message; - - $sformat(message, "%m: called pop_response - queue depth %0d", - response_queue.size()); - print(VERBOSITY_DEBUG, message); - - if (response_queue.size() == 0) begin - $sformat(message, "%m: Illegal command: response queue is empty"); - print(VERBOSITY_ERROR, message); - ->signal_fatal_error; - end - - current_response = response_queue.pop_front(); - endfunction - - function automatic int get_response_latency(); // public - // Return the response latency due to back pressure for a - // transaction. The value is in terms of clock cycles. - $sformat(message, "%m: called get_response_latency - %0d", - current_response.latency); - print(VERBOSITY_DEBUG, message); - return current_response.latency; - endfunction - - function automatic void set_max_transaction_queue_size( // public - int size - ); - // Set the pending transaction maximum queue size threshold. - // The public event signal_max_transaction_queue_size - // will fire when the threshold is exceeded. - max_transaction_queue_size = size; - endfunction - - function automatic void set_min_transaction_queue_size( // public - int size - ); - // Set the pending transaction minimum queue size threshold. - // The public event signal_min_transaction_queue_size - // will fire when the queue level is below this threshold. - min_transaction_queue_size = size; - endfunction - - //=cut - - initial begin - __hello(); - end - - always @(posedge clk) begin - if (transaction_queue.size() > max_transaction_queue_size) begin - ->signal_max_transaction_queue_size; - end else if (transaction_queue.size() < min_transaction_queue_size) begin - ->signal_min_transaction_queue_size; - end - end - - always @(signal_fatal_error) abort_simulation(); - - - // The ST_BEATSPERCYCLE parameter complicates the driving of transactions - // somewhat as not all beats in a given cycle need to be valid. - // The following scenarios are possible: - // Transactions with no idle cycles: - // 1 There are an integral multiple of ST_BEATSPERCYCLE transactions - // in the pending transaction queue: - // All transactions fit neatly into an integral number of cycles - // with all beats valid and no resulting bubbles. - // 2 There are a non integral multiple of ST_BEATSPERCYCLE transactions - // in the pending transaction queue: - // The final pending transaction(s) in the queue need to be driven - // out with unused beats being marked as invalid i.e. there are one - // or more bubbles (invalid beats) at the end of the transaction - // sequence. - // A transaction with idle cycles defined is decomposed into a sequence of - // transactions. First there is a sequence of non valid, empty transaction - // beats which define the idle cycles or bubbles. And finally, there is - // one valid transaction beat. - - // delay chain for src_ready back pressure input to account for latency - always @(posedge clk or posedge reset) begin - if (reset) begin - src_ready_delayed <= 0; - end else begin - src_ready_delayed <= {src_ready_delayed[6:0], src_ready}; - end - end - - assign src_ready_qualified = (USE_READY == 0)? 1'b1 : - (ST_READY_LATENCY == 0)? src_ready : - src_ready_delayed[__floor(ST_READY_LATENCY-1)]; - - assign src_is_now_ready = (USE_READY == 0)? 1'b1 : - (ST_READY_LATENCY <= 1)? src_ready : - src_ready_delayed[__floor(ST_READY_LATENCY-2)]; - - always @(*) begin - src_valid_local = src_valid_temp; - - if (USE_VALID > 0) begin - if (USE_READY == 0 || ST_READY_LATENCY == 0) begin - src_valid = src_valid_temp; - src_startofpacket = src_startofpacket_temp; - src_endofpacket = src_endofpacket_temp; - src_data = src_data_temp; - src_channel = src_channel_temp; - src_error = src_error_temp; - src_empty = src_empty_temp; - end else begin - if (src_ready_qualified) begin - src_valid = src_valid_temp; - src_startofpacket = src_startofpacket_temp; - src_endofpacket = src_endofpacket_temp; - src_data = src_data_temp; - src_channel = src_channel_temp; - src_error = src_error_temp; - src_empty = src_empty_temp; - end else begin - __drive_interface_idle(); - end - end - end else begin - src_valid = 0; - src_startofpacket = src_startofpacket_temp; - src_endofpacket = src_endofpacket_temp; - src_data = src_data_temp; - src_channel = src_channel_temp; - src_error = src_error_temp; - src_empty = src_empty_temp; - end - - end - - bit pending; - int response_transaction_ctr; - - always @(posedge clk or posedge reset) begin - if (reset) begin - ready_latency_ctr <= 0; - complete <= 0; - response_transaction_ctr = 0; - new_response = 0; - current_response = 0; - response_queue = {}; - end else begin - if (src_ready_qualified && ((src_valid != 0) || (USE_VALID == 0))) begin - ready_latency_ctr <= 0; - - if (transaction_pending) begin - new_response.count = response_transaction_ctr++; - new_response.latency = ready_latency_ctr; - response_queue.push_back(new_response); - ->signal_response_done; - end - - end else begin - if (transaction_pending && ((src_valid != 0) || (USE_VALID == 0))) - ready_latency_ctr <= ready_latency_ctr + 1; - end - - if ((get_transaction_queue_size() == 0) && src_ready_qualified && - (USE_READY == 0 || src_valid != 0)) begin - complete <= 1; - ->signal_src_transaction_complete; - end else if (complete && - ((get_transaction_queue_size() > 0) || transaction_pending)) begin - complete <= 0; - end - - if ((response_timeout != 0) && (ready_latency_ctr > response_timeout)) begin - $sformat(message, "%m: Response Timeout"); - print(VERBOSITY_FAILURE, message); - ->signal_fatal_error; - end - - end - end - - always @(posedge clk or posedge reset) begin - if (reset) begin - idle_ctr <= 0; - transaction_pending = 0; // keep blocking - - __drive_temp_interface_idle(); - - new_transaction = 0; - transaction_queue = {}; - for (int i=0; i 0 && src_ready_qualified == 1) begin - transaction_pending = 0; - end - - if (~transaction_pending && get_transaction_queue_size() > 0) begin - transaction_pending = 1; - load_transaction = 1; - - // initialize all beats to be invalid - for (int i=0; isignal_src_driving_transaction; - load_transaction = 0; - end else if (ST_READY_LATENCY > 0 && src_is_now_ready == 1) begin - ->signal_src_driving_transaction; - load_transaction = 0; - end - end - end - end - join_none - end else begin - idle_ctr = idle_ctr - 1; - end - end - - end - end - - always@(signal_src_driving_transaction) begin - if (get_transaction_queue_size() == 0) - -> signal_src_transaction_almost_complete; - end - - always @(posedge src_ready_qualified or negedge src_ready_qualified) begin - if (src_ready_qualified) - ->signal_src_ready; - else - ->signal_src_not_ready; - end -// synthesis translate_on - -endmodule - -// =head1 SEE ALSO -// avalon_st_sink_bfm -// =cut - - - - - - - - Index: trunk/avalon_lib/syn/ast_source.qsys =================================================================== --- trunk/avalon_lib/syn/ast_source.qsys (revision 49) +++ trunk/avalon_lib/syn/ast_source.qsys (nonexistent) @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Index: trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/altera_avalon_st_monitor_assertion.sv =================================================================== --- trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/altera_avalon_st_monitor_assertion.sv (revision 49) +++ trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/altera_avalon_st_monitor_assertion.sv (nonexistent) @@ -1,550 +0,0 @@ -// (C) 2001-2017 Intel Corporation. All rights reserved. -// Your use of Intel Corporation's design tools, logic functions and other -// software and tools, and its AMPP partner logic functions, and any output -// files from any of the foregoing (including device programming or simulation -// files), and any associated documentation or information are expressly subject -// to the terms and conditions of the Intel Program License Subscription -// Agreement, Intel FPGA IP License Agreement, or other applicable -// license agreement, including, without limitation, that your use is for the -// sole purpose of programming logic devices manufactured by Intel and sold by -// Intel or its authorized distributors. Please refer to the applicable -// agreement for further details. - - -// $File: //acds/main/ip/sopc/components/verification/altera_avalon_st_monitor_bfm/altera_avalon_st_monitor_tap.sv $ -// $Revision: #7 $ -// $Date: 2009/04/16 $ -// $Author: pscheidt $ -//----------------------------------------------------------------------------- -// =head1 NAME -// altera_avalon_st_monitor_assertion -// =head1 SYNOPSIS -// Streaming Avalon Bus Protocol Checker -//----------------------------------------------------------------------------- -// =head1 DESCRIPTION -// This module implements Avalon ST protocol assertion checking for simulation. -//----------------------------------------------------------------------------- - -`timescale 1ns / 1ns - -module altera_avalon_st_monitor_assertion( - clk, - reset, - tap - ); - - // =head1 PARAMETERS - parameter ST_SYMBOL_W = 8; // number of bits in one symbols - parameter ST_NUMSYMBOLS = 4; // number of symbols in one data - parameter ST_CHANNEL_W = 0; // width of channel signal - parameter ST_ERROR_W = 0; // width of error signal - parameter ST_EMPTY_W = 0; // width of empty signal, ST_EMPTY_W = log2(`ST_NUMSYMBOLS) - - parameter ST_READY_LATENCY = 0; // fixed ready latency in cycles - parameter ST_MAX_CHANNELS = 1; // maximum number of channels - - parameter USE_PACKET = 0; // data transfer in packet format - parameter USE_CHANNEL = 0; // use channel port - parameter USE_ERROR = 0; // use error port - parameter USE_READY = 1; // use ready port - parameter USE_VALID = 1; // use valid port - parameter USE_EMPTY = 0; // use empty port - parameter ST_BEATSPERCYCLE = 1; // Max number of packets per cycle - - localparam ST_DATA_W = ST_SYMBOL_W * ST_NUMSYMBOLS; - localparam ST_MAX_EMPTY = 2**(ST_EMPTY_W) - 1; - localparam NUM_CHANNEL = ST_MAX_CHANNELS+1; - - localparam TAP_W = ((ST_DATA_W == 0)? 1:ST_DATA_W) + // data - ((ST_CHANNEL_W == 0)? 1:ST_CHANNEL_W) + // channel - 1 + // valid - 1 + // startofpacket - 1 + // endofpacket - ((ST_ERROR_W == 0)? 1:ST_ERROR_W) + // error - ((ST_EMPTY_W == 0)? 1:ST_EMPTY_W) + // empty - 1; // ready - - // =head1 PINS - // =head2 Clock Interface - input clk; - input reset; - - // =head2 Avalon Monitor Interface - will be defined as Streaming Sink - input [(TAP_W*ST_BEATSPERCYCLE)-ST_BEATSPERCYCLE:0] tap; - - // =cut - - function int lindex; - // returns the left index for a vector having a declared width - // when width is 0, then the left index is set to 0 rather than -1 - input [31:0] width; - lindex = (width > 0) ? (width-1) : 0; - endfunction - - //-------------------------------------------------------------------------- - // synthesis translate_off - - import verbosity_pkg::*; - - typedef bit [lindex(ST_DATA_W) :0] STData_t; - typedef bit [lindex(ST_CHANNEL_W) :0] STChannel_t; - typedef bit [lindex(ST_EMPTY_W) :0] STEmpty_t; - typedef bit [lindex(ST_ERROR_W) :0] STError_t; - - event signal_fatal_error; - - event event_a_valid_legal; - event event_a_empty_legal; - event event_a_no_data_outside_packet; - event event_a_non_missing_endofpacket; - event event_a_non_missing_startofpacket; - event event_a_less_than_max_channel; - - string fatal_message = "*unitialized*"; - string message = "*unitialized*"; - - bit enable_a_valid_legal = 1; - bit enable_a_empty_legal = 1; - bit enable_a_no_data_outside_packet = 1; - bit enable_a_non_missing_endofpacket = 1; - bit enable_a_non_missing_startofpacket = 1; - bit enable_a_less_than_max_channel = 1; - - //-------------------------------------------------------------------------- - // unpack Avalon bus interface tap into individual port signals - logic ready; - logic [lindex(ST_BEATSPERCYCLE):0][lindex(ST_DATA_W):0] data; - logic [lindex(ST_BEATSPERCYCLE):0][lindex(ST_CHANNEL_W):0] channel; - logic [lindex(ST_BEATSPERCYCLE):0] valid; - logic [lindex(ST_BEATSPERCYCLE):0] startofpacket; - logic [lindex(ST_BEATSPERCYCLE):0] endofpacket; - logic [lindex(ST_BEATSPERCYCLE):0][lindex(ST_ERROR_W):0] error; - logic [lindex(ST_BEATSPERCYCLE):0][lindex(ST_EMPTY_W):0] empty; - - always_comb begin - data <= tap[lindex(ST_DATA_W*ST_BEATSPERCYCLE)+lindex(ST_CHANNEL_W*ST_BEATSPERCYCLE)+ - lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3*ST_BEATSPERCYCLE+4: - lindex(ST_CHANNEL_W*ST_BEATSPERCYCLE)+lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3*ST_BEATSPERCYCLE+4]; - - channel <= (USE_CHANNEL == 1)? - tap[lindex(ST_CHANNEL_W*ST_BEATSPERCYCLE)+lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+ - lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3*ST_BEATSPERCYCLE+3: - lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3*ST_BEATSPERCYCLE+3] : 0; - - valid <= (USE_VALID == 1)? - tap[lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3*ST_BEATSPERCYCLE+2: - lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+2*ST_BEATSPERCYCLE+3] : 1; - - startofpacket <= (USE_PACKET == 1)? - tap[lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+2*ST_BEATSPERCYCLE+2: - lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+ST_BEATSPERCYCLE+3] : 0; - - endofpacket <= (USE_PACKET == 1)? - tap[lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+ST_BEATSPERCYCLE+2: - lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3] : 0; - - error <= (USE_ERROR == 1)? - tap[lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+2: - lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+2] : 0; - - empty <= (USE_EMPTY == 1)? tap[lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+1:1] : 0; - - ready <= (USE_READY == 1)? tap[0:0] : 1; - end - - //-------------------------------------------------------------------------- - // General Statistics Counters - //-------------------------------------------------------------------------- - - logic [31:0] clock_counter; - logic [31:0] sop_counter; - logic [31:0] eop_counter; - - logic sop_counter_reset = 0; - logic eop_counter_reset = 0; - logic [255:0] sop_channel_used = '0; - logic [255:0] eop_channel_used = '1; - logic [lindex(ST_BEATSPERCYCLE):0] sop_error_in_channel = '0; - logic [lindex(ST_BEATSPERCYCLE):0] eop_error_in_channel = '0; - logic [lindex(ST_BEATSPERCYCLE):0] data_outside_packet = '0; - - always @(posedge clk) begin - if (reset) - clock_counter <= 0; - else - clock_counter <= clock_counter + 1; - end - - always @(posedge clk) begin - if (reset) begin - sop_counter <= 0; - end else if (sop_counter_reset) begin - sop_counter_reset <= 0; - sop_counter <= 0; - end else begin - for (int i=0; i 0) || (USE_READY && (ST_READY_LATENCY == 0) && ready) || !USE_READY) begin - sop_counter <= (USE_PACKET && valid[i] && startofpacket[i]) ? sop_counter + 1 : sop_counter; - end - end - end - end - end - - always @(posedge clk) begin - if (reset) begin - eop_counter <= 0; - end else if (eop_counter_reset) begin - eop_counter_reset <= 0; - eop_counter <= 0; - end else begin - for (int i=0; i 0) || (USE_READY && (ST_READY_LATENCY == 0) && ready) || !USE_READY) begin - eop_counter <= (USE_PACKET && valid[i] && endofpacket[i]) ? eop_counter + 1 : eop_counter; - end - end - end - end - end - - //-------------------------------------------------------------------------- - // Private Methods - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // =head1 Public Methods API - // This section describes the public methods in the application programming - // interface (API). In this case the application program is the test bench - // which instantiates and controls and queries state of this component. - // Test programs must only use these public access methods and events to - // communicate with this BFM component. The API and the module pins - // are the only interfaces in this component that are guaranteed to be - // stable. The API will be maintained for the life of the product. - // While we cannot prevent a test program from directly accessing internal - // tasks, functions, or data private to the BFM, there is no guarantee that - // these will be present in the future. In fact, it is best for the user - // to assume that the underlying implementation of this component can - // and will change. - // =cut - //-------------------------------------------------------------------------- - // Master Assertions API - function automatic void set_enable_a_valid_legal( // public - bit assert_enable - ); - // enable or disable a_valid_legal assertion - - enable_a_valid_legal = assert_enable; - endfunction - - function automatic void set_enable_a_empty_legal( // public - bit assert_enable - ); - // enable or disable a_empty_legal assertion - - enable_a_empty_legal = assert_enable; - endfunction - - function automatic void set_enable_a_no_data_outside_packet( // public - bit assert_enable - ); - // enable or disable a_no_data_outside_packet assertion - - enable_a_no_data_outside_packet = assert_enable; - endfunction - - function automatic void set_enable_a_non_missing_endofpacket( // public - bit assert_enable - ); - // enable or disable a_non_missing_endofpacket assertion - - enable_a_non_missing_endofpacket = assert_enable; - endfunction - - function automatic void set_enable_a_non_missing_startofpacket( // public - bit assert_enable - ); - // enable or disable a_non_missing_startofpacket assertion - - enable_a_non_missing_startofpacket = assert_enable; - endfunction - - function automatic void set_enable_a_less_than_max_channel( // public - bit assert_enable - ); - // enable or disable a_less_than_max_channel assertion - - enable_a_less_than_max_channel = assert_enable; - endfunction - // =cut - - function automatic logic [31:0] get_sop_counter(); - return sop_counter; - if (USE_PACKET == 0) begin - $sformat(message, "%m: No packet signals in this stream (USE_PACKET=0)."); - print(VERBOSITY_WARNING, message); - end - endfunction - - function automatic void reset_sop_counter(); - sop_counter_reset = 1'b1; - endfunction - - function automatic logic [31:0] get_eop_counter(); - return eop_counter; - if (USE_PACKET == 0) begin - $sformat(message, "%m: No packet signals in this stream (USE_PACKET=0)."); - print(VERBOSITY_WARNING, message); - end - endfunction - - function automatic void reset_eop_counter(); - eop_counter_reset = 1'b1; - endfunction - - // remaining API declarations will go here - //-------------------------------------------------------------------------- - event fatal_error; - - always @(fatal_error) begin - $sformat(message, "%m: Terminate simulation."); - print(VERBOSITY_FAILURE, message); - abort_simulation(); - end - - //-------------------------------------------------------------------------- - // =head1 Assertion Checkers and Coverage Monitors - // The assertion checkers in this module are only executable on simulators - // supporting the SystemVerilog Assertion (SVA) language. - // Mentor Modelsim AE and SE do not support this. - // Simulators that are supported include: Synopsys VCS and Mentor questasim. - // The assertion checking logic in this module must be explicitly enabled - // so that designs using this module can still be compiled on Modelsim without - // changes. To disable assertions define the following macro in the testbench - // or on the command line with: +define+DISABLE_ALTERA_AVALON_SIM_SVA. - // =cut - //-------------------------------------------------------------------------- - - function automatic void print_assertion( - string message_in - ); - string message_out; - $sformat(message_out, "ASSERTION: %s", message_in); - print(VERBOSITY_FAILURE, message_out); - endfunction - - - // Counter for general assertion counters - always @(posedge clk) - begin - for (int i=0; i 0) || (USE_READY && (ST_READY_LATENCY == 0) && ready) || !USE_READY) begin - check_sop_eop_valid(i); - end - end else begin - data_outside_packet[i] = 0; - end - end - end - - always @(posedge clk) - begin - if (reset) begin - sop_channel_used = '0; - eop_channel_used = '1; - sop_error_in_channel = '0; - eop_error_in_channel = '0; - data_outside_packet = '0; - end - end - - task automatic check_sop_eop_valid(int current_beat); - if (startofpacket[current_beat]) begin - if (sop_channel_used[channel[current_beat]] == 1) - sop_error_in_channel[current_beat] = 1; - else begin - sop_channel_used[channel[current_beat]] = 1; - sop_error_in_channel[current_beat] = 0; - end - eop_channel_used[channel[current_beat]] = 0; - end - - if (endofpacket[current_beat]) begin - if (eop_channel_used[channel[current_beat]] == 1) - eop_error_in_channel[current_beat] = 1; - else begin - eop_channel_used[channel[current_beat]] = 1; - eop_error_in_channel[current_beat] = 0; - end - sop_channel_used[channel[current_beat]] = 0; - end - - if (!startofpacket[current_beat] && !endofpacket[current_beat]) begin - if (!sop_channel_used[channel[current_beat]]) begin - data_outside_packet[current_beat] = 1; - end else begin - data_outside_packet[current_beat] = 0; - end - end else begin - data_outside_packet[current_beat] = 0; - end - - endtask - - - // SVA assertion code lives within the following section block - // which is disabled when the macro DISABLE_ALTERA_AVALON_SIM_SVA is defined - - `ifdef DISABLE_ALTERA_AVALON_SIM_SVA - // SVA assertion code has been disabled - - `else - //-------------------------------------------------------------------------- - // ASSERTION CODE BEGIN - //-------------------------------------------------------------------------- - //------------------------------------------------------------------------------- - // =head2 Avalon Streaming Assertions - // The following are the assertions code focus on Streaming Source and Sink - // component checking - //------------------------------------------------------------------------------- - - //------------------------------------------------------------------------------------ - // =head3 p_valid_legal - // This property check if valid is not deasserted ST_READY_LATENCY cycle after ready - // is deasserted. - //------------------------------------------------------------------------------------ - property p_valid_legal(current_beat); - @(posedge clk && enable_a_valid_legal && USE_VALID && USE_READY && ST_READY_LATENCY > 0) - disable iff (reset) - !ready |-> ##ST_READY_LATENCY !valid[current_beat]; - endproperty - - genvar i; - for (i=0; i event_a_valid_legal; - print_assertion("valid asserted after ready deasserted"); - end - end - - //------------------------------------------------------------------------------------ - // =head3 p_empty_legal - // This property check if empty non zero while endofpacket is asserted or empty value - // larger or equal to ST_NUMSYMBOLS - //------------------------------------------------------------------------------------ - property p_empty_legal(current_beat); - @(posedge clk && enable_a_empty_legal && USE_EMPTY && USE_PACKET) - disable iff (reset) - valid[current_beat] && (empty[current_beat] > 0) && (clock_counter > 0) && - ((USE_READY && (ST_READY_LATENCY == 0) && ready) || - !USE_READY || (ST_READY_LATENCY > 0)) - |-> endofpacket[current_beat] && (empty[current_beat] < ST_NUMSYMBOLS); - endproperty - - for (i=0; i event_a_empty_legal; - print_assertion("illegal empty value"); - end - end - - //------------------------------------------------------------------------------------ - // =head3 p_no_data_outside_packet - // This property check if that valid is asserted outside the packet transfer - //------------------------------------------------------------------------------------ - property p_no_data_outside_packet(current_beat); - @(posedge clk && enable_a_no_data_outside_packet && USE_VALID && USE_PACKET) - disable iff (reset) - valid[current_beat] && !startofpacket[current_beat] && !endofpacket[current_beat] && - ((USE_READY && (ST_READY_LATENCY == 0) && ready) || - !USE_READY || (ST_READY_LATENCY > 0)) - |-> ##1 !data_outside_packet[current_beat]; - endproperty - - for (i=0; i event_a_no_data_outside_packet; - print_assertion("valid is asserted outside the packet transfer"); - end - end - - //------------------------------------------------------------------------------------ - // =head3 p_non_missing_endofpacket - // This property check if consecutive startofpacket without endofpacket occurs - //------------------------------------------------------------------------------------ - property p_non_missing_endofpacket(current_beat); - @(posedge clk && enable_a_non_missing_endofpacket && USE_PACKET) - disable iff (reset) - startofpacket[current_beat] && valid[current_beat] && - ((USE_READY && (ST_READY_LATENCY == 0) && ready) || - !USE_READY || (ST_READY_LATENCY > 0)) - |-> ##1 !sop_error_in_channel[current_beat]; - endproperty - - for (i=0; i event_a_non_missing_endofpacket; - print_assertion("consecutive startofpacket without endofpacket"); - end - end - - //------------------------------------------------------------------------------------ - // =head3 p_non_missing_startofpacket - // This property check if consecutive endofpacket without endofpacket occurs - //------------------------------------------------------------------------------------ - property p_non_missing_startofpacket(current_beat); - @(posedge clk && enable_a_non_missing_startofpacket && USE_PACKET) - disable iff (reset) - endofpacket[current_beat] && valid[current_beat] && !startofpacket[current_beat] && - ((USE_READY && (ST_READY_LATENCY == 0) && ready) || - !USE_READY || (ST_READY_LATENCY > 0)) - |-> ##1 !eop_error_in_channel[current_beat]; - endproperty - - for (i=0; i event_a_non_missing_startofpacket; - print_assertion("consecutive endofpacket without startofpacket"); - end - end - - //------------------------------------------------------------------------------------ - // =head3 p_less_than_max_channel - // This property checks if channel size is less than ST_MAX_CHANNELS - //------------------------------------------------------------------------------------ - property p_less_than_max_channel(current_beat); - @(posedge clk && enable_a_less_than_max_channel && USE_CHANNEL) - disable iff (reset) - valid[current_beat] && (channel[current_beat] > 0) && (clock_counter > 0) && - ((USE_READY && (ST_READY_LATENCY == 0) && ready) || - !USE_READY || (ST_READY_LATENCY > 0)) - |-> (channel[current_beat] <= ST_MAX_CHANNELS); - endproperty - - for (i=0; i event_a_less_than_max_channel; - print_assertion("channel size must be within ST_MAX_CHANNELS"); - end - end - - // =cut - - //-------------------------------------------------------------------------- - // ASSERTION CODE END - //-------------------------------------------------------------------------- - `endif - - // synthesis translate_on - -endmodule - - Index: trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/avalon_utilities_pkg.sv =================================================================== --- trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/avalon_utilities_pkg.sv (revision 49) +++ trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/avalon_utilities_pkg.sv (nonexistent) @@ -1,80 +0,0 @@ -// (C) 2001-2017 Intel Corporation. All rights reserved. -// Your use of Intel Corporation's design tools, logic functions and other -// software and tools, and its AMPP partner logic functions, and any output -// files from any of the foregoing (including device programming or simulation -// files), and any associated documentation or information are expressly subject -// to the terms and conditions of the Intel Program License Subscription -// Agreement, Intel FPGA IP License Agreement, or other applicable -// license agreement, including, without limitation, that your use is for the -// sole purpose of programming logic devices manufactured by Intel and sold by -// Intel or its authorized distributors. Please refer to the applicable -// agreement for further details. - - -// $Id: //acds/rel/17.1std/ip/sopc/components/verification/lib/avalon_utilities_pkg.sv#1 $ -// $Revision: #1 $ -// $Date: 2017/07/30 $ -//----------------------------------------------------------------------------- -// =head1 NAME -// avalon_utilities_pkg -// =head1 SYNOPSIS -// Package for shared types and functions -//----------------------------------------------------------------------------- -// =head1 COPYRIGHT -// Copyright (c) 2008 Altera Corporation. All Rights Reserved. -// The information contained in this file is the property of Altera -// Corporation. Except as specifically authorized in writing by Altera -// Corporation, the holder of this file shall keep all information -// contained herein confidential and shall protect same in whole or in part -// from disclosure and dissemination to all third parties. Use of this -// program confirms your agreement with the terms of this license. -//----------------------------------------------------------------------------- -// =head1 DESCRIPTION -// This package contains shared types and functions. -// =cut -`timescale 1ns / 1ns - -`ifndef _AVALON_UTILITIES_PKG_ -`define _AVALON_UTILITIES_PKG_ - -package avalon_utilities_pkg; - - function automatic int clog2( - bit [31:0] Depth - ); - int i= Depth; - for(clog2 = 0; i > 0; clog2 = clog2 + 1) - i = i >> 1; - - return clog2; - endfunction - - function automatic int max( - bit [31:0] one, - bit [31:0] two - ); - if(one > two) - return one; - else - return two; - endfunction - - function automatic int lindex( - bit [31:0] width - ); - // returns the left index for a vector having a declared width - // when width is 0, then the left index is set to 0 rather than -1 - lindex = (width > 0) ? (width-1) : 0; - endfunction - - typedef enum int { - LOW = 0, - HIGH = 1, - RANDOM = 2, - UNKNOWN = 3 - } IdleOutputValue_t; - -endpackage - -`endif - Index: trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/altera_avalon_st_monitor_transactions.sv =================================================================== --- trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/altera_avalon_st_monitor_transactions.sv (revision 49) +++ trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/altera_avalon_st_monitor_transactions.sv (nonexistent) @@ -1,404 +0,0 @@ -// (C) 2001-2017 Intel Corporation. All rights reserved. -// Your use of Intel Corporation's design tools, logic functions and other -// software and tools, and its AMPP partner logic functions, and any output -// files from any of the foregoing (including device programming or simulation -// files), and any associated documentation or information are expressly subject -// to the terms and conditions of the Intel Program License Subscription -// Agreement, Intel FPGA IP License Agreement, or other applicable -// license agreement, including, without limitation, that your use is for the -// sole purpose of programming logic devices manufactured by Intel and sold by -// Intel or its authorized distributors. Please refer to the applicable -// agreement for further details. - - -// $File: //acds/rel/17.1std/ip/sopc/components/verification/altera_avalon_st_monitor_bfm/altera_avalon_st_monitor_transactions.sv $ -// $Revision: #1 $ -// $Date: 2017/07/30 $ -// $Author: swbranch $ -//----------------------------------------------------------------------------- -// =head1 NAME -// altera_avalon_st_monitor_transactions -// =head1 SYNOPSIS -// Streaming Avalon Bus Protocol Checker -//----------------------------------------------------------------------------- -// =head1 DESCRIPTION -// This module implements Avalon ST protocol transaction recording. -//----------------------------------------------------------------------------- - -`timescale 1ns / 1ns - -module altera_avalon_st_monitor_transactions( - clk, - reset, - tap - ); - - // =head1 PARAMETERS - parameter ST_SYMBOL_W = 8; // number of bits in one symbols - parameter ST_NUMSYMBOLS = 4; // number of symbols in one data - parameter ST_CHANNEL_W = 0; // width of channel signal - parameter ST_ERROR_W = 0; // width of error signal - parameter ST_EMPTY_W = 0; // width of empty signal - - parameter ST_READY_LATENCY = 0; // fixed ready latency in cycles - parameter ST_MAX_CHANNELS = 1; // maximum number of channels - - parameter USE_PACKET = 0; // data transfer in packet format - parameter USE_CHANNEL = 0; // use channel port - parameter USE_ERROR = 0; // use error port - parameter USE_READY = 1; // use ready port - parameter USE_VALID = 1; // use valid port - parameter USE_EMPTY = 0; // use empty port - parameter ST_BEATSPERCYCLE = 1; // Max number of packets per cycle - - parameter ST_MAX_PACKET_SIZE = 1; // Max number of packet size covered - - localparam ST_DATA_W = ST_SYMBOL_W * ST_NUMSYMBOLS; - localparam ST_MDATA_W = ST_BEATSPERCYCLE * ST_DATA_W; - localparam ST_MCHANNEL_W = ST_BEATSPERCYCLE * ST_CHANNEL_W; - localparam ST_MERROR_W = ST_BEATSPERCYCLE * ST_ERROR_W; - localparam ST_MEMPTY_W = ST_BEATSPERCYCLE * ST_EMPTY_W; - - localparam ST_MAX_EMPTY = 2**(ST_EMPTY_W) - 1; - localparam NUM_CHANNEL = (ST_MAX_CHANNELS > 1)? ST_MAX_CHANNELS:1; - localparam FIFO_MAX_LEVEL = 100; - localparam FIFO_THRESHOLD = 50; - - localparam TAP_W = ((ST_DATA_W == 0)? 1:ST_DATA_W) + // data - ((ST_CHANNEL_W == 0)? 1:ST_CHANNEL_W) + // channel - 1 + // valid - 1 + // startofpacket - 1 + // endofpacket - ((ST_ERROR_W == 0)? 1:ST_ERROR_W) + // error - ((ST_EMPTY_W == 0)? 1:ST_EMPTY_W) + // empty - 1; // ready - - // =head1 PINS - // =head2 Clock Interface - input clk; - input reset; - - // =head2 Avalon Monitor Interface - will be defined as Streaming Sink - input [(TAP_W*ST_BEATSPERCYCLE)-ST_BEATSPERCYCLE:0] tap; - - // =cut - - function int lindex; - // returns the left index for a vector having a declared width - // when width is 0, then the left index is set to 0 rather than -1 - input [31:0] width; - lindex = (width > 0) ? (width-1) : 0; - endfunction - - //-------------------------------------------------------------------------- - // synthesis translate_off - - import verbosity_pkg::*; - - //-------------------------------------------------------------------------- - // Private Types and Variables - //-------------------------------------------------------------------------- - - typedef logic [lindex(ST_DATA_W) :0] STData_t; - typedef logic [lindex(ST_CHANNEL_W) :0] STChannel_t; - typedef logic [lindex(ST_EMPTY_W) :0] STEmpty_t; - typedef logic [lindex(ST_ERROR_W) :0] STError_t; - - typedef logic [lindex(ST_MDATA_W) :0] STMData_t; - typedef logic [lindex(ST_MCHANNEL_W) :0] STMChannel_t; - typedef logic [lindex(ST_MEMPTY_W) :0] STMEmpty_t; - typedef logic [lindex(ST_MERROR_W) :0] STMError_t; - typedef logic [ST_BEATSPERCYCLE-1 :0] STBeats_t; - - typedef struct packed - { - bit [31:0] idles; - logic startofpacket; - logic endofpacket; - STChannel_t channel; - STData_t data; - STError_t error; - STEmpty_t empty; - } Transaction_t; - - Transaction_t current_transaction[ST_BEATSPERCYCLE]; - Transaction_t query_transaction; - Transaction_t transaction_queue[$]; - - // unpack Avalon bus interface tap into individual port signals - logic [lindex(ST_MDATA_W): 0] sink_data; - logic [lindex(ST_MCHANNEL_W): 0] sink_channel; - logic [ST_BEATSPERCYCLE-1: 0] sink_valid; - logic [ST_BEATSPERCYCLE-1: 0] sink_startofpacket; - logic [ST_BEATSPERCYCLE-1: 0] sink_endofpacket; - logic [lindex(ST_MERROR_W): 0] sink_error; - logic [lindex(ST_MEMPTY_W): 0] sink_empty; - logic sink_ready; - - string message = "*uninitialized*"; - logic ready = 0; - int idle_ctr = 0; - int transaction_fifo_max = FIFO_MAX_LEVEL; - int transaction_fifo_threshold = FIFO_THRESHOLD; - - STBeats_t sink_valid_qualified; - logic sink_ready_qualified; - - localparam MAX_READY_DELAY = 8; - logic [MAX_READY_DELAY-1:0] sink_ready_delayed; - - //-------------------------------------------------------------------------- - // Private Functions - //-------------------------------------------------------------------------- - - function int __floor(int arg); - // returns the arg if it is greater than 0, else returns 0 - return (arg > 0) ? arg : 0; - endfunction - - //-------------------------------------------------------------------------- - // =head1 Public Methods API - // This section describes the public methods in the application programming - // interface (API). In this case the application program is the test bench - // which instantiates and controls and queries state of this component. - // Test programs must only use these public access methods and events to - // communicate with this BFM component. The API and the module pins - // are the only interfaces in this component that are guaranteed to be - // stable. The API will be maintained for the life of the product. - // While we cannot prevent a test program from directly accessing internal - // tasks, functions, or data private to the BFM, there is no guarantee that - // these will be present in the future. In fact, it is best for the user - // to assume that the underlying implementation of this component can - // and will change. - //-------------------------------------------------------------------------- - event signal_fatal_error; // public - // Signal that a fatal error has occurred. Terminates simulation. - - event signal_transaction_received; //public - // Signal that a transaction has been received and queued. - - event signal_transaction_fifo_threshold; // public - // Signal that the transaction FIFO threshold level has been exceeded - - event signal_transaction_fifo_overflow; // public - // Signal that the FIFO is full and further transactions are being dropped - - function automatic string get_version(); // public - // Return component version as a string of three integers separated by periods. - // For example, version 9.1 sp1 is encoded as "9.1.1". - string ret_version = "17.1"; - return ret_version; - endfunction - - function automatic void set_transaction_fifo_max( // public - int level - ); - // Set the maximum fullness level of the FIFO. The event - // signal_transaction_fifo_max is triggered when this - // level is exceeded. - transaction_fifo_max = level; - endfunction - - function automatic int get_transaction_fifo_max(); - // Get the maximum transaction FIFO depth. - return transaction_fifo_max; - endfunction - - function automatic void set_transaction_fifo_threshold( // public - int level - ); - // Set the threshold alert level of the FIFO. The event - // signal_transaction_fifo_threshold is triggered when this - // level is exceeded. - transaction_fifo_threshold = level; - endfunction - - function automatic int get_transaction_fifo_threshold(); - // Get the transaction FIFO threshold level. - return transaction_fifo_threshold; - endfunction - - function automatic void pop_transaction(); // public - // Pop the transaction descriptor from the queue so that it can be - // queried with the get_transaction methods by the test bench. - if (reset) begin - $sformat(message, "%m: Illegal command while reset asserted"); - print(VERBOSITY_ERROR, message); - ->signal_fatal_error; - end - - query_transaction = transaction_queue.pop_back(); - - $sformat(message, "%m: called pop_transaction"); - print(VERBOSITY_DEBUG, message); - $sformat(message, "%m: Data: %x", query_transaction.data); - print(VERBOSITY_DEBUG, message); - $sformat(message, "%m: Channel: %0d", query_transaction.channel); - print(VERBOSITY_DEBUG, message); - $sformat(message, "%m: SOP: %0d EOP: %0d", - query_transaction.startofpacket, - query_transaction.endofpacket); - print(VERBOSITY_DEBUG, message); - endfunction - - function automatic bit[31:0] get_transaction_idles(); // public - // Return the number of idle cycles in the transaction - $sformat(message, "%m: called get_transaction_idles"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.idles; - endfunction - - function automatic logic [ST_DATA_W-1:0] get_transaction_data(); // public - // Return the data in the transaction - $sformat(message, "%m: called get_transaction_data"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.data; - endfunction - - function automatic logic [ST_CHANNEL_W-1:0] get_transaction_channel(); // public - // Return the channel identifier in the transaction - $sformat(message, "%m: called get_transaction_channel"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.channel; - endfunction - - function automatic logic get_transaction_sop(); // public - // Return the start of packet status in the transaction - $sformat(message, "%m: called get_transaction_sop"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.startofpacket; - endfunction - - function automatic logic get_transaction_eop(); // public - // Return the end of packet status in the transaction - $sformat(message, "%m: called get_transaction_eop"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.endofpacket; - endfunction - - function automatic logic [ST_ERROR_W-1:0] get_transaction_error(); // public - // Return the error status in the transaction - $sformat(message, "%m: called get_transaction_error"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.error; - endfunction - - function automatic logic [ST_EMPTY_W-1:0] get_transaction_empty(); // public - // Return the number of empty symbols in the transaction - $sformat(message, "%m: called get_transaction_empty"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.empty; - endfunction - - function automatic int get_transaction_queue_size(); // public - // Return the length of the queue holding received transactions - $sformat(message, "%m: called get_transaction_queue_size"); - print(VERBOSITY_DEBUG, message); - - // Return the number of transactions in the internal queues. - return transaction_queue.size(); - endfunction - - // =cut - - //-------------------------------------------------------------------------- - // Local Machinery - //-------------------------------------------------------------------------- - always @(signal_fatal_error) abort_simulation(); - - always @(*) begin - { - sink_data, - sink_channel, - sink_valid, - sink_startofpacket, - sink_endofpacket, - sink_error, - sink_empty, - sink_ready - } <= tap; - end - - // delay chain for sink_ready back pressure output to account for latency - always @(posedge clk or posedge reset) begin - if (reset) begin - sink_ready_delayed <= 0; - end else begin - sink_ready_delayed <= {sink_ready_delayed[6:0], sink_ready}; - end - end - - always @(*) begin - if (USE_READY == 0) - sink_ready_qualified = 1'b1; - else begin - if (ST_READY_LATENCY == 0) - sink_ready_qualified = sink_ready; - else - sink_ready_qualified = sink_ready_delayed[__floor(ST_READY_LATENCY-1)]; - end - end - - always @(sink_valid) begin - if (USE_VALID > 0) - sink_valid_qualified = sink_valid; - else - sink_valid_qualified = '1; - end - - always @(posedge clk or posedge reset) begin - if (reset) begin - for (int i=0; i 0) ? (width-1) : 0; - endfunction - - function automatic int __floor1( - bit [31:0] arg - ); - __floor1 = (arg <1) ? 1 : arg; - endfunction - - - //-------------------------------------------------------------------------- - // synthesis translate_off - - import verbosity_pkg::*; - - typedef bit [lindex(ST_DATA_W) :0] STData_t; - typedef bit [lindex(ST_CHANNEL_W) :0] STChannel_t; - typedef bit [lindex(ST_EMPTY_W) :0] STEmpty_t; - typedef bit [lindex(ST_ERROR_W) :0] STError_t; - - string message = "*unitialized*"; - - bit covergroup_settings_changed_flag = 0; - bit enable_c_packet_no_idles_no_back_pressure = 1; - bit enable_c_packet_with_idles = 1; - bit enable_c_packet_with_back_pressure = 1; - bit enable_c_channel_change_in_packet = 1; - bit enable_c_empty = 1; - bit enable_c_transfer = 1; - bit enable_c_error = 1; - bit enable_c_packet = 1; - bit enable_c_b2b_packet_different_channel = 1; - bit enable_c_b2b_packet_same_channel = 1; - bit enable_c_b2b_data_different_channel = 1; - bit enable_c_b2b_data_same_channel = 1; - bit enable_c_valid_non_ready = 1; - bit enable_c_non_valid_ready = 1; - bit enable_c_non_valid_non_ready = 1; - bit enable_c_transaction_after_reset = 1; - bit enable_c_packet_size = 1; - bit enable_c_multiple_packet_per_cycle = 1; - bit enable_c_single_packet_per_cycle = 1; - bit enable_c_idle_beat_between_packet = 1; - bit enable_c_all_idle_beats = 1; - bit enable_c_all_valid_beats = 1; - bit enable_c_partial_valid_beats = 1; - bit enable_c_b2b_packet_within_single_cycle = 1; - bit enable_c_b2b_packet_in_different_cycle = 1; - bit enable_c_error_in_middle_of_packet = 1; - - //-------------------------------------------------------------------------- - // unpack Avalon bus interface tap into individual port signals - logic ready; - logic [lindex(ST_BEATSPERCYCLE):0][lindex(ST_DATA_W):0] data; - logic [lindex(ST_BEATSPERCYCLE):0][lindex(ST_CHANNEL_W):0] channel; - logic [lindex(ST_BEATSPERCYCLE):0] valid; - logic [lindex(ST_BEATSPERCYCLE):0] startofpacket; - logic [lindex(ST_BEATSPERCYCLE):0] endofpacket; - logic [lindex(ST_BEATSPERCYCLE):0][lindex(ST_ERROR_W):0] error; - logic [lindex(ST_BEATSPERCYCLE):0][lindex(ST_EMPTY_W):0] empty; - - always_comb begin - data <= tap[lindex(ST_DATA_W*ST_BEATSPERCYCLE)+lindex(ST_CHANNEL_W*ST_BEATSPERCYCLE)+ - lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3*ST_BEATSPERCYCLE+4: - lindex(ST_CHANNEL_W*ST_BEATSPERCYCLE)+lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3*ST_BEATSPERCYCLE+4]; - - channel <= (USE_CHANNEL == 1)? - tap[lindex(ST_CHANNEL_W*ST_BEATSPERCYCLE)+lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+ - lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3*ST_BEATSPERCYCLE+3: - lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3*ST_BEATSPERCYCLE+3] : 0; - - valid <= (USE_VALID == 1)? - tap[lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3*ST_BEATSPERCYCLE+2: - lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+2*ST_BEATSPERCYCLE+3] : - (reset == 1)? 'x: 1; - - startofpacket <= (USE_PACKET == 1)? - tap[lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+2*ST_BEATSPERCYCLE+2: - lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+ST_BEATSPERCYCLE+3] : 0; - - endofpacket <= (USE_PACKET == 1)? - tap[lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+ST_BEATSPERCYCLE+2: - lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+3] : 0; - - error <= (USE_ERROR == 1)? - tap[lindex(ST_ERROR_W*ST_BEATSPERCYCLE)+lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+2: - lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+2] : 0; - - empty <= (USE_EMPTY == 1)? tap[lindex(ST_EMPTY_W*ST_BEATSPERCYCLE)+1:1] : 0; - - ready <= (USE_READY == 1)? tap[0:0] : 1; - end - - //-------------------------------------------------------------------------- - // General Statistics Counters - //-------------------------------------------------------------------------- - - logic [31:0] clock_counter; - logic [31:0] sop_counter; - logic [31:0] eop_counter; - - logic sop_counter_reset = 0; - logic eop_counter_reset = 0; - - logic [lindex(NUM_CHANNEL):0] packet_no_idles_no_back_pressure_flag = '1; - logic [lindex(NUM_CHANNEL):0] packet_with_back_pressure_flag = 0; - logic [lindex(NUM_CHANNEL):0] channel_change_in_packet_flag = 0; - logic [lindex(NUM_CHANNEL):0] packet_with_idles_flag = 0; - logic [31:0] idles_between_b2b_packet_same_channel_counter = 0; - logic [31:0] idles_between_b2b_packet_different_channel_counter = 0; - logic [31:0] idles_between_b2b_data_same_channel_counter = 0; - logic [31:0] idles_between_b2b_data_different_channel_counter = 0; - logic [lindex(NUM_CHANNEL):0] current_packet = 0; - logic [lindex(ST_BEATSPERCYCLE):0][lindex(ST_CHANNEL_W):0] past_channel = 0; - logic [lindex(ST_BEATSPERCYCLE):0] past_endofpacket = 0; - logic idles_between_packet_same_channel_sampled = 0; - logic idles_between_packet_different_channel_sampled = 0; - logic non_valid_ready_sampled = 0; - logic non_valid_non_ready_sampled = 0; - logic [lindex(ST_BEATSPERCYCLE):0] current_beat = 0; - logic [lindex(ST_BEATSPERCYCLE):0] current_beat_2 = 0; - logic [31:0] error_bit_num = 0; - logic [31:0] changed_channel = 0; - logic transaction_after_reset = 0; - logic all_valid_beats_flag = 0; - logic all_invalid_beats_flag = 0; - logic partial_valid_beats_flag = 0; - logic [31:0] idles_between_b2b_packet_transaction_counter = 0; - logic [31:0] idles_between_packet_within_single_transaction_sampled = 0; - logic [31:0] packet_per_transaction = 0; - logic [lindex(NUM_CHANNEL):0][31:0] packet_size = 0; - logic [31:0] error_in_middle_of_packet = 0; - logic [31:0] idles_between_packet_in_different_transaction_sampled = 0; - logic [31:0] invalid_beat_between_packet = 0; - logic packet_per_transaction_flag = 0; - logic channel_change = 0; - logic reset_status = 0; - - always @(posedge clk) begin - if (reset) - clock_counter <= 0; - else - clock_counter <= clock_counter + 1; - end - - always @(posedge clk) begin - if (reset) begin - sop_counter <= 0; - end else if (sop_counter_reset) begin - sop_counter_reset <= 0; - sop_counter <= 0; - end else begin - sop_counter <= (USE_PACKET && valid && startofpacket) ? - sop_counter + 1 : - sop_counter; - end - end - - always @(posedge clk) begin - if (reset) begin - eop_counter <= 0; - end else if (eop_counter_reset) begin - eop_counter_reset <= 0; - eop_counter <= 0; - end else begin - eop_counter <= (USE_PACKET && valid && endofpacket) ? - eop_counter + 1 : eop_counter; - end - end - - //-------------------------------------------------------------------------- - // =head1 Public Methods API - // This section describes the public methods in the application programming - // interface (API). In this case the application program is the test bench - // which instantiates and controls and queries state of this component. - // Test programs must only use these public access methods and events to - // communicate with this BFM component. The API and the module pins - // are the only interfaces in this component that are guaranteed to be - // stable. The API will be maintained for the life of the product. - // While we cannot prevent a test program from directly accessing internal - // tasks, functions, or data private to the BFM, there is no guarantee that - // these will be present in the future. In fact, it is best for the user - // to assume that the underlying implementation of this component can - // and will change. - // =cut - //-------------------------------------------------------------------------- - - // ST Coverage API - function automatic void set_enable_c_packet_no_idles_no_back_pressure( // public - bit cover_enable - ); - // enable or disable c_packet_no_idles_no_back_pressure cover group - - enable_c_packet_no_idles_no_back_pressure = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_packet_no_idles_no_back_pressure"); - endfunction - - function automatic void set_enable_c_packet_with_idles( // public - bit cover_enable - ); - // enable or disable c_packet_with_idles cover group - - enable_c_packet_with_idles = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_packet_with_idles"); - endfunction - - function automatic void set_enable_c_packet_with_back_pressure( // public - bit cover_enable - ); - // enable or disable c_packet_with_back_pressure cover group - - enable_c_packet_with_back_pressure = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_packet_with_back_pressure"); - endfunction - - function automatic void set_enable_c_channel_change_in_packet( // public - bit cover_enable - ); - // enable or disable c_channel_change_in_packet cover group - - enable_c_channel_change_in_packet = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_channel_change_in_packet"); - endfunction - - function automatic void set_enable_c_empty( // public - bit cover_enable - ); - // enable or disable c_empty cover group - - enable_c_empty = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_empty"); - endfunction - - function automatic void set_enable_c_transfer( // public - bit cover_enable - ); - // enable or disable c_transfer cover group - - enable_c_transfer = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_transfer"); - endfunction - - function automatic void set_enable_c_error( // public - bit cover_enable - ); - // enable or disable c_error cover group - - enable_c_error = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_error"); - endfunction - - function automatic void set_enable_c_packet( // public - bit cover_enable - ); - // enable or disable c_packet cover group - - enable_c_packet = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_packet"); - endfunction - - function automatic void set_enable_c_b2b_packet_different_channel( // public - bit cover_enable - ); - // enable or disable c_b2b_packet_different_channel cover group - - enable_c_b2b_packet_different_channel = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_b2b_packet_different_channel"); - endfunction - - function automatic void set_enable_c_b2b_packet_same_channel( // public - bit cover_enable - ); - // enable or disable c_b2b_packet_same_channel cover group - - enable_c_b2b_packet_same_channel = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_b2b_packet_same_channel"); - endfunction - - function automatic void set_enable_c_b2b_data_different_channel( // public - bit cover_enable - ); - // enable or disable c_b2b_data_different_channel cover group - - enable_c_b2b_data_different_channel = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_b2b_data_different_channel"); - endfunction - - function automatic void set_enable_c_b2b_data_same_channel( // public - bit cover_enable - ); - // enable or disable c_b2b_data_same_channel cover group - - enable_c_b2b_data_same_channel = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_b2b_data_same_channel"); - endfunction - - function automatic void set_enable_c_valid_non_ready( // public - bit cover_enable - ); - // enable or disable c_valid_non_ready cover group - - enable_c_valid_non_ready = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_valid_non_ready"); - endfunction - - function automatic void set_enable_c_non_valid_ready( // public - bit cover_enable - ); - // enable or disable c_non_valid_ready cover group - - enable_c_non_valid_ready = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_non_valid_ready"); - endfunction - - function automatic void set_enable_c_non_valid_non_ready( // public - bit cover_enable - ); - // enable or disable c_non_valid_non_ready cover group - - enable_c_non_valid_non_ready = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_non_valid_non_ready"); - endfunction - - function automatic void set_enable_c_transaction_after_reset( // public - bit cover_enable - ); - // enable or disable transaction_after_reset cover group - - enable_c_transaction_after_reset = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_transaction_after_reset"); - endfunction - - function automatic void set_enable_c_packet_size( // public - bit cover_enable - ); - // enable or disable c_packet_size cover group - - enable_c_packet_size = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_packet_size"); - endfunction - - function automatic void set_enable_c_multiple_packet_per_cycle( // public - bit cover_enable - ); - // enable or disable c_multiple_packet_per_cycle cover group - - enable_c_multiple_packet_per_cycle = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_multiple_packet_per_cycle"); - endfunction - - function automatic void set_enable_c_single_packet_per_cycle( // public - bit cover_enable - ); - // enable or disable c_single_packet_per_cycle cover group - - enable_c_single_packet_per_cycle = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_single_packet_per_cycle"); - endfunction - - function automatic void set_enable_c_idle_beat_between_packet( // public - bit cover_enable - ); - // enable or disable c_idle_beat_between_packet cover group - - enable_c_idle_beat_between_packet = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_idle_beat_between_packet"); - endfunction - - function automatic void set_enable_c_all_valid_beats( // public - bit cover_enable - ); - // enable or disable c_all_valid_beats cover group - - enable_c_all_valid_beats = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_all_valid_beats"); - endfunction - - function automatic void set_enable_c_all_idle_beats( // public - bit cover_enable - ); - // enable or disable c_all_idle_beats cover group - - enable_c_all_idle_beats = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_all_idle_beats"); - endfunction - - function automatic void set_enable_c_partial_valid_beats( // public - bit cover_enable - ); - // enable or disable c_partial_valid_beats cover group - - enable_c_partial_valid_beats = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_partial_valid_beats"); - endfunction - - function automatic void set_enable_c_b2b_packet_within_single_cycle( // public - bit cover_enable - ); - // enable or disable c_b2b_packet_within_single_cycle cover group - - enable_c_b2b_packet_within_single_cycle = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_b2b_packet_within_single_cycle"); - endfunction - - function automatic void set_enable_c_b2b_packet_in_different_transaction( // public - bit cover_enable - ); - // enable or disable c_b2b_packet_in_different_transaction cover group - - enable_c_b2b_packet_in_different_cycle = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_b2b_packet_in_different_cycle"); - endfunction - - function automatic void set_enable_c_error_in_middle_of_packet( // public - bit cover_enable - ); - // enable or disable c_error_in_middle_of_packet cover group - - enable_c_error_in_middle_of_packet = cover_enable; - coverage_settings_check(covergroup_settings_changed_flag, "c_error_in_middle_of_packet"); - endfunction - - // =cut - - function automatic logic [31:0] get_sop_counter(); - return sop_counter; - if (USE_PACKET == 0) begin - $sformat(message, "%m: No packet signals in this stream (USE_PACKET = 0)."); - print(VERBOSITY_WARNING, message); - end - endfunction - - function automatic void reset_sop_counter(); - sop_counter_reset = 1'b1; - endfunction - - function automatic logic [31:0] get_eop_counter(); - return eop_counter; - if (USE_PACKET == 0) begin - $sformat(message, "%m: No packet signals in this stream (USE_PACKET = 0)."); - print(VERBOSITY_WARNING, message); - end - endfunction - - function automatic void reset_eop_counter(); - eop_counter_reset = 1'b1; - endfunction - - function void coverage_settings_check( - bit cover_flag, - string cover_name - ); - string message; - if (cover_flag) begin - $sformat(message, "%m: - Changing %s covergroup settings during run-time will not be reflected", - cover_name); - print(VERBOSITY_WARNING, message); - end - endfunction - - `ifdef DISABLE_ALTERA_AVALON_SIM_SVA - // SVA coverage code is disabled when this macro is defined - `else - //-------------------------------------------------------------------------- - // COVERAGE CODE BEGIN - //-------------------------------------------------------------------------- - - function automatic void print_assertion( //private - string message_in - ); - string message_out; - $sformat(message_out, "ASSERTION: %s", message_in); - print(VERBOSITY_FAILURE, message_out); - endfunction - - function logic [1023:0] pow( //private - input int power_value - ); - // This method return the maximum supported value for the port width. - pow = (2**(power_value) - 1); - endfunction - - function automatic logic [31:0] count_ones ( //private - input logic [1023:0] value - ); - // This method return number of 1 bits - if (value == 0) - count_ones = 0; - else if (value == 'x) begin - count_ones = 'x; - end else begin - for( count_ones = 0; value!= 0; value = value >> 1 ) - count_ones += value & 1'b1; - end - endfunction - - function integer log2( //private - input int value - ); - // Mathematic logarithm function with base as 2. - value = value-1; - for (log2=0; value>0; log2=log2+1) - begin - value = value>>1; - end - endfunction - - task sample_non_valid_ready(); - fork - begin - repeat(ST_READY_LATENCY) begin - @(posedge clk); - end - non_valid_ready_sampled = 1; - end - join_none - endtask - - //-------------------------------------------------------------------------- - // =head1 Assertion Checkers and Coverage Monitors - // The assertion checkers in this module are only executable on simulators - // supporting the SystemVerilog Assertion (SVA) language. - // Mentor Modelsim AE and SE do not support this. - // Simulators that are supported include: Synopsys VCS and Mentor questasim. - // The assertion checking logic in this module must be explicitly enabled - // so that designs using this module can still be compiled on Modelsim without - // changes. To disable assertions define the following macro in the testbench - // or on the command line with: +define+DISABLE_ALTERA_AVALON_SIM_SVA. - // =cut - //-------------------------------------------------------------------------- - - - always @(posedge clk) - begin - if (!reset) begin - for (int i=0; i 0) || (USE_READY && (ST_READY_LATENCY == 0) && ready) || !USE_READY) begin - - if (enable_c_transaction_after_reset && USE_VALID) begin - c_transaction_after_reset.sample(); - transaction_after_reset = 0; - end - - if (enable_c_transfer && USE_VALID && USE_READY) begin - c_transfer.sample(); - end - - if (enable_c_empty && USE_EMPTY) begin - c_empty.sample(); - end - - if (enable_c_error && USE_ERROR) begin - for (int j = 0; j < ST_ERROR_W; j++) begin - if (error[current_beat][j] == 1) begin - error_bit_num = j; - c_error.sample(); - end - end - end - - if (startofpacket[i]) begin - if (!endofpacket[i]) begin - current_packet[channel[i]] = 1; - end else begin - packet_size[channel[i]]++; - end - - if (error[i] > 0) begin - error_in_middle_of_packet = 1; - end else begin - error_in_middle_of_packet = 0; - end - - if (enable_c_error_in_middle_of_packet && USE_ERROR && USE_PACKET) begin - c_error_in_middle_of_packet.sample(); - error_in_middle_of_packet = 0; - end - - packet_no_idles_no_back_pressure_flag[channel[i]] = 1; - - //counter to determine time to sample signal - if (i == 0) begin - if (channel[i] != past_channel[ST_BEATSPERCYCLE-1]) begin - idles_between_packet_same_channel_sampled = 0; - if (past_endofpacket[ST_BEATSPERCYCLE-1] == 1) begin - idles_between_packet_different_channel_sampled = 1; - idles_between_packet_in_different_transaction_sampled = 1; - end else begin - idles_between_packet_different_channel_sampled = 0; - idles_between_packet_in_different_transaction_sampled = 0; - end - end else begin - idles_between_packet_different_channel_sampled = 0; - if (past_endofpacket[ST_BEATSPERCYCLE-1] == 1) begin - idles_between_packet_same_channel_sampled = 1; - idles_between_packet_in_different_transaction_sampled = 1; - end else begin - idles_between_packet_same_channel_sampled = 0; - idles_between_packet_in_different_transaction_sampled = 0; - end - end - idles_between_packet_within_single_transaction_sampled = 0; - end else begin - if (channel[i] != channel[i-1]) begin - idles_between_packet_same_channel_sampled = 0; - if (endofpacket[i-1] == 1) begin - idles_between_packet_different_channel_sampled = 1; - idles_between_packet_within_single_transaction_sampled = 1; - end else begin - idles_between_packet_different_channel_sampled = 0; - idles_between_packet_within_single_transaction_sampled = 0; - end - end else begin - idles_between_packet_different_channel_sampled = 0; - if (endofpacket[i-1] == 1) begin - idles_between_packet_same_channel_sampled = 1; - idles_between_packet_within_single_transaction_sampled = 1; - end else begin - idles_between_packet_same_channel_sampled = 0; - idles_between_packet_within_single_transaction_sampled = 0; - end - end - idles_between_packet_in_different_transaction_sampled = 0; - end - - if (enable_c_b2b_packet_different_channel && USE_CHANNEL && USE_PACKET && USE_VALID && (ST_MAX_CHANNELS > 0)) begin - if (idles_between_packet_different_channel_sampled) begin - c_b2b_packet_different_channel.sample(); - end - end - - if (enable_c_b2b_packet_same_channel && USE_PACKET && USE_VALID) begin - if (idles_between_packet_same_channel_sampled) begin - c_b2b_packet_same_channel.sample(); - end - end - - if (enable_c_b2b_packet_within_single_cycle && USE_PACKET && USE_VALID && (ST_BEATSPERCYCLE > 1)) begin - if (idles_between_packet_within_single_transaction_sampled) begin - c_b2b_packet_within_single_cycle.sample(); - end - end - - if (enable_c_b2b_packet_in_different_cycle && USE_PACKET && USE_VALID && (ST_BEATSPERCYCLE > 1)) begin - if (idles_between_packet_in_different_transaction_sampled) begin - c_b2b_packet_in_different_cycle.sample(); - end - end - - if ((count_ones(current_packet) == 1) || ((count_ones(current_packet) == 0) &&(endofpacket[i]))) begin - if (enable_c_idle_beat_between_packet && USE_VALID && USE_PACKET && (ST_BEATSPERCYCLE > 1)) begin - c_idle_beat_between_packet.sample(); - invalid_beat_between_packet = 0; - end - end - end - - for (int j = 0; j 0)) begin - c_channel_change_in_packet.sample(); - channel_change_in_packet_flag[channel[i]] = 0; - end - - if (enable_c_packet_with_back_pressure && USE_READY && USE_PACKET) begin - c_packet_with_back_pressure.sample(); - packet_with_back_pressure_flag[channel[i]] = 0; - end - - if (enable_c_packet_size && USE_PACKET) begin - c_packet_size.sample(); - packet_size[channel[i]] = 0; - end - - end - - if (i == 0) begin - if (channel[i] != past_channel[ST_BEATSPERCYCLE-1]) begin - if (((count_ones(current_packet) == 1) && !startofpacket[i]) || - (count_ones(current_packet) > 1)) begin - if(current_packet[past_channel[ST_BEATSPERCYCLE-1]] == 1) begin - channel_change_in_packet_flag[past_channel[ST_BEATSPERCYCLE-1]] = 1; - end - end - end - end else begin - if (channel[i] != channel[i-1]) begin - if (((count_ones(current_packet) == 1) && !startofpacket[i]) || - (count_ones(current_packet) > 1)) begin - if(current_packet[channel[i-1]] == 1) begin - channel_change_in_packet_flag[channel[i-1]] = 1; - end - end - end - end - - end else begin - if (count_ones(current_packet) == 0) begin - invalid_beat_between_packet = 1; - end - end - end else if (USE_VALID && (valid[i] == 0)) begin - if (count_ones(current_packet) == 0) begin - invalid_beat_between_packet = 1; - end - end - - //counter for idles transaction - if (!valid[i]) begin - for (int j = 0; j 0) || (USE_READY && (ST_READY_LATENCY == 0) && ready) || !USE_READY) begin - if (endofpacket[i]) begin - idles_between_b2b_packet_same_channel_counter = 0; - idles_between_b2b_packet_different_channel_counter = 0; - idles_between_b2b_packet_transaction_counter = 0; - end - end - - if ((!startofpacket[i] && !endofpacket[i]) || (USE_READY && (ST_READY_LATENCY == 0) && !ready)) begin - idles_between_b2b_packet_different_channel_counter++; - idles_between_b2b_packet_transaction_counter++; - end - end - - if (((USE_VALID && valid[i]) || !USE_VALID)) begin - if ((ST_READY_LATENCY > 0) || (USE_READY && (ST_READY_LATENCY == 0) && ready) || !USE_READY) begin - if (enable_c_b2b_data_different_channel && USE_CHANNEL && USE_VALID && (ST_MAX_CHANNELS > 0)) begin - c_b2b_data_different_channel.sample(); - idles_between_b2b_data_different_channel_counter = 0; - end - - if (enable_c_b2b_data_same_channel && USE_VALID) begin - c_b2b_data_same_channel.sample(); - idles_between_b2b_data_same_channel_counter = 0; - end - end - end - - if (!reset_status) - transaction_after_reset = 0; - end - - // counter to capture previous cycle signal value - for (int i=0; i 0) || (USE_READY && (ST_READY_LATENCY == 0) && ready) || !USE_READY) begin - past_endofpacket[i] <= endofpacket[i]; - for (int k = i; k < ST_BEATSPERCYCLE; k++) begin - past_channel[k] <= channel[k]; - end - end else - past_endofpacket[i] <= 0; - end else begin - past_endofpacket[i] <= 0; - end - end - reset_status = 0; - end - end - - always @(posedge clk) - begin - if (!reset) begin - if (ready) begin - if (ST_READY_LATENCY == 0) begin - non_valid_ready_sampled = 1; - end else begin - sample_non_valid_ready(); - end - end - - if (enable_c_valid_non_ready && USE_READY && USE_VALID && (ST_READY_LATENCY == 0)) begin - for (int i=0; i 1)) begin - if ((ST_READY_LATENCY > 0) || (USE_READY && (ST_READY_LATENCY == 0) && ready) || !USE_READY) begin - if (count_ones(valid) == ST_BEATSPERCYCLE) begin - all_valid_beats_flag = 1; - end else begin - all_valid_beats_flag = 0; - end - - if ((count_ones(valid) == 0) && (valid[0] == 0)) begin - all_invalid_beats_flag = 1; - end else begin - all_invalid_beats_flag = 0; - end - - if ((count_ones(valid) > 0) && (count_ones(valid) < ST_BEATSPERCYCLE)) begin - partial_valid_beats_flag = 1; - end else begin - partial_valid_beats_flag = 0; - end - - if (enable_c_all_valid_beats && USE_VALID && (ST_BEATSPERCYCLE > 1)) begin - c_all_valid_beats.sample(); - end - if (enable_c_all_idle_beats && USE_VALID && (ST_BEATSPERCYCLE > 1)) begin - c_all_idle_beats.sample(); - end - if (enable_c_partial_valid_beats && USE_VALID && (ST_BEATSPERCYCLE > 1)) begin - c_partial_valid_beats.sample(); - end - end - end - - if (USE_PACKET && (ST_BEATSPERCYCLE > 1)) begin - for (int i=0; i 0) || (USE_READY && (ST_READY_LATENCY == 0) && ready) || !USE_READY) begin - if (((USE_VALID && valid[i]) || !USE_VALID)) begin - if (i > 0) begin - for (int j = 0; j < i; j++) begin - if (valid[j] == 1) begin - packet_per_transaction_flag = 1; - end - if ((channel[i] != channel[j]) && valid[j]) begin - channel_change = 1; - end - end - if (channel_change && packet_per_transaction_flag) begin - packet_per_transaction++; - end else begin - if ((startofpacket[i]) && packet_per_transaction_flag) begin - packet_per_transaction++; - end - end - channel_change = 0; - end - end - - if (i == (ST_BEATSPERCYCLE-1)) begin - if (enable_c_multiple_packet_per_cycle && USE_PACKET && (ST_BEATSPERCYCLE > 1)) begin - c_multiple_packet_per_cycle.sample(); - end - - if (enable_c_single_packet_per_cycle && USE_PACKET && (ST_BEATSPERCYCLE > 1)) begin - if ((valid > 0)) begin - c_single_packet_per_cycle.sample(); - end - end - packet_per_transaction = 0; - end - end - end - packet_per_transaction_flag = 0; - end - end - end - - - always @(negedge reset) - begin - non_valid_non_ready_sampled = 1; - end - - //counter while reset - always @(posedge clk) - begin - if (reset) begin - non_valid_ready_sampled = 0; - non_valid_non_ready_sampled = 0; - packet_no_idles_no_back_pressure_flag = '1; - packet_with_back_pressure_flag = 0; - idles_between_b2b_packet_same_channel_counter = 0; - idles_between_b2b_packet_different_channel_counter = 0; - channel_change_in_packet_flag = 0; - packet_with_idles_flag = 0; - idles_between_packet_same_channel_sampled = 0; - idles_between_packet_different_channel_sampled = 0; - current_packet = 0; - idles_between_b2b_data_same_channel_counter = 0; - idles_between_b2b_data_different_channel_counter = 0; - past_channel = 0; - past_endofpacket = 0; - transaction_after_reset = 1; - current_beat = 0; - current_beat_2 = 0; - changed_channel = 0; - all_valid_beats_flag = 0; - all_invalid_beats_flag = 0; - partial_valid_beats_flag = 0; - idles_between_b2b_packet_transaction_counter = 0; - idles_between_packet_within_single_transaction_sampled = 0; - packet_per_transaction = 0; - packet_size = 0; - error_in_middle_of_packet = 0; - idles_between_packet_in_different_transaction_sampled = 0; - invalid_beat_between_packet = 0; - packet_per_transaction_flag = 0; - reset_status = 1; - channel_change = 0; - end - end - - // Flag for initial coverage settings - initial begin - #1 covergroup_settings_changed_flag = 1; - end - - //------------------------------------------------------------------------------- - // =head2 Streaming Coverages - // The following are the cover group code focus on ST Monitor component coverage - //------------------------------------------------------------------------------- - - //------------------------------------------------------------------------------- - // =head3 c_empty - // This cover group covers the different empty value - //------------------------------------------------------------------------------- - - covergroup cg_empty; - cp_empty: coverpoint empty[current_beat] - { - bins cg_empty_cp_empty [] = {[0:ST_MAX_EMPTY]}; - } - option.per_instance = 1; - endgroup - - cg_empty c_empty; - - initial begin - #1 if (enable_c_empty && USE_EMPTY) begin - c_empty = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_error - // This cover group covers the different error value - //------------------------------------------------------------------------------- - - covergroup cg_error; - cp_error: coverpoint error_bit_num - { - bins cg_error_cp_error [] = {[0:lindex(ST_ERROR_W)]}; - } - option.per_instance = 1; - endgroup - - cg_error c_error; - - initial begin - #1 if (enable_c_error && USE_ERROR) begin - c_error = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_transfer - // This cover group covers valid is asserted for different channel. - //------------------------------------------------------------------------------- - - covergroup cg_transfer; - cp_transfer: coverpoint (channel[current_beat]) - { - bins cg_transfer_cp_transfer [] = {[0:(USE_CHANNEL == 0? 0:lindex(NUM_CHANNEL))]}; - } - option.per_instance = 1; - endgroup - - cg_transfer c_transfer; - - initial begin - #1 if (enable_c_transfer && USE_VALID && USE_READY) begin - c_transfer = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_packet - // This cover group covers packet transfer for different channel. - //------------------------------------------------------------------------------- - - covergroup cg_packet; - cp_packet: coverpoint (channel[current_beat]) - { - bins cg_packet_cp_packet [] = {[0:(USE_CHANNEL == 0? 0:lindex(NUM_CHANNEL))]}; - } - option.per_instance = 1; - endgroup - - cg_packet c_packet; - - initial begin - #1 if (enable_c_packet && USE_PACKET) begin - c_packet = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_valid_non_ready - // This cover group covers valid is asserted while ready is deasserted. - //------------------------------------------------------------------------------- - - covergroup cg_valid_non_ready; - cp_valid_non_ready: coverpoint ready - { - bins cg_valid_non_ready_cp_valid_non_ready = {0}; - } - option.per_instance = 1; - endgroup - - cg_valid_non_ready c_valid_non_ready; - - initial begin - #1 if (enable_c_valid_non_ready && USE_READY - && USE_VALID && (ST_READY_LATENCY == 0)) begin - c_valid_non_ready = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_non_valid_ready - // This cover group covers valid is deasserted at the N+ST_READ_LATENCY - // clock cycle if ready is asserted at N clock cycle. - //------------------------------------------------------------------------------- - - covergroup cg_non_valid_ready; - cp_non_valid_ready: coverpoint valid[current_beat_2] - { - bins cg_non_valid_ready_cp_non_valid_ready = {0}; - } - option.per_instance = 1; - endgroup - - cg_non_valid_ready c_non_valid_ready; - - initial begin - #1 if (enable_c_non_valid_ready && USE_READY && USE_VALID) begin - c_non_valid_ready = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_non_valid_non_ready - // This cover group covers idle cycle. - //------------------------------------------------------------------------------- - - covergroup cg_non_valid_non_ready; - cp_non_valid_non_ready: coverpoint ready - { - bins cg_non_valid_non_ready_cp_non_valid_non_ready = {0}; - } - option.per_instance = 1; - endgroup - - cg_non_valid_non_ready c_non_valid_non_ready; - - initial begin - #1 if (enable_c_non_valid_non_ready && USE_READY && USE_VALID) begin - c_non_valid_non_ready = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_packet_no_idles_no_back_pressure - // This cover group covers packet transaction without back pressure and idle - // cycles. - //------------------------------------------------------------------------------- - - covergroup cg_packet_no_idles_no_back_pressure; - cp_packet_no_idles_no_back_pressure: coverpoint packet_no_idles_no_back_pressure_flag[channel[current_beat]] - { - bins cg_packet_no_idles_no_back_pressure_cp_packet_no_idles_no_back_pressure = {1}; - } - option.per_instance = 1; - endgroup - - cg_packet_no_idles_no_back_pressure c_packet_no_idles_no_back_pressure; - - initial begin - #1 if (enable_c_packet_no_idles_no_back_pressure && USE_READY && USE_VALID && USE_PACKET) begin - c_packet_no_idles_no_back_pressure = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_packet_with_back_pressure - // This cover group covers packet transaction being back pressured. - //------------------------------------------------------------------------------- - - covergroup cg_packet_with_back_pressure; - cp_packet_with_back_pressure: coverpoint packet_with_back_pressure_flag[channel[current_beat]] - { - bins cg_packet_with_back_pressure_cp_packet_with_back_pressure = {1}; - } - option.per_instance = 1; - endgroup - - cg_packet_with_back_pressure c_packet_with_back_pressure; - - initial begin - #1 if (enable_c_packet_with_back_pressure && USE_READY && USE_PACKET) begin - c_packet_with_back_pressure = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_packet_with_idles - // This cover group covers covers packet transaction with idle cycles - //------------------------------------------------------------------------------- - - covergroup cg_packet_with_idles; - cp_packet_with_idles: coverpoint packet_with_idles_flag[channel[current_beat]] - { - bins cg_packet_with_idles_cp_packet_with_idles = {1}; - } - option.per_instance = 1; - endgroup - - cg_packet_with_idles c_packet_with_idles; - - initial begin - #1 if (enable_c_packet_with_idles && USE_PACKET && USE_VALID) begin - c_packet_with_idles = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_channel_change_in_packet - // This cover group covers changing channel within a packet transaction. - //------------------------------------------------------------------------------- - - covergroup cg_channel_change_in_packet; - cp_channel_change_in_packet: coverpoint channel_change_in_packet_flag[channel[current_beat]] - { - bins cg_channel_change_in_packet_cp_channel_change_in_packet = {1}; - } - option.per_instance = 1; - endgroup - - cg_channel_change_in_packet c_channel_change_in_packet; - - initial begin - #1 if (enable_c_channel_change_in_packet && USE_CHANNEL && USE_PACKET && (ST_MAX_CHANNELS > 0)) begin - c_channel_change_in_packet = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_b2b_packet_different_channel - // This cover group covers back to back packet transfer for different channel. - //------------------------------------------------------------------------------- - - covergroup cg_b2b_packet_different_channel; - cp_b2b_packet_different_channel: coverpoint idles_between_b2b_packet_different_channel_counter - { - bins cg_b2b_packet_different_channel_cp_b2b_packet_different_channel = {0}; - } - option.per_instance = 1; - endgroup - - cg_b2b_packet_different_channel c_b2b_packet_different_channel; - - initial begin - #1 if (enable_c_b2b_packet_different_channel && USE_CHANNEL && USE_PACKET && USE_VALID && (ST_MAX_CHANNELS > 0)) begin - c_b2b_packet_different_channel = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_b2b_packet_same_channel - // This cover group covers back to back packet transfer for same channel. - //------------------------------------------------------------------------------- - - covergroup cg_b2b_packet_same_channel; - cp_b2b_packet_same_channel: coverpoint idles_between_b2b_packet_same_channel_counter - { - bins cg_b2b_packet_same_channel_cp_b2b_packet_same_channel = {0}; - } - option.per_instance = 1; - endgroup - - cg_b2b_packet_same_channel c_b2b_packet_same_channel; - - initial begin - #1 if (enable_c_b2b_packet_same_channel && USE_PACKET && USE_VALID) begin - c_b2b_packet_same_channel = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_b2b_data_different_channel - // This cover group covers back to back data transfer for different channel. - //------------------------------------------------------------------------------- - - covergroup cg_b2b_data_different_channel; - cp_b2b_data_different_channel: coverpoint idles_between_b2b_data_different_channel_counter - { - bins cg_b2b_data_different_channel_cp_b2b_data_different_channel = {0}; - } - option.per_instance = 1; - endgroup - - cg_b2b_data_different_channel c_b2b_data_different_channel; - - initial begin - #1 if (enable_c_b2b_data_different_channel && USE_CHANNEL && USE_VALID && (ST_MAX_CHANNELS > 0)) begin - c_b2b_data_different_channel = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_b2b_data_same_channel - // This cover group covers back to back data transfer for same channel. - //------------------------------------------------------------------------------- - - covergroup cg_b2b_data_same_channel; - cp_b2b_data_same_channel: coverpoint idles_between_b2b_data_same_channel_counter - { - bins cg_b2b_data_same_channel_cp_b2b_data_same_channel = {0}; - } - option.per_instance = 1; - endgroup - - cg_b2b_data_same_channel c_b2b_data_same_channel; - - initial begin - #1 if (enable_c_b2b_data_same_channel && USE_VALID) begin - c_b2b_data_same_channel = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_transaction_after_reset - // This cover group covers first transaction after reset. - //------------------------------------------------------------------------------- - - covergroup cg_transaction_after_reset; - cp_transaction_after_reset: coverpoint transaction_after_reset - { - bins cg_transaction_after_reset_cp_transaction_after_reset = {1}; - } - option.per_instance = 1; - endgroup - - cg_transaction_after_reset c_transaction_after_reset; - - initial begin - #1 if (enable_c_transaction_after_reset && USE_VALID) begin - c_transaction_after_reset = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_packet_size - // This covers different size of packet from one until parameter - // ST_MAX_PACKET_SIZE. For the transaction larger than ST_MAX_PACKET_SIZE will - // count into another bin. - //------------------------------------------------------------------------------- - - covergroup cg_packet_size; - cp_packet_size: coverpoint packet_size[channel[current_beat]] - { - bins cg_packet_size_cp_packet_size [] = {[1:(ST_MAX_PACKET_SIZE < 1)? 1:ST_MAX_PACKET_SIZE]}; - bins cg_packet_size_cp_packet_size_high = {[(ST_MAX_PACKET_SIZE < 1)? 2:ST_MAX_PACKET_SIZE+1:$]}; - } - option.per_instance = 1; - endgroup - - cg_packet_size c_packet_size; - - initial begin - #1 if (enable_c_packet_size && USE_PACKET) begin - c_packet_size = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_multiple_packet_per_cycle - // This cover group covers number of transactions that carry multiple packets - // per single cycle. - //------------------------------------------------------------------------------- - - covergroup cg_multiple_packet_per_cycle; - cp_multiple_packet_per_cycle: coverpoint packet_per_transaction - { - bins cg_multiple_packet_per_cycle_cp_multiple_packet_per_cycle = {[1:(ST_BEATSPERCYCLE > 1)?ST_BEATSPERCYCLE:1]}; - } - option.per_instance = 1; - endgroup - - cg_multiple_packet_per_cycle c_multiple_packet_per_cycle; - - initial begin - #1 if (enable_c_multiple_packet_per_cycle && USE_PACKET && ST_BEATSPERCYCLE > 1) begin - c_multiple_packet_per_cycle = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_single_packet_per_cycle - // This cover group covers number of transactions that carry one packet - // per single cycle. - //------------------------------------------------------------------------------- - - covergroup cg_single_packet_per_cycle; - cp_single_packet_per_cycle: coverpoint packet_per_transaction - { - bins cg_single_packet_per_cycle_cp_single_packet_per_cycle = {0}; - } - option.per_instance = 1; - endgroup - - cg_single_packet_per_cycle c_single_packet_per_cycle; - - initial begin - #1 if (enable_c_single_packet_per_cycle && USE_PACKET && ST_BEATSPERCYCLE > 1) begin - c_single_packet_per_cycle = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_idle_beat_between_packet - // This cover group covers packet transaction that owns idle beats in between. - //------------------------------------------------------------------------------- - - covergroup cg_idle_beat_between_packet; - cp_idle_beat_between_packet: coverpoint invalid_beat_between_packet - { - bins cg_idle_beat_between_packet_cp_idle_beat_between_packet = {1}; - } - option.per_instance = 1; - endgroup - - cg_idle_beat_between_packet c_idle_beat_between_packet; - - initial begin - #1 if (enable_c_idle_beat_between_packet && USE_PACKET && USE_VALID && (ST_BEATSPERCYCLE > 1)) begin - c_idle_beat_between_packet = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_all_valid_beats - // This cover group covers number of transaction with all beats are valid. - //------------------------------------------------------------------------------- - - covergroup cg_all_valid_beats; - cp_all_valid_beats: coverpoint all_valid_beats_flag - { - bins cg_all_valid_beats_cp_all_valid_beats = {1}; - } - option.per_instance = 1; - endgroup - - cg_all_valid_beats c_all_valid_beats; - - initial begin - #1 if (enable_c_all_valid_beats && USE_VALID && (ST_BEATSPERCYCLE > 1)) begin - c_all_valid_beats = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_all_idle_beats - // This cover group covers number of transaction with all beats are idle. - //------------------------------------------------------------------------------- - - covergroup cg_all_idle_beats; - cp_all_idle_beats: coverpoint all_invalid_beats_flag - { - bins cg_all_idle_beats_cp_all_idle_beats = {1}; - } - option.per_instance = 1; - endgroup - - cg_all_idle_beats c_all_idle_beats; - - initial begin - #1 if (enable_c_all_idle_beats && USE_VALID && (ST_BEATSPERCYCLE > 1)) begin - c_all_idle_beats = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_partial_valid_beats - // This cover group covers number of transaction with some beats are invalid and - // some beats are valid. - //------------------------------------------------------------------------------- - - covergroup cg_partial_valid_beats; - cp_partial_valid_beats: coverpoint partial_valid_beats_flag - { - bins cg_partial_valid_beats_cp_partial_valid_beats = {1}; - } - option.per_instance = 1; - endgroup - - cg_partial_valid_beats c_partial_valid_beats; - - initial begin - #1 if (enable_c_partial_valid_beats && USE_VALID && (ST_BEATSPERCYCLE > 1)) begin - c_partial_valid_beats = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_b2b_packet_within_single_cycle - // This cover group covers back to back packet transfer within single cycle. - //------------------------------------------------------------------------------- - - covergroup cg_b2b_packet_within_single_cycle; - cp_b2b_packet_within_single_cycle: coverpoint idles_between_b2b_packet_transaction_counter - { - bins cg_b2b_packet_within_single_cycle_cp_b2b_packet_within_single_cycle = {0}; - } - option.per_instance = 1; - endgroup - - cg_b2b_packet_within_single_cycle c_b2b_packet_within_single_cycle; - - initial begin - #1 if (enable_c_b2b_packet_within_single_cycle && USE_PACKET && USE_VALID && (ST_BEATSPERCYCLE > 1)) begin - c_b2b_packet_within_single_cycle = new(); - end - end - - - //------------------------------------------------------------------------------- - // =head3 c_b2b_packet_in_different_cycle - // This cover group covers back to back packet transfer in different cycle. - //------------------------------------------------------------------------------- - - covergroup cg_b2b_packet_in_different_cycle; - cp_b2b_packet_in_different_cycle: coverpoint idles_between_b2b_packet_transaction_counter - { - bins cg_b2b_packet_in_different_cycle_cp_b2b_packet_in_different_cycle = {0}; - } - option.per_instance = 1; - endgroup - - cg_b2b_packet_in_different_cycle c_b2b_packet_in_different_cycle; - - initial begin - #1 if (enable_c_b2b_packet_in_different_cycle && USE_PACKET && USE_VALID && (ST_BEATSPERCYCLE > 1)) begin - c_b2b_packet_in_different_cycle = new(); - end - end - - //------------------------------------------------------------------------------- - // =head3 c_error_in_middle_of_packet - // This cover group covers assert error in the middle of a packet. - //------------------------------------------------------------------------------- - - covergroup cg_error_in_middle_of_packet; - cp_error_in_middle_of_packet: coverpoint error_in_middle_of_packet - { - bins cg_error_in_middle_of_packet_cp_error_in_middle_of_packet = {1}; - } - option.per_instance = 1; - endgroup - - cg_error_in_middle_of_packet c_error_in_middle_of_packet; - - initial begin - #1 if (enable_c_error_in_middle_of_packet && USE_PACKET && USE_ERROR) begin - c_error_in_middle_of_packet = new(); - end - end - - // =cut - - //-------------------------------------------------------------------------- - // COVERAGE CODE END - //-------------------------------------------------------------------------- - `endif - // synthesis translate_on - -endmodule - - Index: trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/altera_avalon_st_monitor.sv =================================================================== --- trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/altera_avalon_st_monitor.sv (revision 49) +++ trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/altera_avalon_st_monitor.sv (nonexistent) @@ -1,292 +0,0 @@ -// (C) 2001-2017 Intel Corporation. All rights reserved. -// Your use of Intel Corporation's design tools, logic functions and other -// software and tools, and its AMPP partner logic functions, and any output -// files from any of the foregoing (including device programming or simulation -// files), and any associated documentation or information are expressly subject -// to the terms and conditions of the Intel Program License Subscription -// Agreement, Intel FPGA IP License Agreement, or other applicable -// license agreement, including, without limitation, that your use is for the -// sole purpose of programming logic devices manufactured by Intel and sold by -// Intel or its authorized distributors. Please refer to the applicable -// agreement for further details. - - -// $Id: //acds/rel/17.1std/ip/sopc/components/verification/altera_avalon_st_monitor_bfm/altera_avalon_st_monitor.sv#1 $ -// $Revision: #1 $ -// $Date: 2017/07/30 $ -//----------------------------------------------------------------------------- -// =head1 NAME -// altera_avalon_st_monitor -// =head1 SYNOPSIS -// Bridge with Avalon Bus Protocol Assertion Checker -//----------------------------------------------------------------------------- -// =head1 DESCRIPTION -// This module implements Avalon ST protocol assertion checking for simulation. -// The component acts as a simple repeater with Avalon bus signals -// passed through from the sink to source interface. -// The instantiated altera_avalon_st_monitor snoops all passing Avalon -// bus signals and performs assertion checking and measures coverage on -// Avalon Streaming protocol properties. -// Transactions in transit may also be captured in a transaction buffer and -// extracted from the monitor via the API. -// The macro ALTERA_AVALON_SIM_SVA is defined to disable SVA processing -// The macro ENABLE_ALTERA_AVALON_TRANSACTION_RECORDING must be defined to -// enable transaction monitoring -//----------------------------------------------------------------------------- - -`timescale 1ps / 1ps - -module altera_avalon_st_monitor( - clk, - reset, - - sink_data, - sink_channel, - sink_valid, - sink_startofpacket, - sink_endofpacket, - sink_error, - sink_empty, - sink_ready, - - src_data, - src_channel, - src_valid, - src_startofpacket, - src_endofpacket, - src_error, - src_empty, - src_ready - ); - - // =head1 PARAMETERS - parameter ST_SYMBOL_W = 8; // number of bits in one symbols - parameter ST_NUMSYMBOLS = 4; // number of symbols in one data - parameter ST_CHANNEL_W = 0; // width of channel signal - parameter ST_ERROR_W = 0; // width of error signal - parameter ST_EMPTY_W = 0; // width of empty signal, ST_EMPTY_W = log2(`ST_NUMSYMBOLS) - - parameter ST_READY_LATENCY = 0; // fixed ready latency in cycles - parameter ST_MAX_CHANNELS = 1; // maximum number of channels - - parameter USE_PACKET = 0; // data transfer in packet format - parameter USE_CHANNEL = 0; // use channel port - parameter USE_ERROR = 0; // use error port - parameter USE_READY = 1; // use ready port - parameter USE_VALID = 1; // use valid port - parameter USE_EMPTY = 0; // use empty port - parameter ST_BEATSPERCYCLE = 1; // Max number of packets per cycle - - parameter ST_MAX_PACKET_SIZE = 1; // Max number of packet size covered - parameter VHDL_ID = 0; // VHDL BFM ID number - - localparam ST_DATA_W = ST_SYMBOL_W * ST_NUMSYMBOLS; - localparam ST_MDATA_W = ST_BEATSPERCYCLE * ST_DATA_W; - localparam ST_MCHANNEL_W = ST_BEATSPERCYCLE * ST_CHANNEL_W; - localparam ST_MERROR_W = ST_BEATSPERCYCLE * ST_ERROR_W; - localparam ST_MEMPTY_W = ST_BEATSPERCYCLE * ST_EMPTY_W; - - localparam TAP_W = ((ST_DATA_W == 0)? 1:ST_DATA_W) + // data - ((ST_CHANNEL_W == 0)? 1:ST_CHANNEL_W) + // channel - 1 + // valid - 1 + // startofpacket - 1 + // endofpacket - ((ST_ERROR_W == 0)? 1:ST_ERROR_W) + // error - ((ST_EMPTY_W == 0)? 1:ST_EMPTY_W) + // empty - 1; // ready - - localparam MTAP_W = ST_BEATSPERCYCLE*TAP_W; - - // =head1 PINS - // =head2 Clock Interface - input clk; - input reset; - - // =head2 Avalon Streaming Sink Interface - input [lindex(ST_MDATA_W) : 0] sink_data; - input [lindex(ST_MCHANNEL_W) : 0] sink_channel; - input [lindex(ST_BEATSPERCYCLE) : 0] sink_valid; - input [lindex(ST_BEATSPERCYCLE) : 0] sink_startofpacket; - input [lindex(ST_BEATSPERCYCLE) : 0] sink_endofpacket; - input [lindex(ST_MERROR_W) : 0] sink_error; - input [lindex(ST_MEMPTY_W) : 0] sink_empty; - output sink_ready; - - // =head2 Avalon Streaming Source Interface - output [lindex(ST_MDATA_W) : 0] src_data; - output [lindex(ST_MCHANNEL_W) : 0] src_channel; - output [lindex(ST_BEATSPERCYCLE) : 0] src_valid; - output [lindex(ST_BEATSPERCYCLE) : 0] src_startofpacket; - output [lindex(ST_BEATSPERCYCLE) : 0] src_endofpacket; - output [lindex(ST_MERROR_W) : 0] src_error; - output [lindex(ST_MEMPTY_W) : 0] src_empty; - input src_ready; - - // =cut - - function int lindex; - // returns the left index for a vector having a declared width - // when width is 0, then the left index is set to 0 rather than -1 - input [31:0] width; - lindex = (width > 0) ? (width-1) : 0; - endfunction - - // outputs - logic sink_ready; - logic [lindex(ST_MDATA_W) : 0] src_data; - logic [lindex(ST_MCHANNEL_W) : 0] src_channel; - logic [lindex(ST_BEATSPERCYCLE) : 0] src_valid; - logic [lindex(ST_BEATSPERCYCLE) : 0] src_startofpacket; - logic [lindex(ST_BEATSPERCYCLE) : 0] src_endofpacket; - logic [lindex(ST_MERROR_W) : 0] src_error; - logic [lindex(ST_MEMPTY_W) : 0] src_empty; - - logic [(MTAP_W)-ST_BEATSPERCYCLE : 0] tap; - - always @(*) begin - sink_ready <= src_ready; - src_data <= sink_data; - src_channel <= sink_channel; - src_valid <= sink_valid; - src_startofpacket <= sink_startofpacket; - src_endofpacket <= sink_endofpacket; - src_error <= sink_error; - src_empty <= sink_empty; - - tap <= { - sink_data, - sink_channel, - sink_valid, - sink_startofpacket, - sink_endofpacket, - sink_error, - sink_empty, - src_ready - }; - end - - //-------------------------------------------------------------------------- - // =head1 ALTERA_AVALON_ST_MONITOR_ASSERTION - // This module implements Avalon-ST protocol simulation assertion checkers - // =cut - //-------------------------------------------------------------------------- - altera_avalon_st_monitor_assertion - #( - .ST_SYMBOL_W (ST_SYMBOL_W), - .ST_NUMSYMBOLS (ST_NUMSYMBOLS), - .ST_CHANNEL_W (ST_CHANNEL_W), - .ST_ERROR_W (ST_ERROR_W), - .ST_EMPTY_W (ST_EMPTY_W), - - .ST_READY_LATENCY(ST_READY_LATENCY), - .ST_MAX_CHANNELS (ST_MAX_CHANNELS), - .ST_BEATSPERCYCLE(ST_BEATSPERCYCLE), - - .USE_PACKET (USE_PACKET), - .USE_CHANNEL (USE_CHANNEL), - .USE_ERROR (USE_ERROR), - .USE_READY (USE_READY), - .USE_VALID (USE_VALID), - .USE_EMPTY (USE_EMPTY) - ) - monitor_assertion ( - .clk (clk), - .reset (reset), - .tap (tap) - ); - - //-------------------------------------------------------------------------- - // =head1 ALTERA_AVALON_ST_MONITOR_COVERAGE - // This module implements Avalon-ST protocol functional coverage measurements - // =cut - //-------------------------------------------------------------------------- - altera_avalon_st_monitor_coverage - #( - .ST_SYMBOL_W (ST_SYMBOL_W), - .ST_NUMSYMBOLS (ST_NUMSYMBOLS), - .ST_CHANNEL_W (ST_CHANNEL_W), - .ST_ERROR_W (ST_ERROR_W), - .ST_EMPTY_W (ST_EMPTY_W), - .ST_BEATSPERCYCLE (ST_BEATSPERCYCLE), - - .ST_READY_LATENCY (ST_READY_LATENCY), - .ST_MAX_CHANNELS (ST_MAX_CHANNELS), - - .USE_PACKET (USE_PACKET), - .USE_CHANNEL (USE_CHANNEL), - .USE_ERROR (USE_ERROR), - .USE_READY (USE_READY), - .USE_VALID (USE_VALID), - .USE_EMPTY (USE_EMPTY), - .ST_MAX_PACKET_SIZE (ST_MAX_PACKET_SIZE) - ) - monitor_coverage ( - .clk (clk), - .reset (reset), - .tap (tap) - ); - - //-------------------------------------------------------------------------- - // =head1 ALTERA_AVALON_ST_MONITOR_TRANSACTIONS - // This module implements Avalon-ST the transaction recorder. - // =cut - //-------------------------------------------------------------------------- - - `ifdef ENABLE_ALTERA_AVALON_TRANSACTION_RECORDING - altera_avalon_st_monitor_transactions - #( - .ST_SYMBOL_W (ST_SYMBOL_W), - .ST_NUMSYMBOLS (ST_NUMSYMBOLS), - .ST_CHANNEL_W (ST_CHANNEL_W), - .ST_ERROR_W (ST_ERROR_W), - .ST_EMPTY_W (ST_EMPTY_W), - .ST_BEATSPERCYCLE (ST_BEATSPERCYCLE), - - .ST_READY_LATENCY (ST_READY_LATENCY), - .ST_MAX_CHANNELS (ST_MAX_CHANNELS), - - .USE_PACKET (USE_PACKET), - .USE_CHANNEL (USE_CHANNEL), - .USE_ERROR (USE_ERROR), - .USE_READY (USE_READY), - .USE_VALID (USE_VALID), - .USE_EMPTY (USE_EMPTY), - .ST_MAX_PACKET_SIZE (ST_MAX_PACKET_SIZE) - ) - monitor_trans ( - .clk (clk), - .reset (reset), - .tap (tap) - ); - `endif - - // synthesis translate_off - import verbosity_pkg::*; - - localparam VERSION = "17.1"; - - function automatic void hello(); - // introduction message to the console - string message; - $sformat(message, "%m: - Hello from altera_avalon_st_monitor"); - print(VERBOSITY_INFO, message); - `ifdef DISABLE_ALTERA_AVALON_SIM_SVA - $sformat(message, "%m: - Assertions disabled (DISABLE_ALTERA_AVALON_SIM_SVA defined)"); - `else - $sformat(message, "%m: - Assertions enabled (DISABLE_ALTERA_AVALON_SIM_SVA undefined)"); - `endif - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - $Revision: #1 $"); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - $Date: 2017/07/30 $"); - print(VERBOSITY_INFO, message); - print_divider(VERBOSITY_INFO); - endfunction - - initial begin - hello(); - end - - // synthesis translate_on - -endmodule Index: trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/verbosity_pkg.sv =================================================================== --- trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/verbosity_pkg.sv (revision 49) +++ trunk/avalon_lib/syn/ast_monitor/altera_avalon_st_monitor_171/sim/verbosity_pkg.sv (nonexistent) @@ -1,193 +0,0 @@ -// (C) 2001-2017 Intel Corporation. All rights reserved. -// Your use of Intel Corporation's design tools, logic functions and other -// software and tools, and its AMPP partner logic functions, and any output -// files from any of the foregoing (including device programming or simulation -// files), and any associated documentation or information are expressly subject -// to the terms and conditions of the Intel Program License Subscription -// Agreement, Intel FPGA IP License Agreement, or other applicable -// license agreement, including, without limitation, that your use is for the -// sole purpose of programming logic devices manufactured by Intel and sold by -// Intel or its authorized distributors. Please refer to the applicable -// agreement for further details. - - -// $Id: //acds/rel/17.1std/ip/sopc/components/verification/lib/verbosity_pkg.sv#1 $ -// $Revision: #1 $ -// $Date: 2017/07/30 $ -//----------------------------------------------------------------------------- -// =head1 NAME -// verbosity_pkg -// =head1 SYNOPSIS -// Package for controlling verbosity of messages sent to the console -//----------------------------------------------------------------------------- -// =head1 COPYRIGHT -// Copyright (c) 2008 Altera Corporation. All Rights Reserved. -// The information contained in this file is the property of Altera -// Corporation. Except as specifically authorized in writing by Altera -// Corporation, the holder of this file shall keep all information -// contained herein confidential and shall protect same in whole or in part -// from disclosure and dissemination to all third parties. Use of this -// program confirms your agreement with the terms of this license. -//----------------------------------------------------------------------------- -// =head1 DESCRIPTION -// This module will dump diagnostic messages to the console during -// simulation. The level of verbosity can be controlled in the test -// bench by using the *set_verbosity* method in the imported package -// verbosity_pkg. For a given setting, message at that level and all -// lower levels are dumped. For example, setting VERBOSITY_DEBUG level -// causes all messages to be dumped, while VERBOSITY_FAILURE restricts -// only failure messages and those tagged as VERBOSITY_NONE to be -// dumped. -// The different levels are: -// =over 4 -// =item 1 VERBOSITY_NONE -// Messages tagged with this level are always dumped to the console. -// =item 2 VERBOSITY_FAILURE -// A fatal simulation error has occurred and the simulator will exit. -// =item 3 VERBOSITY_ERROR -// A non-fatal error has occured. An example is a data comparison mismatch. -// =item 4 VERBOSITY_WARNING -// Warn the user that a potential error has occurred. -// =item 5 VERBOSITY_INFO -// Informational message. -// =item 6 VERBOSITY_DEBUG -// Dump enough state to diagnose problem scenarios. -// =back - - -`ifndef _AVALON_VERBOSITY_PKG_ -`define _AVALON_VERBOSITY_PKG_ - -package verbosity_pkg; - - timeunit 1ps; - timeprecision 1ps; - - typedef enum int {VERBOSITY_NONE, - VERBOSITY_FAILURE, - VERBOSITY_ERROR, - VERBOSITY_WARNING, - VERBOSITY_INFO, - VERBOSITY_DEBUG} Verbosity_t; - - Verbosity_t verbosity = VERBOSITY_INFO; - string message = ""; - int dump_file; - int dump = 0; - - //-------------------------------------------------------------------------- - // =head1 Public Methods API - // =pod - // This section describes the public methods in the application programming - // interface (API). In this case the application program is the test bench - // or component which imports this package. - // =cut - //-------------------------------------------------------------------------- - - function automatic Verbosity_t get_verbosity(); // public - // Returns the global verbosity setting. - return verbosity; - endfunction - - function automatic void set_verbosity ( // public - Verbosity_t v - ); - // Sets the global verbosity setting. - - string verbosity_str; - verbosity = v; - - case(verbosity) - VERBOSITY_NONE: verbosity_str = "VERBOSITY_"; - VERBOSITY_FAILURE: verbosity_str = "VERBOSITY_FAILURE"; - VERBOSITY_ERROR: verbosity_str = "VERBOSITY_ERROR"; - VERBOSITY_WARNING: verbosity_str = "VERBOSITY_WARNING"; - VERBOSITY_INFO: verbosity_str = "VERBOSITY_INFO"; - VERBOSITY_DEBUG: verbosity_str = "VERBOSITY_DEBUG"; - default: verbosity_str = "UNKNOWN"; - endcase - $sformat(message, "%m: Setting Verbosity level=%0d (%s)", - verbosity, verbosity_str); - print(VERBOSITY_NONE, message); - endfunction - - function automatic void print( // public - Verbosity_t level, - string message - ); - // Print a message to the console if the verbosity argument - // is less than or equal to the global verbosity setting. - string level_str; - - if (level <= verbosity) begin - case(level) - VERBOSITY_NONE: level_str = ""; - VERBOSITY_FAILURE: level_str = "FAILURE:"; - VERBOSITY_ERROR: level_str = "ERROR:"; - VERBOSITY_WARNING: level_str = "WARNING:"; - VERBOSITY_INFO: level_str = "INFO:"; - VERBOSITY_DEBUG: level_str = "DEBUG:"; - default: level_str = "UNKNOWN:"; - endcase - - $display("%t: %s %s",$time, level_str, message); - if (dump) begin - $fdisplay(dump_file, "%t: %s %s",$time, level_str, message); - end - end - endfunction - - function automatic void print_divider( // public - Verbosity_t level - ); - // Prints a divider line to the console to make a block of related text - // easier to identify and read. - string message; - $sformat(message, - "------------------------------------------------------------"); - print(level, message); - endfunction - - function automatic void open_dump_file ( // public - string dump_file_name = "avalon_bfm_sim.log" - ); - // Opens a dump file which collects console messages. - - if (dump) begin - $sformat(message, "%m: Dump file already open - ignoring open."); - print(VERBOSITY_ERROR, message); - end else begin - dump_file = $fopen(dump_file_name, "w"); - $fdisplay(dump_file, "testing dump file"); - $sformat(message, "%m: Opening dump file: %s", dump_file_name); - print(VERBOSITY_INFO, message); - dump = 1; - end - endfunction - - function automatic void close_dump_file(); // public - // Close the console message dump file. - if (!dump) begin - $sformat(message, "%m: No open dump file - ignoring close."); - print(VERBOSITY_ERROR, message); - end else begin - dump = 0; - $fclose(dump_file); - $sformat(message, "%m: Closing dump file"); - print(VERBOSITY_INFO, message); - end - endfunction - - function automatic void abort_simulation(); - string message; - $sformat(message, "%m: Abort the simulation due to fatal error incident."); - print(VERBOSITY_FAILURE, message); - $stop; - endfunction - -endpackage - -// =cut - -`endif - Index: trunk/avalon_lib/syn/ast_sink/altera_avalon_st_sink_bfm_171/sim/altera_avalon_st_sink_bfm.sv =================================================================== --- trunk/avalon_lib/syn/ast_sink/altera_avalon_st_sink_bfm_171/sim/altera_avalon_st_sink_bfm.sv (revision 49) +++ trunk/avalon_lib/syn/ast_sink/altera_avalon_st_sink_bfm_171/sim/altera_avalon_st_sink_bfm.sv (nonexistent) @@ -1,463 +0,0 @@ -// (C) 2001-2017 Intel Corporation. All rights reserved. -// Your use of Intel Corporation's design tools, logic functions and other -// software and tools, and its AMPP partner logic functions, and any output -// files from any of the foregoing (including device programming or simulation -// files), and any associated documentation or information are expressly subject -// to the terms and conditions of the Intel Program License Subscription -// Agreement, Intel FPGA IP License Agreement, or other applicable -// license agreement, including, without limitation, that your use is for the -// sole purpose of programming logic devices manufactured by Intel and sold by -// Intel or its authorized distributors. Please refer to the applicable -// agreement for further details. - - -// $File: //acds/rel/17.1std/ip/sopc/components/verification/altera_avalon_st_sink_bfm/altera_avalon_st_sink_bfm.sv $ -// $Revision: #1 $ -// $Date: 2017/07/30 $ -// $Author: swbranch $ -//----------------------------------------------------------------------------- -// =head1 NAME -// altera_avalon_st_sink_bfm -// =head1 SYNOPSIS -// Bus Functional Model (BFM) for a Avalon Streaming Sink -//----------------------------------------------------------------------------- -// =head1 DESCRIPTION -// This is a Bus Functional Model (BFM) for a Avalon Streaming Sink. -// The behavior of each clock cycle of the ST protocol on the interface -// is governed by a transaction. Received bus cycles are captured as -// transactions and pushed into a response queue. Clients query received -// transactions by popping them off the queue one by one and extract -// information using the public API methods provided. Back pressure to -// a driving source is also applied using the API method set_ready. -//----------------------------------------------------------------------------- - -`timescale 1ps / 1ps - -module altera_avalon_st_sink_bfm( - clk, - reset, - - sink_data, - sink_channel, - sink_valid, - sink_startofpacket, - sink_endofpacket, - sink_error, - sink_empty, - sink_ready - ); - - // =head1 PARAMETERS - parameter ST_SYMBOL_W = 8; // Data symbol width in bits - parameter ST_NUMSYMBOLS = 4; // Number of symbols per word - parameter ST_CHANNEL_W = 0; // Channel width in bits - parameter ST_ERROR_W = 0; // Error width in bits - parameter ST_EMPTY_W = 0; // Empty width in bits - - parameter ST_READY_LATENCY = 0; // Number of cycles latency after ready (0 or 1 only) - parameter ST_MAX_CHANNELS = 1; // Maximum number of channels - - parameter USE_PACKET = 0; // Use packet pins on interface - parameter USE_CHANNEL = 0; // Use channel pins on interface - parameter USE_ERROR = 0; // Use error pin on interface - parameter USE_READY = 1; // Use ready pin on interface - parameter USE_VALID = 1; // Use valid pin on interface - parameter USE_EMPTY = 0; // Use empty pin on interface - - parameter ST_BEATSPERCYCLE = 1; // Max number of packets per cycle - parameter VHDL_ID = 0; // VHDL BFM ID number - - localparam ST_DATA_W = ST_SYMBOL_W * ST_NUMSYMBOLS; - localparam ST_MDATA_W = ST_BEATSPERCYCLE * ST_DATA_W; - localparam ST_MCHANNEL_W = ST_BEATSPERCYCLE * ST_CHANNEL_W; - localparam ST_MERROR_W = ST_BEATSPERCYCLE * ST_ERROR_W; - localparam ST_MEMPTY_W = ST_BEATSPERCYCLE * ST_EMPTY_W; - - // =head1 PINS - // =head2 Clock Interface - input clk; - input reset; - - // =head2 Avalon Streaming Source Interface - input [lindex(ST_MDATA_W): 0] sink_data; - input [lindex(ST_MCHANNEL_W): 0] sink_channel; - input [ST_BEATSPERCYCLE-1: 0] sink_valid; - input [ST_BEATSPERCYCLE-1: 0] sink_startofpacket; - input [ST_BEATSPERCYCLE-1: 0] sink_endofpacket; - input [lindex(ST_MERROR_W): 0] sink_error; - input [lindex(ST_MEMPTY_W): 0] sink_empty; - output sink_ready; - - // =cut - - function integer lindex; - // returns the left index for a vector having a declared width - // when width is 0, then the left index is set to 0 rather than -1 - input [31:0] width; - lindex = (width > 0) ? (width-1) : 0; - endfunction - -// synthesis translate_off - import verbosity_pkg::*; - - logic sink_ready; - - //-------------------------------------------------------------------------- - // Private Types and Variables - //-------------------------------------------------------------------------- - - typedef logic [lindex(ST_DATA_W) :0] STData_t; - typedef logic [lindex(ST_CHANNEL_W) :0] STChannel_t; - typedef logic [lindex(ST_EMPTY_W) :0] STEmpty_t; - typedef logic [lindex(ST_ERROR_W) :0] STError_t; - - typedef logic [lindex(ST_MDATA_W) :0] STMData_t; - typedef logic [lindex(ST_MCHANNEL_W) :0] STMChannel_t; - typedef logic [lindex(ST_MEMPTY_W) :0] STMEmpty_t; - typedef logic [lindex(ST_MERROR_W) :0] STMError_t; - typedef logic [ST_BEATSPERCYCLE-1 :0] STBeats_t; - - typedef struct packed - { - bit [31:0] idles; - logic startofpacket; - logic endofpacket; - STChannel_t channel; - STData_t data; - STError_t error; - STEmpty_t empty; - } Transaction_t; - - Transaction_t current_transaction[ST_BEATSPERCYCLE]; - Transaction_t query_transaction; - - Transaction_t transaction_queue[$]; - - string message = "*uninitialized*"; - logic ready = 0; - int idle_ctr = 0; - - STBeats_t sink_valid_qualified; - logic sink_ready_qualified; - - localparam MAX_READY_DELAY = 8; - logic [MAX_READY_DELAY-1:0] sink_ready_delayed; - - - //-------------------------------------------------------------------------- - // =head1 Public Methods API - // =pod - // This section describes the public methods in the application programming - // interface (API). In this case the application program is the test bench - // which instantiates and controls and queries state in this BFM component. - // Test programs must only use these public access methods and events to - // communicate with this BFM component. The API and the module pins - // are the only interfaces in this component that are guaranteed to be - // stable. The API will be maintained for the life of the product. - // While we cannot prevent a test program from directly accessing internal - // tasks, functions, or data private to the BFM, there is no guarantee that - // these will be present in the future. In fact, it is best for the user - // to assume that the underlying implementation of this component can - // and will change. - // =cut - //-------------------------------------------------------------------------- - - event signal_fatal_error; // public - // Signal that a fatal error has occurred. Terminates simulation. - - event signal_transaction_received; //public - // Signal that a transaction has been received and queued. - - event signal_sink_ready_assert; // public - // Signal that sink_ready is asserted thereby turning off back pressure. - - event signal_sink_ready_deassert; // public - // Signal that sink_ready is deasserted thereby turning on back pressure. - - function automatic string get_version(); // public - // Return BFM version string. For example, version 9.1 sp1 is "9.1sp1" - string ret_version = "__ACDS_VERSION_SHORT__"; - return ret_version; - endfunction - - task automatic init(); // public - // Drive interface to idle state. - $sformat(message, "%m: called init"); - print(VERBOSITY_DEBUG, message); - - drive_interface_idle(); - endtask - - task automatic set_ready( // public - bit state - ); - // Set the value of the interface ready signal. To assert back - // pressure, the state argument is set to 0 i.e. not ready. - // The parameter USE_READY must be set to 1 to enable this signal. - - if (USE_READY > 0) begin - $sformat(message, "%m: called set_ready"); - print(VERBOSITY_DEBUG, message); - - sink_ready <= state; - - if (state == 1'b1) - ->signal_sink_ready_assert; - else - ->signal_sink_ready_deassert; - end else begin - $sformat(message, "%m: Ignore set_ready() when USE_READY == 0"); - print(VERBOSITY_WARNING, message); - sink_ready <= 0; - end - endtask - - function automatic void pop_transaction(); // public - // Pop the transaction descriptor from the queue so that it can be - // queried with the get_transaction methods by the test bench. - if (reset) begin - $sformat(message, "%m: Illegal command while reset asserted"); - print(VERBOSITY_ERROR, message); - ->signal_fatal_error; - end - - query_transaction = transaction_queue.pop_back(); - - $sformat(message, "%m: called pop_transaction"); - print(VERBOSITY_DEBUG, message); - $sformat(message, "%m: Data: %x", query_transaction.data); - print(VERBOSITY_DEBUG, message); - $sformat(message, "%m: Channel: %0d", query_transaction.channel); - print(VERBOSITY_DEBUG, message); - $sformat(message, "%m: SOP: %0d EOP: %0d", - query_transaction.startofpacket, - query_transaction.endofpacket); - print(VERBOSITY_DEBUG, message); - endfunction - - function automatic bit[31:0] get_transaction_idles(); // public - // Return the number of idle cycles in the transaction - $sformat(message, "%m: called get_transaction_idles"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.idles; - endfunction - - function automatic logic [ST_DATA_W-1:0] get_transaction_data(); // public - // Return the data in the transaction - $sformat(message, "%m: called get_transaction_data"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.data; - endfunction - - function automatic logic [ST_CHANNEL_W-1:0] get_transaction_channel(); // public - // Return the channel identifier in the transaction - $sformat(message, "%m: called get_transaction_channel"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.channel; - endfunction - - function automatic logic get_transaction_sop(); // public - // Return the start of packet status in the transaction - $sformat(message, "%m: called get_transaction_sop"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.startofpacket; - endfunction - - function automatic logic get_transaction_eop(); // public - // Return the end of packet status in the transaction - $sformat(message, "%m: called get_transaction_eop"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.endofpacket; - endfunction - - function automatic logic [ST_ERROR_W-1:0] get_transaction_error(); // public - // Return the error status in the transaction - $sformat(message, "%m: called get_transaction_error"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.error; - endfunction - - function automatic logic [ST_EMPTY_W-1:0] get_transaction_empty(); // public - // Return the number of empty symbols in the transaction - $sformat(message, "%m: called get_transaction_empty"); - print(VERBOSITY_DEBUG, message); - - return query_transaction.empty; - endfunction - - function automatic int get_transaction_queue_size(); // public - // Return the length of the queue holding received transactions - $sformat(message, "%m: called get_transaction_queue_size"); - print(VERBOSITY_DEBUG, message); - - // Return the number of transactions in the internal queues. - return transaction_queue.size(); - endfunction - - // =cut - - //-------------------------------------------------------------------------- - // Private Methods - //-------------------------------------------------------------------------- - function int __floor( - int arg - ); - // returns the arg if it is greater than 0, else returns 0 - return (arg > 0) ? arg : 0; - endfunction - - task automatic drive_interface_idle(); - set_ready(0); - endtask - - function automatic void __hello(); - // Introduction Message to console - $sformat(message, "%m: - Hello from altera_avalon_st_sink_bfm."); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - $Revision: #1 $"); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - $Date: 2017/07/30 $"); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_SYMBOL_W = %0d", - ST_SYMBOL_W); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_NUMSYMBOLS = %0d", - ST_NUMSYMBOLS); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_CHANNEL_W = %0d", - ST_CHANNEL_W); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_ERROR_W = %0d", - ST_ERROR_W); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_EMPTY_W = %0d", - ST_EMPTY_W); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_READY_LATENCY = %0d", - ST_READY_LATENCY); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_MAX_CHANNELS = %0d", - ST_MAX_CHANNELS); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - ST_BEATSPERCYCLE = %0d", - ST_BEATSPERCYCLE); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_PACKET = %0d", - USE_PACKET); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_CHANNEL = %0d", - USE_CHANNEL); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_ERROR = %0d", - USE_ERROR); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_READY = %0d", - USE_READY); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_VALID = %0d", - USE_VALID); - print(VERBOSITY_INFO, message); - $sformat(message, "%m: - USE_EMPTY = %0d", - USE_EMPTY); - print(VERBOSITY_INFO, message); - print_divider(VERBOSITY_INFO); - endfunction - - //-------------------------------------------------------------------------- - initial begin - __hello(); - end - - //-------------------------------------------------------------------------- - // Local Machinery - //-------------------------------------------------------------------------- - always @(signal_fatal_error) abort_simulation(); - - // delay chain for sink_ready back pressure output to account for latency - always @(posedge clk or posedge reset) begin - if (reset) begin - sink_ready_delayed <= 0; - end else begin - sink_ready_delayed <= {sink_ready_delayed[6:0], sink_ready}; - end - end - - assign sink_ready_qualified = (USE_READY == 0)? 1'b1 : - (ST_READY_LATENCY == 0)? sink_ready : - sink_ready_delayed[__floor(ST_READY_LATENCY-1)]; - - assign sink_valid_qualified = (USE_VALID == 0)? 1'b1 : sink_valid; - - always @(posedge clk or posedge reset) begin - if (reset) begin - transaction_queue = {}; - query_transaction = 0; - for (int i=0; i 0; clog2 = clog2 + 1) - i = i >> 1; - - return clog2; - endfunction - - function automatic int max( - bit [31:0] one, - bit [31:0] two - ); - if(one > two) - return one; - else - return two; - endfunction - - function automatic int lindex( - bit [31:0] width - ); - // returns the left index for a vector having a declared width - // when width is 0, then the left index is set to 0 rather than -1 - lindex = (width > 0) ? (width-1) : 0; - endfunction - - typedef enum int { - LOW = 0, - HIGH = 1, - RANDOM = 2, - UNKNOWN = 3 - } IdleOutputValue_t; - -endpackage - -`endif - Index: trunk/avalon_lib/syn/ast_monitor.qsys =================================================================== --- trunk/avalon_lib/syn/ast_monitor.qsys (revision 49) +++ trunk/avalon_lib/syn/ast_monitor.qsys (nonexistent) @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Index: trunk/avalon_lib/syn/ast_sink.qsys =================================================================== --- trunk/avalon_lib/syn/ast_sink.qsys (revision 49) +++ trunk/avalon_lib/syn/ast_sink.qsys (nonexistent) @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Index: trunk/axi4_lib/sim/src/axi4_bfm_pkg.sv =================================================================== --- trunk/axi4_lib/sim/src/axi4_bfm_pkg.sv (revision 49) +++ trunk/axi4_lib/sim/src/axi4_bfm_pkg.sv (nonexistent) @@ -1,563 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -// -------------------------------------------------------------------- -// -package axi4_bfm_pkg; - - // -------------------------------------------------------------------- - // - import tb_bfm_pkg::*; - import axi4_transaction_pkg::*; - - - // -------------------------------------------------------------------- - // - class ar_master_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m; - - - //-------------------------------------------------------------------- - function new - ( - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m - ); - - super.new(); - this.axi4_m = axi4_m; - - endfunction: new - - - // -------------------------------------------------------------------- - // - function void - ar_default; - - axi4_m.cb_m.araddr <= 'bx; - axi4_m.cb_m.arburst <= 'bx; - axi4_m.cb_m.arcache <= 'bx; - axi4_m.cb_m.arid <= 'bx; - axi4_m.cb_m.arlen <= 'bx; - axi4_m.cb_m.arlock <= 'bx; - axi4_m.cb_m.arprot <= 'bx; - axi4_m.cb_m.arqos <= 'bx; - axi4_m.cb_m.arregion <= 'bx; - axi4_m.cb_m.arsize <= 'bx; - axi4_m.cb_m.arvalid <= 0; - - endfunction: ar_default - - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - repeat(tr_h.delay_h.next()) @(axi4_m.cb_m); - - axi4_m.cb_m.araddr <= tr_h.addr; - axi4_m.cb_m.arid <= tr_h.id; - axi4_m.cb_m.arlen <= tr_h.len; - axi4_m.cb_m.arsize <= tr_h.size; - - axi4_m.cb_m.arburst <= tr_h.burst; - axi4_m.cb_m.arcache <= tr_h.cache; - axi4_m.cb_m.arlock <= tr_h.lock; - axi4_m.cb_m.arprot <= tr_h.prot; - axi4_m.cb_m.arqos <= tr_h.qos; - axi4_m.cb_m.arregion <= tr_h.region; - axi4_m.cb_m.arvalid <= 1; - - $display("^^^ %16.t | %m | master AR transaction @ 0x%08x |", $time, tr_h.addr); - - repeat(1) @(axi4_m.cb_m); - wait(axi4_m.cb_m.arready); - - axi4_m.zero_cycle_delay(); - ar_default(); - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: ar_master_transaction_class - - - // -------------------------------------------------------------------- - // - class r_master_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m; - - - //-------------------------------------------------------------------- - function new - ( - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m - ); - - super.new(); - this.axi4_m = axi4_m; - - endfunction: new - - - // -------------------------------------------------------------------- - // - function void - r_default; - - axi4_m.cb_m.rready <= 0; - - endfunction: r_default - - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - tr_h.data_h = new(tr_h.len); - - foreach(tr_h.payload_h.w[i]) - begin - repeat(tr_h.delay_h.next()) @(axi4_m.cb_m); - axi4_m.cb_m.rready <= 1; - repeat(1) @(axi4_m.cb_m); - - wait(axi4_m.cb_m.rvalid); - axi4_m.zero_cycle_delay(); - - tr_h.data_h.w[i] = axi4_m.cb_m.rdata; - - $display("^^^ %16.t | %m | master R transaction | %d | 0x%016x |", $time, i, tr_h.data_h.w[i]); - r_default(); - end - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: r_master_transaction_class - - - // -------------------------------------------------------------------- - // - class aw_master_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m; - - - //-------------------------------------------------------------------- - function new - ( - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m - ); - - super.new(); - this.axi4_m = axi4_m; - - endfunction: new - - - // -------------------------------------------------------------------- - // - function void - aw_default; - - axi4_m.cb_m.awaddr <= 'bx; - axi4_m.cb_m.awburst <= 'bx; - axi4_m.cb_m.awcache <= 'bx; - axi4_m.cb_m.awid <= 'bx; - axi4_m.cb_m.awlen <= 'bx; - axi4_m.cb_m.awlock <= 'bx; - axi4_m.cb_m.awprot <= 'bx; - axi4_m.cb_m.awqos <= 'bx; - axi4_m.cb_m.awregion <= 'bx; - axi4_m.cb_m.awsize <= 'bx; - axi4_m.cb_m.awvalid <= 0; - - endfunction: aw_default - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - repeat(tr_h.delay_h.next()) @(axi4_m.cb_m); - - axi4_m.cb_m.awaddr <= tr_h.addr; - axi4_m.cb_m.awid <= tr_h.id; - axi4_m.cb_m.awlen <= tr_h.len; - axi4_m.cb_m.awsize <= tr_h.size; - - axi4_m.cb_m.awburst <= tr_h.burst; - axi4_m.cb_m.awcache <= tr_h.cache; - axi4_m.cb_m.awlock <= tr_h.lock; - axi4_m.cb_m.awprot <= tr_h.prot; - axi4_m.cb_m.awqos <= tr_h.qos; - axi4_m.cb_m.awregion <= tr_h.region; - axi4_m.cb_m.awvalid <= 1; - - $display("^^^ %16.t | %m | master AW transaction @ 0x%08x |", $time, tr_h.addr); - - repeat(1) @(axi4_m.cb_m); - wait(axi4_m.cb_m.awready); - - axi4_m.zero_cycle_delay(); - aw_default(); - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: aw_master_transaction_class - - - // -------------------------------------------------------------------- - // - class w_master_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m; - - - //-------------------------------------------------------------------- - function new - ( - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m - ); - - super.new(); - this.axi4_m = axi4_m; - - endfunction: new - - - // -------------------------------------------------------------------- - // - function void - w_default; - - axi4_m.cb_m.wdata <= 'bx; - axi4_m.cb_m.wlast <= 'bx; - axi4_m.cb_m.wstrb <= {N{1'b1}}; - axi4_m.cb_m.wvalid <= 0; - - endfunction: w_default - - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - foreach(tr_h.payload_h.w[i]) - begin - repeat(tr_h.delay_h.next()) @(axi4_m.cb_m); - - axi4_m.cb_m.wdata <= tr_h.payload_h.w[i]; - // axi4_m.cb_m.wstrb <= tr_h.strb; // need to fix - - if(i < tr_h.payload_h.w.size - 1) - axi4_m.cb_m.wlast <= 0; - else - axi4_m.cb_m.wlast <= 1; - - axi4_m.cb_m.wvalid <= 1; - - repeat(1) @(axi4_m.cb_m); - wait(axi4_m.cb_m.wready); - - axi4_m.zero_cycle_delay(); - $display("^^^ %16.t | %m | master W transaction | %d | 0x%016x |", $time, i, tr_h.payload_h.w[i]); - w_default(); - end - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: w_master_transaction_class - - - // -------------------------------------------------------------------- - // - class b_master_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m; - - - //-------------------------------------------------------------------- - function new - ( - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m - ); - - super.new(); - this.axi4_m = axi4_m; - - endfunction: new - - - // -------------------------------------------------------------------- - // - function void - b_default; - - axi4_m.cb_m.bready <= 0; - - endfunction: b_default - - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - repeat(tr_h.delay_h.next()) @(axi4_m.cb_m); - axi4_m.cb_m.bready <= 1; - repeat(1) @(axi4_m.cb_m); - - wait(axi4_m.cb_m.bvalid); - axi4_m.zero_cycle_delay(); - - $display("^^^ %16.t | %m | master B transaction | 0x%x |", $time, axi4_m.cb_m.bresp); - b_default(); - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: b_master_transaction_class - - - // -------------------------------------------------------------------- - // - class axi4_master_bfm_class #(A = 32, N = 8, I = 1); - - ar_master_transaction_class #(.A(A), .N(N), .I(I)) ar_h; - r_master_transaction_class #(.A(A), .N(N), .I(I)) r_h; - aw_master_transaction_class #(.A(A), .N(N), .I(I)) aw_h; - w_master_transaction_class #(.A(A), .N(N), .I(I)) w_h; - b_master_transaction_class #(.A(A), .N(N), .I(I)) b_h; - - axi4_transaction_class tr_h; - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m; - - - //-------------------------------------------------------------------- - function new - ( - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m - ); - - this.axi4_m = axi4_m; - - ar_h = new(axi4_m); - r_h = new(axi4_m); - aw_h = new(axi4_m); - w_h = new(axi4_m); - b_h = new(axi4_m); - - ar_h.init(); - ar_h.ar_default(); - - r_h.init(); - r_h.r_default(); - - aw_h.init(); - aw_h.aw_default(); - - w_h.init(); - w_h.w_default(); - - b_h.init(); - b_h.b_default(); - - endfunction: new - - - // -------------------------------------------------------------------- - // - function void - init; - - endfunction: init - - - // -------------------------------------------------------------------- - // - task - basic_read - ( - input logic [(A-1):0] araddr, - input logic [7:0] arlen, - output logic [(8*N)-1:0] data[], - output logic [1:0] rresp - ); - - this.tr_h = new; - this.tr_h.basic_read(araddr, arlen); - - ar_h.put(tr_h); - r_h.put(tr_h); - - @(r_h.done); - data = tr_h.data_h.w; - rresp = tr_h.resp; - - endtask: basic_read - - - // -------------------------------------------------------------------- - // - task - basic_random_read_burst - ( - output logic [(8*N)-1:0] data[], - output logic [1:0] rresp - ); - - this.tr_h = new; - this.tr_h.basic_random_burst; - - ar_h.put(tr_h); - r_h.put(tr_h); - - @(r_h.done); - data = tr_h.data_h.w; - rresp = tr_h.resp; - - endtask: basic_random_read_burst - - - // -------------------------------------------------------------------- - // - task - basic_write - ( - input logic [(A-1):0] awaddr, - input logic [7:0] awlen, - input logic [(8*N)-1:0] data[], - output logic [1:0] bresp - ); - - this.tr_h = new; - this.tr_h.basic_write(awaddr, awlen); - - foreach(this.tr_h.payload_h.w[i]) - this.tr_h.payload_h.w[i] = data[i]; - - aw_h.put(tr_h); - w_h.put(tr_h); - b_h.put(tr_h); - - @(b_h.done); - bresp = tr_h.resp; - - endtask: basic_write - - - // -------------------------------------------------------------------- - // - task - basic_random_write_burst - ( - output logic [1:0] bresp - ); - - this.tr_h = new; - this.tr_h.basic_random_burst; - - aw_h.put(tr_h); - w_h.put(tr_h); - b_h.put(tr_h); - - @(b_h.done); - bresp = tr_h.resp; - - endtask: basic_random_write_burst - - - // -------------------------------------------------------------------- - // - endclass: axi4_master_bfm_class - - -// -------------------------------------------------------------------- -// -endpackage: axi4_bfm_pkg - - Index: trunk/axi4_lib/sim/src/tb_bfm.sv =================================================================== --- trunk/axi4_lib/sim/src/tb_bfm.sv (revision 49) +++ trunk/axi4_lib/sim/src/tb_bfm.sv (nonexistent) @@ -1,119 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_100mhz; - wire tb_clk = clk_100mhz; - wire tb_rst; - wire aclk = tb_clk; - wire aresetn = ~tb_rst; - - tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); - - - // -------------------------------------------------------------------- - // - localparam A = 32; - localparam N = 8; - - - // -------------------------------------------------------------------- - // - axi4_if #(.A(A), .N(N)) - axi4_bus(.*); - - axi4_checker #(.A(A), .N(N)) - axi4_in_check(.axi4_in(axi4_bus)); - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - // -------------------------------------------------------------------- - // - import axi4_simple_agent_pkg::*; - - - // -------------------------------------------------------------------- - // - axi4_master_bfm_if #(.A(A), .N(N)) - axi4_m(.axi4_s(axi4_bus), .*); - - axi4_slave_bfm_if #(.A(A), .N(N)) - axi4_s(.axi4_m(axi4_bus), .*); - - - // -------------------------------------------------------------------- - // - axi4_simple_agent_class bfm; - - initial - bfm = new(axi4_m, axi4_s); - - - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - - - // -------------------------------------------------------------------- - // test - the_test test( tb_clk, tb_rst ); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule - - - Index: trunk/axi4_lib/sim/src/axi4_bfm/axi4_slave_bfm_if.sv =================================================================== --- trunk/axi4_lib/sim/src/axi4_bfm/axi4_slave_bfm_if.sv (revision 49) +++ trunk/axi4_lib/sim/src/axi4_bfm/axi4_slave_bfm_if.sv (nonexistent) @@ -1,514 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -interface - axi4_slave_bfm_if - #( - A = 32, // address bus width - N = 8, // data bus width in bytes - I = 1 // ID width - ) - ( - axi4_if axi4_m, - input aresetn, - input aclk - ); - - logic [(A-1):0] araddr; - logic [1:0] arburst; - logic [3:0] arcache; - logic [(I-1):0] arid; - logic [7:0] arlen; - logic arlock; - logic [2:0] arprot; - logic [3:0] arqos; - logic arready; - logic [3:0] arregion; - logic [2:0] arsize; - logic arvalid; - logic [(A-1):0] awaddr; - logic [1:0] awburst; - logic [3:0] awcache; - logic [(I-1):0] awid; - logic [7:0] awlen; - logic awlock; - logic [2:0] awprot; - logic [3:0] awqos; - logic awready; - logic [3:0] awregion; - logic [2:0] awsize; - logic awvalid; - logic [(I-1):0] bid; - logic bready; - logic [1:0] bresp; - logic bvalid; - logic [(8*N)-1:0] rdata; - logic [(I-1):0] rid; - logic rlast; - logic rready; - logic [1:0] rresp; - logic rvalid; - logic [(8*N)-1:0] wdata; - logic [(I-1):0] wid; - logic wlast; - logic wready; - logic [N-1:0] wstrb; - logic wvalid; - - - // -------------------------------------------------------------------- - // - default clocking cb @(posedge aclk); - input arid; - input araddr; - input arburst; - input arcache; - input awid; - input arlen; - input arlock; - input arprot; - input arqos; - output arready; - input arregion; - input arsize; - input arvalid; - input awaddr; - input awburst; - input awcache; - input awlen; - input awlock; - input awprot; - input awqos; - output awready; - input awregion; - input awsize; - input awvalid; - input bready; - output bid; - output bresp; - output bvalid; - output rdata; - output rid; - output rlast; - input rready; - output rresp; - output rvalid; - input wdata; - input wid; - input wlast; - output wready; - input wstrb; - input wvalid; - input aresetn; - input aclk; - endclocking - - - // -------------------------------------------------------------------- - // - assign arid = axi4_m.arid; - assign araddr = axi4_m.araddr; - assign arburst = axi4_m.arburst; - assign arcache = axi4_m.arcache; - assign awid = axi4_m.awid; - assign arlen = axi4_m.arlen; - assign arlock = axi4_m.arlock; - assign arprot = axi4_m.arprot; - assign arqos = axi4_m.arqos; - assign axi4_m.arready = arready; - assign arregion = axi4_m.arregion; - assign arsize = axi4_m.arsize; - assign arvalid = axi4_m.arvalid; - assign awaddr = axi4_m.awaddr; - assign awburst = axi4_m.awburst; - assign awcache = axi4_m.awcache; - assign awlen = axi4_m.awlen; - assign awlock = axi4_m.awlock; - assign awprot = axi4_m.awprot; - assign awqos = axi4_m.awqos; - assign axi4_m.awready = awready; - assign awregion = axi4_m.awregion; - assign awsize = axi4_m.awsize; - assign awvalid = axi4_m.awvalid; - assign bready = axi4_m.bready; - assign axi4_m.bid = bid; - assign axi4_m.bresp = bresp; - assign axi4_m.bvalid = bvalid; - assign axi4_m.rdata = rdata; - assign axi4_m.rid = rid; - assign axi4_m.rlast = rlast; - assign rready = axi4_m.rready; - assign axi4_m.rresp = rresp; - assign axi4_m.rvalid = rvalid; - assign wdata = axi4_m.wdata; - assign wlast = axi4_m.wlast; - assign axi4_m.wready = wready; - assign wstrb = axi4_m.wstrb; - assign wvalid = axi4_m.wvalid; - - - // -------------------------------------------------------------------- - // - function void - ar_default; - - cb.arready <= 0; - - endfunction: ar_default - - - // -------------------------------------------------------------------- - // - function void - aw_default; - - cb.awready <= 0; - - endfunction: aw_default - - - // -------------------------------------------------------------------- - // - function void - r_default; - - cb.rdata <= 'bx; - cb.rid <= 'bx; - cb.rlast <= 'bx; - cb.rresp <= 0; - cb.rvalid <= 0; - - endfunction: r_default - - - // -------------------------------------------------------------------- - // - function void - w_default; - - cb.wready <= 0; - - endfunction: w_default - - - // -------------------------------------------------------------------- - // - function void - b_default; - - cb.bid <= 0; - cb.bresp <= 0; - cb.bvalid <= 0; - - endfunction: b_default - - - // -------------------------------------------------------------------- - // - function void - init; - - ar_default(); - r_default(); - aw_default(); - w_default(); - b_default(); - - endfunction: init - - - // -------------------------------------------------------------------- - // - task - zero_cycle_delay; - - ##0; - - endtask: zero_cycle_delay - - - // -------------------------------------------------------------------- - // - import tb_bfm_pkg::*; - import axi4_transaction_pkg::*; - - - // -------------------------------------------------------------------- - // - class r_slave_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - foreach(tr_h.payload_h.w[i]) - begin - ##(tr_h.delay_h.next()); - - cb.rdata <= tr_h.payload_h.w[i]; - cb.rresp <= tr_h.resp; - cb.rid <= tr_h.id; - - if(i < tr_h.payload_h.w.size - 1) - cb.rlast <= 0; - else - cb.rlast <= 1; - - cb.rvalid <= 1; - ##1; - - wait(cb.rready); - ##0; - - $display("^^^ %16.t | %m | slave R transaction | %d | 0x%016x |", $time, i, tr_h.payload_h.w[i]); - r_default(); - end - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: r_slave_transaction_class - - - // -------------------------------------------------------------------- - // - r_slave_transaction_class #(.A(A), .N(N), .I(I)) r_h; - - class ar_slave_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - ##(tr_h.delay_h.next()); - - cb.arready <= 1; - ##1; - - wait(cb.arvalid); - - ##0; - r_h.put(tr_h); - ar_default(); - - $display("^^^ %16.t | %m | slave AR transaction @ 0x%08x | 0x%016x |", $time, tr_h.addr, tr_h.payload_h.w[0]); - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: ar_slave_transaction_class - - - // -------------------------------------------------------------------- - // - class aw_slave_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - semaphore aw_semaphore; - - - //-------------------------------------------------------------------- - function new; - - super.new(); - this.aw_semaphore = new(0); - - endfunction: new - - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - ##(tr_h.delay_h.next()); - - cb.awready <= 1; - ##1; - - wait(cb.awvalid); - - ##0; - this.aw_semaphore.put(); - aw_default(); - - $display("^^^ %16.t | %m | slave AW transaction @ 0x%08x | 0x%016x |", $time, tr_h.addr, tr_h.payload_h.w[0]); - - ->this.done; - - endtask: transaction - - // -------------------------------------------------------------------- - // - endclass: aw_slave_transaction_class - - - // -------------------------------------------------------------------- - // - aw_slave_transaction_class #(.A(A), .N(N), .I(I)) aw_h; - - class b_slave_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - // Error: AXI4_ERRS_BRESP_AW: A slave must not give a write response before the write address. - // Spec: section A3.3.1 and figure A3-7. - aw_h.aw_semaphore.get(); // better way to do this??? - - ##(tr_h.delay_h.next()); - - cb.bresp <= tr_h.resp; - cb.bid <= tr_h.id; - - cb.bvalid <= 1; - ##1; - - wait(cb.bready); - ##0; - - $display("^^^ %16.t | %m | slave B transaction |", $time); - b_default(); - - ->this.done; - - endtask: transaction - - // -------------------------------------------------------------------- - // - endclass: b_slave_transaction_class - - - // -------------------------------------------------------------------- - // - b_slave_transaction_class #(.A(A), .N(N), .I(I)) b_h; - - class w_slave_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - tr_h.data_h = new(tr_h.len); - - foreach(tr_h.payload_h.w[i]) - begin - ##(tr_h.delay_h.next()); - - cb.wready <= 1; - ##1; - - wait(cb.wvalid); - ##0; - - tr_h.data_h.w[i] <= cb.wdata; - $display("^^^ %16.t | %m | slave W transaction | %d | 0x%016x |", $time, i, cb.wdata); - w_default(); - end - - b_h.put(tr_h); - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: w_slave_transaction_class - - - // -------------------------------------------------------------------- - // - ar_slave_transaction_class #(.A(A), .N(N), .I(I)) ar_h; - w_slave_transaction_class #(.A(A), .N(N), .I(I)) w_h; - - initial - begin - init(); - ar_h = new; - ar_h.init(); - r_h = new; - r_h.init(); - aw_h = new; - aw_h.init(); - w_h = new; - w_h.init(); - b_h = new; - b_h.init(); - end - - -// -------------------------------------------------------------------- -// - -endinterface - - Index: trunk/axi4_lib/sim/src/axi4_bfm/axi4_master_bfm_if.sv =================================================================== --- trunk/axi4_lib/sim/src/axi4_bfm/axi4_master_bfm_if.sv (revision 49) +++ trunk/axi4_lib/sim/src/axi4_bfm/axi4_master_bfm_if.sv (nonexistent) @@ -1,526 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -interface - axi4_master_bfm_if - #( - A = 32, // address bus width - N = 8, // data bus width in bytes - I = 1 // ID width - ) - ( - axi4_if axi4_s, - input aresetn, - input aclk - ); - - logic [(A-1):0] araddr; - logic [1:0] arburst; - logic [3:0] arcache; - logic [(I-1):0] arid; - logic [7:0] arlen; - logic arlock; - logic [2:0] arprot; - logic [3:0] arqos; - logic arready; - logic [3:0] arregion; - logic [2:0] arsize; - logic arvalid; - logic [(A-1):0] awaddr; - logic [1:0] awburst; - logic [3:0] awcache; - logic [(I-1):0] awid; - logic [7:0] awlen; - logic awlock; - logic [2:0] awprot; - logic [3:0] awqos; - logic awready; - logic [3:0] awregion; - logic [2:0] awsize; - logic awvalid; - logic [(I-1):0] bid; - logic bready; - logic [1:0] bresp; - logic bvalid; - logic [(8*N)-1:0] rdata; - logic [(I-1):0] rid; - logic rlast; - logic rready; - logic [1:0] rresp; - logic rvalid; - logic [(8*N)-1:0] wdata; - logic [(I-1):0] wid; - logic wlast; - logic wready; - logic [N-1:0] wstrb; - logic wvalid; - - - // -------------------------------------------------------------------- - // - default clocking cb @(posedge aclk); - output arid; - output araddr; - output arburst; - output arcache; - output awid; - output arlen; - output arlock; - output arprot; - output arqos; - input arready; - output arregion; - output arsize; - output arvalid; - output awaddr; - output awburst; - output awcache; - output awlen; - output awlock; - output awprot; - output awqos; - input awready; - output awregion; - output awsize; - output awvalid; - output bready; - input bid; - input bresp; - input bvalid; - input rdata; - input rid; - input rlast; - output rready; - input rresp; - input rvalid; - output wdata; - output wlast; - input wready; - output wstrb; - output wvalid; - input aresetn; - input aclk; - endclocking - - - // -------------------------------------------------------------------- - // - assign axi4_s.arid = arid; - assign axi4_s.araddr = araddr; - assign axi4_s.arburst = arburst; - assign axi4_s.arcache = arcache; - assign axi4_s.awid = awid; - assign axi4_s.arlen = arlen; - assign axi4_s.arlock = arlock; - assign axi4_s.arprot = arprot; - assign axi4_s.arqos = arqos; - assign arready = axi4_s.arready; - assign axi4_s.arregion = arregion; - assign axi4_s.arsize = arsize; - assign axi4_s.arvalid = arvalid; - assign axi4_s.awaddr = awaddr; - assign axi4_s.awburst = awburst; - assign axi4_s.awcache = awcache; - assign axi4_s.awlen = awlen; - assign axi4_s.awlock = awlock; - assign axi4_s.awprot = awprot; - assign axi4_s.awqos = awqos; - assign awready = axi4_s.awready; - assign axi4_s.awregion = awregion; - assign axi4_s.awsize = awsize; - assign axi4_s.awvalid = awvalid; - assign axi4_s.bready = bready; - assign bid = axi4_s.bid; - assign bresp = axi4_s.bresp; - assign bvalid = axi4_s.bvalid; - assign rdata = axi4_s.rdata; - assign rid = axi4_s.rid; - assign rlast = axi4_s.rlast; - assign axi4_s.rready = rready; - assign rresp = axi4_s.rresp; - assign rvalid = axi4_s.rvalid; - assign axi4_s.wdata = wdata; - assign axi4_s.wlast = wlast; - assign wready = axi4_s.wready; - assign axi4_s.wstrb = wstrb; - assign axi4_s.wvalid = wvalid; - - - // -------------------------------------------------------------------- - // - function void - ar_default; - - cb.araddr <= 'bx; - cb.arburst <= 'bx; - cb.arcache <= 'bx; - cb.arid <= 'bx; - cb.arlen <= 'bx; - cb.arlock <= 'bx; - cb.arprot <= 'bx; - cb.arqos <= 'bx; - cb.arregion <= 'bx; - cb.arsize <= 'bx; - cb.arvalid <= 0; - - endfunction: ar_default - - - // -------------------------------------------------------------------- - // - function void - aw_default; - - cb.awaddr <= 'bx; - cb.awburst <= 'bx; - cb.awcache <= 'bx; - cb.awid <= 'bx; - cb.awlen <= 'bx; - cb.awlock <= 'bx; - cb.awprot <= 'bx; - cb.awqos <= 'bx; - cb.awregion <= 'bx; - cb.awsize <= 'bx; - cb.awvalid <= 0; - - endfunction: aw_default - - - // -------------------------------------------------------------------- - // - function void - r_default; - - cb.rready <= 0; - - endfunction: r_default - - - // -------------------------------------------------------------------- - // - function void - w_default; - - cb.wdata <= 'bx; - cb.wlast <= 'bx; - cb.wstrb <= {N{1'b1}}; - cb.wvalid <= 0; - - endfunction: w_default - - - // -------------------------------------------------------------------- - // - function void - b_default; - - cb.bready <= 0; - - endfunction: b_default - - - // -------------------------------------------------------------------- - // - function void - init; - - ar_default(); - r_default(); - aw_default(); - w_default(); - b_default(); - - endfunction: init - - - // -------------------------------------------------------------------- - // - task - zero_cycle_delay; - - ##0; - - endtask: zero_cycle_delay - - - // -------------------------------------------------------------------- - // - import tb_bfm_pkg::*; - import axi4_transaction_pkg::*; - - - // -------------------------------------------------------------------- - // - class ar_master_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - ##(tr_h.delay_h.next()); - - cb.araddr <= tr_h.addr; - cb.arid <= tr_h.id; - cb.arlen <= tr_h.len; - cb.arsize <= tr_h.size; - - cb.arburst <= tr_h.burst; - cb.arcache <= tr_h.cache; - cb.arlock <= tr_h.lock; - cb.arprot <= tr_h.prot; - cb.arqos <= tr_h.qos; - cb.arregion <= tr_h.region; - cb.arvalid <= 1; - - $display("^^^ %16.t | %m | master AR transaction @ 0x%08x |", $time, tr_h.addr); - - ##1; - wait(cb.arready); - - ##0; - ar_default(); - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: ar_master_transaction_class - - - // -------------------------------------------------------------------- - // - class r_master_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - tr_h.data_h = new(tr_h.len); - - foreach(tr_h.payload_h.w[i]) - begin - ##(tr_h.delay_h.next()); - cb.rready <= 1; - ##1; - - wait(cb.rvalid); - ##0; - - tr_h.data_h.w[i] = cb.rdata; - - $display("^^^ %16.t | %m | master R transaction | %d | 0x%016x |", $time, i, tr_h.data_h.w[i]); - r_default(); - end - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: r_master_transaction_class - - - // -------------------------------------------------------------------- - // - class aw_master_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - ##(tr_h.delay_h.next()); - - cb.awaddr <= tr_h.addr; - cb.awid <= tr_h.id; - cb.awlen <= tr_h.len; - cb.awsize <= tr_h.size; - - cb.awburst <= tr_h.burst; - cb.awcache <= tr_h.cache; - cb.awlock <= tr_h.lock; - cb.awprot <= tr_h.prot; - cb.awqos <= tr_h.qos; - cb.awregion <= tr_h.region; - cb.awvalid <= 1; - - $display("^^^ %16.t | %m | master AW transaction @ 0x%08x |", $time, tr_h.addr); - - ##1; - wait(cb.awready); - - ##0; - aw_default(); - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: aw_master_transaction_class - - - // -------------------------------------------------------------------- - // - class w_master_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - foreach(tr_h.payload_h.w[i]) - begin - ##(tr_h.delay_h.next()); - - cb.wdata <= tr_h.payload_h.w[i]; - // cb.wstrb <= tr_h.strb; // need to fix - - if(i < tr_h.payload_h.w.size - 1) - cb.wlast <= 0; - else - cb.wlast <= 1; - - cb.wvalid <= 1; - - ##1; - wait(cb.wready); - - ##0; - $display("^^^ %16.t | %m | master W transaction | %d | 0x%016x |", $time, i, tr_h.payload_h.w[i]); - w_default(); - end - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: w_master_transaction_class - - - // -------------------------------------------------------------------- - // - class b_master_transaction_class #(A = 32, N = 8, I = 1) - extends tb_blocking_transaction_q_class #(axi4_transaction_class #(.A(A), .N(N), .I(I))); - - // -------------------------------------------------------------------- - // - task automatic - transaction - ( - ref T tr_h - ); - - ->this.start; - - ##(tr_h.delay_h.next()); - cb.bready <= 1; - ##1; - - wait(cb.bvalid); - ##0; - - $display("^^^ %16.t | %m | master B transaction | 0x%x |", $time, cb.bresp); - b_default(); - - ->this.done; - - endtask: transaction - - - // -------------------------------------------------------------------- - // - endclass: b_master_transaction_class - - - // -------------------------------------------------------------------- - // - ar_master_transaction_class #(.A(A), .N(N), .I(I)) ar_h; - r_master_transaction_class #(.A(A), .N(N), .I(I)) r_h; - aw_master_transaction_class #(.A(A), .N(N), .I(I)) aw_h; - w_master_transaction_class #(.A(A), .N(N), .I(I)) w_h; - b_master_transaction_class #(.A(A), .N(N), .I(I)) b_h; - - initial - begin - init(); - ar_h = new; - ar_h.init(); - r_h = new; - r_h.init(); - aw_h = new; - aw_h.init(); - w_h = new; - w_h.init(); - b_h = new; - b_h.init(); - end - - -// -------------------------------------------------------------------- -// - -endinterface - - Index: trunk/axi4_lib/sim/src/axi4_bfm/axi4_transaction_pkg.sv =================================================================== --- trunk/axi4_lib/sim/src/axi4_bfm/axi4_transaction_pkg.sv (revision 49) +++ trunk/axi4_lib/sim/src/axi4_bfm/axi4_transaction_pkg.sv (nonexistent) @@ -1,253 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package axi4_transaction_pkg; - - // -------------------------------------------------------------------- - // - class axi4_delay_class; - - rand int unsigned delay; - - - // -------------------------------------------------------------------- - // - function int unsigned - next; - - assert(this.randomize() with{delay dist {0 := 40, [1:3] := 40, [4:7] := 20};}); - return(delay); - - endfunction: next - - - // -------------------------------------------------------------------- - // - endclass: axi4_delay_class - - - // -------------------------------------------------------------------- - // - class axi4_payload_class #(N = 8); - - rand logic [(8*N)-1:0] w[]; - - - // -------------------------------------------------------------------- - // - function - new - ( - logic [7:0] len = 0 - ); - - this.w = new[len + 1]; - - endfunction: new - - - // -------------------------------------------------------------------- - // - function void - random - ( - logic [7:0] len = 0 - ); - - this.w = new[len + 1]; - assert(this.randomize()); - - endfunction: random - - - // -------------------------------------------------------------------- - // - endclass: axi4_payload_class - - - // -------------------------------------------------------------------- - // - class axi4_transaction_class #(A = 32, N = 8, I = 1); - - axi4_delay_class delay_h; - axi4_payload_class #(.N(N)) payload_h; - axi4_payload_class #(.N(N)) data_h; - rand logic [(A-1):0] addr = 'bz; - rand logic [1:0] burst = 2'b01; - rand logic [7:0] len = 0; - rand logic [2:0] size = $clog2(N); - rand logic [(I-1):0] id = 0; - rand logic [1:0] resp = 0; - - logic [3:0] cache = 0; - logic lock = 0; - logic [2:0] prot = 0; - logic [3:0] qos = 0; - logic [3:0] region = 0; - - constraint default_len - { - len dist {0 := 40, [1:15] := 40, [16:255] := 20}; - } - - - // -------------------------------------------------------------------- - // - function - new - ( - logic [7:0] len = 0 - ); - - this.payload_h = new(len + 1); - this.delay_h = new; - - endfunction: new - - - // -------------------------------------------------------------------- - // - function void - basic_random; - - assert(this.randomize() with - { - this.id == 0; - this.resp == 0; - this.burst == 2'b01; - this.len == 0; - this.size == $clog2(N); - }); - - this.payload_h.random(this.len); - - endfunction: basic_random - - - // -------------------------------------------------------------------- - // - function void - basic_random_burst; - - assert(this.randomize() with - { - this.addr[$clog2(N*8)-1:0] == 0; - this.id == 0; - this.resp == 0; - this.burst == 2'b01; - this.size == $clog2(N); - this.len dist {0 := 40, [1:3] := 40, [4:15] := 20}; - }); - - this.payload_h.random(this.len); - - endfunction: basic_random_burst - - - // -------------------------------------------------------------------- - // - function void - basic_read - ( - logic [(A-1):0] addr, - logic [7:0] len = 0 - ); - - this.id = 0; - this.resp = 0; - this.burst = 2'b01; - this.size = $clog2(N); - this.addr = addr; - this.len = len; - this.payload_h.random(len); - - endfunction: basic_read - - - // -------------------------------------------------------------------- - // - function void - basic_write - ( - logic [(A-1):0] addr, - logic [7:0] len = 0 - ); - - this.id = 0; - this.resp = 0; - this.burst = 2'b01; - this.size = $clog2(N); - this.addr = addr; - this.len = len; - this.payload_h.random(len); - - endfunction: basic_write - - - // -------------------------------------------------------------------- - // - function void copy - ( - axi4_transaction_class #(.A(A), .N(N), .I(I)) from - ); - - this.addr = from.addr; - this.burst = from.burst; - this.len = from.len; - this.size = from.size; - this.id = from.id; - this.resp = from.resp; - this.cache = from.cache; - this.lock = from.lock; - this.prot = from.prot; - this.qos = from.qos; - this.region = from.region; - - endfunction: copy - - - // -------------------------------------------------------------------- - // - virtual function axi4_transaction_class #(.A(A), .N(N), .I(I)) clone; - - clone = new(); - clone.copy(this); - return(clone); - - endfunction: clone - - - // -------------------------------------------------------------------- - // - endclass: axi4_transaction_class - - -// -------------------------------------------------------------------- -// -endpackage: axi4_transaction_pkg - Index: trunk/axi4_lib/sim/src/axi4_bfm/axi4_simple_agent_pkg.sv =================================================================== --- trunk/axi4_lib/sim/src/axi4_bfm/axi4_simple_agent_pkg.sv (revision 49) +++ trunk/axi4_lib/sim/src/axi4_bfm/axi4_simple_agent_pkg.sv (nonexistent) @@ -1,153 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package axi4_simple_agent_pkg; - - // -------------------------------------------------------------------- - // - import axi4_transaction_pkg::*; - - - // -------------------------------------------------------------------- - // - class axi4_simple_agent_class #(A = 32, N = 8, I = 1); - - axi4_transaction_class tr_h; - virtual axi4_master_bfm_if #(.A(A), .N(N), .I(I)) axi4_m; - virtual axi4_slave_bfm_if #(.A(A), .N(N), .I(I)) axi4_s; - - - //-------------------------------------------------------------------- - function new - ( - virtual axi4_master_bfm_if #(.A(A), .N(N), .I(I)) axi4_m, - virtual axi4_slave_bfm_if #(.A(A), .N(N), .I(I)) axi4_s - ); - - this.axi4_m = axi4_m; - this.axi4_s = axi4_s; - - endfunction: new - - - // -------------------------------------------------------------------- - // - task - basic_read - ( - input logic [(A-1):0] araddr, - input logic [7:0] arlen, - output logic [(8*N)-1:0] data[], - output logic [1:0] rresp - ); - - this.tr_h = new; - this.tr_h.basic_read(araddr, arlen); - - axi4_m.ar_h.put(tr_h); - axi4_s.ar_h.put(tr_h); - axi4_m.r_h.put(tr_h); - - @(axi4_m.r_h.done); - data = tr_h.data_h.w; - rresp = tr_h.resp; - - endtask: basic_read - - - // -------------------------------------------------------------------- - // - task - basic_write - ( - input logic [(A-1):0] awaddr, - input logic [7:0] awlen, - input logic [(8*N)-1:0] data[], - output logic [1:0] bresp - ); - - this.tr_h = new; - this.tr_h.basic_write(awaddr, awlen); - - foreach(this.tr_h.payload_h.w[i]) - this.tr_h.payload_h.w[i] = data[i]; - - axi4_m.aw_h.put(tr_h); - axi4_s.aw_h.put(tr_h); - axi4_m.w_h.put(tr_h); - axi4_s.w_h.put(tr_h); - axi4_m.b_h.put(tr_h); - - @(axi4_s.b_h.done); - bresp = tr_h.resp; - - endtask: basic_write - - - // -------------------------------------------------------------------- - // - task - basic_random_write - ( - input logic [(A-1):0] awaddr, - input logic [7:0] awlen, - output logic [1:0] bresp - ); - - this.tr_h = new; - this.tr_h.basic_write(awaddr, awlen); - - axi4_m.aw_h.put(tr_h); - axi4_s.aw_h.put(tr_h); - axi4_m.w_h.put(tr_h); - axi4_s.w_h.put(tr_h); - axi4_m.b_h.put(tr_h); - - @(axi4_s.b_h.done); - bresp = tr_h.resp; - - endtask: basic_random_write - - - // -------------------------------------------------------------------- - // - function void - init; - - endfunction: init - - - // -------------------------------------------------------------------- - // - endclass: axi4_simple_agent_class - - -// -------------------------------------------------------------------- -// -endpackage: axi4_simple_agent_pkg - Index: trunk/axi4_lib/sim/src/tb_axi4_memory.sv =================================================================== --- trunk/axi4_lib/sim/src/tb_axi4_memory.sv (revision 49) +++ trunk/axi4_lib/sim/src/tb_axi4_memory.sv (nonexistent) @@ -1,129 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_100mhz; - wire tb_clk = clk_100mhz; - wire tb_rst; - wire aclk = tb_clk; - wire aresetn = ~tb_rst; - - tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); - - - // -------------------------------------------------------------------- - // - localparam A = 32; - localparam N = 8; - - - // -------------------------------------------------------------------- - // - axi4_if #(.A(A), .N(N)) - axi4_s(.*); - - - // -------------------------------------------------------------------- - // - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - // -------------------------------------------------------------------- - // - axi4_checker #(.A(A), .N(N)) - axi4_s_check(.axi4_in(axi4_s)); - - - // // -------------------------------------------------------------------- - // // - // axi4_master_bfm_if #(.A(A), .N(N)) - // tb_axi4_m(.axi4_s(axi4_s), .*); - - - // -------------------------------------------------------------------- - // - import axi4_bfm_pkg::*; - - axi4_master_bfm_class bfm; - - initial - bfm = new(axi4_s); - - - // -------------------------------------------------------------------- - // - import axi4_memory_pkg::*; - - axi4_memory_class axi4_memory; - - initial - axi4_memory = new(axi4_s); - - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - - - // -------------------------------------------------------------------- - // test - the_test test( tb_clk, tb_rst ); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule - - - Index: trunk/axi4_lib/sim/src/tb_axi4_to_axis_agent_class_pkg.sv =================================================================== --- trunk/axi4_lib/sim/src/tb_axi4_to_axis_agent_class_pkg.sv (revision 49) +++ trunk/axi4_lib/sim/src/tb_axi4_to_axis_agent_class_pkg.sv (nonexistent) @@ -1,130 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package tb_axi4_to_axis_agent_class_pkg; - - // -------------------------------------------------------------------- - // - import axi4_memory_pkg::*; - import axis_bfm_pkg::*; - - - // -------------------------------------------------------------------- - // - class tb_axi4_to_axis_agent_class #(N, A, I, D, U); - - axi4_memory_class #(A, N, I) m_h; - axis_rx_bfm_class #(N, I, D, U) s_h; - memory_tr_class #(A, N, I) m_tr_h, m_tr_clone_h; - axis_tr_class #(N, I, D, U) s_tr_h; - - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m; - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out; - - mailbox #(memory_tr_class #(A, N, I)) q; - - - // -------------------------------------------------------------------- - // - task wait_for_sof; - @(posedge axis_out.cb_s.tuser); - $display("^^^ %16.t | %m", $time); - endtask: wait_for_sof - - - // -------------------------------------------------------------------- - // - task random_transaction(int addr, int size); - m_tr_h = new(); - m_tr_h.random(addr, size); - m_tr_clone_h = m_tr_h.clone(); - q.put(m_tr_clone_h); - m_h.load_words(addr, m_tr_h.data); - endtask: random_transaction - - - // -------------------------------------------------------------------- - // - task automatic - compare; - - $display("^^^ %16.t | %m", $time); - $display("^^^ %16.t | q.num = %d", $time, q.num); - $display("^^^ %16.t | s_h.q.num = %d", $time, s_h.q.num); - $display("^^^ %16.t | m_tr_h.data.size = %d", $time, m_tr_h.data.size); - - q.get(m_tr_h); - - for(int i = 0; i < m_tr_h.data.size; i += N) - begin - if(s_h.q.try_get(s_tr_h) == 0) - begin - $display("!!! %16.t | ERROR!!! try_get(s_tr_h) == 0", $time); - break; - end - - for(int k = 0; k < N; k++) - begin - if(s_tr_h.tdata[k*8 +: 8] != m_tr_h.data[i + k]) - begin - $display("!!! %16.t | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", $time); - $display("!!! %16.t | ERROR!!! mismatch | i = %d | k = %d", $time, i, k); - $display("!!! %16.t | %x | %x |", $time, s_tr_h.tdata[k*8 +: 8], m_tr_h.data[i + k]); - $stop; - end - end - end - - $display("^^^ %16.t | %m | done!", $time); - - endtask: compare - - - //-------------------------------------------------------------------- - // - function new - ( - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m, - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out - ); - - this.axi4_m = axi4_m; - this.axis_out = axis_out; - m_h = new(axi4_m); - s_h = new(axis_out); - q = new(); - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: tb_axi4_to_axis_agent_class - -// -------------------------------------------------------------------- -// -endpackage: tb_axi4_to_axis_agent_class_pkg Index: trunk/axi4_lib/sim/src/tb_register_slice.sv =================================================================== --- trunk/axi4_lib/sim/src/tb_register_slice.sv (revision 49) +++ trunk/axi4_lib/sim/src/tb_register_slice.sv (nonexistent) @@ -1,133 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_100mhz; - wire tb_clk = clk_100mhz; - wire tb_rst; - wire aclk = tb_clk; - wire aresetn = ~tb_rst; - - tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); - - - // -------------------------------------------------------------------- - // - localparam A = 32; - localparam N = 8; - - - // -------------------------------------------------------------------- - // - axi4_if #(.A(A), .N(N)) - axi4_s(.*); - - axi4_if #(.A(A), .N(N)) - axi4_m(.*); - - - // -------------------------------------------------------------------- - // - axi4_register_slice #(.A(A), .N(N)) - dut(.*); - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - // -------------------------------------------------------------------- - // - axi4_checker #(.A(A), .N(N)) - axi4_s_check(.axi4_in(axi4_s)); - - axi4_checker #(.A(A), .N(N)) - axi4_m_check(.axi4_in(axi4_m)); - - - // -------------------------------------------------------------------- - // - import axi4_simple_agent_pkg::*; - - - // -------------------------------------------------------------------- - // - axi4_master_bfm_if #(.A(A), .N(N)) - tb_axi4_m(.axi4_s(axi4_s), .*); - - axi4_slave_bfm_if #(.A(A), .N(N)) - tb_axi4_s(.axi4_m(axi4_m), .*); - - - // -------------------------------------------------------------------- - // - axi4_simple_agent_class bfm; - - initial - bfm = new(tb_axi4_m, tb_axi4_s); - - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - - - // -------------------------------------------------------------------- - // test - the_test test( tb_clk, tb_rst ); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule - - - Index: trunk/axi4_lib/sim/src/axi4_models/axi4_arbiter_pkg.sv =================================================================== --- trunk/axi4_lib/sim/src/axi4_models/axi4_arbiter_pkg.sv (revision 49) +++ trunk/axi4_lib/sim/src/axi4_models/axi4_arbiter_pkg.sv (nonexistent) @@ -1,474 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package axi4_arbiter_pkg; - - // -------------------------------------------------------------------- - // - import axi4_models_pkg::*; - import bfm_pkg::*; - import logger_pkg::*; - - - // -------------------------------------------------------------------- - // - virtual class base_request_class #(A, N, I); - - string kind; - int id = -1; - - //-------------------------------------------------------------------- - // - pure virtual function void write_ax_if(axi4_channel_if_class #(A, N, I) channel); - pure virtual function void copy_ax_if(axi4_channel_if_class #(A, N, I) channel); - - - // -------------------------------------------------------------------- - // - endclass: base_request_class - - - // -------------------------------------------------------------------- - // - class write_request_class #(A, N, I) - extends base_request_class #(A, N, I); - - logic [(A-1):0] awaddr; - logic [1:0] awburst; - logic [(I-1):0] awid; - logic [7:0] awlen; - logic [2:0] awsize; - logic [3:0] awcache; - logic awlock; - logic [2:0] awprot; - logic [3:0] awqos; - logic [3:0] awregion; - - - // -------------------------------------------------------------------- - // - function void write_ax_if(axi4_channel_if_class #(A, N, I) channel); - axi4_aw_if_class #(A, N, I) aw_if_h; - $cast(aw_if_h, channel); - aw_if_h.awaddr = awaddr; - aw_if_h.awburst = awburst; - aw_if_h.awid = awid; - aw_if_h.awlen = awlen; - aw_if_h.awsize = awsize; - aw_if_h.awcache = awcache; - aw_if_h.awlock = awlock; - aw_if_h.awprot = awprot; - aw_if_h.awqos = awqos; - aw_if_h.awregion = awregion; - endfunction: write_ax_if - - - // -------------------------------------------------------------------- - // - function void copy_ax_if(axi4_channel_if_class #(A, N, I) channel); - axi4_aw_if_class #(A, N, I) aw_if_h; - $cast(aw_if_h, channel); - awaddr = aw_if_h.awaddr; - awburst = aw_if_h.awburst; - awid = aw_if_h.awid; - awlen = aw_if_h.awlen; - awsize = aw_if_h.awsize; - awcache = aw_if_h.awcache; - awlock = aw_if_h.awlock; - awprot = aw_if_h.awprot; - awqos = aw_if_h.awqos; - awregion = aw_if_h.awregion; - endfunction: copy_ax_if - - - //-------------------------------------------------------------------- - function new(int id); - super.new; - this.kind = "WRITE"; - this.id = id; - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: write_request_class - - - // -------------------------------------------------------------------- - // - class read_request_class #(A, N, I) - extends base_request_class #(A, N, I); - - logic [(A-1):0] araddr; - logic [1:0] arburst; - logic [(I-1):0] arid; - logic [7:0] arlen; - logic [2:0] arsize; - logic [3:0] arcache; - logic arlock; - logic [2:0] arprot; - logic [3:0] arqos; - logic [3:0] arregion; - - // -------------------------------------------------------------------- - // - function void write_ax_if(axi4_channel_if_class #(A, N, I) channel); - axi4_ar_if_class #(A, N, I) ar_if_h; - $cast(ar_if_h, channel); - ar_if_h.araddr = araddr; - ar_if_h.arburst = arburst; - ar_if_h.arid = arid; - ar_if_h.arlen = arlen; - ar_if_h.arsize = arsize; - ar_if_h.arcache = arcache; - ar_if_h.arlock = arlock; - ar_if_h.arprot = arprot; - ar_if_h.arqos = arqos; - ar_if_h.arregion = arregion; - endfunction: write_ax_if - - - // -------------------------------------------------------------------- - // - function void copy_ax_if(axi4_channel_if_class #(A, N, I) channel); - axi4_ar_if_class #(A, N, I) ar_if_h; - $cast(ar_if_h, channel); - araddr = ar_if_h.araddr; - arburst = ar_if_h.arburst; - arid = ar_if_h.arid; - arlen = ar_if_h.arlen; - arsize = ar_if_h.arsize; - arcache = ar_if_h.arcache; - arlock = ar_if_h.arlock; - arprot = ar_if_h.arprot; - arqos = ar_if_h.arqos; - arregion = ar_if_h.arregion; - endfunction: copy_ax_if - - - //-------------------------------------------------------------------- - function new(int id); - super.new; - this.kind = "READ"; - this.id = id; - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: read_request_class - - - // -------------------------------------------------------------------- - // - class requester_class #(A, N, I) - extends axi4_slave_model_class #(A, N, I); - - mailbox #(base_request_class #(A, N, I)) q; - semaphore read_done; - semaphore write_done; - int id = -1; - logger_class log; - - - // -------------------------------------------------------------------- - // - task automatic run_read_interface; - read_request_class #(A, N, I) r_req_h; - read_done = new; - forever - @(axi4_s.cb_s) - begin - ar_q_h.q.get(ar_if_h); - log.debug($sformatf("%m | start")); - log.debug($sformatf("%m | araddr = 0x%h", ar_if_h.araddr)); - log.debug($sformatf("%m | arlen = 0x%h", ar_if_h.arlen)); - r_req_h = new(id); - r_req_h.copy_ax_if(ar_if_h); - q.put(r_req_h); - read_done.get(); - log.debug($sformatf("%m | done")); - end - endtask: run_read_interface - - - // -------------------------------------------------------------------- - // - task run_write_interface; - write_request_class #(A, N, I) w_req_h; - write_done = new; - forever - @(axi4_s.cb_s) - begin - aw_q_h.q.get(aw_if_h); - log.debug($sformatf("%m | start")); - log.debug($sformatf("%m | awaddr = 0x%h", aw_if_h.awaddr)); - log.debug($sformatf("%m | awlen = 0x%h", aw_if_h.awlen)); - w_req_h = new(id); - w_req_h.copy_ax_if(aw_if_h); - q.put(w_req_h); - write_done.get(); - log.debug($sformatf("%m | done")); - end - endtask: run_write_interface - - - // -------------------------------------------------------------------- - // - task run_model; - wait(axi4_s.cb_s.aresetn); - axi4_s.zero_cycle_delay(); - - aw_q_h.run_q(); - w_q_h.run_q(); - b_q_h.run_q(); - ar_q_h.run_q(); - r_q_h.run_q(); - - fork - run_read_interface(); - join_none - - fork - run_write_interface(); - join_none - - endtask: run_model - - - //-------------------------------------------------------------------- - function new(int id, virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_s); - super.new(axi4_s); - this.aw_q_h = new(axi4_s, 2); - this.w_q_h = new(axi4_s, 16); - this.b_q_h = new(axi4_s, 2); - this.ar_q_h = new(axi4_s, 2); - this.r_q_h = new(axi4_s, 16); - this.id = id; - this.q = new(1); - this.log = new(); - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: requester_class - - - // -------------------------------------------------------------------- - // - class axi4_granter_class #(A, N, I) - extends axi4_master_model_class #(A, N, I); - - logger_class log; - - - // -------------------------------------------------------------------- - // - task run_model; - wait(axi4_m.cb_s.aresetn); - axi4_m.zero_cycle_delay(); - - aw_q_h.run_q(); - w_q_h.run_q(); - b_q_h.run_q(); - ar_q_h.run_q(); - r_q_h.run_q(); - endtask: run_model - - - //-------------------------------------------------------------------- - function new(virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m); - super.new(axi4_m); - this.aw_q_h = new(axi4_m, 2); - this.w_q_h = new(axi4_m, 16); - this.b_q_h = new(axi4_m, 2); - this.ar_q_h = new(axi4_m, 2); - this.r_q_h = new(axi4_m, 16); - this.log = new(); - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: axi4_granter_class - - - // -------------------------------------------------------------------- - // - class axi4_arbiter_class #(A, N, I); - - axi4_granter_class #(A, N, I) g_h; - requester_class #(A, N, I) r_h[]; - mailbox #(int) grant; - int count = -1; - int current = 0, previous; - logger_class log; - - - // -------------------------------------------------------------------- - // - task automatic do_read(requester_class #(A, N, I) r_h); - int id; - read_request_class #(A, N, I) r_req_h; - base_request_class #(A, N, I) request; - log.debug($sformatf("%m | read grant for %d", r_h.id)); - r_h.q.get(request); - $cast(r_req_h, request); - - g_h.ar_if_h = new(g_h.axi4_m); - r_req_h.write_ax_if(g_h.ar_if_h); - g_h.ar_q_h.q.put(g_h.ar_if_h); - - for(int i = 0; i < r_h.ar_if_h.arlen + 1; i++) - begin - g_h.r_if_h = new(g_h.axi4_m); - r_h.r_if_h = new(r_h.axi4_s); - g_h.r_q_h.q.get(g_h.r_if_h); - r_h.r_if_h.copy(g_h.r_if_h); - r_h.r_q_h.q.put(r_h.r_if_h); - @(r_h.axi4_s.cb_s); - end - - r_h.read_done.put(); - grant.get(id); - log.debug($sformatf("%m | read grant for %d done", id)); - endtask: do_read - - - // -------------------------------------------------------------------- - // - task automatic do_write(requester_class #(A, N, I) r_h); - int id; - write_request_class #(A, N, I) w_req_h; - base_request_class #(A, N, I) request; - log.debug($sformatf("%m | write grant for %d", r_h.id)); - r_h.q.get(request); - $cast(w_req_h, request); - - g_h.aw_if_h = new(g_h.axi4_m); - w_req_h.write_ax_if(g_h.aw_if_h); - g_h.aw_q_h.q.put(g_h.aw_if_h); - - for(int i = 0; i < r_h.aw_if_h.awlen + 1; i++) - begin - r_h.w_if_h = new(r_h.axi4_s); - g_h.w_if_h = new(g_h.axi4_m); - r_h.w_q_h.q.get(r_h.w_if_h); - g_h.w_if_h.copy(r_h.w_if_h); - g_h.w_q_h.q.put(g_h.w_if_h); - @(r_h.axi4_s.cb_s); - end - - g_h.b_q_h.q.get(g_h.b_if_h); - r_h.b_if_h = new(r_h.axi4_s); - r_h.b_if_h.copy(g_h.b_if_h); - r_h.b_q_h.q.put(r_h.b_if_h); - r_h.write_done.put(); - grant.get(id); - log.debug($sformatf("%m | write grant for %d done", id)); - endtask: do_write - - - // -------------------------------------------------------------------- - // - task automatic give_grant(requester_class #(A, N, I) r_h); - base_request_class #(A, N, I) request; - grant.put(r_h.id); - r_h.q.peek(request); - log.debug($sformatf("%m | %d got grant for %s", r_h.id, request.kind)); - - if(request.kind.toupper == "WRITE") - do_write(r_h); - else if(request.kind.toupper == "READ") - do_read(r_h); - else - $stop; - - current = (current + count + 1) % count; - log.debug($sformatf("%m | new current = %d", current)); - endtask: give_grant - - - // -------------------------------------------------------------------- - // - task automatic do_arbitration; - wait(g_h.axi4_m.cb_m.aresetn); - g_h.axi4_m.zero_cycle_delay(); - forever - @(g_h.axi4_m.cb_m) - begin - for(int i = current; i < current + count; i++) - if(r_h[i % count].q.num > 0) - begin - give_grant(r_h[i % count]); - break; - end - end - endtask: do_arbitration - - - //-------------------------------------------------------------------- - function void debug_enable; - log.debug_enable(); - g_h.log.debug_enable(); - foreach(r_h[i]) - r_h[i].log.debug_enable(); - endfunction: debug_enable - - - //-------------------------------------------------------------------- - function new - ( - virtual axi4_if #(A, N, I) axi4_s[], - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m - ); - this.grant = new(1); - this.g_h = new(axi4_m); - this.count = axi4_s.size; - this.r_h = new[axi4_s.size]; - this.log = new; - - foreach(axi4_s[i]) - r_h[i] = new(i, axi4_s[i]); - - fork - do_arbitration(); - join_none - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: axi4_arbiter_class - - -// -------------------------------------------------------------------- -// -endpackage: axi4_arbiter_pkg - Index: trunk/axi4_lib/sim/src/axi4_models/axi4_memory_pkg.sv =================================================================== --- trunk/axi4_lib/sim/src/axi4_models/axi4_memory_pkg.sv (revision 49) +++ trunk/axi4_lib/sim/src/axi4_models/axi4_memory_pkg.sv (nonexistent) @@ -1,369 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package axi4_memory_pkg; - - // -------------------------------------------------------------------- - // - import axi4_models_pkg::*; - import bfm_pkg::*; - import logger_pkg::*; - - - // -------------------------------------------------------------------- - // - class memory_tr_class #(A, N, I, type WORD_T = byte) - extends transaction_class #(memory_tr_class #(A, N, I)); - - rand int addr; - rand int size; - rand byte data[]; - - constraint default_addr - { - addr[$clog2(N*8)-1:0] == 0; - } - - constraint default_size - { - size dist {N := 40, [N*2:N*15] := 40, [N*16:N*255] := 20}; - } - - - //-------------------------------------------------------------------- - // - function void init(int addr, int size); - this.data = new[size]; - this.addr = addr; - this.size = size; - endfunction: init - - - //-------------------------------------------------------------------- - // - function void random(int addr, int size); - this.data = new[size]; - assert(this.randomize() with - { - this.addr == addr; // why not working? - this.size == size; - }); - this.addr = addr; - this.size = size; - endfunction: random - - - // -------------------------------------------------------------------- - // - task constant(int addr, int size, byte value[]); - init(addr, size); - this.data = new[size]; - for(int i = 0; i < size; i += value.size) - foreach(value[k]) - data[i + k] = value[k]; - endtask: constant - - - // -------------------------------------------------------------------- - // - task automatic counting(int addr, int count); - byte word[]; - int word_size = $bits(WORD_T) / 8; // word size in bytes - init(addr, count * word_size); - for(WORD_T i = 0; i < count; i++) - begin - word = {<< byte{i}}; - foreach(word[k]) - data[addr + (i * word_size) + k] = word[k]; - end - endtask: counting - - - // -------------------------------------------------------------------- - // - function void copy(TR_T from); - init(from.addr, from.size); - this.data = new[from.size]; - foreach(from.data[i]) - this.data[i] = from.data[i]; - endfunction: copy - - - //-------------------------------------------------------------------- - function new; - a_word_t_mod_n: assert($bits(WORD_T) % 8 == 0) else $fatal; - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: memory_tr_class - - - // -------------------------------------------------------------------- - // - class axi4_memory_class #(A, N, I, type WORD_T = byte) - extends axi4_slave_model_class #(.A(A), .N(N), .I(I)); - - logger_class log; - byte memory [*]; - - - // -------------------------------------------------------------------- - // - function void clear_all; - memory.delete; - endfunction: clear_all - - - // -------------------------------------------------------------------- - // - function void compare(memory_tr_class #(A, N, I, WORD_T) tr_h); - foreach(tr_h.data[i]) - if(memory.exists(tr_h.addr + i)) - begin - if(memory[tr_h.addr + i] != tr_h.data[i]) - log.error($sformatf("%m | 1 memory[0x%8.h] = 0x%2.h | 0x%2.h", tr_h.addr + i, memory[tr_h.addr + i], tr_h.data[i])); - end - else - log.error($sformatf("%m | 2 memory[0x%8.h] = 0x%2.h | 0x%2.h", tr_h.addr + i, 'bx, tr_h.data[i])); - endfunction: compare - - - // -------------------------------------------------------------------- - // - task display_memory(int offset, int count); - for(int i = 0; i < count; i++) - if(memory.exists(offset + i)) - $display("^^^ %16.t | %m | memory[0x%8.x] = 0x%2.x", $time, offset + i, memory[offset + i]); - else - $display("^^^ %16.t | %m | memory[0x%8.x] = 0x%2.x", $time, offset + i, 8'hxx); - endtask: display_memory - - - // -------------------------------------------------------------------- - // - task constant_fill(int offset, int count, int value); - for(int i = 0; i < count; i++) - memory[offset + i] = value; - endtask: constant_fill - - - // -------------------------------------------------------------------- - // - task counting_fill(int offset, int count); - for(int i = 0; i < count; i++) - memory[offset + i] = i; - endtask: counting_fill - - - // -------------------------------------------------------------------- - // - task dump_words(int offset, ref byte data[]); - foreach(data[i]) - if(memory.exists(offset + i)) - data[i] = memory[offset + i]; - else - data[i] = 'bx; - endtask: dump_words - - - // -------------------------------------------------------------------- - // - function reg [7:0] dump(int offset); - if(memory.exists(offset)) - return(memory[offset]); - else - return('bx); - endfunction: dump - - - // -------------------------------------------------------------------- - // - task load_words(int offset, byte data[]); - foreach(data[i]) - memory[offset + i] = data[i]; - endtask: load_words - - - // -------------------------------------------------------------------- - // - task load(int offset, reg [7:0] data); - memory[offset] = data; - endtask: load - - - // -------------------------------------------------------------------- - // - task run_read_interface; - int result; - logic [9:0] delay = 0; - int memory_addr; - - forever - @(axi4_s.cb_s) - begin - result = ar_q_h.q.try_peek(ar_if_h); - if(result != 0) - begin - log.debug($sformatf("araddr = 0x%h", ar_if_h.araddr)); - log.debug($sformatf("arlen = 0x%h", ar_if_h.arlen)); - delay = $urandom_range(9, 0); - if(delay > 6) - repeat($urandom_range(50, 1)) - @(axi4_s.cb_s); - - for(int i = 0; i < ar_if_h.arlen + 1; i++) - begin - memory_addr = ar_if_h.araddr + (i * (2 ** ar_if_h.arsize)); - for(int i = 0; i < ar_if_h.N; i++) - begin - if(memory.exists(memory_addr)) - r_if_h.rdata[i*8 +: 8] = memory[memory_addr]; - else - r_if_h.rdata[i*8 +: 8] = 8'hxx; - - memory_addr++; - end - log.debug($sformatf("rdata = 0x%h", r_if_h.rdata)); - - if(i == ar_if_h.arlen) - begin - ar_q_h.q.get(ar_if_h); - r_if_h.rlast = 1; - end - else - r_if_h.rlast = 0; - - r_if_h.rid = 0; - r_if_h.rresp = 0; - - r_q_h.q.put(r_if_h); - r_if_h = new(axi4_s); - - @(axi4_s.cb_s); - end - r_if_h.rlast = 0; - end - end - endtask: run_read_interface - - - // -------------------------------------------------------------------- - // - task run_write_interface; - - int result; - logic [9:0] delay = 0; - int memory_addr; - - forever - @(axi4_s.cb_s) - begin - result = aw_q_h.q.try_peek(aw_if_h); - if(result != 0) - begin - memory_addr = aw_if_h.awaddr; - log.debug($sformatf("awaddr = 0x%h", aw_if_h.awaddr)); - - delay = $urandom_range(9, 0); - if(delay > 6) - repeat($urandom_range(8, 1)) - @(axi4_s.cb_s); - - for(int i = 0; i < aw_if_h.awlen + 1; i++) - begin - w_q_h.q.get(w_if_h); - log.debug($sformatf("wdata = 0x%h", w_if_h.wdata)); - for(int k = 0; k < aw_if_h.N; k++) - begin - memory[memory_addr] = w_if_h.wdata[k*8 +: 8]; - memory_addr++; - end - - if(i == aw_if_h.awlen) - begin - b_if_h.bresp = 0; - b_if_h.bid = aw_if_h.awid; - b_q_h.q.put(b_if_h); - b_if_h = new(axi4_s); - aw_q_h.q.get(aw_if_h); - end - - @(axi4_s.cb_s); - end - end - end - - endtask: run_write_interface - - - // -------------------------------------------------------------------- - // - task run_model; - wait(axi4_s.cb_s.aresetn); - axi4_s.zero_cycle_delay(); - - aw_q_h.run_q(); - w_q_h.run_q(); - b_q_h.run_q(); - ar_q_h.run_q(); - r_q_h.run_q(); - - fork - run_write_interface(); - join_none - - fork - run_read_interface(); - join_none - endtask: run_model - - - //-------------------------------------------------------------------- - function new(virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_s); - super.new(axi4_s); - a_word_t_mod_n: assert($bits(WORD_T) % 8 == 0) else $fatal; - this.aw_q_h = new(axi4_s, 2); - this.w_q_h = new(axi4_s, 16); - this.b_q_h = new(axi4_s, 2); - this.ar_q_h = new(axi4_s, 2); - this.r_q_h = new(axi4_s, 16); - this.log = new(); - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: axi4_memory_class - - -// -------------------------------------------------------------------- -// -endpackage: axi4_memory_pkg - Index: trunk/axi4_lib/sim/src/axi4_models/tb_axi4_multi_port_memory.sv =================================================================== --- trunk/axi4_lib/sim/src/axi4_models/tb_axi4_multi_port_memory.sv (revision 49) +++ trunk/axi4_lib/sim/src/axi4_models/tb_axi4_multi_port_memory.sv (nonexistent) @@ -1,89 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -module - tb_axi4_multi_port_memory - #( - A = 32, // address bus width - N = 8, // data bus width in bytes - I = 1, // ID width - PORTS, - MAXWAITS = 256, - type WORD_T = byte - ) - ( - axi4_if axi4_s[PORTS], - - input aclk, - input aresetn - ); - - // -------------------------------------------------------------------- - // - import axis_bfm_pkg::*; - import axi4_memory_pkg::*; - import axi4_arbiter_pkg::*; - - - // -------------------------------------------------------------------- - // - axi4_if #(.A(A), .N(N), .I(I)) axi4_bus(.*); - - - // -------------------------------------------------------------------- - // - axi4_arbiter_class #(A, N, I) arb_h; - axi4_memory_class #(A, N, I, WORD_T) m_h; - - initial - begin - arb_h = new(axi4_s, axi4_bus); - m_h = new(axi4_bus); - end - - - // -------------------------------------------------------------------- - // - axi4_checker #(.A(A), .N(N), .MAXWAITS(MAXWAITS)) - axi4_bus_checker(.axi4_in(axi4_bus)); - - - // -------------------------------------------------------------------- - // - generate - begin: axi4_s_cherkers - for(genvar j = 0; j < PORTS; j++) - axi4_checker #(.A(A), .N(N), .MAXWAITS(MAXWAITS)) - axi4_checker_i(.axi4_in(axi4_s[j])); - end - endgenerate - - -// -------------------------------------------------------------------- -// -endmodule - Index: trunk/axi4_lib/sim/src/axi4_models/axi4_models_pkg.sv =================================================================== --- trunk/axi4_lib/sim/src/axi4_models/axi4_models_pkg.sv (revision 49) +++ trunk/axi4_lib/sim/src/axi4_models/axi4_models_pkg.sv (nonexistent) @@ -1,822 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -// -------------------------------------------------------------------- -// -package axi4_models_pkg; - - // -------------------------------------------------------------------- - // - virtual class axi4_channel_if_class #(A, N, I); - - virtual axi4_if #(A, N, I) axi4_bus; - event valid; - - - // -------------------------------------------------------------------- - // - pure virtual function void set_master_default; - pure virtual function void set_slave_default; - pure virtual function void copy(axi4_channel_if_class #(A, N, I) from); - pure virtual function void copy_if; - pure virtual function void drive_if; - pure virtual function void set_ready(bit value); - pure virtual function bit is_valid; - pure virtual function void set_valid(bit value); - pure virtual function bit is_ready; - pure virtual function bit is_transfer; - - - //-------------------------------------------------------------------- - function new(virtual axi4_if #(A, N, I) axi4_bus); - this.axi4_bus = axi4_bus; - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: axi4_channel_if_class - - - // -------------------------------------------------------------------- - // - class axi4_channel_sink_q_class #(A, N, I, type T = logic); - - virtual axi4_if #(A, N, I) axi4_bus; - T c_if_h; - int q_size; - mailbox #(T) q; - - - // -------------------------------------------------------------------- - // - function automatic void run_q; - int result; - c_if_h.set_ready(1'b1); - - fork - forever - @(axi4_bus.cb_s) - begin - if(c_if_h.is_transfer) - begin - result = q.try_put(c_if_h); - if(result == 0) - $error; - - c_if_h.copy_if(); - c_if_h = new(axi4_bus); - end - - if(q.num >= q_size) - c_if_h.set_ready(1'b0); - else - c_if_h.set_ready(1'b1); - end - join_none - endfunction: run_q - - - //-------------------------------------------------------------------- - function new( virtual axi4_if #(A, N, I) axi4_bus, int q_size); - this.axi4_bus = axi4_bus; - this.q_size = q_size; - this.q = new(q_size); - this.c_if_h = new(axi4_bus); - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: axi4_channel_sink_q_class - - - // -------------------------------------------------------------------- - // - class axi4_channel_source_q_class #(A, N, I, type T = logic); - - virtual axi4_if #(A, N, I) axi4_bus; - T c_if_h; - int q_size; - mailbox #(T) q; - - - // -------------------------------------------------------------------- - // - function automatic void run_q; - int result; - c_if_h.set_valid(1'b0); - - fork - forever - @(axi4_bus.cb_s) - begin - if(c_if_h.is_transfer) - begin - result = q.try_get(c_if_h); - if(result == 0) - $stop; - end - - result = q.try_peek(c_if_h); - if(result == 0) - c_if_h.set_valid(1'b0); - else - begin - c_if_h.set_valid(1'b1); - c_if_h.drive_if(); - end - end - join_none - endfunction: run_q - - - //-------------------------------------------------------------------- - function new(virtual axi4_if #(A, N, I) axi4_bus, int q_size); - this.axi4_bus = axi4_bus; - this.q_size = q_size; - this.q = new(q_size); - this.c_if_h = new(axi4_bus); - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: axi4_channel_source_q_class - - - // -------------------------------------------------------------------- - // - class axi4_aw_if_class #(A, N, I) - extends axi4_channel_if_class #(A, N, I); - - logic [(A-1):0] awaddr; - logic [1:0] awburst; - logic [(I-1):0] awid; - logic [7:0] awlen; - logic [2:0] awsize; - logic [3:0] awcache; - logic awlock; - logic [2:0] awprot; - logic [3:0] awqos; - logic [3:0] awregion; - - - // -------------------------------------------------------------------- - // - function void set_master_default; - axi4_bus.cb_m.awvalid <= 0; - endfunction: set_master_default - - - // -------------------------------------------------------------------- - // - function void set_slave_default; - axi4_bus.cb_s.awready <= 0; - endfunction: set_slave_default - - - // -------------------------------------------------------------------- - // - function void copy(axi4_channel_if_class #(A, N, I) from); - axi4_aw_if_class #(A, N, I) child; - $cast(child, from); - awaddr = child.awaddr; - awburst = child.awburst; - awid = child.awid; - awlen = child.awlen; - awsize = child.awsize; - awcache = child.awcache; - awlock = child.awlock; - awprot = child.awprot; - awqos = child.awqos; - awregion = child.awregion; - endfunction: copy - - - // -------------------------------------------------------------------- - // - function void copy_if; - awaddr = axi4_bus.cb_s.awaddr; - awburst = axi4_bus.cb_s.awburst; - awid = axi4_bus.cb_s.awid; - awlen = axi4_bus.cb_s.awlen; - awsize = axi4_bus.cb_s.awsize; - awcache = axi4_bus.cb_s.awcache; - awlock = axi4_bus.cb_s.awlock; - awprot = axi4_bus.cb_s.awprot; - awqos = axi4_bus.cb_s.awqos; - awregion = axi4_bus.cb_s.awregion; - endfunction: copy_if - - - // -------------------------------------------------------------------- - // - function void drive_if; - axi4_bus.cb_m.awaddr <= awaddr; - axi4_bus.cb_m.awburst <= awburst; - axi4_bus.cb_m.awid <= awid; - axi4_bus.cb_m.awlen <= awlen; - axi4_bus.cb_m.awsize <= awsize; - axi4_bus.cb_m.awcache <= awcache; - axi4_bus.cb_m.awlock <= awlock; - axi4_bus.cb_m.awprot <= awprot; - axi4_bus.cb_m.awqos <= awqos; - axi4_bus.cb_m.awregion <= awregion; - endfunction: drive_if - - - // -------------------------------------------------------------------- - // - function void set_ready(bit value); - axi4_bus.cb_s.awready <= value; - endfunction: set_ready - - - // -------------------------------------------------------------------- - // - function bit is_valid; - return(axi4_bus.cb_s.awvalid); - endfunction: is_valid - - - // -------------------------------------------------------------------- - // - function void set_valid(bit value); - axi4_bus.cb_m.awvalid <= value; - endfunction: set_valid - - - // -------------------------------------------------------------------- - // - function bit is_ready; - return(axi4_bus.cb_m.awready); - endfunction: is_ready - - - // -------------------------------------------------------------------- - // - function bit is_transfer; - return(axi4_bus.cb_m.awready & axi4_bus.cb_s.awvalid); - endfunction: is_transfer - - - //-------------------------------------------------------------------- - function new(virtual axi4_if #(A, N, I) axi4_bus); - super.new(axi4_bus); - endfunction: new - - // -------------------------------------------------------------------- - // - endclass: axi4_aw_if_class - - - // -------------------------------------------------------------------- - // - class axi4_ar_if_class #(A, N, I) - extends axi4_channel_if_class #(A, N, I); - - logic [(A-1):0] araddr; - logic [1:0] arburst; - logic [(I-1):0] arid; - logic [7:0] arlen; - logic [2:0] arsize; - logic [3:0] arcache; - logic arlock; - logic [2:0] arprot; - logic [3:0] arqos; - logic [3:0] arregion; - - - // -------------------------------------------------------------------- - // - virtual function void set_master_default; - axi4_bus.cb_m.arvalid <= 0; - endfunction: set_master_default - - - // -------------------------------------------------------------------- - // - virtual function void set_slave_default; - axi4_bus.cb_s.arready <= 0; - endfunction: set_slave_default - - - // -------------------------------------------------------------------- - // - virtual function void copy(axi4_channel_if_class #(A, N, I) from); - axi4_ar_if_class #(A, N, I) child; - $cast(child, from); - araddr = child.araddr; - arburst = child.arburst; - arid = child.arid; - arlen = child.arlen; - arsize = child.arsize; - arcache = child.arcache; - arlock = child.arlock; - arprot = child.arprot; - arqos = child.arqos; - arregion = child.arregion; - endfunction: copy - - - // -------------------------------------------------------------------- - // - virtual function void copy_if; - araddr = axi4_bus.cb_s.araddr; - arburst = axi4_bus.cb_s.arburst; - arid = axi4_bus.cb_s.arid; - arlen = axi4_bus.cb_s.arlen; - arsize = axi4_bus.cb_s.arsize; - arcache = axi4_bus.cb_s.arcache; - arlock = axi4_bus.cb_s.arlock; - arprot = axi4_bus.cb_s.arprot; - arqos = axi4_bus.cb_s.arqos; - arregion = axi4_bus.cb_s.arregion; - endfunction: copy_if - - - // -------------------------------------------------------------------- - // - virtual function void drive_if; - axi4_bus.cb_m.araddr <= araddr; - axi4_bus.cb_m.arburst <= arburst; - axi4_bus.cb_m.arid <= arid; - axi4_bus.cb_m.arlen <= arlen; - axi4_bus.cb_m.arsize <= arsize; - axi4_bus.cb_m.arcache <= arcache; - axi4_bus.cb_m.arlock <= arlock; - axi4_bus.cb_m.arprot <= arprot; - axi4_bus.cb_m.arqos <= arqos; - axi4_bus.cb_m.arregion <= arregion; - endfunction: drive_if - - - // -------------------------------------------------------------------- - // - virtual function void set_ready(bit value); - axi4_bus.cb_s.arready <= value; - endfunction: set_ready - - - // -------------------------------------------------------------------- - // - virtual function bit is_valid; - return(axi4_bus.cb_s.arvalid); - endfunction: is_valid - - - // -------------------------------------------------------------------- - // - function void set_valid(bit value); - axi4_bus.cb_m.arvalid <= value; - endfunction: set_valid - - - // -------------------------------------------------------------------- - // - function bit is_ready; - return(axi4_bus.cb_m.arready); - endfunction: is_ready - - - // -------------------------------------------------------------------- - // - function bit is_transfer; - return(axi4_bus.cb_m.arready & axi4_bus.cb_s.arvalid); - endfunction: is_transfer - - - //-------------------------------------------------------------------- - function new(virtual axi4_if #(A, N, I) axi4_bus); - super.new(axi4_bus); - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: axi4_ar_if_class - - - // -------------------------------------------------------------------- - // - class axi4_w_if_class #(A, N, I) - extends axi4_channel_if_class #(A, N, I); - - logic [(8*N)-1:0] wdata; - logic [(I-1):0] wid; - logic wlast; - logic [N-1:0] wstrb; - - - // -------------------------------------------------------------------- - // - function void set_master_default; - axi4_bus.cb_m.wvalid <= 0; - endfunction: set_master_default - - - // -------------------------------------------------------------------- - // - function void set_slave_default; - axi4_bus.cb_s.wready <= 0; - endfunction: set_slave_default - - - // -------------------------------------------------------------------- - // - function void copy(axi4_channel_if_class #(A, N, I) from); - axi4_w_if_class #(A, N, I) child; - $cast(child, from); - wdata = child.wdata; - wid = child.wid; - wlast = child.wlast; - wstrb = child.wstrb; - endfunction: copy - - - // -------------------------------------------------------------------- - // - function void copy_if; - wdata = axi4_bus.cb_s.wdata; - wid = axi4_bus.cb_s.wid; - wlast = axi4_bus.cb_s.wlast; - wstrb = axi4_bus.cb_s.wstrb; - endfunction: copy_if - - - // -------------------------------------------------------------------- - // - function void drive_if; - axi4_bus.cb_m.wdata <= wdata; - axi4_bus.cb_m.wid <= wid; - axi4_bus.cb_m.wlast <= wlast; - axi4_bus.cb_m.wstrb <= wstrb; - endfunction: drive_if - - - // -------------------------------------------------------------------- - // - function void set_ready(bit value); - axi4_bus.cb_s.wready <= value; - endfunction: set_ready - - - // -------------------------------------------------------------------- - // - function bit is_valid; - return(axi4_bus.cb_s.wvalid); - endfunction: is_valid - - - // -------------------------------------------------------------------- - // - function void set_valid(bit value); - axi4_bus.cb_m.wvalid <= value; - endfunction: set_valid - - - // -------------------------------------------------------------------- - // - function bit is_ready; - return(axi4_bus.cb_m.wready); - endfunction: is_ready - - - // -------------------------------------------------------------------- - // - function bit is_transfer; - return(axi4_bus.cb_m.wready & axi4_bus.cb_s.wvalid); - endfunction: is_transfer - - - //-------------------------------------------------------------------- - function new(virtual axi4_if #(A, N, I) axi4_bus); - super.new(axi4_bus); - endfunction: new - - // -------------------------------------------------------------------- - // - endclass: axi4_w_if_class - - - // -------------------------------------------------------------------- - // - class axi4_b_if_class #(A, N, I) - extends axi4_channel_if_class #(A, N, I); - - logic [(I-1):0] bid; - logic [1:0] bresp; - - - // -------------------------------------------------------------------- - // - function void set_master_default; - axi4_bus.cb_m.bready <= 0; - endfunction: set_master_default - - - // -------------------------------------------------------------------- - // - function void set_slave_default; - axi4_bus.cb_s.bvalid <= 0; - endfunction: set_slave_default - - - // -------------------------------------------------------------------- - // - function void copy(axi4_channel_if_class #(A, N, I) from); - axi4_b_if_class #(A, N, I) child; - $cast(child, from); - bid = child.bid; - bresp = child.bresp; - endfunction: copy - - - // -------------------------------------------------------------------- - // - function void copy_if; - bid = axi4_bus.cb_m.bid; - bresp = axi4_bus.cb_m.bresp; - endfunction: copy_if - - - // -------------------------------------------------------------------- - // - function void drive_if; - axi4_bus.cb_s.bid <= bid; - axi4_bus.cb_s.bresp <= bresp; - endfunction: drive_if - - - // -------------------------------------------------------------------- - // - function void set_ready(bit value); - axi4_bus.cb_m.bready <= value; - endfunction: set_ready - - - // -------------------------------------------------------------------- - // - function bit is_valid; - return(axi4_bus.cb_m.bvalid); - endfunction: is_valid - - - // -------------------------------------------------------------------- - // - function void set_valid(bit value); - axi4_bus.cb_s.bvalid <= value; - endfunction: set_valid - - - // -------------------------------------------------------------------- - // - function bit is_ready; - return(axi4_bus.cb_s.bready); - endfunction: is_ready - - - // -------------------------------------------------------------------- - // - function bit is_transfer; - return(axi4_bus.cb_s.bready & axi4_bus.cb_m.bvalid); - endfunction: is_transfer - - - //-------------------------------------------------------------------- - function new(virtual axi4_if #(A, N, I) axi4_bus); - super.new(axi4_bus); - endfunction: new - - // -------------------------------------------------------------------- - // - endclass: axi4_b_if_class - - // -------------------------------------------------------------------- - // - class axi4_r_if_class #(A, N, I) - extends axi4_channel_if_class #(A, N, I); - - logic [(8*N)-1:0] rdata; - logic [(I-1):0] rid; - logic rlast; - logic [1:0] rresp; - - - // -------------------------------------------------------------------- - // - function void set_master_default; - axi4_bus.cb_m.rready <= 0; - endfunction: set_master_default - - - // -------------------------------------------------------------------- - // - function void set_slave_default; - axi4_bus.cb_s.rvalid <= 0; - endfunction: set_slave_default - - - // -------------------------------------------------------------------- - // - function void copy(axi4_channel_if_class #(A, N, I) from); - axi4_r_if_class #(A, N, I) child; - $cast(child, from); - rdata = child.rdata; - rid = child.rid; - rlast = child.rlast; - rresp = child.rresp; - endfunction: copy - - - // -------------------------------------------------------------------- - // - function void copy_if; - rdata = axi4_bus.cb_m.rdata; - rid = axi4_bus.cb_m.rid; - rlast = axi4_bus.cb_m.rlast; - rresp = axi4_bus.cb_m.rresp; - endfunction: copy_if - - - // -------------------------------------------------------------------- - // - function void drive_if; - axi4_bus.cb_s.rdata <= rdata; - axi4_bus.cb_s.rid <= rid; - axi4_bus.cb_s.rlast <= rlast; - axi4_bus.cb_s.rresp <= rresp; - endfunction: drive_if - - - // -------------------------------------------------------------------- - // - function void set_ready(bit value); - axi4_bus.cb_m.rready <= value; - endfunction: set_ready - - - // -------------------------------------------------------------------- - // - function bit is_valid; - return(axi4_bus.cb_m.rvalid); - endfunction: is_valid - - - // -------------------------------------------------------------------- - // - function void set_valid(bit value); - axi4_bus.cb_s.rvalid <= value; - endfunction: set_valid - - - // -------------------------------------------------------------------- - // - function bit is_ready; - return(axi4_bus.cb_s.rready); - endfunction: is_ready - - - // -------------------------------------------------------------------- - // - function bit is_transfer; - return(axi4_bus.cb_s.rready & axi4_bus.cb_m.rvalid); - endfunction: is_transfer - - - //-------------------------------------------------------------------- - function new(virtual axi4_if #(A, N, I) axi4_bus); - super.new(axi4_bus); - endfunction: new - - // -------------------------------------------------------------------- - // - endclass: axi4_r_if_class - - - // -------------------------------------------------------------------- - // - virtual class axi4_master_model_class #(A, N, I); - - virtual axi4_if #(A, N, I) axi4_m; - axi4_aw_if_class #(A, N, I) aw_if_h; - axi4_channel_source_q_class #(A, N, I, axi4_aw_if_class #(A, N, I)) aw_q_h; - axi4_w_if_class #(A, N, I) w_if_h; - axi4_channel_source_q_class #(A, N, I, axi4_w_if_class #(A, N, I)) w_q_h; - axi4_b_if_class #(A, N, I) b_if_h; - axi4_channel_sink_q_class #(A, N, I, axi4_b_if_class #(A, N, I)) b_q_h; - axi4_ar_if_class #(A, N, I) ar_if_h; - axi4_channel_source_q_class #(A, N, I, axi4_ar_if_class #(A, N, I)) ar_q_h; - axi4_r_if_class #(A, N, I) r_if_h; - axi4_channel_sink_q_class #(A, N, I, axi4_r_if_class #(A, N, I)) r_q_h; - - - // -------------------------------------------------------------------- - // - pure virtual task run_model; - - - //-------------------------------------------------------------------- - function new(virtual axi4_if #(A, N, I) axi4_m); - this.axi4_m = axi4_m; - this.aw_if_h = new(axi4_m); - aw_if_h.set_master_default(); - this.w_if_h = new(axi4_m); - w_if_h.set_master_default(); - this.b_if_h = new(axi4_m); - b_if_h.set_master_default(); - this.ar_if_h = new(axi4_m); - ar_if_h.set_master_default(); - this.r_if_h = new(axi4_m); - r_if_h.set_master_default(); - - fork - run_model(); - join_none - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: axi4_master_model_class - - - // -------------------------------------------------------------------- - // - virtual class axi4_slave_model_class #(A, N, I); - - virtual axi4_if #(A, N, I) axi4_s; - axi4_aw_if_class #(A, N, I) aw_if_h; - axi4_channel_sink_q_class #(A, N, I, axi4_aw_if_class #(A, N, I)) aw_q_h; - axi4_w_if_class #(A, N, I) w_if_h; - axi4_channel_sink_q_class #(A, N, I, axi4_w_if_class #(A, N, I)) w_q_h; - axi4_b_if_class #(A, N, I) b_if_h; - axi4_channel_source_q_class #(A, N, I, axi4_b_if_class #(A, N, I)) b_q_h; - axi4_ar_if_class #(A, N, I) ar_if_h; - axi4_channel_sink_q_class #(A, N, I, axi4_ar_if_class #(A, N, I)) ar_q_h; - axi4_r_if_class #(A, N, I) r_if_h; - axi4_channel_source_q_class #(A, N, I, axi4_r_if_class #(A, N, I)) r_q_h; - - - // -------------------------------------------------------------------- - // - pure virtual task run_model; - - - //-------------------------------------------------------------------- - function new(virtual axi4_if #(A, N, I) axi4_s); - - this.axi4_s = axi4_s; - this.aw_if_h = new(axi4_s); - aw_if_h.set_slave_default(); - this.w_if_h = new(axi4_s); - w_if_h.set_slave_default(); - this.b_if_h = new(axi4_s); - b_if_h.set_slave_default(); - this.ar_if_h = new(axi4_s); - ar_if_h.set_slave_default(); - this.r_if_h = new(axi4_s); - r_if_h.set_slave_default(); - - fork - run_model(); - join_none - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: axi4_slave_model_class - - -// -------------------------------------------------------------------- -// -endpackage: axi4_models_pkg - - Index: trunk/axi4_lib/sim/src/legacy/tb_axi4_memory.sv =================================================================== --- trunk/axi4_lib/sim/src/legacy/tb_axi4_memory.sv (nonexistent) +++ trunk/axi4_lib/sim/src/legacy/tb_axi4_memory.sv (revision 50) @@ -0,0 +1,129 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +module tb_top(); + + // -------------------------------------------------------------------- + // test bench clock & reset + wire clk_100mhz; + wire tb_clk = clk_100mhz; + wire tb_rst; + wire aclk = tb_clk; + wire aresetn = ~tb_rst; + + tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); + + + // -------------------------------------------------------------------- + // + localparam A = 32; + localparam N = 8; + + + // -------------------------------------------------------------------- + // + axi4_if #(.A(A), .N(N)) + axi4_s(.*); + + + // -------------------------------------------------------------------- + // + + + // -------------------------------------------------------------------- + // sim models + // | | | | | | | | | | | | | | | | | + // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + + // -------------------------------------------------------------------- + // + axi4_checker #(.A(A), .N(N)) + axi4_s_check(.axi4_in(axi4_s)); + + + // // -------------------------------------------------------------------- + // // + // axi4_master_bfm_if #(.A(A), .N(N)) + // tb_axi4_m(.axi4_s(axi4_s), .*); + + + // -------------------------------------------------------------------- + // + import axi4_bfm_pkg::*; + + axi4_master_bfm_class bfm; + + initial + bfm = new(axi4_s); + + + // -------------------------------------------------------------------- + // + import axi4_memory_pkg::*; + + axi4_memory_class axi4_memory; + + initial + axi4_memory = new(axi4_s); + + + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ + // | | | | | | | | | | | | | | | | | + // sim models + // -------------------------------------------------------------------- + + + // -------------------------------------------------------------------- + // debug wires + + + // -------------------------------------------------------------------- + // test + the_test test( tb_clk, tb_rst ); + + initial + begin + + test.run_the_test(); + + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench done.", $time); + $display("^^^---------------------------------"); + + $display("^^^---------------------------------"); + + $stop(); + + end + +endmodule + + + Index: trunk/axi4_lib/sim/src/legacy/tb_axi4_to_axis_agent_class_pkg.sv =================================================================== --- trunk/axi4_lib/sim/src/legacy/tb_axi4_to_axis_agent_class_pkg.sv (nonexistent) +++ trunk/axi4_lib/sim/src/legacy/tb_axi4_to_axis_agent_class_pkg.sv (revision 50) @@ -0,0 +1,130 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +package tb_axi4_to_axis_agent_class_pkg; + + // -------------------------------------------------------------------- + // + import axi4_memory_pkg::*; + import axis_bfm_pkg::*; + + + // -------------------------------------------------------------------- + // + class tb_axi4_to_axis_agent_class #(N, A, I, D, U); + + axi4_memory_class #(A, N, I) m_h; + axis_rx_bfm_class #(N, I, D, U) s_h; + memory_tr_class #(A, N, I) m_tr_h, m_tr_clone_h; + axis_tr_class #(N, I, D, U) s_tr_h; + + virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m; + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out; + + mailbox #(memory_tr_class #(A, N, I)) q; + + + // -------------------------------------------------------------------- + // + task wait_for_sof; + @(posedge axis_out.cb_s.tuser); + $display("^^^ %16.t | %m", $time); + endtask: wait_for_sof + + + // -------------------------------------------------------------------- + // + task random_transaction(int addr, int size); + m_tr_h = new(); + m_tr_h.random(addr, size); + m_tr_clone_h = m_tr_h.clone(); + q.put(m_tr_clone_h); + m_h.load_words(addr, m_tr_h.data); + endtask: random_transaction + + + // -------------------------------------------------------------------- + // + task automatic + compare; + + $display("^^^ %16.t | %m", $time); + $display("^^^ %16.t | q.num = %d", $time, q.num); + $display("^^^ %16.t | s_h.q.num = %d", $time, s_h.q.num); + $display("^^^ %16.t | m_tr_h.data.size = %d", $time, m_tr_h.data.size); + + q.get(m_tr_h); + + for(int i = 0; i < m_tr_h.data.size; i += N) + begin + if(s_h.q.try_get(s_tr_h) == 0) + begin + $display("!!! %16.t | ERROR!!! try_get(s_tr_h) == 0", $time); + break; + end + + for(int k = 0; k < N; k++) + begin + if(s_tr_h.tdata[k*8 +: 8] != m_tr_h.data[i + k]) + begin + $display("!!! %16.t | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", $time); + $display("!!! %16.t | ERROR!!! mismatch | i = %d | k = %d", $time, i, k); + $display("!!! %16.t | %x | %x |", $time, s_tr_h.tdata[k*8 +: 8], m_tr_h.data[i + k]); + $stop; + end + end + end + + $display("^^^ %16.t | %m | done!", $time); + + endtask: compare + + + //-------------------------------------------------------------------- + // + function new + ( + virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m, + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out + ); + + this.axi4_m = axi4_m; + this.axis_out = axis_out; + m_h = new(axi4_m); + s_h = new(axis_out); + q = new(); + endfunction: new + + + // -------------------------------------------------------------------- + // + endclass: tb_axi4_to_axis_agent_class + +// -------------------------------------------------------------------- +// +endpackage: tb_axi4_to_axis_agent_class_pkg Index: trunk/axi4_lib/sim/src/legacy/tb_bfm.sv =================================================================== --- trunk/axi4_lib/sim/src/legacy/tb_bfm.sv (nonexistent) +++ trunk/axi4_lib/sim/src/legacy/tb_bfm.sv (revision 50) @@ -0,0 +1,119 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +module tb_top(); + + // -------------------------------------------------------------------- + // test bench clock & reset + wire clk_100mhz; + wire tb_clk = clk_100mhz; + wire tb_rst; + wire aclk = tb_clk; + wire aresetn = ~tb_rst; + + tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); + + + // -------------------------------------------------------------------- + // + localparam A = 32; + localparam N = 8; + + + // -------------------------------------------------------------------- + // + axi4_if #(.A(A), .N(N)) + axi4_bus(.*); + + axi4_checker #(.A(A), .N(N)) + axi4_in_check(.axi4_in(axi4_bus)); + + + // -------------------------------------------------------------------- + // sim models + // | | | | | | | | | | | | | | | | | + // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + + // -------------------------------------------------------------------- + // + import axi4_simple_agent_pkg::*; + + + // -------------------------------------------------------------------- + // + axi4_master_bfm_if #(.A(A), .N(N)) + axi4_m(.axi4_s(axi4_bus), .*); + + axi4_slave_bfm_if #(.A(A), .N(N)) + axi4_s(.axi4_m(axi4_bus), .*); + + + // -------------------------------------------------------------------- + // + axi4_simple_agent_class bfm; + + initial + bfm = new(axi4_m, axi4_s); + + + + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ + // | | | | | | | | | | | | | | | | | + // sim models + // -------------------------------------------------------------------- + + + // -------------------------------------------------------------------- + // debug wires + + + // -------------------------------------------------------------------- + // test + the_test test( tb_clk, tb_rst ); + + initial + begin + + test.run_the_test(); + + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench done.", $time); + $display("^^^---------------------------------"); + + $display("^^^---------------------------------"); + + $stop(); + + end + +endmodule + + + Index: trunk/axi4_lib/sim/src/legacy/tb_register_slice.sv =================================================================== --- trunk/axi4_lib/sim/src/legacy/tb_register_slice.sv (nonexistent) +++ trunk/axi4_lib/sim/src/legacy/tb_register_slice.sv (revision 50) @@ -0,0 +1,133 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +module tb_top(); + + // -------------------------------------------------------------------- + // test bench clock & reset + wire clk_100mhz; + wire tb_clk = clk_100mhz; + wire tb_rst; + wire aclk = tb_clk; + wire aresetn = ~tb_rst; + + tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); + + + // -------------------------------------------------------------------- + // + localparam A = 32; + localparam N = 8; + + + // -------------------------------------------------------------------- + // + axi4_if #(.A(A), .N(N)) + axi4_s(.*); + + axi4_if #(.A(A), .N(N)) + axi4_m(.*); + + + // -------------------------------------------------------------------- + // + axi4_register_slice #(.A(A), .N(N)) + dut(.*); + + + // -------------------------------------------------------------------- + // sim models + // | | | | | | | | | | | | | | | | | + // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + + // -------------------------------------------------------------------- + // + axi4_checker #(.A(A), .N(N)) + axi4_s_check(.axi4_in(axi4_s)); + + axi4_checker #(.A(A), .N(N)) + axi4_m_check(.axi4_in(axi4_m)); + + + // -------------------------------------------------------------------- + // + import axi4_simple_agent_pkg::*; + + + // -------------------------------------------------------------------- + // + axi4_master_bfm_if #(.A(A), .N(N)) + tb_axi4_m(.axi4_s(axi4_s), .*); + + axi4_slave_bfm_if #(.A(A), .N(N)) + tb_axi4_s(.axi4_m(axi4_m), .*); + + + // -------------------------------------------------------------------- + // + axi4_simple_agent_class bfm; + + initial + bfm = new(tb_axi4_m, tb_axi4_s); + + + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ + // | | | | | | | | | | | | | | | | | + // sim models + // -------------------------------------------------------------------- + + + // -------------------------------------------------------------------- + // debug wires + + + // -------------------------------------------------------------------- + // test + the_test test( tb_clk, tb_rst ); + + initial + begin + + test.run_the_test(); + + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench done.", $time); + $display("^^^---------------------------------"); + + $display("^^^---------------------------------"); + + $stop(); + + end + +endmodule + + + Index: trunk/axi4_stream_lib/syn/src/axis_if.sv =================================================================== --- trunk/axi4_stream_lib/syn/src/axis_if.sv (revision 49) +++ trunk/axi4_stream_lib/syn/src/axis_if.sv (nonexistent) @@ -1,128 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -interface - axis_if - #( - N = 8, // data bus width in bytes - I = 1, // TID width - D = 1, // TDEST width - U = 1 // TUSER width - ) - ( - input aclk, - input aresetn - ); - wire tvalid; - wire tready; - wire [(8*N)-1:0] tdata; - wire [N-1:0] tstrb; - wire [N-1:0] tkeep; - wire tlast; - wire [I-1:0] tid; - wire [D-1:0] tdest; - wire [U-1:0] tuser; - - -// -------------------------------------------------------------------- -// synthesis translate_off - default clocking cb_m @(posedge aclk iff aresetn); - output tvalid; - input tready; - output tdata; - output tstrb; - output tkeep; - output tlast; - output tid; - output tdest; - output tuser; - endclocking - - - // -------------------------------------------------------------------- - // - clocking cb_s @(posedge aclk iff aresetn); - input tvalid; - output tready; - input tdata; - input tstrb; - input tkeep; - input tlast; - input tid; - input tdest; - input tuser; - endclocking - - - // -------------------------------------------------------------------- - // - modport - master - ( - input aresetn, - input aclk, - output tvalid, - input tready, - output tdata, - output tstrb, - output tkeep, - output tlast, - output tid, - output tdest, - output tuser, - clocking cb_m - ); - - - // -------------------------------------------------------------------- - // - modport - slave - ( - input aresetn, - input aclk, - input tvalid, - output tready, - input tdata, - input tstrb, - input tkeep, - input tlast, - input tid, - input tdest, - input tuser, - clocking cb_s - ); - - -// synthesis translate_on -// -------------------------------------------------------------------- - - -endinterface: axis_if - - Index: trunk/axi4_stream_lib/sim/src/axis_bfm_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/src/axis_bfm_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/src/axis_bfm_pkg.sv (nonexistent) @@ -1,220 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package axis_bfm_pkg; - - - // -------------------------------------------------------------------- - // - import q_pkg::*; - import bfm_pkg::*; - - - // -------------------------------------------------------------------- - // - class axis_tr_class #(N, I, D, U) - extends transaction_class #(axis_tr_class #(N, I, D, U)); - - rand logic [(8*N)-1:0] tdata; - rand logic [N-1:0] tstrb; - rand logic [N-1:0] tkeep; - rand logic tlast; - rand logic [I-1:0] tid; - rand logic [D-1:0] tdest; - rand logic [U-1:0] tuser; - - // -------------------------------------------------------------------- - // - function void copy(TR_T from); - // delay_class delay_h; - this.tdata = from.tdata; - this.tstrb = from.tstrb; - this.tkeep = from.tkeep; - this.tlast = from.tlast; - this.tid = from.tid; - this.tdest = from.tdest; - this.tuser = from.tuser; - endfunction: copy - - - // -------------------------------------------------------------------- - // - endclass: axis_tr_class - - - // -------------------------------------------------------------------- - // - class axis_tx_bfm_class #(N, I, D, U) - extends blocking_transmission_q_class #(axis_tr_class #(.N(N), .I(I), .D(D), .U(U))); - - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out; - - - //-------------------------------------------------------------------- - // - function void set_default; - axis_out.cb_m.tvalid <= 0; - axis_out.cb_m.tdata <= 'bx; - axis_out.cb_m.tstrb <= 'bx; - axis_out.cb_m.tkeep <= 'bx; - axis_out.cb_m.tlast <= 'bx; - axis_out.cb_m.tid <= 'bx; - axis_out.cb_m.tdest <= 'bx; - axis_out.cb_m.tuser <= 'bx; - endfunction: set_default - - - //-------------------------------------------------------------------- - // - task tx_transaction(axis_tr_class #(.N(N), .I(I), .D(D), .U(U)) tr_h); - axis_out.zero_cycle_delay(); - repeat(tr_h.delay_h.delay) @(axis_out.cb_m); - - axis_out.cb_m.tvalid <= 1; - axis_out.cb_m.tdata <= tr_h.tdata; - axis_out.cb_m.tstrb <= 0; - axis_out.cb_m.tkeep <= 0; - axis_out.cb_m.tlast <= tr_h.tlast; - axis_out.cb_m.tid <= 0; - axis_out.cb_m.tdest <= 0; - axis_out.cb_m.tuser <= tr_h.tuser; - - @(axis_out.cb_m); - wait(axis_out.cb_m.tready); - // @(axis_out.cb_m iff axis_out.cb_m.tready); - - set_default(); - endtask: tx_transaction - - - // -------------------------------------------------------------------- - // - event tx_done; - - task automatic transmit(ref Q_T tr_h); - tx_transaction(tr_h); - ->tx_done; - endtask: transmit - - - //-------------------------------------------------------------------- - // - task init; - set_default(); - endtask: init - - - //-------------------------------------------------------------------- - // - function new(virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out); - this.axis_out = axis_out; - tr_h = new(); - fork - init(); - join_none - $display("^^^ %16.t | %m", $time); - endfunction: new - - // -------------------------------------------------------------------- - // - endclass: axis_tx_bfm_class - - - // -------------------------------------------------------------------- - // - class axis_rx_bfm_class #(N, I, D, U) - extends blocking_receiver_q_class #(axis_tr_class #(.N(N), .I(I), .D(D), .U(U))); - - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in; - - - //-------------------------------------------------------------------- - // - function void set_tready(bit value); - axis_in.cb_s.tready <= value; - endfunction: set_tready - - - //-------------------------------------------------------------------- - // - task rx_transaction(axis_tr_class #(.N(N), .I(I), .D(D), .U(U)) tr_h); - repeat(tr_h.delay_h.delay) @(axis_in.cb_s); - axis_in.cb_s.tready <= 1; - - @(axis_in.cb_s); - wait(axis_in.cb_s.tvalid); - // @(axis_in.cb_s iff axis_in.cb_s.tvalid); - - tr_h.tdata <= axis_in.cb_s.tdata; - tr_h.tstrb <= axis_in.cb_s.tstrb; - tr_h.tkeep <= axis_in.cb_s.tkeep; - tr_h.tlast <= axis_in.cb_s.tlast; - tr_h.tid <= axis_in.cb_s.tid; - tr_h.tdest <= axis_in.cb_s.tdest; - tr_h.tuser <= axis_in.cb_s.tuser; - - axis_in.cb_s.tready <= 0; - endtask: rx_transaction - - - // -------------------------------------------------------------------- - // - event rx_frame_done; - - virtual task receive(ref Q_T tr_h); - tr_h = new(); - void'(tr_h.delay_h.next()); - rx_transaction(tr_h); - ->rx_frame_done; - endtask: receive - - - //-------------------------------------------------------------------- - // - task init; - set_tready(0); - endtask: init - - - //-------------------------------------------------------------------- - // - function new (virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in); - this.axis_in = axis_in; - fork - init(); - join_none - $display("^^^ %16.t | %m", $time); - endfunction: new - - endclass: axis_rx_bfm_class - - -// -------------------------------------------------------------------- -// -endpackage: axis_bfm_pkg - Index: trunk/axi4_stream_lib/sim/src/tb_axis_register_slice.sv =================================================================== --- trunk/axi4_stream_lib/sim/src/tb_axis_register_slice.sv (revision 49) +++ trunk/axi4_stream_lib/sim/src/tb_axis_register_slice.sv (nonexistent) @@ -1,159 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_200mhz; - wire tb_clk = clk_200mhz; - wire tb_rst; - wire aclk = tb_clk; - wire aresetn = ~tb_rst; - - tb_base #( .PERIOD(5_000) ) tb( clk_200mhz, tb_rst ); - - - // -------------------------------------------------------------------- - // - localparam TILES = 1; - localparam WIDTH = 32; // tile width - localparam HEIGHT = 16; // tile height - localparam OUTPUTS_PER_TILE = 1; // outputs per tile - localparam BYTES_PER_PIXEL = 2; - localparam BITS_PER_PIXEL = 16; - localparam VERTICAL_BLANKING = 20; - - - // -------------------------------------------------------------------- - // - localparam AVF_N = BYTES_PER_PIXEL * OUTPUTS_PER_TILE; // data bus width in bytes - localparam AVF_U = 1; // TUSER width - - axis_if #(.N(AVF_N), .U(AVF_U)) axis_in[TILES](.*); - axis_if #(.N(AVF_N), .U(AVF_U)) axis_out[TILES](.*); - - - // -------------------------------------------------------------------- - // - axis_register_slice #(.N(AVF_N), .U(AVF_U)) - dut - ( - .axis_en(1'b1), - .axis_in(axis_in.slave[0]), - .axis_out(axis_out.master[0]), - .* - ); - - - // -------------------------------------------------------------------- - // - import axis_video_frame_bfm_pkg::*; - import avf_agent_class_pkg::*; - - - // -------------------------------------------------------------------- - // - avf_agent_config_class avf_agent_config_h; - avf_agent_class #(BYTES_PER_PIXEL, OUTPUTS_PER_TILE) avf_agent_h; - - initial - begin - - avf_agent_config_h = new - ( - .width(WIDTH), - .height(HEIGHT), - .bytes_per_pixel(BYTES_PER_PIXEL), - .bits_per_pixel(BITS_PER_PIXEL), - .tiles(TILES), - .outputs_per_tile(OUTPUTS_PER_TILE), - .name("AVF_"), - .vertical_blanking(VERTICAL_BLANKING) - ); - - avf_agent_config_h.tile[0].direction = RIGHT_DOWN; - - avf_agent_h = new - ( - .avf_agent_config(avf_agent_config_h), - .avf_axis_in_if(axis_out), - .avf_axis_out_if(axis_in) - ); - - avf_agent_h.init(); - - end - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - // -------------------------------------------------------------------- - // - - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - for(genvar j = 0; j < TILES; j++) - axis_video_debug #(BYTES_PER_PIXEL, OUTPUTS_PER_TILE) avf_debug(axis_out[j]); - - - // -------------------------------------------------------------------- - // test - the_test test( tb_clk, tb_rst ); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule - - - Index: trunk/axi4_stream_lib/sim/src/tb_axis_upsizer_agent_class_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/src/tb_axis_upsizer_agent_class_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/src/tb_axis_upsizer_agent_class_pkg.sv (nonexistent) @@ -1,129 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package tb_axis_upsizer_agent_class_pkg; - - // -------------------------------------------------------------------- - // - import video_frame_pkg::*; - import axis_video_frame_bfm_pkg::*; - - - // -------------------------------------------------------------------- - // - class tb_axis_upsizer_agent_class #(BYTES_PER_PIXEL, OUTPUTS_PER_TILE, AVF_N, AVF_U, S); - - virtual axis_if #(.N(AVF_N * S), .U(AVF_U)) avf_axis_in_if; - virtual axis_if #(.N(AVF_N), .U(AVF_U)) avf_axis_out_if; - - avf_config_class c_h; - - avf_tx_class #(BYTES_PER_PIXEL, OUTPUTS_PER_TILE, AVF_U) tx_h; - avf_rx_class #(BYTES_PER_PIXEL, OUTPUTS_PER_TILE * S, AVF_U) rx_h; - - video_frame_class clone_h; - video_frame_class sent_f_h; - video_frame_class rx_f_h; - - mailbox #(video_frame_class) q; - - - // -------------------------------------------------------------------- - // - virtual task - queue_frame - ( - string pattern = "", - int pixel = 0 - ); - - if(pattern != "") - tx_h.make_frame(pattern, pixel); - - clone_h = tx_h.tx_bfm_h[0].f_h.clone(); - tx_h.tx_bfm_h[0].put(clone_h); - q.put(clone_h); - - $display("^^^ %16.t | %m | using %s pattern", $time, pattern); - - endtask: queue_frame - - - // -------------------------------------------------------------------- - // - virtual task automatic - compare_frame; - - int mismatch_count; - - $display("^^^ %16.t | %m", $time); - - q.get(sent_f_h); - rx_h.rx_bfm_h[0].get(rx_f_h); - mismatch_count = sent_f_h.compare(8, rx_f_h); - - endtask: compare_frame - - - //-------------------------------------------------------------------- - // - function void init(avf_config_class in_c_h, avf_config_class out_c_h); - - rx_h = new(in_c_h, '{avf_axis_in_if}); - tx_h = new(out_c_h, '{avf_axis_out_if}); - - this.q = new(); - - endfunction: init - - - //-------------------------------------------------------------------- - // - function new - ( - virtual axis_if #(.N(AVF_N * S), .U(AVF_U)) avf_axis_in_if, - virtual axis_if #(.N(AVF_N), .U(AVF_U)) avf_axis_out_if - ); - - this.avf_axis_in_if = avf_axis_in_if; - this.avf_axis_out_if = avf_axis_out_if; - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: tb_axis_upsizer_agent_class - -// -------------------------------------------------------------------- -// -endpackage: tb_axis_upsizer_agent_class_pkg - - - - - Index: trunk/axi4_stream_lib/sim/src/tb_axis_upsizer_class_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/src/tb_axis_upsizer_class_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/src/tb_axis_upsizer_class_pkg.sv (nonexistent) @@ -1,114 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package tb_axis_upsizer_class_pkg; - - // -------------------------------------------------------------------- - // - import axis_video_frame_bfm_pkg::*; - import tb_axis_upsizer_agent_class_pkg::*; - - - // -------------------------------------------------------------------- - // - localparam WIDTH = 32; // tile width - localparam HEIGHT = 16; // tile height - localparam OUTPUTS_PER_TILE = 1; // outputs per tile - localparam BYTES_PER_PIXEL = 2; - localparam BITS_PER_PIXEL = 16; - localparam VERTICAL_BLANKING = 20; - - localparam S = 4; // tdata size multiplier - localparam AVF_N = BYTES_PER_PIXEL * OUTPUTS_PER_TILE; // data bus width in bytes - localparam AVF_U = 3; // TUSER width - - - // -------------------------------------------------------------------- - // - class tb_axis_upsizer_class - extends tb_axis_upsizer_agent_class #(BYTES_PER_PIXEL, OUTPUTS_PER_TILE, AVF_N, AVF_U, S); - - avf_config_class in_c_h; - avf_config_class out_c_h; - avf_tile_config_t tile_config[]; - - - //-------------------------------------------------------------------- - // - function new - ( - virtual axis_if #(.N(AVF_N * S), .U(AVF_U)) avf_axis_in_if, - virtual axis_if #(.N(AVF_N), .U(AVF_U)) avf_axis_out_if - ); - - super.new(avf_axis_in_if, avf_axis_out_if); - - this.tile_config = new[1]; - this.tile_config[0].direction = RIGHT_DOWN; - - this.in_c_h = new - ( - .width(WIDTH), - .height(HEIGHT), - .bytes_per_pixel(BYTES_PER_PIXEL), - .bits_per_pixel(BITS_PER_PIXEL), - .pixels_per_clk(OUTPUTS_PER_TILE * S), - .name("IN_"), - .vertical_blanking(VERTICAL_BLANKING), - .tile(tile_config) - ); - - this.out_c_h = new - ( - .width(WIDTH), - .height(HEIGHT), - .bytes_per_pixel(BYTES_PER_PIXEL), - .bits_per_pixel(BITS_PER_PIXEL), - .pixels_per_clk(OUTPUTS_PER_TILE), - .name("OUT_"), - .vertical_blanking(VERTICAL_BLANKING), - .tile(tile_config) - ); - - super.init(in_c_h, out_c_h); - - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: tb_axis_upsizer_class - -// -------------------------------------------------------------------- -// -endpackage: tb_axis_upsizer_class_pkg - - - - - Index: trunk/axi4_stream_lib/sim/src/tb_axis_to_axi4_agent_class_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/src/tb_axis_to_axi4_agent_class_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/src/tb_axis_to_axi4_agent_class_pkg.sv (nonexistent) @@ -1,158 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package tb_axis_to_axi4_agent_class_pkg; - - // -------------------------------------------------------------------- - // - import axi4_memory_pkg::*; - import axis_bfm_pkg::*; - - - // -------------------------------------------------------------------- - // - class tb_axis_to_axi4_agent_class #(N, A, I, D, U); - - axi4_memory_class #(A, N, I) m_h; - axis_tx_bfm_class #(N, I, D, U) s_h; - memory_tr_class #(A, N, I) m_tr_h; - axis_tr_class #(N, I, D, U) s_tr_h; - - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m; - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in; - - mailbox #(memory_tr_class #(A, N, I)) q; - - - // -------------------------------------------------------------------- - // - task wait_for_sof; - @(posedge axis_in.cb_s.tuser); - $display("^^^ %16.t | %m", $time); - endtask: wait_for_sof - - - // -------------------------------------------------------------------- - // - task wait_for_dma_done(int bvalid_count); - repeat(bvalid_count) - @(axi4_m.cb_s iff axi4_m.cb_m.bvalid & axi4_m.cb_s.bready); - $display("^^^ %16.t | %m", $time); - endtask: wait_for_dma_done - - - // -------------------------------------------------------------------- - // - task random_transaction(int addr, int size, int stride); - m_h.clear_all(); - m_tr_h = new(); - m_tr_h.random(addr, size); - q.put(m_tr_h); - - $display("^^^ %16.t | %m | m_tr_h.data.size = %x", $time, m_tr_h.data.size); - for(int i = 0; i < m_tr_h.data.size; i += N) - begin - s_tr_h = new(); - for(int k = 0; k < N; k++) - begin - s_tr_h.tdata[k*8 +: 8] = m_tr_h.data[i + k]; - end - - if(i == 0) - s_tr_h.tuser = 'b1; - else - s_tr_h.tuser = 'b0; - - if(i + N < m_tr_h.data.size) - s_tr_h.tlast = 1'b0; - else - s_tr_h.tlast = 1'b1; - - s_h.q.put(s_tr_h); - end - - wait_for_dma_done(size / stride); - endtask: random_transaction - - - // -------------------------------------------------------------------- - // - task automatic compare(int offset); - byte data[]; - - $display("^^^ %16.t | %m", $time); - $display("^^^ %16.t | q.num = %d", $time, q.num); - $display("^^^ %16.t | s_h.q.num = %d", $time, s_h.q.num); - $display("^^^ %16.t | m_tr_h.data.size = %d", $time, m_tr_h.data.size); - - if(q.try_get(m_tr_h) == 0) - begin - $display("!!! %16.t | ERROR!!! try_get(m_tr_h) == 0", $time); - $stop; - end - - data = new[m_tr_h.data.size]; - m_h.dump_words(offset, data); - - foreach(m_tr_h.data[i]) - if(data[i] != m_tr_h.data[i]) - begin - $display("!!! %16.t | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", $time); - $display("!!! %16.t | %x ", $time, i); - $display("!!! %16.t | %x | %x |", $time, data[i], m_tr_h.data[i]); - $stop; - end - - $display("^^^ %16.t | %m | done!", $time); - - endtask: compare - - - //-------------------------------------------------------------------- - // - function new - ( - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m, - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in - ); - - this.axi4_m = axi4_m; - this.axis_in = axis_in; - m_h = new(axi4_m); - s_h = new(axis_in); - q = new(); - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: tb_axis_to_axi4_agent_class - -// -------------------------------------------------------------------- -// -endpackage: tb_axis_to_axi4_agent_class_pkg Index: trunk/axi4_stream_lib/sim/src/tb_axis_upsizer.sv =================================================================== --- trunk/axi4_stream_lib/sim/src/tb_axis_upsizer.sv (revision 49) +++ trunk/axi4_stream_lib/sim/src/tb_axis_upsizer.sv (nonexistent) @@ -1,144 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_200mhz; - wire tb_clk = clk_200mhz; - wire tb_rst; - - tb_base #(.PERIOD(5_000)) tb(clk_200mhz, tb_rst); - - - // -------------------------------------------------------------------- - // - wire tb_rst_s; - wire aclk = tb_clk; - wire aresetn = ~tb_rst_s; - - sync_reset - sync_reset_i(aclk, tb_rst, tb_rst_s); - - - // -------------------------------------------------------------------- - // - import tb_axis_upsizer_class_pkg::*; - - - // -------------------------------------------------------------------- - // - axis_if #(.N(AVF_N), .U(AVF_U)) axis_in(.*); - axis_if #(.N(AVF_N * S), .U(AVF_U * S)) axis_out(.*); - - - // -------------------------------------------------------------------- - // - axis_upsizer - #( - .N(AVF_N), // data bus width in bytes - .I(1), // TID width - .D(1), // TDEST width - .U(AVF_U), // TUSER width - .S(S), // tdata size multiplier - .USE_TSTRB(0), // set to 1 to enable, 0 to disable - .USE_TKEEP(0), // set to 1 to enable, 0 to disable - .BYTES_PER_TUSER(0) // bytes per tuser bit. Set to 0 for transfer based. - ) - dut(.*); - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - // -------------------------------------------------------------------- - // - axis_checker #(.N(AVF_N * S), .I(1), .D(1), .U(AVF_U)) - axis_checker_i(.*); - - - // -------------------------------------------------------------------- - // - axis_if #(.N(AVF_N * S), .U(AVF_U)) avf_axis_in_if(.*); - - assign axis_out.tready = avf_axis_in_if.tready; - assign avf_axis_in_if.tvalid = axis_out.tvalid; - assign avf_axis_in_if.tdata = axis_out.tdata; - assign avf_axis_in_if.tuser = {axis_out.tuser[(AVF_U*S)-1], axis_out.tuser[1:0]}; - assign avf_axis_in_if.tlast = axis_out.tlast; - - - // -------------------------------------------------------------------- - // - tb_axis_upsizer_class a_h; - - initial - a_h = new(.avf_axis_in_if(avf_axis_in_if), .avf_axis_out_if(axis_in)); - - - // -------------------------------------------------------------------- - // - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - - - // -------------------------------------------------------------------- - // test - the_test test( tb_clk, tb_rst ); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule - - - Index: trunk/axi4_stream_lib/sim/tests/defparam_test_case.zip =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: trunk/axi4_stream_lib/sim/tests/defparam_test_case.zip =================================================================== --- trunk/axi4_stream_lib/sim/tests/defparam_test_case.zip (revision 49) +++ trunk/axi4_stream_lib/sim/tests/defparam_test_case.zip (nonexistent)
trunk/axi4_stream_lib/sim/tests/defparam_test_case.zip Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/wip.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/wip.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/wip.do (nonexistent) @@ -1,11 +0,0 @@ -# - -# compile simulation files -vlog -f ./$env(SIM_TB).f - -vlog ./$env(SIM_TB)_pkg.sv -vlog ./tests_pkg.sv - -# simulation $root -vlog ./$env(SIM_TB).sv - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/init_test.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/init_test.do (nonexistent) @@ -1,42 +0,0 @@ -# ------------------------------------ -# -# ------------------------------------ - -global env - -# setup environment -do ../../../../scripts/sim_env.do -set env(SIM_TARGET) fpga -set env(SIM_TB) tb_axis_gear_box - -radix -hexadecimal - -make_lib work 1 - -sim_compile_lib $env(LIB_BASE_DIR) tb_packages -sim_compile_lib $env(LIB_BASE_DIR) bfm_packages -sim_compile_lib $env(LIB_BASE_DIR) axi4_lib -sim_compile_lib $env(LIB_BASE_DIR) qaz_lib -sim_compile_lib $env(LIB_BASE_DIR) sim - -# AXI4 streaming package -vlog ./axis_pkg.sv - -vlog ./$env(SIM_TB)_pkg.sv -vlog ./tests_base_pkg.sv -vlog ./tests_pkg.sv -vlog ./tb_dut_if.sv - -# simulation $root -vlog ./$env(SIM_TB).sv - -# compile simulation files -vlog -f ./$env(SIM_TB).f - -# # compile test last -# vlog ./the_test.sv - -# run the sim -sim_run_test - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_axis_gear_box.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_axis_gear_box.f (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_axis_gear_box.f (nonexistent) @@ -1,6 +0,0 @@ -# - -./axis_pkg.sv - -${PROJECT_DIR}/src/axis_gear_box.sv - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tests_base_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tests_base_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tests_base_pkg.sv (nonexistent) @@ -1,85 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -// -------------------------------------------------------------------- -// -package tests_base_pkg; - - // -------------------------------------------------------------------- - // - import uvm_pkg::*; - `include "uvm_macros.svh" - import tb_axis_gear_box_pkg::*; - - // -------------------------------------------------------------------- - // - virtual class test_base extends uvm_test; - `uvm_component_utils(test_base); - tb_env env_h; - - // -------------------------------------------------------------------- - // - function void build_phase(uvm_phase phase); - env_h = tb_env::type_id::create("env_h",this); - endfunction : build_phase - - // -------------------------------------------------------------------- - // - function new (string name, uvm_component parent); - super.new(name,parent); - endfunction : new - - // -------------------------------------------------------------------- - // - endclass : test_base - - // -------------------------------------------------------------------- - // - class test_debug_base extends test_base; - `uvm_component_utils(test_debug_base) - - // -------------------------------------------------------------------- - // - function new (string name, uvm_component parent); - super.new(name,parent); - endfunction : new - - // -------------------------------------------------------------------- - // - function void final_phase(uvm_phase phase); - super.final_phase(phase); - $display("^^^ %16.t | %m | Test Done!!!", $time); - $stop; - endfunction : final_phase - - // -------------------------------------------------------------------- - // - endclass : test_debug_base - -// -------------------------------------------------------------------- -// -endpackage: tests_base_pkg Index: trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_dut_if.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_dut_if.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_dut_if.sv (nonexistent) @@ -1,63 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -import tb_axis_gear_box_pkg::*; - -interface - tb_dut_if #(dut_config_t dut_cfg) - ( - input aclk, - input aresetn - ); - - // -------------------------------------------------------------------- - // - axis_if - #( - .N(dut_cfg.axis_cfg_in.N), - .I(dut_cfg.axis_cfg_in.I), - .D(dut_cfg.axis_cfg_in.D), - .U(dut_cfg.axis_cfg_in.U) - ) - axis_in(.*); - - // -------------------------------------------------------------------- - // - axis_if - #( - .N(dut_cfg.axis_cfg_out.N), - .I(dut_cfg.axis_cfg_out.I), - .D(dut_cfg.axis_cfg_out.D), - .U(dut_cfg.axis_cfg_out.U) - ) - axis_out(.*); - -// -------------------------------------------------------------------- -// -endinterface: tb_dut_if - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_axis_gear_box.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_axis_gear_box.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_axis_gear_box.sv (nonexistent) @@ -1,90 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// -// ---------------------------------------------------------------------------- - -import tb_axis_gear_box_pkg::*; -import tests_pkg::*; -import uvm_pkg::*; -`include "uvm_macros.svh" - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_100mhz; - wire tb_clk = clk_100mhz; - wire tb_rst; - - tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); - - // -------------------------------------------------------------------- - // - wire tb_rst_s; - wire aclk = tb_clk; - wire aresetn = ~tb_rst_s; - wire clk = tb_clk; - wire reset = tb_rst_s; - - sync_reset sync_reset_i(tb_clk, tb_rst, tb_rst_s); - - // -------------------------------------------------------------------- - // - import tb_axis_gear_box_pkg::*; - - // -------------------------------------------------------------------- - // - tb_dut_if #(dut_cfg) dut_bus(.*); - - // -------------------------------------------------------------------- - // - axis_gear_box - dut - ( - .axis_in(dut_bus.axis_in), - .axis_out(dut_bus.axis_out), - .aclk(dut_bus.aclk), - .aresetn(dut_bus.aresetn) - ); - - // -------------------------------------------------------------------- - // - assign dut_bus.axis_out.tready = 1; - - // -------------------------------------------------------------------- - // - tb_dut_config #(dut_cfg) cfg_h; - - initial - begin - cfg_h = new(dut_bus); - uvm_config_db #(tb_dut_config #(dut_cfg))::set(null, "*env_h", "tb_dut_config", cfg_h); - run_test("t_debug"); - end - -// -------------------------------------------------------------------- -// -endmodule Index: trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_axis_gear_box_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_axis_gear_box_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tb_axis_gear_box_pkg.sv (nonexistent) @@ -1,139 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -package tb_axis_gear_box_pkg; - - // -------------------------------------------------------------------- - // - import uvm_pkg::*; - `include "uvm_macros.svh" - import axis_pkg::*; - - // -------------------------------------------------------------------- - // - typedef struct - { - axis_config_t axis_cfg_in; - axis_config_t axis_cfg_out; - } dut_config_t; - - localparam dut_config_t dut_cfg = - '{ - '{ N : 2 // data bus width in bytes. - , I : 1 // TID width - , D : 1 // TDEST width - , U : 1 // TUSER width - , USE_TSTRB : 0 - , USE_TKEEP : 0 - , USE_ROUTING : 0 - }, - '{ N : 2 // data bus width in bytes. - , I : 1 // TID width - , D : 1 // TDEST width - , U : 1 // TUSER width - , USE_TSTRB : 0 - , USE_TKEEP : 0 - , USE_ROUTING : 0 - } - }; - - // -------------------------------------------------------------------- - // - class tb_dut_config #(dut_config_t dut_cfg); - - virtual tb_dut_if #(dut_cfg) dut_bus; - - // -------------------------------------------------------------------- - // - function new(virtual tb_dut_if #(dut_cfg) dut_bus); - this.dut_bus = dut_bus; - endfunction : new - - // -------------------------------------------------------------------- - // - endclass : tb_dut_config - - // -------------------------------------------------------------------- - // - class tb_env extends uvm_env; - `uvm_component_utils(tb_env); - - // -------------------------------------------------------------------- - // - // coverage coverage_h; - // scoreboard scoreboard_h; - axis_agent #(dut_cfg.axis_cfg_in) agent_h; - - // -------------------------------------------------------------------- - // - function new (string name, uvm_component parent); - super.new(name,parent); - endfunction : new - - // -------------------------------------------------------------------- - // - function void build_phase(uvm_phase phase); - tb_dut_config #(dut_cfg) cfg_h; - if (!uvm_config_db#(tb_dut_config #(dut_cfg))::get(this, "", "tb_dut_config", cfg_h)) - `uvm_fatal(get_name(), "Couldn't get config object!") - - uvm_config_db - #( - virtual axis_if - #( .N(dut_cfg.axis_cfg_in.N) - , .I(dut_cfg.axis_cfg_in.I) - , .D(dut_cfg.axis_cfg_in.D) - , .U(dut_cfg.axis_cfg_in.U) - ) - )::set(this, "*agent_h", "axis_bus", cfg_h.dut_bus.axis_in); - - // // analysis - // coverage_h = coverage::type_id::create ("coverage_h",this); - // scoreboard_h = scoreboard::type_id::create("scoreboard",this); - - agent_h = axis_agent #(dut_cfg.axis_cfg_in)::type_id::create("agent_h", this); - - endfunction : build_phase - - // // -------------------------------------------------------------------- - // // - // function void connect_phase(uvm_phase phase); - - // endfunction : connect_phase - -// -------------------------------------------------------------------- -// -endclass : tb_env - -// -------------------------------------------------------------------- -// -endpackage: tb_axis_gear_box_pkg - - - - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/sim.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/sim.do (nonexistent) @@ -1,11 +0,0 @@ -# -# - -quit -sim - -vsim -novopt work.tb_top -# vsim -f ./sim.f work.tb_top - -# # log all signals -# log -r * - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tests_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tests_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/tests_pkg.sv (nonexistent) @@ -1,196 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -// -------------------------------------------------------------------- -// -package tests_pkg; - - // -------------------------------------------------------------------- - // - import uvm_pkg::*; - `include "uvm_macros.svh" - import axis_pkg::*; - import tb_axis_gear_box_pkg::*; - import tests_base_pkg::*; - - // -------------------------------------------------------------------- - // - class t_counting extends test_base; - `uvm_component_utils(t_counting) - - // -------------------------------------------------------------------- - // - function new(string name = "my_test", uvm_component parent); - super.new(name, parent); - endfunction - - // -------------------------------------------------------------------- - // - virtual function void end_of_elaboration_phase(uvm_phase phase); - uvm_phase run_phase = uvm_run_phase::get(); - run_phase.phase_done.set_drain_time(this, 300ns); - endfunction - - // -------------------------------------------------------------------- - // - virtual task run_phase(uvm_phase phase); - axis_counting_sequence #(dut_cfg.axis_cfg_in) seq_h; - super.run_phase(phase); - phase.raise_objection(this); - fork - repeat(3) - begin - seq_h = axis_counting_sequence #(dut_cfg.axis_cfg_in)::type_id::create("seq_h"); - seq_h.start(env_h.agent_h.sequencer); - end - join - phase.drop_objection(this); - endtask : run_phase - - // -------------------------------------------------------------------- - // - endclass : t_counting - // -------------------------------------------------------------------- - // - - // -------------------------------------------------------------------- - // - class gear_box_sequence #(dut_config_t dut_cfg) - extends uvm_sequence #(axis_sequence_item #(dut_cfg.axis_cfg_in)); - `uvm_object_param_utils(gear_box_sequence #(dut_cfg)) - - rand int length = 7 * 3; - - // -------------------------------------------------------------------- - // - typedef logic [15:0] packed_data_t[7]; - - function packed_data_t next_data(int init); - static logic [15:0] previous_value; - logic [13:0] unpacked_data[8]; - logic [15:0] packed_data[7]; - - if(init == 0) - previous_value = 0; - - foreach(unpacked_data[i]) - begin - unpacked_data[i] = previous_value; - // $display("^^^ %16.t | unpacked_data[%0.d] = %h", $time, i, unpacked_data[i]); - previous_value++; - end - - packed_data = {<<16{{<<14{unpacked_data}}}}; - - // $display("^^^ %16.t | %p", $time, packed_data); - - // foreach(packed_data[i]) - // $display("^^^ %16.t | packed_data[%0.d] = %h", $time, i, packed_data[i]); - - next_data = packed_data; - endfunction - - - // -------------------------------------------------------------------- - // - virtual task body(); - localparam CHUNKS = 3; - axis_sequence_item #(dut_cfg.axis_cfg_in) item; - logic [15:0] data[7]; - - item = axis_sequence_item #(dut_cfg.axis_cfg_in)::type_id::create("axis_sequence_item"); - - for(int i = 0; i < CHUNKS; i++) - begin - data = next_data(i); - - foreach(data[k]) - begin - start_item(item); - item.tdata = data[k]; - item.tlast = (i == CHUNKS - 1) & (k == 0); - item.tuser = 0; - finish_item(item); - // $display("^^^ %16.t | %d | %x", $time, (i * 7) + k, item.tdata); - end - end - - endtask - - // -------------------------------------------------------------------- - // - function new(string name = "gear_box_sequence"); - super.new(name); - endfunction - - // -------------------------------------------------------------------- - // - endclass : gear_box_sequence - - // -------------------------------------------------------------------- - // - class t_debug extends test_debug_base; - `uvm_component_utils(t_debug) - - // -------------------------------------------------------------------- - // - function new(string name = "t_debug", uvm_component parent); - super.new(name, parent); - endfunction - - // -------------------------------------------------------------------- - // - function void end_of_elaboration_phase(uvm_phase phase); - uvm_phase run_phase = uvm_run_phase::get(); - run_phase.phase_done.set_drain_time(this, 300ns); - endfunction - - // -------------------------------------------------------------------- - // - virtual task run_phase(uvm_phase phase); - gear_box_sequence #(dut_cfg) seq_h; - super.run_phase(phase); - phase.raise_objection(this); - - fork - repeat(3) - begin - seq_h = gear_box_sequence #(dut_cfg)::type_id::create("seq_h"); - seq_h.start(env_h.agent_h.sequencer); - end - join - - phase.drop_objection(this); - endtask : run_phase - - // -------------------------------------------------------------------- - // - endclass : t_debug - -// -------------------------------------------------------------------- -// -endpackage: tests_pkg Index: trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/axis_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/axis_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_gear_box/axis_pkg.sv (nonexistent) @@ -1,328 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -// -------------------------------------------------------------------- -// -package axis_pkg; - - // -------------------------------------------------------------------- - // - import uvm_pkg::*; - `include "uvm_macros.svh" - import bfm_pkg::*; - - // -------------------------------------------------------------------- - // - typedef struct - { - int unsigned N; // data bus width in bytes - int unsigned I; // TID width - int unsigned D; // TDEST width - int unsigned U; // TUSER width - bit USE_TSTRB; // set to 1 to enable, 0 to disable - bit USE_TKEEP; // set to 1 to enable, 0 to disable - bit USE_ROUTING; // set to 1 to enable, 0 to disable - } axis_config_t; - - // -------------------------------------------------------------------- - // - class axis_sequence_item #(axis_config_t cfg) - extends uvm_sequence_item; - `uvm_object_param_utils(axis_sequence_item #(cfg)) - - // -------------------------------------------------------------------- - // - localparam N = cfg.N; - localparam I = cfg.I; - localparam D = cfg.D; - localparam U = cfg.U; - localparam USE_TSTRB = cfg.USE_TSTRB; - localparam USE_TKEEP = cfg.USE_TKEEP; - localparam USE_ROUTING = cfg.USE_ROUTING; - - // -------------------------------------------------------------------- - // - delay_class delay_h; - rand logic [(8*N)-1:0] tdata; - rand logic [N-1:0] tstrb; - rand logic [N-1:0] tkeep; - rand logic tlast; - rand logic [I-1:0] tid; - rand logic [D-1:0] tdest; - rand logic [U-1:0] tuser; - - // -------------------------------------------------------------------- - // - function new(string name = ""); - super.new(name); - delay_h = new; - endfunction : new - - // -------------------------------------------------------------------- - // - function bit do_compare(uvm_object rhs, uvm_comparer comparer); - axis_sequence_item #(cfg) tested; - bit same; - - if (rhs==null) - `uvm_fatal(get_type_name(), "| %m | comparison to a null pointer"); - - if (!$cast(tested,rhs)) - same = 0; - else - same = super.do_compare(rhs, comparer) - & (tested.tdata == tdata) - & (USE_TSTRB ? (tested.tstrb == tstrb) : 1) - & (USE_TKEEP ? (tested.tkeep == tkeep) : 1) - & (tested.tlast == tlast) - & (USE_ROUTING ? (tested.tid == tid) : 1) - & (USE_ROUTING ? (tested.tdest == tdest) : 1) - & (tested.tuser == tuser); - return same; - endfunction : do_compare - - // -------------------------------------------------------------------- - // - function void do_copy(uvm_object rhs); - axis_sequence_item #(cfg) item; - assert(rhs != null) else - `uvm_fatal(get_type_name(), "| %m | copy null transaction"); - super.do_copy(rhs); - assert($cast(item,rhs)) else - `uvm_fatal(get_type_name(), "| %m | failed cast"); - tdata = item.tdata; - tstrb = item.tstrb; - tkeep = item.tkeep; - tlast = item.tlast; - tid = item.tid; - tdest = item.tdest; - tuser = item.tuser; - endfunction : do_copy - - // -------------------------------------------------------------------- - // - function string convert2string(); - string s0, s1; - s0 = $sformatf("| tdata: %h\n" ,tdata); - s1 = $sformatf("| tlast: %1h | tuser: %h" , tlast, tuser); - return {s1, s0}; - endfunction : convert2string - - // -------------------------------------------------------------------- - // - endclass : axis_sequence_item - - // -------------------------------------------------------------------- - // - class axis_driver #(parameter axis_config_t cfg) - extends uvm_driver #(axis_sequence_item #(cfg)); - `uvm_component_param_utils(axis_driver#(cfg)) - - // -------------------------------------------------------------------- - // - localparam N = cfg.N; - localparam I = cfg.I; - localparam D = cfg.D; - localparam U = cfg.U; - localparam USE_TSTRB = cfg.USE_TSTRB; - localparam USE_TKEEP = cfg.USE_TKEEP; - localparam USE_ROUTING = cfg.USE_ROUTING; - - // -------------------------------------------------------------------- - // - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_bus; - - //-------------------------------------------------------------------- - // - function void set_default; - axis_bus.cb_m.tvalid <= 0; - axis_bus.cb_m.tdata <= 'bx; - axis_bus.cb_m.tstrb <= 'bx; - axis_bus.cb_m.tkeep <= 'bx; - axis_bus.cb_m.tlast <= 'bx; - axis_bus.cb_m.tid <= 'bx; - axis_bus.cb_m.tdest <= 'bx; - axis_bus.cb_m.tuser <= 'bx; - endfunction: set_default - - //-------------------------------------------------------------------- - // - virtual task run_phase(uvm_phase phase); - axis_sequence_item #(cfg) item; - super.run_phase(phase); - - set_default(); - wait(~axis_bus.aresetn); - @(axis_bus.cb_m); - - forever - begin - // seq_item_port.try_next_item(item); - seq_item_port.get_next_item(item); - - axis_bus.cb_m.tvalid <= 1; - axis_bus.cb_m.tdata <= item.tdata; - axis_bus.cb_m.tstrb <= 0; - axis_bus.cb_m.tkeep <= 0; - axis_bus.cb_m.tlast <= item.tlast; - axis_bus.cb_m.tid <= 0; - axis_bus.cb_m.tdest <= 0; - axis_bus.cb_m.tuser <= item.tuser; - - @(axis_bus.cb_m); - wait(axis_bus.cb_m.tready); - // @(axis_bus.cb_m iff axis_bus.cb_m.tready); - - set_default(); - repeat(item.delay_h.next()) @(axis_bus.cb_m); - - seq_item_port.item_done(); - end - endtask : run_phase - - //-------------------------------------------------------------------- - // - function new(string name, uvm_component parent); - super.new(name, parent); - endfunction - - // -------------------------------------------------------------------- - // - endclass : axis_driver - - // -------------------------------------------------------------------- - // - class axis_sequencer #(axis_config_t cfg) - extends uvm_sequencer #(axis_sequence_item #(cfg)); - `uvm_component_param_utils(axis_sequencer #(cfg)) - - // -------------------------------------------------------------------- - // - function new(string name, uvm_component parent); - super.new(name, parent); - endfunction - - // -------------------------------------------------------------------- - // - endclass : axis_sequencer - - // -------------------------------------------------------------------- - // - class axis_counting_sequence #(axis_config_t cfg) - extends uvm_sequence #(axis_sequence_item #(cfg)); - `uvm_object_param_utils(axis_counting_sequence #(cfg)) - - rand int length = 16; - - // -------------------------------------------------------------------- - // - virtual task body(); - axis_sequence_item #(cfg) item; - - for(int i = 0; i < length; i++) - begin - item = axis_sequence_item #(cfg)::type_id::create("axis_sequence_item"); - - item.tdata = i; - item.tlast = (i == length - 1); - - start_item (item); - finish_item(item); - end - endtask - - // -------------------------------------------------------------------- - // - function new(string name = "axis_counting_sequence"); - super.new(name); - endfunction - - // -------------------------------------------------------------------- - // - endclass : axis_counting_sequence - - // -------------------------------------------------------------------- - // - class axis_agent #(axis_config_t cfg) - extends uvm_agent; - `uvm_component_param_utils(axis_agent #(cfg)) - - // -------------------------------------------------------------------- - // - localparam N = cfg.N; - localparam I = cfg.I; - localparam D = cfg.D; - localparam U = cfg.U; - localparam USE_TSTRB = cfg.USE_TSTRB; - localparam USE_TKEEP = cfg.USE_TKEEP; - localparam USE_ROUTING = cfg.USE_ROUTING; - - // -------------------------------------------------------------------- - // - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_bus; - - axis_driver #(cfg) driver; - // my_monitor #(cfg) monitor; - axis_sequencer #(cfg) sequencer; - - // -------------------------------------------------------------------- - // - virtual function void build_phase(uvm_phase phase); - super.build_phase(phase); - - if(!uvm_config_db #(virtual axis_if #(.N(N), .I(I), .D(D), .U(U)))::get(this, "", "axis_bus", axis_bus)) - `uvm_fatal(get_name(), "Couldn't get virtual interface!") - - driver = axis_driver #(cfg)::type_id::create("driver", this); - // monitor = my_monitor #(cfg)::type_id::create("monitor" , this); - sequencer = axis_sequencer #(cfg)::type_id::create("sequencer", this); - endfunction - - // -------------------------------------------------------------------- - // - virtual function void connect_phase(uvm_phase phase); - super.connect_phase(phase); - - driver.axis_bus = axis_bus; - // monitor.vif = vif; - - driver.seq_item_port.connect(sequencer.seq_item_export); - endfunction - - // -------------------------------------------------------------------- - // - function new(string name, uvm_component parent); - super.new(name, parent); - endfunction - - // -------------------------------------------------------------------- - // - endclass : axis_agent - -// -------------------------------------------------------------------- -// -endpackage: axis_pkg Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/init_test.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/init_test.do (nonexistent) @@ -1,35 +0,0 @@ -# ------------------------------------ -# -# ------------------------------------ - -global env - -# setup environment -do ../../../../scripts/sim_env.do -set env(SIM_TARGET) fpga -set env(SIM_TB) tb_recursive_axis_switch - -radix -hexadecimal - -make_lib work 1 - -sim_compile_lib $env(LIB_BASE_DIR) tb_packages -sim_compile_lib $env(LIB_BASE_DIR) bfm_packages -sim_compile_lib $env(LIB_BASE_DIR) axi4_lib -sim_compile_lib $env(LIB_BASE_DIR) qaz_lib -sim_compile_lib $env(LIB_BASE_DIR) sim - -# compile simulation files -vlog -f ./$env(SIM_TB).f - -# simulation $root -vlog ./$env(SIM_TB)_pkg.sv -vlog ./$env(SIM_TB).sv - -# compile test last -vlog ./the_test.sv - -# run the sim -sim_run_test - - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/tb_recursive_axis_switch.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/tb_recursive_axis_switch.f (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/tb_recursive_axis_switch.f (nonexistent) @@ -1,5 +0,0 @@ -# - -${PROJECT_DIR}/src/axis_switch.sv -${PROJECT_DIR}/src/recursive_axis_switch.sv - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/the_test.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/the_test.sv (nonexistent) @@ -1,86 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -`timescale 1ps/1ps - - -module the_test(input tb_clk, input tb_rst); - - // -------------------------------------------------------------------- - // - import tb_recursive_axis_switch_pkg::*; - - // -------------------------------------------------------------------- - // - int i = 0; - - task automatic run_the_test; - - // -------------------------------------------------------------------- - // insert test below - // -------------------------------------------------------------------- - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench begun.", $time); - $display("^^^---------------------------------"); - - // -------------------------------------------------------------------- - tb_top.tb.timeout_stop(2ms); - wait(~tb_rst); - - // -------------------------------------------------------------------- - #1us; - - // // -------------------------------------------------------------------- - // repeat(1)tb_top.a_h.queue_frame("counting"); - - // // -------------------------------------------------------------------- - // repeat(1) tb_top.a_h.queue_frame("random"); - // repeat(1)tb_top.a_h.queue_frame("counting"); - // repeat(3) tb_top.a_h.queue_frame("random"); - // tb_top.a_h.queue_frame("constant", 16'habba); - - // -------------------------------------------------------------------- - for(i = 0; i < SD; i++) - begin - force tb_top.select = i; - #1us; - tb_top.a_h.queue_frame("counting"); - #8us; - end - - // -------------------------------------------------------------------- - #5us; - - // -------------------------------------------------------------------- - // insert test above - // -------------------------------------------------------------------- - - endtask - - -endmodule - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/tb_recursive_axis_switch.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/tb_recursive_axis_switch.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/tb_recursive_axis_switch.sv (nonexistent) @@ -1,127 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// -// ---------------------------------------------------------------------------- - -`timescale 1ps/1ps - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_100mhz; - wire tb_clk = clk_100mhz; - wire tb_rst; - - tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); - - - // -------------------------------------------------------------------- - // - wire tb_rst_s; - wire aclk = tb_clk; - wire aresetn = ~tb_rst_s; - wire clk = tb_clk; - wire reset = tb_rst_s; - - sync_reset sync_reset_i(tb_clk, tb_rst, tb_rst_s); - - - // -------------------------------------------------------------------- - // - import tb_recursive_axis_switch_pkg::*; - - - // -------------------------------------------------------------------- - // - axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in(.*); - axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out[SD-1:0](.*); - - - // -------------------------------------------------------------------- - // - wire [SA-1:0] select = 0; - - recursive_axis_switch #(.N(N), .I(I), .D(D), .U(U), .SA(SA)) - dut(.*); - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - - // // -------------------------------------------------------------------- - // // - // initial - // axis_out.cb_s.tready <= 1; - - - // -------------------------------------------------------------------- - // - tb_recursive_axis_switch_class a_h; - - initial - a_h = new(axis_in, axis_out); - - - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - - - // -------------------------------------------------------------------- - // test - the_test test(tb_clk, tb_rst); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule - - - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/sim.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/sim.do (nonexistent) @@ -1,11 +0,0 @@ -# -# - -quit -sim - -vsim -novopt work.tb_top -# vsim -f ./sim.f work.tb_top - -# log all signals -log -r * - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/tb_recursive_axis_switch_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/tb_recursive_axis_switch_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_switch/tb_recursive_axis_switch_pkg.sv (nonexistent) @@ -1,142 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package tb_recursive_axis_switch_pkg; - - // -------------------------------------------------------------------- - // - import video_frame_pkg::*; - import axis_video_frame_bfm_pkg::*; - import avf_agent_class_pkg::*; - - - // -------------------------------------------------------------------- - // - localparam AW = 32; // active width - localparam AH = 16; // active height - localparam B = 2; // bytes per pixel - localparam T = 1; // pixels per clock - localparam VERTICAL_BLANKING = AW * 4; - localparam N = B * T; // data bus width in bytes - localparam I = 1; // TID width - localparam D = 1; // TDEST width - localparam U = 3; // TUSER width - localparam SA = 2; - localparam SD = 2 ** SA; - - - // -------------------------------------------------------------------- - // - class tb_recursive_axis_switch_class; - - avf_config_class c_h; - avf_tile_config_t tile_config[]; - - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out[]; - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in; - - avf_tx_class #(B, T, U) tx_h; - avf_rx_class #(B, T, U) rx_h; - - // video_frame_class clone_h; - // video_frame_class sent_f_h; - // video_frame_class rx_f_h; - - // mailbox #(video_frame_class) q[]; - - - // -------------------------------------------------------------------- - // - task automatic - queue_frame - ( - string pattern = "", - int pixel = 0 - ); - video_frame_class clone_h; - - if(pattern != "") - tx_h.make_frame(pattern, pixel); - - foreach(tx_h.tx_bfm_h[i]) - begin - clone_h = tx_h.tx_bfm_h[i].f_h.clone(); - tx_h.tx_bfm_h[i].put(clone_h); - // q[i].put(clone_h); - end - - $display("^^^ %16.t | %m | using %s pattern", $time, pattern); - - endtask: queue_frame - - - //-------------------------------------------------------------------- - // - function new - ( - virtual axis_if #(.N(N), .U(U)) axis_in, - virtual axis_if #(.N(N), .U(U)) axis_out[] - ); - - this.axis_out = axis_out; - this.axis_in = axis_in; - - this.tile_config = new[T]; - this.tile_config[0].direction = RIGHT_DOWN; - - this.c_h = new - ( - .width(AW), - .height(AH), - .bytes_per_pixel(B), - .bits_per_pixel(B * 8), - .pixels_per_clk(T), - .name("AVR_"), - .vertical_blanking(VERTICAL_BLANKING), - .tile(tile_config) - ); - - rx_h = new(c_h, axis_out); - tx_h = new(c_h, '{axis_in}); - - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: tb_recursive_axis_switch_class - - -// -------------------------------------------------------------------- -// -endpackage: tb_recursive_axis_switch_pkg - - - - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/tb_axis_upsizer.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/tb_axis_upsizer.f (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/tb_axis_upsizer.f (nonexistent) @@ -1,6 +0,0 @@ -# - -${PROJECT_DIR}/sim/src/tb_axis_upsizer_agent_class_pkg.sv -${PROJECT_DIR}/sim/src/tb_axis_upsizer_class_pkg.sv - -${PROJECT_DIR}/src/axis_upsizer.sv Index: trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/init_test.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/init_test.do (nonexistent) @@ -1,37 +0,0 @@ -# ------------------------------------ -# -# ------------------------------------ - -global env - -set env(ROOT_DIR) ../../../../.. -set env(PROJECT_DIR) ../../.. -set env(SIM_TARGET) fpga - -# load sim procedures -do $env(ROOT_DIR)/qaz_libs/scripts/sim_procs.do - -radix -hexadecimal - -make_lib work 1 - -sim_compile_all tb_packages -sim_compile_all bfm_packages -sim_compile_all axi4_lib -sim_compile_all qaz_libs -sim_compile_all sim -vlog -f ./tb_axis_upsizer.f - -# simulation $root -vlog $env(PROJECT_DIR)/sim/src/tb_axis_upsizer.sv - -# compile test last -vlog ./the_test.sv - -# vopt work.glbl tb_top -L secureip -L simprims_ver -L unisims_ver -f opt_tb_top.f -o opt_tb_top - -# run the sim -sim_run_test - - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/the_test.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/the_test.sv (nonexistent) @@ -1,98 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -`timescale 1ps/1ps - - -module - the_test( - input tb_clk, - input tb_rst - ); - - // -------------------------------------------------------------------- - // - int mismatch_count = 0; - - - // -------------------------------------------------------------------- - // - task run_the_test; - - // -------------------------------------------------------------------- - // insert test below - // -------------------------------------------------------------------- - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench begun.\n", $time); - $display("^^^---------------------------------"); - - // -------------------------------------------------------------------- - tb_top.tb.timeout_stop(50us); - - - // -------------------------------------------------------------------- - wait(tb_top.aresetn); - #1us; - - // -------------------------------------------------------------------- - repeat(3) tb_top.a_h.queue_frame("counting"); - repeat(3) tb_top.a_h.compare_frame(); - - // -------------------------------------------------------------------- - tb_top.a_h.tx_h.make_frame("constant", 16'habba); - tb_top.a_h.queue_frame(); - tb_top.a_h.compare_frame(); - - tb_top.a_h.queue_frame("random"); - tb_top.a_h.compare_frame(); - - tb_top.a_h.queue_frame("constant", 16'hbeef); - tb_top.a_h.compare_frame(); - - tb_top.a_h.queue_frame("random"); - tb_top.a_h.rx_h.wait_for_rx_frames(1); - tb_top.a_h.compare_frame(); - - tb_top.a_h.queue_frame("counting"); - tb_top.a_h.compare_frame(); - - repeat(3) tb_top.a_h.queue_frame("random"); - repeat(3) tb_top.a_h.compare_frame(); - - // -------------------------------------------------------------------- - #1us; - // #6us; - - // -------------------------------------------------------------------- - // insert test above - // -------------------------------------------------------------------- - - endtask - - -endmodule - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/sim.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_upsizer/sim.do (nonexistent) @@ -1,16 +0,0 @@ -# -# - - -quit -sim - -# vsim opt_tb_top -vsim -novopt work.tb_top -# vsim -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top - -# log all signals -log -r * - -# run -all - - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/tb_recursive_axis_catenate.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/tb_recursive_axis_catenate.f (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/tb_recursive_axis_catenate.f (nonexistent) @@ -1,6 +0,0 @@ -# - -${PROJECT_DIR}/src/recursive_axis_mux.sv -${PROJECT_DIR}/src/axis_catenate.sv -${PROJECT_DIR}/src/recursive_axis_catenate.sv - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/sim.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/sim.do (nonexistent) @@ -1,11 +0,0 @@ -# -# - -quit -sim - -vsim -novopt work.tb_top -# vsim -f ./sim.f work.tb_top - -# log all signals -log -r * - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/tb_recursive_axis_catenate.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/tb_recursive_axis_catenate.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/tb_recursive_axis_catenate.sv (nonexistent) @@ -1,126 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// -// ---------------------------------------------------------------------------- - - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_100mhz; - wire tb_clk = clk_100mhz; - wire tb_rst; - - tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); - - - // -------------------------------------------------------------------- - // - wire tb_rst_s; - wire aclk = tb_clk; - wire aresetn = ~tb_rst_s; - wire clk = tb_clk; - wire reset = tb_rst_s; - - sync_reset sync_reset_i(tb_clk, tb_rst, tb_rst_s); - - - // -------------------------------------------------------------------- - // - import tb_recursive_axis_catenate_pkg::*; - - - // -------------------------------------------------------------------- - // - axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in[MD-1:0](.*); - axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out(.*); - - - // -------------------------------------------------------------------- - // - recursive_axis_catenate - #( - .N(N), - .I(I), - .D(D), - .U(U), - .U_IS_EOP(U_IS_EOP), - .MA(MA) - ) - dut(.*); - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - - // -------------------------------------------------------------------- - // - tb_recursive_axis_catenate_class a_h; - - initial - a_h = new(axis_in, axis_out); - - - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - - - // -------------------------------------------------------------------- - // test - the_test test(tb_clk, tb_rst); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule - - - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/tb_recursive_axis_catenate_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/tb_recursive_axis_catenate_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/tb_recursive_axis_catenate_pkg.sv (nonexistent) @@ -1,144 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package tb_recursive_axis_catenate_pkg; - - // -------------------------------------------------------------------- - // - import video_frame_pkg::*; - import axis_video_frame_bfm_pkg::*; - import avf_agent_class_pkg::*; - - - // -------------------------------------------------------------------- - // - localparam AW = 32; // active width - localparam AH = 16; // active height - localparam B = 2; // bytes per pixel - localparam T = 1; // pixels per clock - localparam VERTICAL_BLANKING = AW * 4; - localparam N = B * T; // data bus width in bytes - localparam I = 1; // TID width - localparam D = 1; // TDEST width - localparam U = 3; // TUSER width - // localparam U_IS_EOP = 2; - localparam U_IS_EOP = -1; - localparam MA = 2; - localparam MD = 2 ** MA; - - - // -------------------------------------------------------------------- - // - class tb_recursive_axis_catenate_class; - - avf_config_class c_h; - avf_tile_config_t tile_config[]; - - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out; - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in[]; - - avf_tx_class #(B, T, U) tx_h; - avf_rx_class #(B, T, U) rx_h; - - // video_frame_class clone_h; - // video_frame_class sent_f_h; - // video_frame_class rx_f_h; - - // mailbox #(video_frame_class) q[]; - - - // -------------------------------------------------------------------- - // - task automatic - queue_frame - ( - string pattern = "", - int pixel = 0 - ); - video_frame_class clone_h; - - if(pattern != "") - tx_h.make_frame(pattern, pixel); - - foreach(tx_h.tx_bfm_h[i]) - begin - clone_h = tx_h.tx_bfm_h[i].f_h.clone(); - tx_h.tx_bfm_h[i].put(clone_h); - // q[i].put(clone_h); - end - - $display("^^^ %16.t | %m | using %s pattern", $time, pattern); - - endtask: queue_frame - - - //-------------------------------------------------------------------- - // - function new - ( - virtual axis_if #(.N(N), .U(U)) axis_in[], - virtual axis_if #(.N(N), .U(U)) axis_out - ); - - this.axis_out = axis_out; - this.axis_in = axis_in; - - this.tile_config = new[T]; - this.tile_config[0].direction = RIGHT_DOWN; - - this.c_h = new - ( - .width(AW), - .height(AH), - .bytes_per_pixel(B), - .bits_per_pixel(B * 8), - .pixels_per_clk(T), - .name("AVR_"), - .vertical_blanking(VERTICAL_BLANKING), - .tile(tile_config) - ); - - rx_h = new(c_h, '{axis_out}); - tx_h = new(c_h, axis_in); - - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: tb_recursive_axis_catenate_class - - -// -------------------------------------------------------------------- -// -endpackage: tb_recursive_axis_catenate_pkg - - - - - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/init_test.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/init_test.do (nonexistent) @@ -1,35 +0,0 @@ -# ------------------------------------ -# -# ------------------------------------ - -global env - -# setup environment -do ../../../../scripts/sim_env.do -set env(SIM_TARGET) fpga -set env(SIM_TB) tb_recursive_axis_catenate - -radix -hexadecimal - -make_lib work 1 - -sim_compile_lib $env(LIB_BASE_DIR) tb_packages -sim_compile_lib $env(LIB_BASE_DIR) bfm_packages -sim_compile_lib $env(LIB_BASE_DIR) axi4_lib -sim_compile_lib $env(LIB_BASE_DIR) qaz_lib -sim_compile_lib $env(LIB_BASE_DIR) sim - -# compile simulation files -vlog -f ./$env(SIM_TB).f - -# simulation $root -vlog ./$env(SIM_TB)_pkg.sv -vlog ./$env(SIM_TB).sv - -# compile test last -vlog ./the_test.sv - -# run the sim -sim_run_test - - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/the_test.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_catenate/the_test.sv (nonexistent) @@ -1,84 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -`timescale 1ps/1ps - - -module the_test(input tb_clk, input tb_rst); - - // -------------------------------------------------------------------- - // - import tb_recursive_axis_catenate_pkg::*; - - // -------------------------------------------------------------------- - // - int i = 0; - - task automatic run_the_test; - - // -------------------------------------------------------------------- - // insert test below - // -------------------------------------------------------------------- - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench begun.", $time); - $display("^^^---------------------------------"); - - // -------------------------------------------------------------------- - tb_top.tb.timeout_stop(2ms); - wait(~tb_rst); - - // -------------------------------------------------------------------- - #1us; - - // -------------------------------------------------------------------- - repeat(10)tb_top.a_h.queue_frame("counting"); - - // // -------------------------------------------------------------------- - // repeat(1) tb_top.a_h.queue_frame("random"); - // repeat(1)tb_top.a_h.queue_frame("counting"); - // repeat(3) tb_top.a_h.queue_frame("random"); - // tb_top.a_h.queue_frame("constant", 16'habba); - - // // -------------------------------------------------------------------- - // for(i = 0; i < MD; i++) - // begin - // force tb_top.select = i; - // #20us; - // end - - // -------------------------------------------------------------------- - #100us; - - // -------------------------------------------------------------------- - // insert test above - // -------------------------------------------------------------------- - - endtask - - -endmodule - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/sim.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/sim.do (nonexistent) @@ -1,11 +0,0 @@ -# -# - -quit -sim - -vsim -novopt work.tb_top -# vsim -f ./sim.f work.tb_top - -# log all signals -log -r * - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/tb_axis_switch_allocator.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/tb_axis_switch_allocator.f (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/tb_axis_switch_allocator.f (nonexistent) @@ -1,6 +0,0 @@ -# - -${PROJECT_DIR}/src/axis_switch.sv -${PROJECT_DIR}/src/recursive_axis_switch.sv - -${PROJECT_DIR}/src/axis_switch_allocator.sv Index: trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/tb_axis_switch_allocator.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/tb_axis_switch_allocator.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/tb_axis_switch_allocator.sv (nonexistent) @@ -1,118 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// -// ---------------------------------------------------------------------------- - - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_100mhz; - wire tb_clk = clk_100mhz; - wire tb_rst; - - tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); - - - // -------------------------------------------------------------------- - // - wire tb_rst_s; - wire aclk = tb_clk; - wire aresetn = ~tb_rst_s; - wire clk = tb_clk; - wire reset = tb_rst_s; - - sync_reset sync_reset_i(tb_clk, tb_rst, tb_rst_s); - - - // -------------------------------------------------------------------- - // - import tb_axis_switch_allocator_pkg::*; - - - // -------------------------------------------------------------------- - // - axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in(.*); - axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out[SD-1:0](.*); - - - // -------------------------------------------------------------------- - // - axis_switch_allocator #(.N(N), .I(I), .D(D), .U(U), .U_IS_EOP(U_IS_EOP), .SA(SA)) - dut(.*); - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - - // -------------------------------------------------------------------- - // - tb_axis_switch_allocator_class a_h; - - initial - a_h = new(axis_in, axis_out); - - - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - - - // -------------------------------------------------------------------- - // test - the_test test(tb_clk, tb_rst); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule - - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/tb_axis_switch_allocator_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/tb_axis_switch_allocator_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/tb_axis_switch_allocator_pkg.sv (nonexistent) @@ -1,143 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package tb_axis_switch_allocator_pkg; - - // -------------------------------------------------------------------- - // - import video_frame_pkg::*; - import axis_video_frame_bfm_pkg::*; - import avf_agent_class_pkg::*; - - - // -------------------------------------------------------------------- - // - localparam AW = 32; // active width - localparam AH = 16; // active height - localparam B = 2; // bytes per pixel - localparam T = 1; // pixels per clock - localparam VERTICAL_BLANKING = AW * 4; - localparam N = B * T; // data bus width in bytes - localparam I = 1; // TID width - localparam D = 1; // TDEST width - localparam U = 3; // TUSER width - localparam U_IS_EOP = 2; - localparam SA = 3; - localparam SD = 2 ** SA; - - - // -------------------------------------------------------------------- - // - class tb_axis_switch_allocator_class; - - avf_config_class c_h; - avf_tile_config_t tile_config[]; - - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out[]; - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in; - - avf_tx_class #(B, T, U) tx_h; - avf_rx_class #(B, T, U) rx_h; - - // video_frame_class clone_h; - // video_frame_class sent_f_h; - // video_frame_class rx_f_h; - - // mailbox #(video_frame_class) q[]; - - - // -------------------------------------------------------------------- - // - task automatic - queue_frame - ( - string pattern = "", - int pixel = 0 - ); - video_frame_class clone_h; - - if(pattern != "") - tx_h.make_frame(pattern, pixel); - - foreach(tx_h.tx_bfm_h[i]) - begin - clone_h = tx_h.tx_bfm_h[i].f_h.clone(); - tx_h.tx_bfm_h[i].put(clone_h); - // q[i].put(clone_h); - end - - $display("^^^ %16.t | %m | using %s pattern", $time, pattern); - - endtask: queue_frame - - - //-------------------------------------------------------------------- - // - function new - ( - virtual axis_if #(.N(N), .U(U)) axis_in, - virtual axis_if #(.N(N), .U(U)) axis_out[] - ); - - this.axis_out = axis_out; - this.axis_in = axis_in; - - this.tile_config = new[T]; - this.tile_config[0].direction = RIGHT_DOWN; - - this.c_h = new - ( - .width(AW), - .height(AH), - .bytes_per_pixel(B), - .bits_per_pixel(B * 8), - .pixels_per_clk(T), - .name("AVR_"), - .vertical_blanking(VERTICAL_BLANKING), - .tile(tile_config) - ); - - rx_h = new(c_h, axis_out); - tx_h = new(c_h, '{axis_in}); - - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: tb_axis_switch_allocator_class - - -// -------------------------------------------------------------------- -// -endpackage: tb_axis_switch_allocator_pkg - - - - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/init_test.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/init_test.do (nonexistent) @@ -1,35 +0,0 @@ -# ------------------------------------ -# -# ------------------------------------ - -global env - -# setup environment -do ../../../../scripts/sim_env.do -set env(SIM_TARGET) fpga -set env(SIM_TB) tb_axis_switch_allocator - -radix -hexadecimal - -make_lib work 1 - -sim_compile_lib $env(LIB_BASE_DIR) tb_packages -sim_compile_lib $env(LIB_BASE_DIR) bfm_packages -sim_compile_lib $env(LIB_BASE_DIR) axi4_lib -sim_compile_lib $env(LIB_BASE_DIR) qaz_lib -sim_compile_lib $env(LIB_BASE_DIR) sim - -# compile simulation files -vlog -f ./$env(SIM_TB).f - -# simulation $root -vlog ./$env(SIM_TB)_pkg.sv -vlog ./$env(SIM_TB).sv - -# compile test last -vlog ./the_test.sv - -# run the sim -sim_run_test - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/the_test.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_switch_allocator/the_test.sv (nonexistent) @@ -1,88 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -`timescale 1ps/1ps - - -module the_test(input tb_clk, input tb_rst); - - // -------------------------------------------------------------------- - // - import tb_axis_switch_allocator_pkg::*; - - // -------------------------------------------------------------------- - // - int i = 0; - - task automatic run_the_test; - - // -------------------------------------------------------------------- - // insert test below - // -------------------------------------------------------------------- - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench begun.", $time); - $display("^^^---------------------------------"); - - // -------------------------------------------------------------------- - tb_top.tb.timeout_stop(2ms); - wait(~tb_rst); - - // -------------------------------------------------------------------- - #1us; - - // // -------------------------------------------------------------------- - // repeat(1)tb_top.a_h.queue_frame("counting"); - - // // -------------------------------------------------------------------- - // repeat(1) tb_top.a_h.queue_frame("random"); - // repeat(1)tb_top.a_h.queue_frame("counting"); - // repeat(3) tb_top.a_h.queue_frame("random"); - // tb_top.a_h.queue_frame("constant", 16'habba); - - // // -------------------------------------------------------------------- - // for(i = 0; i < SD; i++) - // begin - // #1us; - // tb_top.a_h.queue_frame("counting"); - // #8us; - // end - - // -------------------------------------------------------------------- - repeat(SD * 2) tb_top.a_h.queue_frame("counting"); - - // -------------------------------------------------------------------- - #100us; - - // -------------------------------------------------------------------- - // insert test above - // -------------------------------------------------------------------- - - endtask - - -endmodule - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/wip.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/wip.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/wip.do (nonexistent) @@ -1,11 +0,0 @@ -# - -vlog -f ./tb_axis_to_axi4_basic_dma.f - -# simulation $root -vlog ./tb_axis_to_axi4_basic_dma.sv - -# compile test last -vlog ./the_test.sv - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/init_test.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/init_test.do (nonexistent) @@ -1,34 +0,0 @@ -# ------------------------------------ -# -# ------------------------------------ - -global env - -# setup environment -do ../../../../scripts/sim_env.do -set env(SIM_TARGET) fpga -set env(SIM_TB) tb_axis_to_axi4_basic_dma - -radix -hexadecimal - -make_lib work 1 - -sim_compile_all tb_packages -sim_compile_all bfm_packages -sim_compile_all axi4_lib -sim_compile_all qaz_lib -sim_compile_all sim - -# compile simulation files -vlog -f ./$env(SIM_TB).f - -# simulation $root -vlog ./$env(SIM_TB)_pkg.sv -vlog ./$env(SIM_TB).sv - -# compile test last -vlog ./the_test.sv - -# run the sim -sim_run_test - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/the_test.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/the_test.sv (nonexistent) @@ -1,60 +0,0 @@ -// -------------------------------------------------------------------- -// -// -------------------------------------------------------------------- - -`timescale 1ps/1ps - - -module - the_test( - input tb_clk, - input tb_rst - ); - - // -------------------------------------------------------------------- - // - import tb_axis_to_axi4_basic_dma_pkg::*; - - - // -------------------------------------------------------------------- - // - task run_the_test; - - // -------------------------------------------------------------------- - // insert test below - // -------------------------------------------------------------------- - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench begun.", $time); - $display("^^^---------------------------------"); - - // -------------------------------------------------------------------- - tb_top.tb.timeout_stop(50us); - - // -------------------------------------------------------------------- - wait(tb_top.aresetn); - #200ns; - - // -------------------------------------------------------------------- - force tb_top.dma_enable = 1; - #100ns; - - // -------------------------------------------------------------------- - repeat(8) - begin - tb_top.a_h.random_transaction(BASE_ADDRESS, BUFFER_SIZE, N * BURST_LENGTH); - tb_top.a_h.compare(BASE_ADDRESS); - end - - // -------------------------------------------------------------------- - #200ns; - - // -------------------------------------------------------------------- - // insert test above - // -------------------------------------------------------------------- - - endtask - -// -------------------------------------------------------------------- -// -endmodule - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.f (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.f (nonexistent) @@ -1,12 +0,0 @@ -# - -${LIB_BASE_DIR}/axi4_stream_lib/sim/src/axis_bfm_pkg.sv -${LIB_BASE_DIR}/axi4_lib/sim/src/axi4_models/axi4_memory_pkg.sv - -${PROJECT_DIR}/sim/src/tb_axis_to_axi4_agent_class_pkg.sv - -${PROJECT_DIR}/src/axis_to_axi4_basic_dma.sv - -./${SIM_TB}_pkg.sv -./${SIM_TB}.sv - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.sv (nonexistent) @@ -1,115 +0,0 @@ -// -------------------------------------------------------------------- -// -// -------------------------------------------------------------------- - - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_200mhz; - wire tb_clk = clk_200mhz; - wire tb_rst; - - tb_base #(.PERIOD(5_000)) tb(clk_200mhz, tb_rst); - - - // -------------------------------------------------------------------- - // - wire tb_rst_s; - wire aclk = tb_clk; - wire aresetn = ~tb_rst_s; - - sync_reset - sync_reset_i(aclk, tb_rst, tb_rst_s); - - - // -------------------------------------------------------------------- - // - import tb_axis_to_axi4_basic_dma_pkg::*; - - - // -------------------------------------------------------------------- - // - axi4_if #(.A(A), .N(N), .I(I)) axi4_m(.*); - axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in(.*); - - - // -------------------------------------------------------------------- - // - logic dma_enable = 0; - - axis_to_axi4_basic_dma - #( - .A(A), - .N(N), - .I(I), - .BASE_ADDRESS(BASE_ADDRESS), - .BUFFER_SIZE(BUFFER_SIZE), - .BURST_LENGTH(BURST_LENGTH), - .MAX_BURSTS(MAX_BURSTS), - .BYTES_PER_TUSER(BYTES_PER_TUSER) - ) - dut(.*); - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - // -------------------------------------------------------------------- - // - axi4_checker #(.A(A), .N(N), .MAXWAITS(64)) - axi4_checker_i(.axi4_in(axi4_m)); - - - // -------------------------------------------------------------------- - // - axis_checker #(.N(N), .I(I), .D(D), .U(U), .MAXWAITS(64)) - axis_checker_i(.axis_in(axis_in)); - - - // -------------------------------------------------------------------- - // - tb_axis_to_axi4_basic_dma_class a_h; - - initial - a_h = new(axi4_m, axis_in); - - - // -------------------------------------------------------------------- - // - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - - - // -------------------------------------------------------------------- - // test - the_test test(tb_clk, tb_rst); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule Index: trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/sim.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/sim.do (nonexistent) @@ -1,13 +0,0 @@ -# -# - -quit -sim - -vsim -novopt work.tb_top - -# log all signals -log -r * - -# run -all - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma_pkg.sv (nonexistent) @@ -1,58 +0,0 @@ -// -------------------------------------------------------------------- -// -// -------------------------------------------------------------------- - - -package tb_axis_to_axi4_basic_dma_pkg; - - // -------------------------------------------------------------------- - // - import tb_axis_to_axi4_agent_class_pkg::*; - - - // -------------------------------------------------------------------- - // - localparam BASE_ADDRESS = 32'h0000_0000; // must be on 4K boundry - localparam BUFFER_SIZE = 'h800; - localparam BURST_LENGTH = 8'h08; - localparam MAX_BURSTS = 4; - localparam BYTES_PER_TUSER = 2; // bytes per tuser bit. Set to 0 for transfer based. - - localparam N = 8; // data bus width in bytes - localparam A = 32; // address bus width - localparam I = 1; // ID width - localparam D = 1; // TDEST width - localparam U = N / BYTES_PER_TUSER; // TUSER width - - - // -------------------------------------------------------------------- - // - class tb_axis_to_axi4_basic_dma_class - extends tb_axis_to_axi4_agent_class #(N, A, I, D, U); - - - //-------------------------------------------------------------------- - // - function new - ( - virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m, - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in - ); - - super.new(.axi4_m(axi4_m), .axis_in(axis_in)); - - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: tb_axis_to_axi4_basic_dma_class - -// -------------------------------------------------------------------- -// -endpackage: tb_axis_to_axi4_basic_dma_pkg - - - - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/wip.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/wip.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/wip.do (nonexistent) @@ -1,12 +0,0 @@ -# - - -vlog -f ../../libs/axi4_stream_lib_verilog/axi4_stream_lib.f - -# simulation $root -vlog ../../src/tb_axis_register_slice.sv - -# compile test last -vlog ./the_test.sv - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/init_test.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/init_test.do (nonexistent) @@ -1,35 +0,0 @@ -# ------------------------------------ -# -# ------------------------------------ - -global env - -set env(ROOT_DIR) ../../../../.. -set env(PROJECT_DIR) ../../.. -set env(SIM_TARGET) fpga - -# load sim procedures -do $env(ROOT_DIR)/qaz_libs/scripts/sim_procs.do - -radix -hexadecimal - -make_lib work 1 - -# sim_compile_all FPGA -sim_compile_all sim -sim_compile_all sync_fifo -sim_compile_all axi4_stream_lib - -# simulation $root -vlog $env(PROJECT_DIR)/sim/src/tb_axis_register_slice.sv - -# compile test last -vlog ./the_test.sv - -# vopt work.glbl tb_top -L secureip -L simprims_ver -L unisims_ver -f opt_tb_top.f -o opt_tb_top - -# run the sim -sim_run_test - - - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/the_test.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/the_test.sv (nonexistent) @@ -1,79 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -`timescale 1ps/1ps - - -module - the_test( - input tb_clk, - input tb_rst - ); - - // -------------------------------------------------------------------- - // - int mismatch_count = 0; - - - // -------------------------------------------------------------------- - // - task run_the_test; - - // -------------------------------------------------------------------- - // insert test below - // -------------------------------------------------------------------- - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench begun.\n", $time); - $display("^^^---------------------------------"); - // -------------------------------------------------------------------- - - // -------------------------------------------------------------------- - tb_top.tb.timeout_stop(4us); - wait(~tb_rst); - - - // -------------------------------------------------------------------- - repeat(100) @(posedge tb_clk); - tb_top.avf_agent_h.make_frame("counting"); - tb_top.avf_agent_h.get_frame(); - tb_top.avf_agent_h.put_frame(); - - wait(~tb_top.avf_agent_h.put_frame_active); - wait(~tb_top.avf_agent_h.get_frame_active); - - mismatch_count = tb_top.avf_agent_h.compare_frame(); - - - // -------------------------------------------------------------------- - // insert test above - // -------------------------------------------------------------------- - - endtask - - -endmodule - Index: trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/sim.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_axis_register_slice/sim.do (nonexistent) @@ -1,21 +0,0 @@ -# -# - - -quit -sim - -# vsim opt_tb_top - -vsim -novopt work.tb_top -# vsim -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top - -# vsim -voptargs="+acc=rn+/tb_top/dut" -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top -# vsim -pli "C:/Xilinx/Vivado/2015.4/lib/win64.o/libxil_vsim.dll" -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top - - -# # log all signals -# log -r * - -# run -all - - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/tb_recursive_axis_mux.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/tb_recursive_axis_mux.f (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/tb_recursive_axis_mux.f (nonexistent) @@ -1,4 +0,0 @@ -# - -${PROJECT_DIR}/src/recursive_axis_mux.sv - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/tb_recursive_axis_mux.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/tb_recursive_axis_mux.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/tb_recursive_axis_mux.sv (nonexistent) @@ -1,126 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// -// ---------------------------------------------------------------------------- - - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_100mhz; - wire tb_clk = clk_100mhz; - wire tb_rst; - - tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); - - - // -------------------------------------------------------------------- - // - wire tb_rst_s; - wire aclk = tb_clk; - wire aresetn = ~tb_rst_s; - wire clk = tb_clk; - wire reset = tb_rst_s; - - sync_reset sync_reset_i(tb_clk, tb_rst, tb_rst_s); - - - // -------------------------------------------------------------------- - // - import tb_recursive_axis_mux_pkg::*; - - - // -------------------------------------------------------------------- - // - axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in[MD-1:0](.*); - axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out(.*); - - - // -------------------------------------------------------------------- - // - wire [MA-1:0] select = 0; - - recursive_axis_mux #(.N(N), .I(I), .D(D), .U(U), .MA(MA)) - dut(.*); - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - - // -------------------------------------------------------------------- - // - initial - axis_out.cb_s.tready <= 1; - - - // -------------------------------------------------------------------- - // - tb_recursive_axis_mux_class a_h; - - initial - a_h = new(axis_in, axis_out); - - - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - - - // -------------------------------------------------------------------- - // test - the_test test(tb_clk, tb_rst); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule - - - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/tb_recursive_axis_mux_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/tb_recursive_axis_mux_pkg.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/tb_recursive_axis_mux_pkg.sv (nonexistent) @@ -1,142 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package tb_recursive_axis_mux_pkg; - - // -------------------------------------------------------------------- - // - import video_frame_pkg::*; - import axis_video_frame_bfm_pkg::*; - import avf_agent_class_pkg::*; - - - // -------------------------------------------------------------------- - // - localparam AW = 32; // active width - localparam AH = 16; // active height - localparam B = 2; // bytes per pixel - localparam T = 1; // pixels per clock - localparam VERTICAL_BLANKING = AW * 4; - localparam N = B * T; // data bus width in bytes - localparam I = 1; // TID width - localparam D = 1; // TDEST width - localparam U = 3; // TUSER width - localparam MA = 5; - localparam MD = 2 ** MA; - - - // -------------------------------------------------------------------- - // - class tb_recursive_axis_mux_class; - - avf_config_class c_h; - avf_tile_config_t tile_config[]; - - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out; - virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in[]; - - avf_tx_class #(B, T, U) tx_h; - avf_rx_class #(B, T, U) rx_h; - - // video_frame_class clone_h; - // video_frame_class sent_f_h; - // video_frame_class rx_f_h; - - // mailbox #(video_frame_class) q[]; - - - // -------------------------------------------------------------------- - // - task automatic - queue_frame - ( - string pattern = "", - int pixel = 0 - ); - video_frame_class clone_h; - - if(pattern != "") - tx_h.make_frame(pattern, pixel); - - foreach(tx_h.tx_bfm_h[i]) - begin - clone_h = tx_h.tx_bfm_h[i].f_h.clone(); - tx_h.tx_bfm_h[i].put(clone_h); - // q[i].put(clone_h); - end - - $display("^^^ %16.t | %m | using %s pattern", $time, pattern); - - endtask: queue_frame - - - //-------------------------------------------------------------------- - // - function new - ( - virtual axis_if #(.N(N), .U(U)) axis_in[], - virtual axis_if #(.N(N), .U(U)) axis_out - ); - - this.axis_out = axis_out; - this.axis_in = axis_in; - - this.tile_config = new[T]; - this.tile_config[0].direction = RIGHT_DOWN; - - this.c_h = new - ( - .width(AW), - .height(AH), - .bytes_per_pixel(B), - .bits_per_pixel(B * 8), - .pixels_per_clk(T), - .name("AVR_"), - .vertical_blanking(VERTICAL_BLANKING), - .tile(tile_config) - ); - - rx_h = new(c_h, '{axis_out}); - tx_h = new(c_h, axis_in); - - endfunction: new - - - // -------------------------------------------------------------------- - // - endclass: tb_recursive_axis_mux_class - - -// -------------------------------------------------------------------- -// -endpackage: tb_recursive_axis_mux_pkg - - - - - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/init_test.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/init_test.do (nonexistent) @@ -1,35 +0,0 @@ -# ------------------------------------ -# -# ------------------------------------ - -global env - -# setup environment -do ../../../../scripts/sim_env.do -set env(SIM_TARGET) fpga -set env(SIM_TB) tb_recursive_axis_mux - -radix -hexadecimal - -make_lib work 1 - -sim_compile_lib $env(LIB_BASE_DIR) tb_packages -sim_compile_lib $env(LIB_BASE_DIR) bfm_packages -sim_compile_lib $env(LIB_BASE_DIR) axi4_lib -sim_compile_lib $env(LIB_BASE_DIR) qaz_lib -sim_compile_lib $env(LIB_BASE_DIR) sim - -# compile simulation files -vlog -f ./$env(SIM_TB).f - -# simulation $root -vlog ./$env(SIM_TB)_pkg.sv -vlog ./$env(SIM_TB).sv - -# compile test last -vlog ./the_test.sv - -# run the sim -sim_run_test - - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/the_test.sv (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/the_test.sv (nonexistent) @@ -1,84 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2017 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -`timescale 1ps/1ps - - -module the_test(input tb_clk, input tb_rst); - - // -------------------------------------------------------------------- - // - import tb_recursive_axis_mux_pkg::*; - - // -------------------------------------------------------------------- - // - int i = 0; - - task automatic run_the_test; - - // -------------------------------------------------------------------- - // insert test below - // -------------------------------------------------------------------- - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench begun.", $time); - $display("^^^---------------------------------"); - - // -------------------------------------------------------------------- - // tb_top.tb.timeout_stop(2ms); - wait(~tb_rst); - - // -------------------------------------------------------------------- - #1us; - - // -------------------------------------------------------------------- - repeat(1)tb_top.a_h.queue_frame("counting"); - - // // -------------------------------------------------------------------- - // repeat(1) tb_top.a_h.queue_frame("random"); - // repeat(1)tb_top.a_h.queue_frame("counting"); - // repeat(3) tb_top.a_h.queue_frame("random"); - // tb_top.a_h.queue_frame("constant", 16'habba); - - // -------------------------------------------------------------------- - for(i = 0; i < MD; i++) - begin - force tb_top.select = i; - #20us; - end - - // -------------------------------------------------------------------- - #10us; - - // -------------------------------------------------------------------- - // insert test above - // -------------------------------------------------------------------- - - endtask - - -endmodule - Index: trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/sim.do (revision 49) +++ trunk/axi4_stream_lib/sim/tests/tb_recursive_axis_mux/sim.do (nonexistent) @@ -1,11 +0,0 @@ -# -# - -quit -sim - -vsim -novopt work.tb_top -# vsim -f ./sim.f work.tb_top - -# log all signals -log -r * - Index: trunk/axi4_stream_lib/sim/tests/legacy/defparam_test_case.zip =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: trunk/axi4_stream_lib/sim/tests/legacy/defparam_test_case.zip =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/defparam_test_case.zip (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/defparam_test_case.zip (revision 50)
trunk/axi4_stream_lib/sim/tests/legacy/defparam_test_case.zip Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/axis_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/axis_pkg.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/axis_pkg.sv (revision 50) @@ -0,0 +1,328 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +// -------------------------------------------------------------------- +// +package axis_pkg; + + // -------------------------------------------------------------------- + // + import uvm_pkg::*; + `include "uvm_macros.svh" + import bfm_pkg::*; + + // -------------------------------------------------------------------- + // + typedef struct + { + int unsigned N; // data bus width in bytes + int unsigned I; // TID width + int unsigned D; // TDEST width + int unsigned U; // TUSER width + bit USE_TSTRB; // set to 1 to enable, 0 to disable + bit USE_TKEEP; // set to 1 to enable, 0 to disable + bit USE_ROUTING; // set to 1 to enable, 0 to disable + } axis_config_t; + + // -------------------------------------------------------------------- + // + class axis_sequence_item #(axis_config_t cfg) + extends uvm_sequence_item; + `uvm_object_param_utils(axis_sequence_item #(cfg)) + + // -------------------------------------------------------------------- + // + localparam N = cfg.N; + localparam I = cfg.I; + localparam D = cfg.D; + localparam U = cfg.U; + localparam USE_TSTRB = cfg.USE_TSTRB; + localparam USE_TKEEP = cfg.USE_TKEEP; + localparam USE_ROUTING = cfg.USE_ROUTING; + + // -------------------------------------------------------------------- + // + delay_class delay_h; + rand logic [(8*N)-1:0] tdata; + rand logic [N-1:0] tstrb; + rand logic [N-1:0] tkeep; + rand logic tlast; + rand logic [I-1:0] tid; + rand logic [D-1:0] tdest; + rand logic [U-1:0] tuser; + + // -------------------------------------------------------------------- + // + function new(string name = ""); + super.new(name); + delay_h = new; + endfunction : new + + // -------------------------------------------------------------------- + // + function bit do_compare(uvm_object rhs, uvm_comparer comparer); + axis_sequence_item #(cfg) tested; + bit same; + + if (rhs==null) + `uvm_fatal(get_type_name(), "| %m | comparison to a null pointer"); + + if (!$cast(tested,rhs)) + same = 0; + else + same = super.do_compare(rhs, comparer) + & (tested.tdata == tdata) + & (USE_TSTRB ? (tested.tstrb == tstrb) : 1) + & (USE_TKEEP ? (tested.tkeep == tkeep) : 1) + & (tested.tlast == tlast) + & (USE_ROUTING ? (tested.tid == tid) : 1) + & (USE_ROUTING ? (tested.tdest == tdest) : 1) + & (tested.tuser == tuser); + return same; + endfunction : do_compare + + // -------------------------------------------------------------------- + // + function void do_copy(uvm_object rhs); + axis_sequence_item #(cfg) item; + assert(rhs != null) else + `uvm_fatal(get_type_name(), "| %m | copy null transaction"); + super.do_copy(rhs); + assert($cast(item,rhs)) else + `uvm_fatal(get_type_name(), "| %m | failed cast"); + tdata = item.tdata; + tstrb = item.tstrb; + tkeep = item.tkeep; + tlast = item.tlast; + tid = item.tid; + tdest = item.tdest; + tuser = item.tuser; + endfunction : do_copy + + // -------------------------------------------------------------------- + // + function string convert2string(); + string s0, s1; + s0 = $sformatf("| tdata: %h\n" ,tdata); + s1 = $sformatf("| tlast: %1h | tuser: %h" , tlast, tuser); + return {s1, s0}; + endfunction : convert2string + + // -------------------------------------------------------------------- + // + endclass : axis_sequence_item + + // -------------------------------------------------------------------- + // + class axis_driver #(parameter axis_config_t cfg) + extends uvm_driver #(axis_sequence_item #(cfg)); + `uvm_component_param_utils(axis_driver#(cfg)) + + // -------------------------------------------------------------------- + // + localparam N = cfg.N; + localparam I = cfg.I; + localparam D = cfg.D; + localparam U = cfg.U; + localparam USE_TSTRB = cfg.USE_TSTRB; + localparam USE_TKEEP = cfg.USE_TKEEP; + localparam USE_ROUTING = cfg.USE_ROUTING; + + // -------------------------------------------------------------------- + // + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_bus; + + //-------------------------------------------------------------------- + // + function void set_default; + axis_bus.cb_m.tvalid <= 0; + axis_bus.cb_m.tdata <= 'bx; + axis_bus.cb_m.tstrb <= 'bx; + axis_bus.cb_m.tkeep <= 'bx; + axis_bus.cb_m.tlast <= 'bx; + axis_bus.cb_m.tid <= 'bx; + axis_bus.cb_m.tdest <= 'bx; + axis_bus.cb_m.tuser <= 'bx; + endfunction: set_default + + //-------------------------------------------------------------------- + // + virtual task run_phase(uvm_phase phase); + axis_sequence_item #(cfg) item; + super.run_phase(phase); + + set_default(); + wait(~axis_bus.aresetn); + @(axis_bus.cb_m); + + forever + begin + // seq_item_port.try_next_item(item); + seq_item_port.get_next_item(item); + + axis_bus.cb_m.tvalid <= 1; + axis_bus.cb_m.tdata <= item.tdata; + axis_bus.cb_m.tstrb <= 0; + axis_bus.cb_m.tkeep <= 0; + axis_bus.cb_m.tlast <= item.tlast; + axis_bus.cb_m.tid <= 0; + axis_bus.cb_m.tdest <= 0; + axis_bus.cb_m.tuser <= item.tuser; + + @(axis_bus.cb_m); + wait(axis_bus.cb_m.tready); + // @(axis_bus.cb_m iff axis_bus.cb_m.tready); + + set_default(); + repeat(item.delay_h.next()) @(axis_bus.cb_m); + + seq_item_port.item_done(); + end + endtask : run_phase + + //-------------------------------------------------------------------- + // + function new(string name, uvm_component parent); + super.new(name, parent); + endfunction + + // -------------------------------------------------------------------- + // + endclass : axis_driver + + // -------------------------------------------------------------------- + // + class axis_sequencer #(axis_config_t cfg) + extends uvm_sequencer #(axis_sequence_item #(cfg)); + `uvm_component_param_utils(axis_sequencer #(cfg)) + + // -------------------------------------------------------------------- + // + function new(string name, uvm_component parent); + super.new(name, parent); + endfunction + + // -------------------------------------------------------------------- + // + endclass : axis_sequencer + + // -------------------------------------------------------------------- + // + class axis_counting_sequence #(axis_config_t cfg) + extends uvm_sequence #(axis_sequence_item #(cfg)); + `uvm_object_param_utils(axis_counting_sequence #(cfg)) + + rand int length = 16; + + // -------------------------------------------------------------------- + // + virtual task body(); + axis_sequence_item #(cfg) item; + + for(int i = 0; i < length; i++) + begin + item = axis_sequence_item #(cfg)::type_id::create("axis_sequence_item"); + + item.tdata = i; + item.tlast = (i == length - 1); + + start_item (item); + finish_item(item); + end + endtask + + // -------------------------------------------------------------------- + // + function new(string name = "axis_counting_sequence"); + super.new(name); + endfunction + + // -------------------------------------------------------------------- + // + endclass : axis_counting_sequence + + // -------------------------------------------------------------------- + // + class axis_agent #(axis_config_t cfg) + extends uvm_agent; + `uvm_component_param_utils(axis_agent #(cfg)) + + // -------------------------------------------------------------------- + // + localparam N = cfg.N; + localparam I = cfg.I; + localparam D = cfg.D; + localparam U = cfg.U; + localparam USE_TSTRB = cfg.USE_TSTRB; + localparam USE_TKEEP = cfg.USE_TKEEP; + localparam USE_ROUTING = cfg.USE_ROUTING; + + // -------------------------------------------------------------------- + // + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_bus; + + axis_driver #(cfg) driver; + // my_monitor #(cfg) monitor; + axis_sequencer #(cfg) sequencer; + + // -------------------------------------------------------------------- + // + virtual function void build_phase(uvm_phase phase); + super.build_phase(phase); + + if(!uvm_config_db #(virtual axis_if #(.N(N), .I(I), .D(D), .U(U)))::get(this, "", "axis_bus", axis_bus)) + `uvm_fatal(get_name(), "Couldn't get virtual interface!") + + driver = axis_driver #(cfg)::type_id::create("driver", this); + // monitor = my_monitor #(cfg)::type_id::create("monitor" , this); + sequencer = axis_sequencer #(cfg)::type_id::create("sequencer", this); + endfunction + + // -------------------------------------------------------------------- + // + virtual function void connect_phase(uvm_phase phase); + super.connect_phase(phase); + + driver.axis_bus = axis_bus; + // monitor.vif = vif; + + driver.seq_item_port.connect(sequencer.seq_item_export); + endfunction + + // -------------------------------------------------------------------- + // + function new(string name, uvm_component parent); + super.new(name, parent); + endfunction + + // -------------------------------------------------------------------- + // + endclass : axis_agent + +// -------------------------------------------------------------------- +// +endpackage: axis_pkg Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/init_test.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/init_test.do (revision 50) @@ -0,0 +1,42 @@ +# ------------------------------------ +# +# ------------------------------------ + +global env + +# setup environment +do ../../../../scripts/sim_env.do +set env(SIM_TARGET) fpga +set env(SIM_TB) tb_axis_gear_box + +radix -hexadecimal + +make_lib work 1 + +sim_compile_lib $env(LIB_BASE_DIR) tb_packages +sim_compile_lib $env(LIB_BASE_DIR) bfm_packages +sim_compile_lib $env(LIB_BASE_DIR) axi4_lib +sim_compile_lib $env(LIB_BASE_DIR) qaz_lib +sim_compile_lib $env(LIB_BASE_DIR) sim + +# AXI4 streaming package +vlog ./axis_pkg.sv + +vlog ./$env(SIM_TB)_pkg.sv +vlog ./tests_base_pkg.sv +vlog ./tests_pkg.sv +vlog ./tb_dut_if.sv + +# simulation $root +vlog ./$env(SIM_TB).sv + +# compile simulation files +vlog -f ./$env(SIM_TB).f + +# # compile test last +# vlog ./the_test.sv + +# run the sim +sim_run_test + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/sim.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/sim.do (revision 50) @@ -0,0 +1,11 @@ +# +# + +quit -sim + +vsim -novopt work.tb_top +# vsim -f ./sim.f work.tb_top + +# # log all signals +# log -r * + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_axis_gear_box.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_axis_gear_box.f (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_axis_gear_box.f (revision 50) @@ -0,0 +1,6 @@ +# + +./axis_pkg.sv + +${PROJECT_DIR}/src/axis_gear_box.sv + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_axis_gear_box.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_axis_gear_box.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_axis_gear_box.sv (revision 50) @@ -0,0 +1,90 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// ---------------------------------------------------------------------------- + +import tb_axis_gear_box_pkg::*; +import tests_pkg::*; +import uvm_pkg::*; +`include "uvm_macros.svh" + +module tb_top(); + + // -------------------------------------------------------------------- + // test bench clock & reset + wire clk_100mhz; + wire tb_clk = clk_100mhz; + wire tb_rst; + + tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); + + // -------------------------------------------------------------------- + // + wire tb_rst_s; + wire aclk = tb_clk; + wire aresetn = ~tb_rst_s; + wire clk = tb_clk; + wire reset = tb_rst_s; + + sync_reset sync_reset_i(tb_clk, tb_rst, tb_rst_s); + + // -------------------------------------------------------------------- + // + import tb_axis_gear_box_pkg::*; + + // -------------------------------------------------------------------- + // + tb_dut_if #(dut_cfg) dut_bus(.*); + + // -------------------------------------------------------------------- + // + axis_gear_box + dut + ( + .axis_in(dut_bus.axis_in), + .axis_out(dut_bus.axis_out), + .aclk(dut_bus.aclk), + .aresetn(dut_bus.aresetn) + ); + + // -------------------------------------------------------------------- + // + assign dut_bus.axis_out.tready = 1; + + // -------------------------------------------------------------------- + // + tb_dut_config #(dut_cfg) cfg_h; + + initial + begin + cfg_h = new(dut_bus); + uvm_config_db #(tb_dut_config #(dut_cfg))::set(null, "*env_h", "tb_dut_config", cfg_h); + run_test("t_debug"); + end + +// -------------------------------------------------------------------- +// +endmodule Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_axis_gear_box_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_axis_gear_box_pkg.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_axis_gear_box_pkg.sv (revision 50) @@ -0,0 +1,139 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +package tb_axis_gear_box_pkg; + + // -------------------------------------------------------------------- + // + import uvm_pkg::*; + `include "uvm_macros.svh" + import axis_pkg::*; + + // -------------------------------------------------------------------- + // + typedef struct + { + axis_config_t axis_cfg_in; + axis_config_t axis_cfg_out; + } dut_config_t; + + localparam dut_config_t dut_cfg = + '{ + '{ N : 2 // data bus width in bytes. + , I : 1 // TID width + , D : 1 // TDEST width + , U : 1 // TUSER width + , USE_TSTRB : 0 + , USE_TKEEP : 0 + , USE_ROUTING : 0 + }, + '{ N : 2 // data bus width in bytes. + , I : 1 // TID width + , D : 1 // TDEST width + , U : 1 // TUSER width + , USE_TSTRB : 0 + , USE_TKEEP : 0 + , USE_ROUTING : 0 + } + }; + + // -------------------------------------------------------------------- + // + class tb_dut_config #(dut_config_t dut_cfg); + + virtual tb_dut_if #(dut_cfg) dut_bus; + + // -------------------------------------------------------------------- + // + function new(virtual tb_dut_if #(dut_cfg) dut_bus); + this.dut_bus = dut_bus; + endfunction : new + + // -------------------------------------------------------------------- + // + endclass : tb_dut_config + + // -------------------------------------------------------------------- + // + class tb_env extends uvm_env; + `uvm_component_utils(tb_env); + + // -------------------------------------------------------------------- + // + // coverage coverage_h; + // scoreboard scoreboard_h; + axis_agent #(dut_cfg.axis_cfg_in) agent_h; + + // -------------------------------------------------------------------- + // + function new (string name, uvm_component parent); + super.new(name,parent); + endfunction : new + + // -------------------------------------------------------------------- + // + function void build_phase(uvm_phase phase); + tb_dut_config #(dut_cfg) cfg_h; + if (!uvm_config_db#(tb_dut_config #(dut_cfg))::get(this, "", "tb_dut_config", cfg_h)) + `uvm_fatal(get_name(), "Couldn't get config object!") + + uvm_config_db + #( + virtual axis_if + #( .N(dut_cfg.axis_cfg_in.N) + , .I(dut_cfg.axis_cfg_in.I) + , .D(dut_cfg.axis_cfg_in.D) + , .U(dut_cfg.axis_cfg_in.U) + ) + )::set(this, "*agent_h", "axis_bus", cfg_h.dut_bus.axis_in); + + // // analysis + // coverage_h = coverage::type_id::create ("coverage_h",this); + // scoreboard_h = scoreboard::type_id::create("scoreboard",this); + + agent_h = axis_agent #(dut_cfg.axis_cfg_in)::type_id::create("agent_h", this); + + endfunction : build_phase + + // // -------------------------------------------------------------------- + // // + // function void connect_phase(uvm_phase phase); + + // endfunction : connect_phase + +// -------------------------------------------------------------------- +// +endclass : tb_env + +// -------------------------------------------------------------------- +// +endpackage: tb_axis_gear_box_pkg + + + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_dut_if.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_dut_if.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tb_dut_if.sv (revision 50) @@ -0,0 +1,63 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +import tb_axis_gear_box_pkg::*; + +interface + tb_dut_if #(dut_config_t dut_cfg) + ( + input aclk, + input aresetn + ); + + // -------------------------------------------------------------------- + // + axis_if + #( + .N(dut_cfg.axis_cfg_in.N), + .I(dut_cfg.axis_cfg_in.I), + .D(dut_cfg.axis_cfg_in.D), + .U(dut_cfg.axis_cfg_in.U) + ) + axis_in(.*); + + // -------------------------------------------------------------------- + // + axis_if + #( + .N(dut_cfg.axis_cfg_out.N), + .I(dut_cfg.axis_cfg_out.I), + .D(dut_cfg.axis_cfg_out.D), + .U(dut_cfg.axis_cfg_out.U) + ) + axis_out(.*); + +// -------------------------------------------------------------------- +// +endinterface: tb_dut_if + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tests_base_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tests_base_pkg.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tests_base_pkg.sv (revision 50) @@ -0,0 +1,85 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +// -------------------------------------------------------------------- +// +package tests_base_pkg; + + // -------------------------------------------------------------------- + // + import uvm_pkg::*; + `include "uvm_macros.svh" + import tb_axis_gear_box_pkg::*; + + // -------------------------------------------------------------------- + // + virtual class test_base extends uvm_test; + `uvm_component_utils(test_base); + tb_env env_h; + + // -------------------------------------------------------------------- + // + function void build_phase(uvm_phase phase); + env_h = tb_env::type_id::create("env_h",this); + endfunction : build_phase + + // -------------------------------------------------------------------- + // + function new (string name, uvm_component parent); + super.new(name,parent); + endfunction : new + + // -------------------------------------------------------------------- + // + endclass : test_base + + // -------------------------------------------------------------------- + // + class test_debug_base extends test_base; + `uvm_component_utils(test_debug_base) + + // -------------------------------------------------------------------- + // + function new (string name, uvm_component parent); + super.new(name,parent); + endfunction : new + + // -------------------------------------------------------------------- + // + function void final_phase(uvm_phase phase); + super.final_phase(phase); + $display("^^^ %16.t | %m | Test Done!!!", $time); + $stop; + endfunction : final_phase + + // -------------------------------------------------------------------- + // + endclass : test_debug_base + +// -------------------------------------------------------------------- +// +endpackage: tests_base_pkg Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tests_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tests_pkg.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/tests_pkg.sv (revision 50) @@ -0,0 +1,196 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +// -------------------------------------------------------------------- +// +package tests_pkg; + + // -------------------------------------------------------------------- + // + import uvm_pkg::*; + `include "uvm_macros.svh" + import axis_pkg::*; + import tb_axis_gear_box_pkg::*; + import tests_base_pkg::*; + + // -------------------------------------------------------------------- + // + class t_counting extends test_base; + `uvm_component_utils(t_counting) + + // -------------------------------------------------------------------- + // + function new(string name = "my_test", uvm_component parent); + super.new(name, parent); + endfunction + + // -------------------------------------------------------------------- + // + virtual function void end_of_elaboration_phase(uvm_phase phase); + uvm_phase run_phase = uvm_run_phase::get(); + run_phase.phase_done.set_drain_time(this, 300ns); + endfunction + + // -------------------------------------------------------------------- + // + virtual task run_phase(uvm_phase phase); + axis_counting_sequence #(dut_cfg.axis_cfg_in) seq_h; + super.run_phase(phase); + phase.raise_objection(this); + fork + repeat(3) + begin + seq_h = axis_counting_sequence #(dut_cfg.axis_cfg_in)::type_id::create("seq_h"); + seq_h.start(env_h.agent_h.sequencer); + end + join + phase.drop_objection(this); + endtask : run_phase + + // -------------------------------------------------------------------- + // + endclass : t_counting + // -------------------------------------------------------------------- + // + + // -------------------------------------------------------------------- + // + class gear_box_sequence #(dut_config_t dut_cfg) + extends uvm_sequence #(axis_sequence_item #(dut_cfg.axis_cfg_in)); + `uvm_object_param_utils(gear_box_sequence #(dut_cfg)) + + rand int length = 7 * 3; + + // -------------------------------------------------------------------- + // + typedef logic [15:0] packed_data_t[7]; + + function packed_data_t next_data(int init); + static logic [15:0] previous_value; + logic [13:0] unpacked_data[8]; + logic [15:0] packed_data[7]; + + if(init == 0) + previous_value = 0; + + foreach(unpacked_data[i]) + begin + unpacked_data[i] = previous_value; + // $display("^^^ %16.t | unpacked_data[%0.d] = %h", $time, i, unpacked_data[i]); + previous_value++; + end + + packed_data = {<<16{{<<14{unpacked_data}}}}; + + // $display("^^^ %16.t | %p", $time, packed_data); + + // foreach(packed_data[i]) + // $display("^^^ %16.t | packed_data[%0.d] = %h", $time, i, packed_data[i]); + + next_data = packed_data; + endfunction + + + // -------------------------------------------------------------------- + // + virtual task body(); + localparam CHUNKS = 3; + axis_sequence_item #(dut_cfg.axis_cfg_in) item; + logic [15:0] data[7]; + + item = axis_sequence_item #(dut_cfg.axis_cfg_in)::type_id::create("axis_sequence_item"); + + for(int i = 0; i < CHUNKS; i++) + begin + data = next_data(i); + + foreach(data[k]) + begin + start_item(item); + item.tdata = data[k]; + item.tlast = (i == CHUNKS - 1) & (k == 0); + item.tuser = 0; + finish_item(item); + // $display("^^^ %16.t | %d | %x", $time, (i * 7) + k, item.tdata); + end + end + + endtask + + // -------------------------------------------------------------------- + // + function new(string name = "gear_box_sequence"); + super.new(name); + endfunction + + // -------------------------------------------------------------------- + // + endclass : gear_box_sequence + + // -------------------------------------------------------------------- + // + class t_debug extends test_debug_base; + `uvm_component_utils(t_debug) + + // -------------------------------------------------------------------- + // + function new(string name = "t_debug", uvm_component parent); + super.new(name, parent); + endfunction + + // -------------------------------------------------------------------- + // + function void end_of_elaboration_phase(uvm_phase phase); + uvm_phase run_phase = uvm_run_phase::get(); + run_phase.phase_done.set_drain_time(this, 300ns); + endfunction + + // -------------------------------------------------------------------- + // + virtual task run_phase(uvm_phase phase); + gear_box_sequence #(dut_cfg) seq_h; + super.run_phase(phase); + phase.raise_objection(this); + + fork + repeat(3) + begin + seq_h = gear_box_sequence #(dut_cfg)::type_id::create("seq_h"); + seq_h.start(env_h.agent_h.sequencer); + end + join + + phase.drop_objection(this); + endtask : run_phase + + // -------------------------------------------------------------------- + // + endclass : t_debug + +// -------------------------------------------------------------------- +// +endpackage: tests_pkg Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/wip.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/wip.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_gear_box/wip.do (revision 50) @@ -0,0 +1,11 @@ +# + +# compile simulation files +vlog -f ./$env(SIM_TB).f + +vlog ./$env(SIM_TB)_pkg.sv +vlog ./tests_pkg.sv + +# simulation $root +vlog ./$env(SIM_TB).sv + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/init_test.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/init_test.do (revision 50) @@ -0,0 +1,35 @@ +# ------------------------------------ +# +# ------------------------------------ + +global env + +set env(ROOT_DIR) ../../../../.. +set env(PROJECT_DIR) ../../.. +set env(SIM_TARGET) fpga + +# load sim procedures +do $env(ROOT_DIR)/qaz_libs/scripts/sim_procs.do + +radix -hexadecimal + +make_lib work 1 + +# sim_compile_all FPGA +sim_compile_all sim +sim_compile_all sync_fifo +sim_compile_all axi4_stream_lib + +# simulation $root +vlog $env(PROJECT_DIR)/sim/src/tb_axis_register_slice.sv + +# compile test last +vlog ./the_test.sv + +# vopt work.glbl tb_top -L secureip -L simprims_ver -L unisims_ver -f opt_tb_top.f -o opt_tb_top + +# run the sim +sim_run_test + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/sim.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/sim.do (revision 50) @@ -0,0 +1,21 @@ +# +# + + +quit -sim + +# vsim opt_tb_top + +vsim -novopt work.tb_top +# vsim -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top + +# vsim -voptargs="+acc=rn+/tb_top/dut" -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top +# vsim -pli "C:/Xilinx/Vivado/2015.4/lib/win64.o/libxil_vsim.dll" -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top + + +# # log all signals +# log -r * + +# run -all + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/the_test.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/the_test.sv (revision 50) @@ -0,0 +1,79 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +`timescale 1ps/1ps + + +module + the_test( + input tb_clk, + input tb_rst + ); + + // -------------------------------------------------------------------- + // + int mismatch_count = 0; + + + // -------------------------------------------------------------------- + // + task run_the_test; + + // -------------------------------------------------------------------- + // insert test below + // -------------------------------------------------------------------- + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench begun.\n", $time); + $display("^^^---------------------------------"); + // -------------------------------------------------------------------- + + // -------------------------------------------------------------------- + tb_top.tb.timeout_stop(4us); + wait(~tb_rst); + + + // -------------------------------------------------------------------- + repeat(100) @(posedge tb_clk); + tb_top.avf_agent_h.make_frame("counting"); + tb_top.avf_agent_h.get_frame(); + tb_top.avf_agent_h.put_frame(); + + wait(~tb_top.avf_agent_h.put_frame_active); + wait(~tb_top.avf_agent_h.get_frame_active); + + mismatch_count = tb_top.avf_agent_h.compare_frame(); + + + // -------------------------------------------------------------------- + // insert test above + // -------------------------------------------------------------------- + + endtask + + +endmodule + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/wip.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/wip.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_register_slice/wip.do (revision 50) @@ -0,0 +1,12 @@ +# + + +vlog -f ../../libs/axi4_stream_lib_verilog/axi4_stream_lib.f + +# simulation $root +vlog ../../src/tb_axis_register_slice.sv + +# compile test last +vlog ./the_test.sv + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/init_test.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/init_test.do (revision 50) @@ -0,0 +1,35 @@ +# ------------------------------------ +# +# ------------------------------------ + +global env + +# setup environment +do ../../../../scripts/sim_env.do +set env(SIM_TARGET) fpga +set env(SIM_TB) tb_axis_switch_allocator + +radix -hexadecimal + +make_lib work 1 + +sim_compile_lib $env(LIB_BASE_DIR) tb_packages +sim_compile_lib $env(LIB_BASE_DIR) bfm_packages +sim_compile_lib $env(LIB_BASE_DIR) axi4_lib +sim_compile_lib $env(LIB_BASE_DIR) qaz_lib +sim_compile_lib $env(LIB_BASE_DIR) sim + +# compile simulation files +vlog -f ./$env(SIM_TB).f + +# simulation $root +vlog ./$env(SIM_TB)_pkg.sv +vlog ./$env(SIM_TB).sv + +# compile test last +vlog ./the_test.sv + +# run the sim +sim_run_test + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/sim.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/sim.do (revision 50) @@ -0,0 +1,11 @@ +# +# + +quit -sim + +vsim -novopt work.tb_top +# vsim -f ./sim.f work.tb_top + +# log all signals +log -r * + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/tb_axis_switch_allocator.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/tb_axis_switch_allocator.f (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/tb_axis_switch_allocator.f (revision 50) @@ -0,0 +1,6 @@ +# + +${PROJECT_DIR}/src/axis_switch.sv +${PROJECT_DIR}/src/recursive_axis_switch.sv + +${PROJECT_DIR}/src/axis_switch_allocator.sv Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/tb_axis_switch_allocator.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/tb_axis_switch_allocator.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/tb_axis_switch_allocator.sv (revision 50) @@ -0,0 +1,118 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// ---------------------------------------------------------------------------- + + +module tb_top(); + + // -------------------------------------------------------------------- + // test bench clock & reset + wire clk_100mhz; + wire tb_clk = clk_100mhz; + wire tb_rst; + + tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); + + + // -------------------------------------------------------------------- + // + wire tb_rst_s; + wire aclk = tb_clk; + wire aresetn = ~tb_rst_s; + wire clk = tb_clk; + wire reset = tb_rst_s; + + sync_reset sync_reset_i(tb_clk, tb_rst, tb_rst_s); + + + // -------------------------------------------------------------------- + // + import tb_axis_switch_allocator_pkg::*; + + + // -------------------------------------------------------------------- + // + axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in(.*); + axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out[SD-1:0](.*); + + + // -------------------------------------------------------------------- + // + axis_switch_allocator #(.N(N), .I(I), .D(D), .U(U), .U_IS_EOP(U_IS_EOP), .SA(SA)) + dut(.*); + + + // -------------------------------------------------------------------- + // sim models + // | | | | | | | | | | | | | | | | | + // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + + + // -------------------------------------------------------------------- + // + tb_axis_switch_allocator_class a_h; + + initial + a_h = new(axis_in, axis_out); + + + + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ + // | | | | | | | | | | | | | | | | | + // sim models + // -------------------------------------------------------------------- + + + // -------------------------------------------------------------------- + // debug wires + + + // -------------------------------------------------------------------- + // test + the_test test(tb_clk, tb_rst); + + initial + begin + + test.run_the_test(); + + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench done.", $time); + $display("^^^---------------------------------"); + + $display("^^^---------------------------------"); + + $stop(); + + end + +endmodule + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/tb_axis_switch_allocator_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/tb_axis_switch_allocator_pkg.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/tb_axis_switch_allocator_pkg.sv (revision 50) @@ -0,0 +1,143 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +package tb_axis_switch_allocator_pkg; + + // -------------------------------------------------------------------- + // + import video_frame_pkg::*; + import axis_video_frame_bfm_pkg::*; + import avf_agent_class_pkg::*; + + + // -------------------------------------------------------------------- + // + localparam AW = 32; // active width + localparam AH = 16; // active height + localparam B = 2; // bytes per pixel + localparam T = 1; // pixels per clock + localparam VERTICAL_BLANKING = AW * 4; + localparam N = B * T; // data bus width in bytes + localparam I = 1; // TID width + localparam D = 1; // TDEST width + localparam U = 3; // TUSER width + localparam U_IS_EOP = 2; + localparam SA = 3; + localparam SD = 2 ** SA; + + + // -------------------------------------------------------------------- + // + class tb_axis_switch_allocator_class; + + avf_config_class c_h; + avf_tile_config_t tile_config[]; + + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out[]; + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in; + + avf_tx_class #(B, T, U) tx_h; + avf_rx_class #(B, T, U) rx_h; + + // video_frame_class clone_h; + // video_frame_class sent_f_h; + // video_frame_class rx_f_h; + + // mailbox #(video_frame_class) q[]; + + + // -------------------------------------------------------------------- + // + task automatic + queue_frame + ( + string pattern = "", + int pixel = 0 + ); + video_frame_class clone_h; + + if(pattern != "") + tx_h.make_frame(pattern, pixel); + + foreach(tx_h.tx_bfm_h[i]) + begin + clone_h = tx_h.tx_bfm_h[i].f_h.clone(); + tx_h.tx_bfm_h[i].put(clone_h); + // q[i].put(clone_h); + end + + $display("^^^ %16.t | %m | using %s pattern", $time, pattern); + + endtask: queue_frame + + + //-------------------------------------------------------------------- + // + function new + ( + virtual axis_if #(.N(N), .U(U)) axis_in, + virtual axis_if #(.N(N), .U(U)) axis_out[] + ); + + this.axis_out = axis_out; + this.axis_in = axis_in; + + this.tile_config = new[T]; + this.tile_config[0].direction = RIGHT_DOWN; + + this.c_h = new + ( + .width(AW), + .height(AH), + .bytes_per_pixel(B), + .bits_per_pixel(B * 8), + .pixels_per_clk(T), + .name("AVR_"), + .vertical_blanking(VERTICAL_BLANKING), + .tile(tile_config) + ); + + rx_h = new(c_h, axis_out); + tx_h = new(c_h, '{axis_in}); + + endfunction: new + + + // -------------------------------------------------------------------- + // + endclass: tb_axis_switch_allocator_class + + +// -------------------------------------------------------------------- +// +endpackage: tb_axis_switch_allocator_pkg + + + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/the_test.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_switch_allocator/the_test.sv (revision 50) @@ -0,0 +1,88 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +`timescale 1ps/1ps + + +module the_test(input tb_clk, input tb_rst); + + // -------------------------------------------------------------------- + // + import tb_axis_switch_allocator_pkg::*; + + // -------------------------------------------------------------------- + // + int i = 0; + + task automatic run_the_test; + + // -------------------------------------------------------------------- + // insert test below + // -------------------------------------------------------------------- + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench begun.", $time); + $display("^^^---------------------------------"); + + // -------------------------------------------------------------------- + tb_top.tb.timeout_stop(2ms); + wait(~tb_rst); + + // -------------------------------------------------------------------- + #1us; + + // // -------------------------------------------------------------------- + // repeat(1)tb_top.a_h.queue_frame("counting"); + + // // -------------------------------------------------------------------- + // repeat(1) tb_top.a_h.queue_frame("random"); + // repeat(1)tb_top.a_h.queue_frame("counting"); + // repeat(3) tb_top.a_h.queue_frame("random"); + // tb_top.a_h.queue_frame("constant", 16'habba); + + // // -------------------------------------------------------------------- + // for(i = 0; i < SD; i++) + // begin + // #1us; + // tb_top.a_h.queue_frame("counting"); + // #8us; + // end + + // -------------------------------------------------------------------- + repeat(SD * 2) tb_top.a_h.queue_frame("counting"); + + // -------------------------------------------------------------------- + #100us; + + // -------------------------------------------------------------------- + // insert test above + // -------------------------------------------------------------------- + + endtask + + +endmodule + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/init_test.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/init_test.do (revision 50) @@ -0,0 +1,34 @@ +# ------------------------------------ +# +# ------------------------------------ + +global env + +# setup environment +do ../../../../scripts/sim_env.do +set env(SIM_TARGET) fpga +set env(SIM_TB) tb_axis_to_axi4_basic_dma + +radix -hexadecimal + +make_lib work 1 + +sim_compile_all tb_packages +sim_compile_all bfm_packages +sim_compile_all axi4_lib +sim_compile_all qaz_lib +sim_compile_all sim + +# compile simulation files +vlog -f ./$env(SIM_TB).f + +# simulation $root +vlog ./$env(SIM_TB)_pkg.sv +vlog ./$env(SIM_TB).sv + +# compile test last +vlog ./the_test.sv + +# run the sim +sim_run_test + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/sim.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/sim.do (revision 50) @@ -0,0 +1,13 @@ +# +# + +quit -sim + +vsim -novopt work.tb_top + +# log all signals +log -r * + +# run -all + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.f (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.f (revision 50) @@ -0,0 +1,12 @@ +# + +${LIB_BASE_DIR}/axi4_stream_lib/sim/src/axis_bfm_pkg.sv +${LIB_BASE_DIR}/axi4_lib/sim/src/axi4_models/axi4_memory_pkg.sv + +${PROJECT_DIR}/sim/src/tb_axis_to_axi4_agent_class_pkg.sv + +${PROJECT_DIR}/src/axis_to_axi4_basic_dma.sv + +./${SIM_TB}_pkg.sv +./${SIM_TB}.sv + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma.sv (revision 50) @@ -0,0 +1,115 @@ +// -------------------------------------------------------------------- +// +// -------------------------------------------------------------------- + + +module tb_top(); + + // -------------------------------------------------------------------- + // test bench clock & reset + wire clk_200mhz; + wire tb_clk = clk_200mhz; + wire tb_rst; + + tb_base #(.PERIOD(5_000)) tb(clk_200mhz, tb_rst); + + + // -------------------------------------------------------------------- + // + wire tb_rst_s; + wire aclk = tb_clk; + wire aresetn = ~tb_rst_s; + + sync_reset + sync_reset_i(aclk, tb_rst, tb_rst_s); + + + // -------------------------------------------------------------------- + // + import tb_axis_to_axi4_basic_dma_pkg::*; + + + // -------------------------------------------------------------------- + // + axi4_if #(.A(A), .N(N), .I(I)) axi4_m(.*); + axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in(.*); + + + // -------------------------------------------------------------------- + // + logic dma_enable = 0; + + axis_to_axi4_basic_dma + #( + .A(A), + .N(N), + .I(I), + .BASE_ADDRESS(BASE_ADDRESS), + .BUFFER_SIZE(BUFFER_SIZE), + .BURST_LENGTH(BURST_LENGTH), + .MAX_BURSTS(MAX_BURSTS), + .BYTES_PER_TUSER(BYTES_PER_TUSER) + ) + dut(.*); + + + // -------------------------------------------------------------------- + // sim models + // | | | | | | | | | | | | | | | | | + // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + + // -------------------------------------------------------------------- + // + axi4_checker #(.A(A), .N(N), .MAXWAITS(64)) + axi4_checker_i(.axi4_in(axi4_m)); + + + // -------------------------------------------------------------------- + // + axis_checker #(.N(N), .I(I), .D(D), .U(U), .MAXWAITS(64)) + axis_checker_i(.axis_in(axis_in)); + + + // -------------------------------------------------------------------- + // + tb_axis_to_axi4_basic_dma_class a_h; + + initial + a_h = new(axi4_m, axis_in); + + + // -------------------------------------------------------------------- + // + + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ + // | | | | | | | | | | | | | | | | | + // sim models + // -------------------------------------------------------------------- + + + // -------------------------------------------------------------------- + // debug wires + + + // -------------------------------------------------------------------- + // test + the_test test(tb_clk, tb_rst); + + initial + begin + + test.run_the_test(); + + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench done.", $time); + $display("^^^---------------------------------"); + + $display("^^^---------------------------------"); + + $stop(); + + end + +endmodule Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma_pkg.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/tb_axis_to_axi4_basic_dma_pkg.sv (revision 50) @@ -0,0 +1,58 @@ +// -------------------------------------------------------------------- +// +// -------------------------------------------------------------------- + + +package tb_axis_to_axi4_basic_dma_pkg; + + // -------------------------------------------------------------------- + // + import tb_axis_to_axi4_agent_class_pkg::*; + + + // -------------------------------------------------------------------- + // + localparam BASE_ADDRESS = 32'h0000_0000; // must be on 4K boundry + localparam BUFFER_SIZE = 'h800; + localparam BURST_LENGTH = 8'h08; + localparam MAX_BURSTS = 4; + localparam BYTES_PER_TUSER = 2; // bytes per tuser bit. Set to 0 for transfer based. + + localparam N = 8; // data bus width in bytes + localparam A = 32; // address bus width + localparam I = 1; // ID width + localparam D = 1; // TDEST width + localparam U = N / BYTES_PER_TUSER; // TUSER width + + + // -------------------------------------------------------------------- + // + class tb_axis_to_axi4_basic_dma_class + extends tb_axis_to_axi4_agent_class #(N, A, I, D, U); + + + //-------------------------------------------------------------------- + // + function new + ( + virtual axi4_if #(.A(A), .N(N), .I(I)) axi4_m, + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in + ); + + super.new(.axi4_m(axi4_m), .axis_in(axis_in)); + + endfunction: new + + + // -------------------------------------------------------------------- + // + endclass: tb_axis_to_axi4_basic_dma_class + +// -------------------------------------------------------------------- +// +endpackage: tb_axis_to_axi4_basic_dma_pkg + + + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/the_test.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/the_test.sv (revision 50) @@ -0,0 +1,60 @@ +// -------------------------------------------------------------------- +// +// -------------------------------------------------------------------- + +`timescale 1ps/1ps + + +module + the_test( + input tb_clk, + input tb_rst + ); + + // -------------------------------------------------------------------- + // + import tb_axis_to_axi4_basic_dma_pkg::*; + + + // -------------------------------------------------------------------- + // + task run_the_test; + + // -------------------------------------------------------------------- + // insert test below + // -------------------------------------------------------------------- + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench begun.", $time); + $display("^^^---------------------------------"); + + // -------------------------------------------------------------------- + tb_top.tb.timeout_stop(50us); + + // -------------------------------------------------------------------- + wait(tb_top.aresetn); + #200ns; + + // -------------------------------------------------------------------- + force tb_top.dma_enable = 1; + #100ns; + + // -------------------------------------------------------------------- + repeat(8) + begin + tb_top.a_h.random_transaction(BASE_ADDRESS, BUFFER_SIZE, N * BURST_LENGTH); + tb_top.a_h.compare(BASE_ADDRESS); + end + + // -------------------------------------------------------------------- + #200ns; + + // -------------------------------------------------------------------- + // insert test above + // -------------------------------------------------------------------- + + endtask + +// -------------------------------------------------------------------- +// +endmodule + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/wip.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/wip.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_to_axi4_basic_dma/wip.do (revision 50) @@ -0,0 +1,11 @@ +# + +vlog -f ./tb_axis_to_axi4_basic_dma.f + +# simulation $root +vlog ./tb_axis_to_axi4_basic_dma.sv + +# compile test last +vlog ./the_test.sv + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/init_test.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/init_test.do (revision 50) @@ -0,0 +1,37 @@ +# ------------------------------------ +# +# ------------------------------------ + +global env + +set env(ROOT_DIR) ../../../../.. +set env(PROJECT_DIR) ../../.. +set env(SIM_TARGET) fpga + +# load sim procedures +do $env(ROOT_DIR)/qaz_libs/scripts/sim_procs.do + +radix -hexadecimal + +make_lib work 1 + +sim_compile_all tb_packages +sim_compile_all bfm_packages +sim_compile_all axi4_lib +sim_compile_all qaz_libs +sim_compile_all sim +vlog -f ./tb_axis_upsizer.f + +# simulation $root +vlog $env(PROJECT_DIR)/sim/src/tb_axis_upsizer.sv + +# compile test last +vlog ./the_test.sv + +# vopt work.glbl tb_top -L secureip -L simprims_ver -L unisims_ver -f opt_tb_top.f -o opt_tb_top + +# run the sim +sim_run_test + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/sim.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/sim.do (revision 50) @@ -0,0 +1,16 @@ +# +# + + +quit -sim + +# vsim opt_tb_top +vsim -novopt work.tb_top +# vsim -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top + +# log all signals +log -r * + +# run -all + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/tb_axis_upsizer.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/tb_axis_upsizer.f (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/tb_axis_upsizer.f (revision 50) @@ -0,0 +1,6 @@ +# + +${PROJECT_DIR}/sim/src/tb_axis_upsizer_agent_class_pkg.sv +${PROJECT_DIR}/sim/src/tb_axis_upsizer_class_pkg.sv + +${PROJECT_DIR}/src/axis_upsizer.sv Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/the_test.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_axis_upsizer/the_test.sv (revision 50) @@ -0,0 +1,98 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +`timescale 1ps/1ps + + +module + the_test( + input tb_clk, + input tb_rst + ); + + // -------------------------------------------------------------------- + // + int mismatch_count = 0; + + + // -------------------------------------------------------------------- + // + task run_the_test; + + // -------------------------------------------------------------------- + // insert test below + // -------------------------------------------------------------------- + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench begun.\n", $time); + $display("^^^---------------------------------"); + + // -------------------------------------------------------------------- + tb_top.tb.timeout_stop(50us); + + + // -------------------------------------------------------------------- + wait(tb_top.aresetn); + #1us; + + // -------------------------------------------------------------------- + repeat(3) tb_top.a_h.queue_frame("counting"); + repeat(3) tb_top.a_h.compare_frame(); + + // -------------------------------------------------------------------- + tb_top.a_h.tx_h.make_frame("constant", 16'habba); + tb_top.a_h.queue_frame(); + tb_top.a_h.compare_frame(); + + tb_top.a_h.queue_frame("random"); + tb_top.a_h.compare_frame(); + + tb_top.a_h.queue_frame("constant", 16'hbeef); + tb_top.a_h.compare_frame(); + + tb_top.a_h.queue_frame("random"); + tb_top.a_h.rx_h.wait_for_rx_frames(1); + tb_top.a_h.compare_frame(); + + tb_top.a_h.queue_frame("counting"); + tb_top.a_h.compare_frame(); + + repeat(3) tb_top.a_h.queue_frame("random"); + repeat(3) tb_top.a_h.compare_frame(); + + // -------------------------------------------------------------------- + #1us; + // #6us; + + // -------------------------------------------------------------------- + // insert test above + // -------------------------------------------------------------------- + + endtask + + +endmodule + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/init_test.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/init_test.do (revision 50) @@ -0,0 +1,35 @@ +# ------------------------------------ +# +# ------------------------------------ + +global env + +# setup environment +do ../../../../scripts/sim_env.do +set env(SIM_TARGET) fpga +set env(SIM_TB) tb_recursive_axis_catenate + +radix -hexadecimal + +make_lib work 1 + +sim_compile_lib $env(LIB_BASE_DIR) tb_packages +sim_compile_lib $env(LIB_BASE_DIR) bfm_packages +sim_compile_lib $env(LIB_BASE_DIR) axi4_lib +sim_compile_lib $env(LIB_BASE_DIR) qaz_lib +sim_compile_lib $env(LIB_BASE_DIR) sim + +# compile simulation files +vlog -f ./$env(SIM_TB).f + +# simulation $root +vlog ./$env(SIM_TB)_pkg.sv +vlog ./$env(SIM_TB).sv + +# compile test last +vlog ./the_test.sv + +# run the sim +sim_run_test + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/sim.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/sim.do (revision 50) @@ -0,0 +1,11 @@ +# +# + +quit -sim + +vsim -novopt work.tb_top +# vsim -f ./sim.f work.tb_top + +# log all signals +log -r * + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/tb_recursive_axis_catenate.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/tb_recursive_axis_catenate.f (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/tb_recursive_axis_catenate.f (revision 50) @@ -0,0 +1,6 @@ +# + +${PROJECT_DIR}/src/recursive_axis_mux.sv +${PROJECT_DIR}/src/axis_catenate.sv +${PROJECT_DIR}/src/recursive_axis_catenate.sv + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/tb_recursive_axis_catenate.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/tb_recursive_axis_catenate.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/tb_recursive_axis_catenate.sv (revision 50) @@ -0,0 +1,126 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// ---------------------------------------------------------------------------- + + +module tb_top(); + + // -------------------------------------------------------------------- + // test bench clock & reset + wire clk_100mhz; + wire tb_clk = clk_100mhz; + wire tb_rst; + + tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); + + + // -------------------------------------------------------------------- + // + wire tb_rst_s; + wire aclk = tb_clk; + wire aresetn = ~tb_rst_s; + wire clk = tb_clk; + wire reset = tb_rst_s; + + sync_reset sync_reset_i(tb_clk, tb_rst, tb_rst_s); + + + // -------------------------------------------------------------------- + // + import tb_recursive_axis_catenate_pkg::*; + + + // -------------------------------------------------------------------- + // + axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in[MD-1:0](.*); + axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out(.*); + + + // -------------------------------------------------------------------- + // + recursive_axis_catenate + #( + .N(N), + .I(I), + .D(D), + .U(U), + .U_IS_EOP(U_IS_EOP), + .MA(MA) + ) + dut(.*); + + + // -------------------------------------------------------------------- + // sim models + // | | | | | | | | | | | | | | | | | + // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + + + // -------------------------------------------------------------------- + // + tb_recursive_axis_catenate_class a_h; + + initial + a_h = new(axis_in, axis_out); + + + + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ + // | | | | | | | | | | | | | | | | | + // sim models + // -------------------------------------------------------------------- + + + // -------------------------------------------------------------------- + // debug wires + + + // -------------------------------------------------------------------- + // test + the_test test(tb_clk, tb_rst); + + initial + begin + + test.run_the_test(); + + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench done.", $time); + $display("^^^---------------------------------"); + + $display("^^^---------------------------------"); + + $stop(); + + end + +endmodule + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/tb_recursive_axis_catenate_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/tb_recursive_axis_catenate_pkg.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/tb_recursive_axis_catenate_pkg.sv (revision 50) @@ -0,0 +1,144 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +package tb_recursive_axis_catenate_pkg; + + // -------------------------------------------------------------------- + // + import video_frame_pkg::*; + import axis_video_frame_bfm_pkg::*; + import avf_agent_class_pkg::*; + + + // -------------------------------------------------------------------- + // + localparam AW = 32; // active width + localparam AH = 16; // active height + localparam B = 2; // bytes per pixel + localparam T = 1; // pixels per clock + localparam VERTICAL_BLANKING = AW * 4; + localparam N = B * T; // data bus width in bytes + localparam I = 1; // TID width + localparam D = 1; // TDEST width + localparam U = 3; // TUSER width + // localparam U_IS_EOP = 2; + localparam U_IS_EOP = -1; + localparam MA = 2; + localparam MD = 2 ** MA; + + + // -------------------------------------------------------------------- + // + class tb_recursive_axis_catenate_class; + + avf_config_class c_h; + avf_tile_config_t tile_config[]; + + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out; + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in[]; + + avf_tx_class #(B, T, U) tx_h; + avf_rx_class #(B, T, U) rx_h; + + // video_frame_class clone_h; + // video_frame_class sent_f_h; + // video_frame_class rx_f_h; + + // mailbox #(video_frame_class) q[]; + + + // -------------------------------------------------------------------- + // + task automatic + queue_frame + ( + string pattern = "", + int pixel = 0 + ); + video_frame_class clone_h; + + if(pattern != "") + tx_h.make_frame(pattern, pixel); + + foreach(tx_h.tx_bfm_h[i]) + begin + clone_h = tx_h.tx_bfm_h[i].f_h.clone(); + tx_h.tx_bfm_h[i].put(clone_h); + // q[i].put(clone_h); + end + + $display("^^^ %16.t | %m | using %s pattern", $time, pattern); + + endtask: queue_frame + + + //-------------------------------------------------------------------- + // + function new + ( + virtual axis_if #(.N(N), .U(U)) axis_in[], + virtual axis_if #(.N(N), .U(U)) axis_out + ); + + this.axis_out = axis_out; + this.axis_in = axis_in; + + this.tile_config = new[T]; + this.tile_config[0].direction = RIGHT_DOWN; + + this.c_h = new + ( + .width(AW), + .height(AH), + .bytes_per_pixel(B), + .bits_per_pixel(B * 8), + .pixels_per_clk(T), + .name("AVR_"), + .vertical_blanking(VERTICAL_BLANKING), + .tile(tile_config) + ); + + rx_h = new(c_h, '{axis_out}); + tx_h = new(c_h, axis_in); + + endfunction: new + + + // -------------------------------------------------------------------- + // + endclass: tb_recursive_axis_catenate_class + + +// -------------------------------------------------------------------- +// +endpackage: tb_recursive_axis_catenate_pkg + + + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/the_test.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_catenate/the_test.sv (revision 50) @@ -0,0 +1,84 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +`timescale 1ps/1ps + + +module the_test(input tb_clk, input tb_rst); + + // -------------------------------------------------------------------- + // + import tb_recursive_axis_catenate_pkg::*; + + // -------------------------------------------------------------------- + // + int i = 0; + + task automatic run_the_test; + + // -------------------------------------------------------------------- + // insert test below + // -------------------------------------------------------------------- + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench begun.", $time); + $display("^^^---------------------------------"); + + // -------------------------------------------------------------------- + tb_top.tb.timeout_stop(2ms); + wait(~tb_rst); + + // -------------------------------------------------------------------- + #1us; + + // -------------------------------------------------------------------- + repeat(10)tb_top.a_h.queue_frame("counting"); + + // // -------------------------------------------------------------------- + // repeat(1) tb_top.a_h.queue_frame("random"); + // repeat(1)tb_top.a_h.queue_frame("counting"); + // repeat(3) tb_top.a_h.queue_frame("random"); + // tb_top.a_h.queue_frame("constant", 16'habba); + + // // -------------------------------------------------------------------- + // for(i = 0; i < MD; i++) + // begin + // force tb_top.select = i; + // #20us; + // end + + // -------------------------------------------------------------------- + #100us; + + // -------------------------------------------------------------------- + // insert test above + // -------------------------------------------------------------------- + + endtask + + +endmodule + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/init_test.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/init_test.do (revision 50) @@ -0,0 +1,35 @@ +# ------------------------------------ +# +# ------------------------------------ + +global env + +# setup environment +do ../../../../scripts/sim_env.do +set env(SIM_TARGET) fpga +set env(SIM_TB) tb_recursive_axis_mux + +radix -hexadecimal + +make_lib work 1 + +sim_compile_lib $env(LIB_BASE_DIR) tb_packages +sim_compile_lib $env(LIB_BASE_DIR) bfm_packages +sim_compile_lib $env(LIB_BASE_DIR) axi4_lib +sim_compile_lib $env(LIB_BASE_DIR) qaz_lib +sim_compile_lib $env(LIB_BASE_DIR) sim + +# compile simulation files +vlog -f ./$env(SIM_TB).f + +# simulation $root +vlog ./$env(SIM_TB)_pkg.sv +vlog ./$env(SIM_TB).sv + +# compile test last +vlog ./the_test.sv + +# run the sim +sim_run_test + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/sim.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/sim.do (revision 50) @@ -0,0 +1,11 @@ +# +# + +quit -sim + +vsim -novopt work.tb_top +# vsim -f ./sim.f work.tb_top + +# log all signals +log -r * + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/tb_recursive_axis_mux.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/tb_recursive_axis_mux.f (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/tb_recursive_axis_mux.f (revision 50) @@ -0,0 +1,4 @@ +# + +${PROJECT_DIR}/src/recursive_axis_mux.sv + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/tb_recursive_axis_mux.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/tb_recursive_axis_mux.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/tb_recursive_axis_mux.sv (revision 50) @@ -0,0 +1,126 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// ---------------------------------------------------------------------------- + + +module tb_top(); + + // -------------------------------------------------------------------- + // test bench clock & reset + wire clk_100mhz; + wire tb_clk = clk_100mhz; + wire tb_rst; + + tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); + + + // -------------------------------------------------------------------- + // + wire tb_rst_s; + wire aclk = tb_clk; + wire aresetn = ~tb_rst_s; + wire clk = tb_clk; + wire reset = tb_rst_s; + + sync_reset sync_reset_i(tb_clk, tb_rst, tb_rst_s); + + + // -------------------------------------------------------------------- + // + import tb_recursive_axis_mux_pkg::*; + + + // -------------------------------------------------------------------- + // + axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in[MD-1:0](.*); + axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out(.*); + + + // -------------------------------------------------------------------- + // + wire [MA-1:0] select = 0; + + recursive_axis_mux #(.N(N), .I(I), .D(D), .U(U), .MA(MA)) + dut(.*); + + + // -------------------------------------------------------------------- + // sim models + // | | | | | | | | | | | | | | | | | + // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + + + // -------------------------------------------------------------------- + // + initial + axis_out.cb_s.tready <= 1; + + + // -------------------------------------------------------------------- + // + tb_recursive_axis_mux_class a_h; + + initial + a_h = new(axis_in, axis_out); + + + + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ + // | | | | | | | | | | | | | | | | | + // sim models + // -------------------------------------------------------------------- + + + // -------------------------------------------------------------------- + // debug wires + + + // -------------------------------------------------------------------- + // test + the_test test(tb_clk, tb_rst); + + initial + begin + + test.run_the_test(); + + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench done.", $time); + $display("^^^---------------------------------"); + + $display("^^^---------------------------------"); + + $stop(); + + end + +endmodule + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/tb_recursive_axis_mux_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/tb_recursive_axis_mux_pkg.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/tb_recursive_axis_mux_pkg.sv (revision 50) @@ -0,0 +1,142 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +package tb_recursive_axis_mux_pkg; + + // -------------------------------------------------------------------- + // + import video_frame_pkg::*; + import axis_video_frame_bfm_pkg::*; + import avf_agent_class_pkg::*; + + + // -------------------------------------------------------------------- + // + localparam AW = 32; // active width + localparam AH = 16; // active height + localparam B = 2; // bytes per pixel + localparam T = 1; // pixels per clock + localparam VERTICAL_BLANKING = AW * 4; + localparam N = B * T; // data bus width in bytes + localparam I = 1; // TID width + localparam D = 1; // TDEST width + localparam U = 3; // TUSER width + localparam MA = 5; + localparam MD = 2 ** MA; + + + // -------------------------------------------------------------------- + // + class tb_recursive_axis_mux_class; + + avf_config_class c_h; + avf_tile_config_t tile_config[]; + + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out; + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in[]; + + avf_tx_class #(B, T, U) tx_h; + avf_rx_class #(B, T, U) rx_h; + + // video_frame_class clone_h; + // video_frame_class sent_f_h; + // video_frame_class rx_f_h; + + // mailbox #(video_frame_class) q[]; + + + // -------------------------------------------------------------------- + // + task automatic + queue_frame + ( + string pattern = "", + int pixel = 0 + ); + video_frame_class clone_h; + + if(pattern != "") + tx_h.make_frame(pattern, pixel); + + foreach(tx_h.tx_bfm_h[i]) + begin + clone_h = tx_h.tx_bfm_h[i].f_h.clone(); + tx_h.tx_bfm_h[i].put(clone_h); + // q[i].put(clone_h); + end + + $display("^^^ %16.t | %m | using %s pattern", $time, pattern); + + endtask: queue_frame + + + //-------------------------------------------------------------------- + // + function new + ( + virtual axis_if #(.N(N), .U(U)) axis_in[], + virtual axis_if #(.N(N), .U(U)) axis_out + ); + + this.axis_out = axis_out; + this.axis_in = axis_in; + + this.tile_config = new[T]; + this.tile_config[0].direction = RIGHT_DOWN; + + this.c_h = new + ( + .width(AW), + .height(AH), + .bytes_per_pixel(B), + .bits_per_pixel(B * 8), + .pixels_per_clk(T), + .name("AVR_"), + .vertical_blanking(VERTICAL_BLANKING), + .tile(tile_config) + ); + + rx_h = new(c_h, '{axis_out}); + tx_h = new(c_h, axis_in); + + endfunction: new + + + // -------------------------------------------------------------------- + // + endclass: tb_recursive_axis_mux_class + + +// -------------------------------------------------------------------- +// +endpackage: tb_recursive_axis_mux_pkg + + + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/the_test.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_mux/the_test.sv (revision 50) @@ -0,0 +1,84 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +`timescale 1ps/1ps + + +module the_test(input tb_clk, input tb_rst); + + // -------------------------------------------------------------------- + // + import tb_recursive_axis_mux_pkg::*; + + // -------------------------------------------------------------------- + // + int i = 0; + + task automatic run_the_test; + + // -------------------------------------------------------------------- + // insert test below + // -------------------------------------------------------------------- + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench begun.", $time); + $display("^^^---------------------------------"); + + // -------------------------------------------------------------------- + // tb_top.tb.timeout_stop(2ms); + wait(~tb_rst); + + // -------------------------------------------------------------------- + #1us; + + // -------------------------------------------------------------------- + repeat(1)tb_top.a_h.queue_frame("counting"); + + // // -------------------------------------------------------------------- + // repeat(1) tb_top.a_h.queue_frame("random"); + // repeat(1)tb_top.a_h.queue_frame("counting"); + // repeat(3) tb_top.a_h.queue_frame("random"); + // tb_top.a_h.queue_frame("constant", 16'habba); + + // -------------------------------------------------------------------- + for(i = 0; i < MD; i++) + begin + force tb_top.select = i; + #20us; + end + + // -------------------------------------------------------------------- + #10us; + + // -------------------------------------------------------------------- + // insert test above + // -------------------------------------------------------------------- + + endtask + + +endmodule + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/init_test.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/init_test.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/init_test.do (revision 50) @@ -0,0 +1,35 @@ +# ------------------------------------ +# +# ------------------------------------ + +global env + +# setup environment +do ../../../../scripts/sim_env.do +set env(SIM_TARGET) fpga +set env(SIM_TB) tb_recursive_axis_switch + +radix -hexadecimal + +make_lib work 1 + +sim_compile_lib $env(LIB_BASE_DIR) tb_packages +sim_compile_lib $env(LIB_BASE_DIR) bfm_packages +sim_compile_lib $env(LIB_BASE_DIR) axi4_lib +sim_compile_lib $env(LIB_BASE_DIR) qaz_lib +sim_compile_lib $env(LIB_BASE_DIR) sim + +# compile simulation files +vlog -f ./$env(SIM_TB).f + +# simulation $root +vlog ./$env(SIM_TB)_pkg.sv +vlog ./$env(SIM_TB).sv + +# compile test last +vlog ./the_test.sv + +# run the sim +sim_run_test + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/sim.do =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/sim.do (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/sim.do (revision 50) @@ -0,0 +1,11 @@ +# +# + +quit -sim + +vsim -novopt work.tb_top +# vsim -f ./sim.f work.tb_top + +# log all signals +log -r * + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/tb_recursive_axis_switch.f =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/tb_recursive_axis_switch.f (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/tb_recursive_axis_switch.f (revision 50) @@ -0,0 +1,5 @@ +# + +${PROJECT_DIR}/src/axis_switch.sv +${PROJECT_DIR}/src/recursive_axis_switch.sv + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/tb_recursive_axis_switch.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/tb_recursive_axis_switch.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/tb_recursive_axis_switch.sv (revision 50) @@ -0,0 +1,127 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// ---------------------------------------------------------------------------- + +`timescale 1ps/1ps + +module tb_top(); + + // -------------------------------------------------------------------- + // test bench clock & reset + wire clk_100mhz; + wire tb_clk = clk_100mhz; + wire tb_rst; + + tb_base #(.PERIOD(10_000)) tb(clk_100mhz, tb_rst); + + + // -------------------------------------------------------------------- + // + wire tb_rst_s; + wire aclk = tb_clk; + wire aresetn = ~tb_rst_s; + wire clk = tb_clk; + wire reset = tb_rst_s; + + sync_reset sync_reset_i(tb_clk, tb_rst, tb_rst_s); + + + // -------------------------------------------------------------------- + // + import tb_recursive_axis_switch_pkg::*; + + + // -------------------------------------------------------------------- + // + axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in(.*); + axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out[SD-1:0](.*); + + + // -------------------------------------------------------------------- + // + wire [SA-1:0] select = 0; + + recursive_axis_switch #(.N(N), .I(I), .D(D), .U(U), .SA(SA)) + dut(.*); + + + // -------------------------------------------------------------------- + // sim models + // | | | | | | | | | | | | | | | | | + // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + + + // // -------------------------------------------------------------------- + // // + // initial + // axis_out.cb_s.tready <= 1; + + + // -------------------------------------------------------------------- + // + tb_recursive_axis_switch_class a_h; + + initial + a_h = new(axis_in, axis_out); + + + + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ + // | | | | | | | | | | | | | | | | | + // sim models + // -------------------------------------------------------------------- + + + // -------------------------------------------------------------------- + // debug wires + + + // -------------------------------------------------------------------- + // test + the_test test(tb_clk, tb_rst); + + initial + begin + + test.run_the_test(); + + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench done.", $time); + $display("^^^---------------------------------"); + + $display("^^^---------------------------------"); + + $stop(); + + end + +endmodule + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/tb_recursive_axis_switch_pkg.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/tb_recursive_axis_switch_pkg.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/tb_recursive_axis_switch_pkg.sv (revision 50) @@ -0,0 +1,142 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +package tb_recursive_axis_switch_pkg; + + // -------------------------------------------------------------------- + // + import video_frame_pkg::*; + import axis_video_frame_bfm_pkg::*; + import avf_agent_class_pkg::*; + + + // -------------------------------------------------------------------- + // + localparam AW = 32; // active width + localparam AH = 16; // active height + localparam B = 2; // bytes per pixel + localparam T = 1; // pixels per clock + localparam VERTICAL_BLANKING = AW * 4; + localparam N = B * T; // data bus width in bytes + localparam I = 1; // TID width + localparam D = 1; // TDEST width + localparam U = 3; // TUSER width + localparam SA = 2; + localparam SD = 2 ** SA; + + + // -------------------------------------------------------------------- + // + class tb_recursive_axis_switch_class; + + avf_config_class c_h; + avf_tile_config_t tile_config[]; + + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_out[]; + virtual axis_if #(.N(N), .I(I), .D(D), .U(U)) axis_in; + + avf_tx_class #(B, T, U) tx_h; + avf_rx_class #(B, T, U) rx_h; + + // video_frame_class clone_h; + // video_frame_class sent_f_h; + // video_frame_class rx_f_h; + + // mailbox #(video_frame_class) q[]; + + + // -------------------------------------------------------------------- + // + task automatic + queue_frame + ( + string pattern = "", + int pixel = 0 + ); + video_frame_class clone_h; + + if(pattern != "") + tx_h.make_frame(pattern, pixel); + + foreach(tx_h.tx_bfm_h[i]) + begin + clone_h = tx_h.tx_bfm_h[i].f_h.clone(); + tx_h.tx_bfm_h[i].put(clone_h); + // q[i].put(clone_h); + end + + $display("^^^ %16.t | %m | using %s pattern", $time, pattern); + + endtask: queue_frame + + + //-------------------------------------------------------------------- + // + function new + ( + virtual axis_if #(.N(N), .U(U)) axis_in, + virtual axis_if #(.N(N), .U(U)) axis_out[] + ); + + this.axis_out = axis_out; + this.axis_in = axis_in; + + this.tile_config = new[T]; + this.tile_config[0].direction = RIGHT_DOWN; + + this.c_h = new + ( + .width(AW), + .height(AH), + .bytes_per_pixel(B), + .bits_per_pixel(B * 8), + .pixels_per_clk(T), + .name("AVR_"), + .vertical_blanking(VERTICAL_BLANKING), + .tile(tile_config) + ); + + rx_h = new(c_h, axis_out); + tx_h = new(c_h, '{axis_in}); + + endfunction: new + + + // -------------------------------------------------------------------- + // + endclass: tb_recursive_axis_switch_class + + +// -------------------------------------------------------------------- +// +endpackage: tb_recursive_axis_switch_pkg + + + + + Index: trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/the_test.sv =================================================================== --- trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/the_test.sv (nonexistent) +++ trunk/axi4_stream_lib/sim/tests/legacy/tb_recursive_axis_switch/the_test.sv (revision 50) @@ -0,0 +1,86 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2017 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +`timescale 1ps/1ps + + +module the_test(input tb_clk, input tb_rst); + + // -------------------------------------------------------------------- + // + import tb_recursive_axis_switch_pkg::*; + + // -------------------------------------------------------------------- + // + int i = 0; + + task automatic run_the_test; + + // -------------------------------------------------------------------- + // insert test below + // -------------------------------------------------------------------- + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench begun.", $time); + $display("^^^---------------------------------"); + + // -------------------------------------------------------------------- + tb_top.tb.timeout_stop(2ms); + wait(~tb_rst); + + // -------------------------------------------------------------------- + #1us; + + // // -------------------------------------------------------------------- + // repeat(1)tb_top.a_h.queue_frame("counting"); + + // // -------------------------------------------------------------------- + // repeat(1) tb_top.a_h.queue_frame("random"); + // repeat(1)tb_top.a_h.queue_frame("counting"); + // repeat(3) tb_top.a_h.queue_frame("random"); + // tb_top.a_h.queue_frame("constant", 16'habba); + + // -------------------------------------------------------------------- + for(i = 0; i < SD; i++) + begin + force tb_top.select = i; + #1us; + tb_top.a_h.queue_frame("counting"); + #8us; + end + + // -------------------------------------------------------------------- + #5us; + + // -------------------------------------------------------------------- + // insert test above + // -------------------------------------------------------------------- + + endtask + + +endmodule + Index: trunk/axi4_stream_lib/src/data_to_axis_fsm.sv =================================================================== --- trunk/axi4_stream_lib/src/data_to_axis_fsm.sv (revision 49) +++ trunk/axi4_stream_lib/src/data_to_axis_fsm.sv (nonexistent) @@ -1,106 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -module - data_to_axis_fsm - ( - input axis_en, - output axis_tvalid, - input axis_tready, - - input fifo_watermark, // OK to use fifo_almost_full if FIFO is synchronous, assert to flush also - input fifo_empty, - output fifo_rd_en, - - output data_to_axis_fsm_error, - - input aclk, - input aresetn - ); - - //--------------------------------------------------- - // state machine binary definitions - enum reg [3:0] { - IDLE_STATE = 4'b0001, - TVALID = 4'b0010, - TREADY = 4'b0100, - ERROR_STATE = 4'b1000 - } state, next_state; - - - //--------------------------------------------------- - // state machine flop - always_ff @(posedge aclk) - if(~aresetn) - state <= IDLE_STATE; - else - state <= next_state; - - - //--------------------------------------------------- - // state machine - always_comb - case(state) - IDLE_STATE: if(axis_en & fifo_watermark & ~fifo_empty) - if(axis_tready) - next_state <= TREADY; - else - next_state <= TVALID; - else - next_state <= IDLE_STATE; - - TVALID: if(axis_tready) // wait for slave to be ready - next_state <= TREADY; - else - next_state <= TVALID; - - TREADY: if(fifo_empty) // slave can accept data - next_state <= IDLE_STATE; - else if(axis_tready) - next_state <= TREADY; - else - next_state <= TVALID; - - ERROR_STATE: next_state <= IDLE_STATE; - - default: next_state <= ERROR_STATE; - - endcase - - - //--------------------------------------------------- - // outputs - assign axis_tvalid = (next_state == TVALID) | (next_state == TREADY); - assign fifo_rd_en = axis_tvalid & axis_tready; - assign data_to_axis_fsm_error = (state == ERROR_STATE); - - -endmodule - - - Index: trunk/axi4_stream_lib/src/axis_flow_control.sv =================================================================== --- trunk/axi4_stream_lib/src/axis_flow_control.sv (revision 49) +++ trunk/axi4_stream_lib/src/axis_flow_control.sv (nonexistent) @@ -1,127 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -module - axis_flow_control - #( - N = 8, // data bus width in bytes - I = 0, // TID width - D = 0, // TDEST width - U = 1, // TUSER width - USE_TSTRB = 0, // set to 1 to enable, 0 to disable - USE_TKEEP = 0 // set to 1 to enable, 0 to disable - ) - ( - input axis_en, - input flow_enable, // enable / disable incoming tready & tvalid - input [1:0] tready_to_master_select, // 00:force 0, 01:force 1, 1X:from_slave - input [1:0] tvalid_to_master_select, // 00:force 0, 01:force 1, 1X:from_slave - output tready_from_slave, // from input of mux - output tvalid_from_slave, // from input of mux - axis_if.slave axis_in, - axis_if.master axis_out, - input aclk, - input aresetn - ); - - // -------------------------------------------------------------------- - // - localparam W = (N * 8) + (N * USE_TSTRB) + (N * USE_TKEEP) + I + D + U + 1; - - fifo_write_if #(.W(W)) fifo_sink(aclk, ~aresetn); - fifo_read_if #(.W(W)) fifo_source(aclk, ~aresetn); - - tiny_sync_fifo #(.W(W)) - tiny_sync_fifo_i(.source(fifo_sink.fifo), .sink(fifo_source.fifo)); - - - // -------------------------------------------------------------------- - // - wire data_to_axis_fsm_error; - - data_to_axis_fsm - data_to_axis_fsm_i - ( - .axis_tvalid(tvalid_from_slave), // axis_out.tvalid - .axis_tready(flow_enable & axis_out.tready), - .fifo_empty(fifo_source.empty), - .fifo_rd_en(fifo_source.rd_en), - .fifo_watermark(1'b1), - .* - ); - - - // -------------------------------------------------------------------- - // - reg axis_in_tready_r; - assign axis_in.tready = axis_in_tready_r; - - always_comb - case(tready_to_master_select) - 2'b00: axis_in_tready_r = 0; - 2'b01: axis_in_tready_r = 1; - 2'b10: axis_in_tready_r = tready_from_slave; - 2'b11: axis_in_tready_r = tready_from_slave; - endcase - - - // -------------------------------------------------------------------- - // - reg axis_out_tvalid_r; - assign axis_out.tvalid = axis_out_tvalid_r; - - always_comb - case(tvalid_to_master_select) - 2'b00: axis_out_tvalid_r = 0; - 2'b01: axis_out_tvalid_r = 1; - 2'b10: axis_out_tvalid_r = tvalid_from_slave; - 2'b11: axis_out_tvalid_r = tvalid_from_slave; - endcase - - - // -------------------------------------------------------------------- - // - assign tready_from_slave = ~fifo_sink.full; // axis_in.tready - - assign fifo_sink.wr_en = flow_enable & axis_in.tvalid & ~fifo_sink.full; - assign fifo_sink.wr_data = - { - axis_in.tdata, - axis_in.tlast, - axis_in.tuser - }; - - assign - { - axis_out.tdata, - axis_out.tlast, - axis_out.tuser - } = fifo_source.rd_data; - - -endmodule - Index: trunk/axi4_stream_lib/src/axis_to_memory.sv =================================================================== --- trunk/axi4_stream_lib/src/axis_to_memory.sv (nonexistent) +++ trunk/axi4_stream_lib/src/axis_to_memory.sv (revision 50) @@ -0,0 +1,129 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2019 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +module + axis_to_memory + #( + W, // data width in bits + A, // address width in bits + P = 1 // pipeline delay + ) + ( + axis_if axis_ar, + axis_if axis_r, + output wr, + output [A-1:0] addr, + output [W-1:0] din, + input [W-1:0] dout, + input aclk, + input aresetn + ); + + // -------------------------------------------------------------------- + localparam CW = ($clog2(P) == 0) ? 1 : $clog2(P); + localparam D = 2 ** CW; + localparam UB = $clog2(D); + + // -------------------------------------------------------------------- + reg [P-1:0] pipeline; + wire ar = axis_ar.tready & axis_ar.tvalid; + wire rd_ready = pipeline[0]; + wire bypass; + + generate + if(P > 1) begin: pipeline_gen + always_ff @(posedge aclk) + if(~aresetn) + pipeline <= 0; + else + pipeline <= {ar, pipeline[P-1:1]}; + end + else begin: min_pipeline_gen // P == 1 + always_ff @(posedge aclk) + if(~aresetn) + pipeline <= 0; + else + pipeline <= ar; + end + endgenerate + + // -------------------------------------------------------------------- + wire wr_full; + wire [W-1:0] wr_data = dout; + wire wr_en = bypass ? 0 : rd_ready; + wire rd_empty; + wire [W-1:0] rd_data; + wire rd_en = axis_r.tready & axis_r.tvalid & ~bypass; + wire [UB:0] count; + + sync_fifo #(W, D) fifo_i(.clk(aclk), .reset(~aresetn), .*); + + // -------------------------------------------------------------------- + // assign bypass = rd_empty & (count != 0) & rd_ready; + assign bypass = 0; + + // // -------------------------------------------------------------------- + // logic [$clog2($bits(pipeline)+1)-1:0] in_pipeline; + + // always_comb begin + // in_pipeline = '0; + + // foreach(pipeline[idx]) begin + // in_pipeline += pipeline[idx]; + // end + // end + + // -------------------------------------------------------------------- + reg [$clog2($bits(pipeline)+1)-1:0] pipeline_count; + reg [$clog2($bits(pipeline)+1)-1:0] next_pipeline_count; + + always_comb + case({rd_ready, ar}) + 2'b0_0: next_pipeline_count = pipeline_count; + 2'b0_1: next_pipeline_count = pipeline_count + 1; + 2'b1_0: next_pipeline_count = pipeline_count - 1; + 2'b1_1: next_pipeline_count = pipeline_count; + endcase + + always_ff @(posedge aclk) + if(~aresetn) + pipeline_count <= 0; + else + pipeline_count <= next_pipeline_count; + + // -------------------------------------------------------------------- + assign axis_ar.tready = (pipeline_count + count < D) | rd_en; + assign axis_r.tdata = bypass ? dout : rd_data; + assign axis_r.tlast = 1; + assign axis_r.tvalid = ~rd_empty | bypass; + + // -------------------------------------------------------------------- + assign wr = 0; + // assign addr = axis_ar.tdata; + +// -------------------------------------------------------------------- +endmodule Index: trunk/basal/sim/src/fifo_agent_pkg.sv =================================================================== --- trunk/basal/sim/src/fifo_agent_pkg.sv (revision 49) +++ trunk/basal/sim/src/fifo_agent_pkg.sv (nonexistent) @@ -1,102 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package fifo_agent_pkg; - - // -------------------------------------------------------------------- - // - import fifo_bfm_pkg::*; - - class fifo_agent_class #(W = 8); - - fifo_bfm_class source_fifo; - fifo_bfm_class sink_fifo; - fifo_transaction_class tr_h; - fifo_transaction_class clone_h; - - //-------------------------------------------------------------------- - function - new - ( - virtual fifo_write_if #(.W(W)) source, - virtual fifo_read_if #(.W(W)) sink - ); - - this.source_fifo = new(.source(source)); - this.sink_fifo = new(.sink(sink)); - this.tr_h = new(); - - endfunction: new - - - // -------------------------------------------------------------------- - // - function void init; - - source_fifo.init("source", SOURCE); - sink_fifo.init("sink", SINK); - - endfunction: init - - - // -------------------------------------------------------------------- - // - task automatic - start_q; - - source_fifo.fifo_write_q(); - sink_fifo.fifo_read_q(); - - endtask: start_q - - - // -------------------------------------------------------------------- - // - task automatic - queue_random; - - if (!tr_h.randomize()) - begin - $display("^^^ %16.t | %m | ERROR! randomize error", $time); - $stop; - end - - clone_h = tr_h.clone(); - source_fifo.fifo_tr_q.put(clone_h); - sink_fifo.fifo_tr_q.put(clone_h); - - endtask: queue_random - - - // -------------------------------------------------------------------- - // - - endclass: fifo_agent_class - -endpackage: fifo_agent_pkg - Index: trunk/basal/sim/src/fifo_bfm_pkg.sv =================================================================== --- trunk/basal/sim/src/fifo_bfm_pkg.sv (revision 49) +++ trunk/basal/sim/src/fifo_bfm_pkg.sv (nonexistent) @@ -1,380 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -package fifo_bfm_pkg; - - typedef enum - { - SOURCE, - SINK, - BOTH - } fifo_type_t; - - // -------------------------------------------------------------------- - // - class fifo_transaction_class; - - rand int data; - rand int write_delay = 0; - rand int read_delay = 0; - - constraint default_write_delay - { - write_delay >= 0 && write_delay <= 4; - write_delay dist {0 := 60, [1:4] :=40 }; - } - - constraint default_read_delay - { - read_delay >= 0 && read_delay <= 4; - read_delay dist {0 := 60, [1:4] :=40 }; - } - - - // -------------------------------------------------------------------- - // - function void copy - ( - ref fifo_transaction_class from - ); - - // $display("^^^ %16.t | %m", $time); - - this.data = from.data; - this.write_delay = from.write_delay; - this.read_delay = from.read_delay; - - endfunction: copy - - - // -------------------------------------------------------------------- - // - extern virtual function fifo_transaction_class clone(); - // virtual function fifo_transaction_class clone(); - - // $display("^^^ %16.t | %m", $time); - - // clone = new(); - // clone.copy(this); - // return(clone); - - // endfunction: clone - - - // -------------------------------------------------------------------- - // - - endclass: fifo_transaction_class - - - // -------------------------------------------------------------------- - // - function fifo_transaction_class fifo_transaction_class::clone(); - - // $display("^^^ %16.t | %m", $time); - - clone = new(); - clone.copy(this); - - endfunction: clone - - - // -------------------------------------------------------------------- - // - class fifo_bfm_class #(W = 8); - - string fifo_name; - fifo_type_t fifo_type; - - virtual fifo_write_if #(.W(W)) source = null; - virtual fifo_read_if #(.W(W)) sink = null; - fifo_transaction_class fifo_tr = new(); - - - //-------------------------------------------------------------------- - function new - ( - virtual fifo_write_if #(.W(W)) source = null, - virtual fifo_read_if #(.W(W)) sink = null - ); - - if(source != null) - this.source = source; - - if(sink != null) - this.sink = sink; - - endfunction: new - - - // -------------------------------------------------------------------- - // - function void - init - ( - input string fifo_name, - input fifo_type_t fifo_type - ); - - this.fifo_name = fifo_name; - this.fifo_type = fifo_type; - - if(fifo_type == SOURCE) - source.cb_s.wr_en <= 0; - else if(fifo_type == SINK) - sink.cb_s.rd_en <= 0; - else if(fifo_type == BOTH) - if((this.source == null) | (this.sink == null)) - begin - $display("^^^ %16.t | %m | ERROR! %s fifo_type == BOTH with null class", $time, fifo_type.name); - $stop; - end - else - begin - source.cb_s.wr_en <= 0; - sink.cb_s.rd_en <= 0; - end - else - begin - $display("^^^ %16.t | %m | ERROR! fifo_type %s is invalid", $time, fifo_type.name); - $stop; - end - - $display("^^^ %16.t | %m | initialization of %s for %s", $time, fifo_name, fifo_type.name); - - endfunction: init - - - // -------------------------------------------------------------------- - // - task - write - ( - input [W-1:0] wr_data, - input int write_delay = 0 - ); - - source.cb_s.wr_data <= wr_data; - source.cb_s.wr_en <= 0; - - source.zero_cycle_delay(); - - if(write_delay != 0) - repeat(write_delay) @(source.cb_s); - - @(source.cb_s iff (source.cb_s.full == 0)); - // @(source.cb_s iff (~source.cb_s.full)); - source.cb_s.wr_en <= 1; - - @(posedge source.clk); - source.cb_s.wr_en <= 0; - - endtask: write - - - // -------------------------------------------------------------------- - // - task - fork_write - ( - input [W-1:0] wr_data, - input int write_delay = 0 - ); - - fork - write(wr_data, write_delay); - join_none - - #0; - - endtask: fork_write - - - // -------------------------------------------------------------------- - // - mailbox #(int) rd_data_q = new(); - - task - read - ( - input int read_delay = 0 - ); - - sink.cb_s.rd_en <= 0; - - sink.zero_cycle_delay(); - - if(read_delay != 0) - repeat(read_delay) @(sink.cb_s); - - @(sink.cb_s iff (sink.cb_s.empty == 0)); - // @(sink.cb_s iff (~sink.cb_s.empty)); - sink.cb_s.rd_en <= 1; - - @(posedge sink.clk); - - sink.cb_s.rd_en <= 0; - - rd_data_q.put(sink.cb_s.rd_data); - - endtask: read - - - // -------------------------------------------------------------------- - // - task automatic - fork_read - ( - input int read_delay = 0 - ); - - fork - read(read_delay); - join_none - - #0; - - endtask: fork_read - - - // -------------------------------------------------------------------- - // - mailbox #(fifo_transaction_class) fifo_tr_q; - semaphore fifo_tr_q_semaphore = new(1); - - - // -------------------------------------------------------------------- - // - event fifo_write_done; - - task automatic - fifo_write_q; - - if((fifo_type != SOURCE) & (fifo_type == BOTH)) - begin - $display("^^^ %16.t | %m | ERROR! wrong fifo_type |", $time); - return; - end - - if(fifo_tr_q_semaphore.try_get() == 0) - begin - $display("^^^ %16.t | %m | ERROR! fifo_tr_q_semaphore.try_get() == 0 |", $time); - return; - end - - $display("^^^ %16.t | %m is active |", $time); - - this.fifo_tr_q = new(); - - fifo_write_fork : fork - forever - begin - - fifo_tr_q.get(fifo_tr); - fork_write(fifo_tr.data, fifo_tr.write_delay); - - wait fork; - - ->fifo_write_done; - end - join_none - - #0; - - endtask: fifo_write_q - - - // -------------------------------------------------------------------- - // - fifo_transaction_class fifo_tr_clone; - event fifo_read_done; - logic [W - 1:0] rd_data; - logic [W - 1:0] rd_result; - int compare_result; - int compare_errors = 0; - - task automatic - fifo_read_q; - - if((fifo_type != SINK) & (fifo_type == BOTH)) - begin - $display("^^^ %16.t | %m | ERROR! wrong fifo_type |", $time); - return; - end - - - if(fifo_tr_q_semaphore.try_get() == 0) - begin - $display("^^^ %16.t | %m | ERROR! fifo_tr_q_semaphore.try_get() == 0 |", $time); - return; - end - - $display("^^^ %16.t | %m is active |", $time); - - this.fifo_tr_q = new(); - fifo_tr_clone = fifo_tr.clone(); - - fifo_read_q_fork : fork - forever - begin - - fifo_tr_q.get(fifo_tr); - fork_read(fifo_tr.read_delay); - - wait fork; - - ->fifo_read_done; - - rd_data_q.get(rd_result); - rd_data = fifo_tr.data; - - if(rd_result != rd_data) - begin - $display("^^^ %16.t | %m | ERROR! rd_result != fifo_tr.data |", $time); - $display("^^^ %16.t | %m | rd_result = %h |", $time, rd_result); - $display("^^^ %16.t | %m | fifo_tr.data = %h |", $time, fifo_tr.data); - end - - // compare_result = avf_in_frame.compare(8, f_h); - // compare_errors += compare_result; - - end - join_none - - #0; - - endtask: fifo_read_q - - - // -------------------------------------------------------------------- - // - - endclass: fifo_bfm_class - -endpackage: fifo_bfm_pkg - Index: trunk/basal/sim/src/legacy/fifo_agent_pkg.sv =================================================================== --- trunk/basal/sim/src/legacy/fifo_agent_pkg.sv (nonexistent) +++ trunk/basal/sim/src/legacy/fifo_agent_pkg.sv (revision 50) @@ -0,0 +1,102 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +package fifo_agent_pkg; + + // -------------------------------------------------------------------- + // + import fifo_bfm_pkg::*; + + class fifo_agent_class #(W = 8); + + fifo_bfm_class source_fifo; + fifo_bfm_class sink_fifo; + fifo_transaction_class tr_h; + fifo_transaction_class clone_h; + + //-------------------------------------------------------------------- + function + new + ( + virtual fifo_write_if #(.W(W)) source, + virtual fifo_read_if #(.W(W)) sink + ); + + this.source_fifo = new(.source(source)); + this.sink_fifo = new(.sink(sink)); + this.tr_h = new(); + + endfunction: new + + + // -------------------------------------------------------------------- + // + function void init; + + source_fifo.init("source", SOURCE); + sink_fifo.init("sink", SINK); + + endfunction: init + + + // -------------------------------------------------------------------- + // + task automatic + start_q; + + source_fifo.fifo_write_q(); + sink_fifo.fifo_read_q(); + + endtask: start_q + + + // -------------------------------------------------------------------- + // + task automatic + queue_random; + + if (!tr_h.randomize()) + begin + $display("^^^ %16.t | %m | ERROR! randomize error", $time); + $stop; + end + + clone_h = tr_h.clone(); + source_fifo.fifo_tr_q.put(clone_h); + sink_fifo.fifo_tr_q.put(clone_h); + + endtask: queue_random + + + // -------------------------------------------------------------------- + // + + endclass: fifo_agent_class + +endpackage: fifo_agent_pkg + Index: trunk/basal/sim/src/legacy/fifo_bfm_pkg.sv =================================================================== --- trunk/basal/sim/src/legacy/fifo_bfm_pkg.sv (nonexistent) +++ trunk/basal/sim/src/legacy/fifo_bfm_pkg.sv (revision 50) @@ -0,0 +1,380 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +package fifo_bfm_pkg; + + typedef enum + { + SOURCE, + SINK, + BOTH + } fifo_type_t; + + // -------------------------------------------------------------------- + // + class fifo_transaction_class; + + rand int data; + rand int write_delay = 0; + rand int read_delay = 0; + + constraint default_write_delay + { + write_delay >= 0 && write_delay <= 4; + write_delay dist {0 := 60, [1:4] :=40 }; + } + + constraint default_read_delay + { + read_delay >= 0 && read_delay <= 4; + read_delay dist {0 := 60, [1:4] :=40 }; + } + + + // -------------------------------------------------------------------- + // + function void copy + ( + ref fifo_transaction_class from + ); + + // $display("^^^ %16.t | %m", $time); + + this.data = from.data; + this.write_delay = from.write_delay; + this.read_delay = from.read_delay; + + endfunction: copy + + + // -------------------------------------------------------------------- + // + extern virtual function fifo_transaction_class clone(); + // virtual function fifo_transaction_class clone(); + + // $display("^^^ %16.t | %m", $time); + + // clone = new(); + // clone.copy(this); + // return(clone); + + // endfunction: clone + + + // -------------------------------------------------------------------- + // + + endclass: fifo_transaction_class + + + // -------------------------------------------------------------------- + // + function fifo_transaction_class fifo_transaction_class::clone(); + + // $display("^^^ %16.t | %m", $time); + + clone = new(); + clone.copy(this); + + endfunction: clone + + + // -------------------------------------------------------------------- + // + class fifo_bfm_class #(W = 8); + + string fifo_name; + fifo_type_t fifo_type; + + virtual fifo_write_if #(.W(W)) source = null; + virtual fifo_read_if #(.W(W)) sink = null; + fifo_transaction_class fifo_tr = new(); + + + //-------------------------------------------------------------------- + function new + ( + virtual fifo_write_if #(.W(W)) source = null, + virtual fifo_read_if #(.W(W)) sink = null + ); + + if(source != null) + this.source = source; + + if(sink != null) + this.sink = sink; + + endfunction: new + + + // -------------------------------------------------------------------- + // + function void + init + ( + input string fifo_name, + input fifo_type_t fifo_type + ); + + this.fifo_name = fifo_name; + this.fifo_type = fifo_type; + + if(fifo_type == SOURCE) + source.cb_s.wr_en <= 0; + else if(fifo_type == SINK) + sink.cb_s.rd_en <= 0; + else if(fifo_type == BOTH) + if((this.source == null) | (this.sink == null)) + begin + $display("^^^ %16.t | %m | ERROR! %s fifo_type == BOTH with null class", $time, fifo_type.name); + $stop; + end + else + begin + source.cb_s.wr_en <= 0; + sink.cb_s.rd_en <= 0; + end + else + begin + $display("^^^ %16.t | %m | ERROR! fifo_type %s is invalid", $time, fifo_type.name); + $stop; + end + + $display("^^^ %16.t | %m | initialization of %s for %s", $time, fifo_name, fifo_type.name); + + endfunction: init + + + // -------------------------------------------------------------------- + // + task + write + ( + input [W-1:0] wr_data, + input int write_delay = 0 + ); + + source.cb_s.wr_data <= wr_data; + source.cb_s.wr_en <= 0; + + source.zero_cycle_delay(); + + if(write_delay != 0) + repeat(write_delay) @(source.cb_s); + + @(source.cb_s iff (source.cb_s.full == 0)); + // @(source.cb_s iff (~source.cb_s.full)); + source.cb_s.wr_en <= 1; + + @(posedge source.clk); + source.cb_s.wr_en <= 0; + + endtask: write + + + // -------------------------------------------------------------------- + // + task + fork_write + ( + input [W-1:0] wr_data, + input int write_delay = 0 + ); + + fork + write(wr_data, write_delay); + join_none + + #0; + + endtask: fork_write + + + // -------------------------------------------------------------------- + // + mailbox #(int) rd_data_q = new(); + + task + read + ( + input int read_delay = 0 + ); + + sink.cb_s.rd_en <= 0; + + sink.zero_cycle_delay(); + + if(read_delay != 0) + repeat(read_delay) @(sink.cb_s); + + @(sink.cb_s iff (sink.cb_s.empty == 0)); + // @(sink.cb_s iff (~sink.cb_s.empty)); + sink.cb_s.rd_en <= 1; + + @(posedge sink.clk); + + sink.cb_s.rd_en <= 0; + + rd_data_q.put(sink.cb_s.rd_data); + + endtask: read + + + // -------------------------------------------------------------------- + // + task automatic + fork_read + ( + input int read_delay = 0 + ); + + fork + read(read_delay); + join_none + + #0; + + endtask: fork_read + + + // -------------------------------------------------------------------- + // + mailbox #(fifo_transaction_class) fifo_tr_q; + semaphore fifo_tr_q_semaphore = new(1); + + + // -------------------------------------------------------------------- + // + event fifo_write_done; + + task automatic + fifo_write_q; + + if((fifo_type != SOURCE) & (fifo_type == BOTH)) + begin + $display("^^^ %16.t | %m | ERROR! wrong fifo_type |", $time); + return; + end + + if(fifo_tr_q_semaphore.try_get() == 0) + begin + $display("^^^ %16.t | %m | ERROR! fifo_tr_q_semaphore.try_get() == 0 |", $time); + return; + end + + $display("^^^ %16.t | %m is active |", $time); + + this.fifo_tr_q = new(); + + fifo_write_fork : fork + forever + begin + + fifo_tr_q.get(fifo_tr); + fork_write(fifo_tr.data, fifo_tr.write_delay); + + wait fork; + + ->fifo_write_done; + end + join_none + + #0; + + endtask: fifo_write_q + + + // -------------------------------------------------------------------- + // + fifo_transaction_class fifo_tr_clone; + event fifo_read_done; + logic [W - 1:0] rd_data; + logic [W - 1:0] rd_result; + int compare_result; + int compare_errors = 0; + + task automatic + fifo_read_q; + + if((fifo_type != SINK) & (fifo_type == BOTH)) + begin + $display("^^^ %16.t | %m | ERROR! wrong fifo_type |", $time); + return; + end + + + if(fifo_tr_q_semaphore.try_get() == 0) + begin + $display("^^^ %16.t | %m | ERROR! fifo_tr_q_semaphore.try_get() == 0 |", $time); + return; + end + + $display("^^^ %16.t | %m is active |", $time); + + this.fifo_tr_q = new(); + fifo_tr_clone = fifo_tr.clone(); + + fifo_read_q_fork : fork + forever + begin + + fifo_tr_q.get(fifo_tr); + fork_read(fifo_tr.read_delay); + + wait fork; + + ->fifo_read_done; + + rd_data_q.get(rd_result); + rd_data = fifo_tr.data; + + if(rd_result != rd_data) + begin + $display("^^^ %16.t | %m | ERROR! rd_result != fifo_tr.data |", $time); + $display("^^^ %16.t | %m | rd_result = %h |", $time, rd_result); + $display("^^^ %16.t | %m | fifo_tr.data = %h |", $time, fifo_tr.data); + end + + // compare_result = avf_in_frame.compare(8, f_h); + // compare_errors += compare_result; + + end + join_none + + #0; + + endtask: fifo_read_q + + + // -------------------------------------------------------------------- + // + + endclass: fifo_bfm_class + +endpackage: fifo_bfm_pkg + Index: trunk/basal/sim/tests/tb_tiny_async_fifo/tb_tiny_async_fifo.sv =================================================================== --- trunk/basal/sim/tests/tb_tiny_async_fifo/tb_tiny_async_fifo.sv (revision 49) +++ trunk/basal/sim/tests/tb_tiny_async_fifo/tb_tiny_async_fifo.sv (nonexistent) @@ -1,122 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_200mhz; - wire tb_clk = clk_200mhz; - wire tb_rst; - wire aclk = tb_clk; - wire aresetn = ~tb_rst; - - tb_base #(.PERIOD(5_000)) tb(clk_200mhz, tb_rst); - - // wire clk_100mhz; - // tb_clk #(.PERIOD(10_000)) tb_100mhz_clk(clk_100mhz); - - - // -------------------------------------------------------------------- - // - localparam W = 8; - - fifo_write_if #(.W(W)) source(clk_200mhz, tb_rst); - fifo_read_if #(.W(W)) sink(clk_200mhz, tb_rst); - - - // -------------------------------------------------------------------- - // - tiny_async_fifo - dut(.*); - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - // -------------------------------------------------------------------- - // - // import fifo_bfm_pkg::*; - - // fifo_bfm_class bfm = new(source, sink); - - // initial - // bfm.init("", BOTH); - - - // -------------------------------------------------------------------- - // - import fifo_agent_pkg::*; - - fifo_agent_class bfm = new(source, sink); - - initial - begin - bfm.init(); - bfm.start_q(); - end - - - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - - - // -------------------------------------------------------------------- - // test - the_test test( tb_clk, tb_rst ); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule - - - Index: trunk/basal/sim/tests/tb_tiny_async_fifo/wip.do =================================================================== --- trunk/basal/sim/tests/tb_tiny_async_fifo/wip.do (revision 49) +++ trunk/basal/sim/tests/tb_tiny_async_fifo/wip.do (nonexistent) @@ -1,13 +0,0 @@ -# - - -vlog -f ../../libs/async_fifo_verilog/tiny_async_fifo.f -# vlog -f ../../libs/sim_verilog/fifo_bfm.f - -# simulation $root -vlog ../../src/tb_tiny_async_fifo.sv - -# compile test last -vlog ./the_test.sv - - Index: trunk/basal/sim/tests/tb_tiny_async_fifo/init_test.do =================================================================== --- trunk/basal/sim/tests/tb_tiny_async_fifo/init_test.do (revision 49) +++ trunk/basal/sim/tests/tb_tiny_async_fifo/init_test.do (nonexistent) @@ -1,33 +0,0 @@ -# ------------------------------------ -# -# ------------------------------------ - -global env - -set env(ROOT_DIR) ../../../../.. -set env(PROJECT_DIR) ../../.. -set env(SIM_TARGET) fpga - -# load sim procedures -do $env(ROOT_DIR)/qaz_libs/scripts/sim_procs.do - -radix -hexadecimal - -make_lib work 1 - -sim_compile_all async_fifo -sim_compile_all sim - -# simulation $root -vlog $env(PROJECT_DIR)/sim/src/tb_tiny_async_fifo.sv - -# compile test last -vlog ./the_test.sv - -# vopt work.glbl tb_top -L secureip -L simprims_ver -L unisims_ver -f opt_tb_top.f -o opt_tb_top - -# run the sim -sim_run_test - - - Index: trunk/basal/sim/tests/tb_tiny_async_fifo/the_test.sv =================================================================== --- trunk/basal/sim/tests/tb_tiny_async_fifo/the_test.sv (revision 49) +++ trunk/basal/sim/tests/tb_tiny_async_fifo/the_test.sv (nonexistent) @@ -1,77 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -`timescale 1ps/1ps - - -module - the_test( - input tb_clk, - input tb_rst - ); - - // -------------------------------------------------------------------- - // - int data; - - - // -------------------------------------------------------------------- - // - task run_the_test; - - // -------------------------------------------------------------------- - // insert test below - // -------------------------------------------------------------------- - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench begun.\n", $time); - $display("^^^---------------------------------"); - // -------------------------------------------------------------------- - - tb_top.tb.timeout_stop(1000ms); - - - // -------------------------------------------------------------------- - wait(~tb_rst); - - - // -------------------------------------------------------------------- - - repeat(20) @(posedge tb_clk); - - repeat(100) tb_top.bfm.queue_random(); - repeat(500) @(posedge tb_clk); - - - // -------------------------------------------------------------------- - // insert test above - // -------------------------------------------------------------------- - - endtask - - -endmodule - Index: trunk/basal/sim/tests/tb_tiny_async_fifo/sim.do =================================================================== --- trunk/basal/sim/tests/tb_tiny_async_fifo/sim.do (revision 49) +++ trunk/basal/sim/tests/tb_tiny_async_fifo/sim.do (nonexistent) @@ -1,21 +0,0 @@ -# -# - - -quit -sim - -# vsim opt_tb_top - -vsim -novopt work.tb_top -# vsim -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top - -# vsim -voptargs="+acc=rn+/tb_top/dut" -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top -# vsim -pli "C:/Xilinx/Vivado/2015.4/lib/win64.o/libxil_vsim.dll" -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top - - -# # log all signals -# log -r * - -# run -all - - Index: trunk/basal/sim/tests/tb_tiny_sync_fifo/the_test.sv =================================================================== --- trunk/basal/sim/tests/tb_tiny_sync_fifo/the_test.sv (revision 49) +++ trunk/basal/sim/tests/tb_tiny_sync_fifo/the_test.sv (nonexistent) @@ -1,88 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - -`timescale 1ps/1ps - - -module - the_test( - input tb_clk, - input tb_rst - ); - - // -------------------------------------------------------------------- - // - int data; - - - // -------------------------------------------------------------------- - // - task run_the_test; - - // -------------------------------------------------------------------- - // insert test below - // -------------------------------------------------------------------- - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench begun.\n", $time); - $display("^^^---------------------------------"); - // -------------------------------------------------------------------- - - tb_top.tb.timeout_stop(1000ms); - - - // -------------------------------------------------------------------- - wait(~tb_rst); - - - // -------------------------------------------------------------------- - - repeat(10) @(posedge tb_clk); - - repeat(100) tb_top.bfm.queue_random(); - - - // tb_top.bfm.write(8'h22, 0); - // tb_top.bfm.write(8'haa, 0); - // tb_top.bfm.read(10); - // tb_top.bfm.write(8'hff, 5); - // tb_top.bfm.read(0); - // tb_top.bfm.read(0); - // tb_top.bfm.write(8'h11, 1); - - - repeat(1000) @(posedge tb_clk); - - - // -------------------------------------------------------------------- - // insert test above - // -------------------------------------------------------------------- - - endtask - - -endmodule - Index: trunk/basal/sim/tests/tb_tiny_sync_fifo/sim.do =================================================================== --- trunk/basal/sim/tests/tb_tiny_sync_fifo/sim.do (revision 49) +++ trunk/basal/sim/tests/tb_tiny_sync_fifo/sim.do (nonexistent) @@ -1,21 +0,0 @@ -# -# - - -quit -sim - -# vsim opt_tb_top - -vsim -novopt work.tb_top -# vsim -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top - -# vsim -voptargs="+acc=rn+/tb_top/dut" -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top -# vsim -pli "C:/Xilinx/Vivado/2015.4/lib/win64.o/libxil_vsim.dll" -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top - - -# # log all signals -# log -r * - -# run -all - - Index: trunk/basal/sim/tests/tb_tiny_sync_fifo/tb_tiny_sync_fifo.sv =================================================================== --- trunk/basal/sim/tests/tb_tiny_sync_fifo/tb_tiny_sync_fifo.sv (revision 49) +++ trunk/basal/sim/tests/tb_tiny_sync_fifo/tb_tiny_sync_fifo.sv (nonexistent) @@ -1,122 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -module tb_top(); - - // -------------------------------------------------------------------- - // test bench clock & reset - wire clk_200mhz; - wire tb_clk = clk_200mhz; - wire tb_rst; - wire aclk = tb_clk; - wire aresetn = ~tb_rst; - - tb_base #(.PERIOD(5_000)) tb(clk_200mhz, tb_rst); - - // wire clk_100mhz; - // tb_clk #(.PERIOD(10_000)) tb_100mhz_clk(clk_100mhz); - - - // -------------------------------------------------------------------- - // - localparam W = 8; - - fifo_write_if #(.W(W)) source(clk_200mhz, tb_rst); - fifo_read_if #(.W(W)) sink(clk_200mhz, tb_rst); - - - // -------------------------------------------------------------------- - // - tiny_sync_fifo - dut(.*); - - - // -------------------------------------------------------------------- - // sim models - // | | | | | | | | | | | | | | | | | - // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - - // -------------------------------------------------------------------- - // - // import fifo_bfm_pkg::*; - - // fifo_bfm_class bfm = new(source, sink); - - // initial - // bfm.init("", BOTH); - - - // -------------------------------------------------------------------- - // - import fifo_agent_pkg::*; - - fifo_agent_class bfm = new(source, sink); - - initial - begin - bfm.init(); - bfm.start_q(); - end - - - - // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' - // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ - // | | | | | | | | | | | | | | | | | - // sim models - // -------------------------------------------------------------------- - - - // -------------------------------------------------------------------- - // debug wires - - - // -------------------------------------------------------------------- - // test - the_test test( tb_clk, tb_rst ); - - initial - begin - - test.run_the_test(); - - $display("^^^---------------------------------"); - $display("^^^ %16.t | Testbench done.", $time); - $display("^^^---------------------------------"); - - $display("^^^---------------------------------"); - - $stop(); - - end - -endmodule - - - Index: trunk/basal/sim/tests/tb_tiny_sync_fifo/wip.do =================================================================== --- trunk/basal/sim/tests/tb_tiny_sync_fifo/wip.do (revision 49) +++ trunk/basal/sim/tests/tb_tiny_sync_fifo/wip.do (nonexistent) @@ -1,13 +0,0 @@ -# - - -vlog -f ../../libs/FPGA_verilog/tiny_fifo.f -vlog -f ../../libs/sim_verilog/fifo_bfm.f - -# simulation $root -vlog ../../src/tb_tiny_sync_fifo.sv - -# compile test last -vlog ./the_test.sv - - Index: trunk/basal/sim/tests/tb_tiny_sync_fifo/init_test.do =================================================================== --- trunk/basal/sim/tests/tb_tiny_sync_fifo/init_test.do (revision 49) +++ trunk/basal/sim/tests/tb_tiny_sync_fifo/init_test.do (nonexistent) @@ -1,33 +0,0 @@ -# ------------------------------------ -# -# ------------------------------------ - -global env - -set env(ROOT_DIR) ../../../../.. -set env(PROJECT_DIR) ../../.. -set env(SIM_TARGET) fpga - -# load sim procedures -do $env(ROOT_DIR)/qaz_libs/scripts/sim_procs.do - -radix -hexadecimal - -make_lib work 1 - -sim_compile_all sync_fifo -sim_compile_all sim - -# simulation $root -vlog $env(PROJECT_DIR)/sim/src/tb_tiny_sync_fifo.sv - -# compile test last -vlog ./the_test.sv - -# vopt work.glbl tb_top -L secureip -L simprims_ver -L unisims_ver -f opt_tb_top.f -o opt_tb_top - -# run the sim -sim_run_test - - - Index: trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/init_test.do =================================================================== --- trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/init_test.do (nonexistent) +++ trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/init_test.do (revision 50) @@ -0,0 +1,33 @@ +# ------------------------------------ +# +# ------------------------------------ + +global env + +set env(ROOT_DIR) ../../../../.. +set env(PROJECT_DIR) ../../.. +set env(SIM_TARGET) fpga + +# load sim procedures +do $env(ROOT_DIR)/qaz_libs/scripts/sim_procs.do + +radix -hexadecimal + +make_lib work 1 + +sim_compile_all async_fifo +sim_compile_all sim + +# simulation $root +vlog $env(PROJECT_DIR)/sim/src/tb_tiny_async_fifo.sv + +# compile test last +vlog ./the_test.sv + +# vopt work.glbl tb_top -L secureip -L simprims_ver -L unisims_ver -f opt_tb_top.f -o opt_tb_top + +# run the sim +sim_run_test + + + Index: trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/sim.do =================================================================== --- trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/sim.do (nonexistent) +++ trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/sim.do (revision 50) @@ -0,0 +1,21 @@ +# +# + + +quit -sim + +# vsim opt_tb_top + +vsim -novopt work.tb_top +# vsim -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top + +# vsim -voptargs="+acc=rn+/tb_top/dut" -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top +# vsim -pli "C:/Xilinx/Vivado/2015.4/lib/win64.o/libxil_vsim.dll" -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top + + +# # log all signals +# log -r * + +# run -all + + Index: trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/tb_tiny_async_fifo.sv =================================================================== --- trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/tb_tiny_async_fifo.sv (nonexistent) +++ trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/tb_tiny_async_fifo.sv (revision 50) @@ -0,0 +1,122 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +module tb_top(); + + // -------------------------------------------------------------------- + // test bench clock & reset + wire clk_200mhz; + wire tb_clk = clk_200mhz; + wire tb_rst; + wire aclk = tb_clk; + wire aresetn = ~tb_rst; + + tb_base #(.PERIOD(5_000)) tb(clk_200mhz, tb_rst); + + // wire clk_100mhz; + // tb_clk #(.PERIOD(10_000)) tb_100mhz_clk(clk_100mhz); + + + // -------------------------------------------------------------------- + // + localparam W = 8; + + fifo_write_if #(.W(W)) source(clk_200mhz, tb_rst); + fifo_read_if #(.W(W)) sink(clk_200mhz, tb_rst); + + + // -------------------------------------------------------------------- + // + tiny_async_fifo + dut(.*); + + + // -------------------------------------------------------------------- + // sim models + // | | | | | | | | | | | | | | | | | + // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + + // -------------------------------------------------------------------- + // + // import fifo_bfm_pkg::*; + + // fifo_bfm_class bfm = new(source, sink); + + // initial + // bfm.init("", BOTH); + + + // -------------------------------------------------------------------- + // + import fifo_agent_pkg::*; + + fifo_agent_class bfm = new(source, sink); + + initial + begin + bfm.init(); + bfm.start_q(); + end + + + + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ + // | | | | | | | | | | | | | | | | | + // sim models + // -------------------------------------------------------------------- + + + // -------------------------------------------------------------------- + // debug wires + + + // -------------------------------------------------------------------- + // test + the_test test( tb_clk, tb_rst ); + + initial + begin + + test.run_the_test(); + + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench done.", $time); + $display("^^^---------------------------------"); + + $display("^^^---------------------------------"); + + $stop(); + + end + +endmodule + + + Index: trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/the_test.sv =================================================================== --- trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/the_test.sv (nonexistent) +++ trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/the_test.sv (revision 50) @@ -0,0 +1,77 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +`timescale 1ps/1ps + + +module + the_test( + input tb_clk, + input tb_rst + ); + + // -------------------------------------------------------------------- + // + int data; + + + // -------------------------------------------------------------------- + // + task run_the_test; + + // -------------------------------------------------------------------- + // insert test below + // -------------------------------------------------------------------- + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench begun.\n", $time); + $display("^^^---------------------------------"); + // -------------------------------------------------------------------- + + tb_top.tb.timeout_stop(1000ms); + + + // -------------------------------------------------------------------- + wait(~tb_rst); + + + // -------------------------------------------------------------------- + + repeat(20) @(posedge tb_clk); + + repeat(100) tb_top.bfm.queue_random(); + repeat(500) @(posedge tb_clk); + + + // -------------------------------------------------------------------- + // insert test above + // -------------------------------------------------------------------- + + endtask + + +endmodule + Index: trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/wip.do =================================================================== --- trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/wip.do (nonexistent) +++ trunk/basal/sim/tests/legacy/tb_tiny_async_fifo/wip.do (revision 50) @@ -0,0 +1,13 @@ +# + + +vlog -f ../../libs/async_fifo_verilog/tiny_async_fifo.f +# vlog -f ../../libs/sim_verilog/fifo_bfm.f + +# simulation $root +vlog ../../src/tb_tiny_async_fifo.sv + +# compile test last +vlog ./the_test.sv + + Index: trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/init_test.do =================================================================== --- trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/init_test.do (nonexistent) +++ trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/init_test.do (revision 50) @@ -0,0 +1,33 @@ +# ------------------------------------ +# +# ------------------------------------ + +global env + +set env(ROOT_DIR) ../../../../.. +set env(PROJECT_DIR) ../../.. +set env(SIM_TARGET) fpga + +# load sim procedures +do $env(ROOT_DIR)/qaz_libs/scripts/sim_procs.do + +radix -hexadecimal + +make_lib work 1 + +sim_compile_all sync_fifo +sim_compile_all sim + +# simulation $root +vlog $env(PROJECT_DIR)/sim/src/tb_tiny_sync_fifo.sv + +# compile test last +vlog ./the_test.sv + +# vopt work.glbl tb_top -L secureip -L simprims_ver -L unisims_ver -f opt_tb_top.f -o opt_tb_top + +# run the sim +sim_run_test + + + Index: trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/sim.do =================================================================== --- trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/sim.do (nonexistent) +++ trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/sim.do (revision 50) @@ -0,0 +1,21 @@ +# +# + + +quit -sim + +# vsim opt_tb_top + +vsim -novopt work.tb_top +# vsim -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top + +# vsim -voptargs="+acc=rn+/tb_top/dut" -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top +# vsim -pli "C:/Xilinx/Vivado/2015.4/lib/win64.o/libxil_vsim.dll" -novopt -L secureip -L simprims_ver -L unisims_ver work.glbl work.tb_top + + +# # log all signals +# log -r * + +# run -all + + Index: trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/tb_tiny_sync_fifo.sv =================================================================== --- trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/tb_tiny_sync_fifo.sv (nonexistent) +++ trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/tb_tiny_sync_fifo.sv (revision 50) @@ -0,0 +1,122 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + + +module tb_top(); + + // -------------------------------------------------------------------- + // test bench clock & reset + wire clk_200mhz; + wire tb_clk = clk_200mhz; + wire tb_rst; + wire aclk = tb_clk; + wire aresetn = ~tb_rst; + + tb_base #(.PERIOD(5_000)) tb(clk_200mhz, tb_rst); + + // wire clk_100mhz; + // tb_clk #(.PERIOD(10_000)) tb_100mhz_clk(clk_100mhz); + + + // -------------------------------------------------------------------- + // + localparam W = 8; + + fifo_write_if #(.W(W)) source(clk_200mhz, tb_rst); + fifo_read_if #(.W(W)) sink(clk_200mhz, tb_rst); + + + // -------------------------------------------------------------------- + // + tiny_sync_fifo + dut(.*); + + + // -------------------------------------------------------------------- + // sim models + // | | | | | | | | | | | | | | | | | + // \|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/ + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + + // -------------------------------------------------------------------- + // + // import fifo_bfm_pkg::*; + + // fifo_bfm_class bfm = new(source, sink); + + // initial + // bfm.init("", BOTH); + + + // -------------------------------------------------------------------- + // + import fifo_agent_pkg::*; + + fifo_agent_class bfm = new(source, sink); + + initial + begin + bfm.init(); + bfm.start_q(); + end + + + + // ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' + // /|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\-/|\ + // | | | | | | | | | | | | | | | | | + // sim models + // -------------------------------------------------------------------- + + + // -------------------------------------------------------------------- + // debug wires + + + // -------------------------------------------------------------------- + // test + the_test test( tb_clk, tb_rst ); + + initial + begin + + test.run_the_test(); + + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench done.", $time); + $display("^^^---------------------------------"); + + $display("^^^---------------------------------"); + + $stop(); + + end + +endmodule + + + Index: trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/the_test.sv =================================================================== --- trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/the_test.sv (nonexistent) +++ trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/the_test.sv (revision 50) @@ -0,0 +1,88 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2015 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// + +`timescale 1ps/1ps + + +module + the_test( + input tb_clk, + input tb_rst + ); + + // -------------------------------------------------------------------- + // + int data; + + + // -------------------------------------------------------------------- + // + task run_the_test; + + // -------------------------------------------------------------------- + // insert test below + // -------------------------------------------------------------------- + $display("^^^---------------------------------"); + $display("^^^ %16.t | Testbench begun.\n", $time); + $display("^^^---------------------------------"); + // -------------------------------------------------------------------- + + tb_top.tb.timeout_stop(1000ms); + + + // -------------------------------------------------------------------- + wait(~tb_rst); + + + // -------------------------------------------------------------------- + + repeat(10) @(posedge tb_clk); + + repeat(100) tb_top.bfm.queue_random(); + + + // tb_top.bfm.write(8'h22, 0); + // tb_top.bfm.write(8'haa, 0); + // tb_top.bfm.read(10); + // tb_top.bfm.write(8'hff, 5); + // tb_top.bfm.read(0); + // tb_top.bfm.read(0); + // tb_top.bfm.write(8'h11, 1); + + + repeat(1000) @(posedge tb_clk); + + + // -------------------------------------------------------------------- + // insert test above + // -------------------------------------------------------------------- + + endtask + + +endmodule + Index: trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/wip.do =================================================================== --- trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/wip.do (nonexistent) +++ trunk/basal/sim/tests/legacy/tb_tiny_sync_fifo/wip.do (revision 50) @@ -0,0 +1,13 @@ +# + + +vlog -f ../../libs/FPGA_verilog/tiny_fifo.f +vlog -f ../../libs/sim_verilog/fifo_bfm.f + +# simulation $root +vlog ../../src/tb_tiny_sync_fifo.sv + +# compile test last +vlog ./the_test.sv + + Index: trunk/basal/src/FIFOs/tiny_async_fifo.sv =================================================================== --- trunk/basal/src/FIFOs/tiny_async_fifo.sv (revision 49) +++ trunk/basal/src/FIFOs/tiny_async_fifo.sv (nonexistent) @@ -1,189 +0,0 @@ -////////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2015 Authors and OPENCORES.ORG //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer. //// -//// //// -//// This source file is free software; you can redistribute it //// -//// and/or modify it under the terms of the GNU Lesser General //// -//// Public License as published by the Free Software Foundation; //// -//// either version 2.1 of the License, or (at your option) any //// -//// later version. //// -//// //// -//// This source is distributed in the hope that it will be //// -//// useful, but WITHOUT ANY WARRANTY; without even the implied //// -//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// -//// PURPOSE. See the GNU Lesser General Public License for more //// -//// details. //// -//// //// -//// You should have received a copy of the GNU Lesser General //// -//// Public License along with this source; if not, download it //// -//// from http://www.opencores.org/lgpl.shtml //// -//// //// -////////////////////////////////////////////////////////////////////// - - -module - tiny_async_fifo - #( - parameter W = 8 - ) - ( - output wr_full, - input [W-1:0] wr_data, - input wr_en, - input wr_clk, - input wr_reset, - - output rd_empty, - output [W-1:0] rd_data, - input rd_en, - input rd_clk, - input rd_reset - ); - - // -------------------------------------------------------------------- - // - wire writing = wr_en && ~wr_full; - wire reading = rd_en && ~rd_empty; - - - // -------------------------------------------------------------------- - // - function logic [1:0] - grey_counter_2_bit - ( - input logic [1:0] count - ); - - case(count) - 2'b00: grey_counter_2_bit = 2'b00; - 2'b01: grey_counter_2_bit = 2'b01; - 2'b10: grey_counter_2_bit = 2'b11; - 2'b11: grey_counter_2_bit = 2'b10; - endcase - - endfunction - - - // -------------------------------------------------------------------- - // sync grey_wr_ptr to rd clk domain - reg [1:0] grey_wr_ptr; - reg [1:0] grey_wr_ptr_r; - reg [1:0] grey_wr_ptr_s; - - always_ff @(posedge rd_clk) - if(rd_reset) - {grey_wr_ptr_s, grey_wr_ptr_r} <= 0; - else - {grey_wr_ptr_s, grey_wr_ptr_r} <= {grey_wr_ptr_r, grey_wr_ptr}; - - - // -------------------------------------------------------------------- - // sync grey_rd_ptr to wr clk domain - reg [1:0] grey_rd_ptr; - reg [1:0] grey_rd_ptr_r; - reg [1:0] grey_rd_ptr_s; - - always_ff @(posedge wr_clk) - if(rd_reset) - {grey_rd_ptr_s, grey_rd_ptr_r} <= 0; - else - {grey_rd_ptr_s, grey_rd_ptr_r} <= {grey_rd_ptr_r, grey_rd_ptr}; - - - // -------------------------------------------------------------------- - // - reg [1:0] bin_rd_ptr; - wire [1:0] bin_rd_ptr_next = bin_rd_ptr + reading; - - always_ff @(posedge rd_clk) - if(rd_reset) - bin_rd_ptr <= 0; - else - bin_rd_ptr <= bin_rd_ptr_next; - - - // -------------------------------------------------------------------- - // - wire [1:0] grey_rd_ptr_next = grey_counter_2_bit(bin_rd_ptr_next); - - always_ff @(posedge rd_clk) - if(rd_reset) - grey_rd_ptr <= 0; - else - grey_rd_ptr <= grey_rd_ptr_next; - - - // -------------------------------------------------------------------- - // - reg asf_empty_r; - - always_ff @(posedge rd_clk) - if(rd_reset) - asf_empty_r <= 1; - else - asf_empty_r <= (grey_rd_ptr_next == grey_wr_ptr_s); - - - // -------------------------------------------------------------------- - // - reg [1:0] bin_wr_ptr; - wire [1:0] bin_wr_ptr_next = bin_wr_ptr + writing; - - always_ff @(posedge wr_clk) - if(wr_reset) - bin_wr_ptr <= 0; - else - bin_wr_ptr <= bin_wr_ptr_next; - - - // -------------------------------------------------------------------- - // - wire [1:0] grey_wr_ptr_next = grey_counter_2_bit(bin_wr_ptr_next); - - always_ff @(posedge wr_clk) - if(wr_reset) - grey_wr_ptr <= 0; - else - grey_wr_ptr <= grey_wr_ptr_next; - - - // -------------------------------------------------------------------- - // - reg asf_full_r; - - always_ff @(posedge wr_clk) - if(wr_reset) - asf_full_r <= 1; - else - asf_full_r <= (grey_wr_ptr_next == ~grey_rd_ptr_s); - - - // -------------------------------------------------------------------- - // - reg [W-1:0] data_0_r; - reg [W-1:0] data_1_r; - wire [W-1:0] rd_data_mux = bin_rd_ptr[0] ? data_1_r : data_0_r; - assign rd_data = rd_data_mux; - - always_ff @(posedge wr_clk) - if (writing) - if(bin_wr_ptr[0]) - data_1_r <= wr_data; - else - data_0_r <= wr_data; - - - // -------------------------------------------------------------------- - // - assign rd_empty = asf_empty_r; - assign wr_full = asf_full_r; - - -endmodule - - Index: trunk/basal/src/FIFOs/sync_fifo.sv =================================================================== --- trunk/basal/src/FIFOs/sync_fifo.sv (revision 49) +++ trunk/basal/src/FIFOs/sync_fifo.sv (revision 50) @@ -25,7 +25,6 @@ //// //// ////////////////////////////////////////////////////////////////////// - module sync_fifo #( @@ -37,11 +36,9 @@ output wr_full, input [W-1:0] wr_data, input wr_en, - output rd_empty, output [W-1:0] rd_data, input rd_en, - output [UB:0] count, input clk, input reset @@ -48,12 +45,21 @@ ); // -------------------------------------------------------------------- - // generate begin: fifo_gen if(D == 2) begin - assign count = 0; + reg [UB:0] count_r; + assign count = count_r; + + always_comb + case({wr_full, rd_empty}) + 2'b0_0: count_r = 1; + 2'b0_1: count_r = 0; + 2'b1_0: count_r = 2; + 2'b1_1: count_r = 'x; // should never happen + endcase + tiny_sync_fifo #(.W(W)) tiny_sync_fifo_i(.*); end @@ -73,7 +79,6 @@ end endgenerate - // -------------------------------------------------------------------- // synthesis translate_off always_ff @(posedge clk) @@ -85,9 +90,5 @@ // synthesis translate_on // -------------------------------------------------------------------- - // -------------------------------------------------------------------- -// endmodule - -
/trunk/basal/src/misc/barrel_shifter.v
0,0 → 1,73
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2019 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
module
barrel_shifter
#(
parameter W = 32,
parameter D = W,
parameter UB = $clog2(D)
)
(
input direction, // right = 0, left = 1
input op, // logical = 0, arithmetic = 1; left arithmetic not supported
input [UB-1:0] amount, // 0 not allowed
input [W-1:0] data_in,
output [W-1:0] data_out,
 
input reset,
input clk
);
 
// --------------------------------------------------------------------
wire [W-1:0] out [UB:0];
wire shift_in = direction & op ? data_in[W-1] : 0;
genvar j, k;
 
// --------------------------------------------------------------------
generate
for(k = 0; k < D; k = k + 1)
begin : reversal
assign out[5][k] = direction ? data_in[k] : data_in[D - 1 - k];
assign data_out[k] = direction ? out[0][k] : out[0][D - 1 - k];
end
endgenerate
 
// --------------------------------------------------------------------
generate
for(j = 0; j < UB; j = j + 1)
for(k = 0; k < D; k = k + 1)
begin : shifter
if(k > D - 1 - (2**j))
assign out[j][k] = amount[j] ? shift_in : out[j+1][k];
else
assign out[j][k] = amount[j] ? out[j+1][k + (2**j)] : out[j+1][k];
end
endgenerate
 
// --------------------------------------------------------------------
endmodule
/trunk/camera_link/docs/ds90cr286.pdf Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
trunk/camera_link/docs/ds90cr286.pdf Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: trunk/camera_link/docs/CameraLink5.pdf =================================================================== --- trunk/camera_link/docs/CameraLink5.pdf (revision 49) +++ trunk/camera_link/docs/CameraLink5.pdf (nonexistent) @@ -1,13633 +0,0 @@ -%PDF-1.3 -% -1729 0 obj -<< -/Linearized 1 -/O 1735 -/H [ 3218 904 ] -/L 293444 -/E 27744 -/N 34 -/T 258744 ->> -endobj - xref -1729 119 -0000000016 00000 n -0000002755 00000 n -0000002940 00000 n -0000003083 00000 n -0000003116 00000 n -0000003175 00000 n -0000004122 00000 n -0000004457 00000 n -0000004527 00000 n -0000004737 00000 n -0000004838 00000 n -0000004971 00000 n -0000005108 00000 n -0000005251 00000 n -0000005307 00000 n -0000005457 00000 n -0000005592 00000 n -0000005725 00000 n -0000005781 00000 n -0000005929 00000 n -0000006087 00000 n -0000006259 00000 n -0000006389 00000 n -0000006472 00000 n -0000006652 00000 n -0000006782 00000 n -0000006891 00000 n -0000007003 00000 n -0000007130 00000 n -0000007303 00000 n -0000007487 00000 n -0000007575 00000 n -0000007743 00000 n -0000007841 00000 n -0000007934 00000 n -0000008050 00000 n -0000008175 00000 n -0000008275 00000 n -0000008425 00000 n -0000008543 00000 n -0000008658 00000 n -0000008713 00000 n -0000008768 00000 n -0000008884 00000 n -0000008999 00000 n -0000009114 00000 n -0000009245 00000 n -0000009417 00000 n -0000009586 00000 n -0000009728 00000 n -0000009874 00000 n -0000010016 00000 n -0000010170 00000 n -0000010324 00000 n -0000010479 00000 n -0000010634 00000 n -0000010787 00000 n -0000010917 00000 n -0000010973 00000 n -0000011074 00000 n -0000011175 00000 n -0000011275 00000 n -0000011375 00000 n -0000011475 00000 n -0000011576 00000 n -0000011676 00000 n -0000011776 00000 n -0000011876 00000 n -0000011976 00000 n -0000012076 00000 n -0000012177 00000 n -0000012277 00000 n -0000012377 00000 n -0000012477 00000 n -0000012577 00000 n -0000012677 00000 n -0000012777 00000 n -0000012877 00000 n -0000012978 00000 n -0000013078 00000 n -0000013179 00000 n -0000013279 00000 n -0000013379 00000 n -0000013479 00000 n -0000013580 00000 n -0000013680 00000 n -0000013780 00000 n -0000013881 00000 n -0000013981 00000 n -0000014080 00000 n -0000014179 00000 n -0000014279 00000 n -0000014378 00000 n -0000014477 00000 n -0000014577 00000 n -0000014676 00000 n -0000014775 00000 n -0000014874 00000 n -0000014974 00000 n -0000015073 00000 n -0000015172 00000 n -0000015271 00000 n -0000015369 00000 n -0000015467 00000 n -0000015568 00000 n -0000015750 00000 n -0000016265 00000 n -0000016288 00000 n -0000016595 00000 n -0000016987 00000 n -0000017468 00000 n -0000017864 00000 n -0000018242 00000 n -0000018691 00000 n -0000020267 00000 n -0000024238 00000 n -0000027472 00000 n -0000003218 00000 n -0000004099 00000 n -trailer -<< -/Size 1848 -/Info 1722 0 R -/Encrypt 1731 0 R -/Root 1730 0 R -/Prev 258732 -/ID[] ->> -startxref -0 -%%EOF - -1730 0 obj -<< -/Type /Catalog -/Pages 1724 0 R -/Outlines 1736 0 R -/Threads 1732 0 R -/Names 1734 0 R -/OpenAction [ 1735 0 R /XYZ null null null ] -/PageMode /UseOutlines ->> -endobj -1731 0 obj -<< -/Filter /Standard -/V 1 -/R 2 -/O ( 4os*! j7XF4) -/U (*\n^_ ps+++?\(Ɲ KX) -/P -12 ->> -endobj -1732 0 obj -[ -1733 0 R -] -endobj -1733 0 obj -<< -/I << /Title ()>> -/F 1831 0 R ->> -endobj -1734 0 obj -<< -/Dests 1720 0 R ->> -endobj -1846 0 obj -<< /S 1026 /O 1265 /E 1281 /Filter /FlateDecode /Length 1847 0 R >> -stream -IgB'K 9DgfoYEkhX'H1T缱v8o0V0{#赵)Qt(~NQ -|3EP %K7Q -51oDadR 3OS ŢvîDi -l߬6͌3v GTxkySHXJ\[VXFt^1"Yp+ ~TsP+d O[|d#g$Iã]wTIElib -j_Wg fɰ^ -g𤅺6:]=;ZN}tri}@.j 7?.:q4XT"K 2I̘M, hnDÊގx0+ym4>Ģ#98P.) -br"J:wS@>$ ~T Q@3y 3'{WDbv d=4'D菫 ^&Tױ>DO.>s ۏ8h&6]5)!7Dzƿ}qlYsݦ2=aFdOsq'sP祼|# x8k.+r˚ndy}zf!k*Xy'dr4bd?u> /ColorSpace << /CS1 1833 0 R >> -/ExtGState << /R12 1845 0 R >> /ProcSet [ /PDF /Text ] >> -/Contents 1834 0 R -/CropBox [ 54 72 558 720 ] -/B [ 1787 0 R 1788 0 R 1832 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -1736 0 obj -<< -/Count 15 -/First 1737 0 R -/Last 1737 0 R ->> -endobj -1737 0 obj -<< -/Title (%py8w.cai֐\r|` лyw#%F0F{VR\)={6\ -7$yL&\(pj?) -/Dest (In-) -/Parent 1736 0 R -/First 1738 0 R -/Last 1739 0 R -/Count 14 ->> -endobj -1738 0 obj -<< -/Title (-f`iq\nM@w) -/A 1786 0 R -/Next 1768 0 R -/Parent 1737 0 R ->> -endobj -1739 0 obj -<< -/Title () -/Count -9 -/Last 1740 0 R -/First 1741 0 R -/A 1742 0 R -/Prev 1743 0 R -/Parent 1737 0 R ->> -endobj -1740 0 obj -<< -/Title («šr!esw G>Z3BpN0\nfd tRQRYӚ) -/Dest (閏f) -/Prev 1785 0 R -/Parent 1739 0 R ->> -endobj -1741 0 obj -<< -/Title (j.s\rKi|AY4m+̏R\(~9qa/l) -/Dest (583) -/Parent 1739 0 R -/Next 1779 0 R ->> -endobj -1742 0 obj -<< -/S /GoTo -/D [ 46 0 R /Fit ] ->> -endobj -1743 0 obj -<< -/Title (p18eL) -/Count -6 -/Last 1744 0 R -/First 1745 0 R -/A 1746 0 R -/Next 1739 0 R -/Prev 1747 0 R -/Parent 1737 0 R ->> -endobj -1744 0 obj -<< -/Title (C$VNH̋z#^K/.0) -/Dest (B^LGsu) -/Prev 1778 0 R -/Parent 1743 0 R ->> -endobj -1745 0 obj -<< -/Title (d,:4\\Q^RB\\{ˢPIK") -/Dest (eq|fH) -/Count 0 -/Parent 1743 0 R -/Next 1775 0 R ->> -endobj -1746 0 obj -<< -/S /GoTo -/D [ 46 0 R /Fit ] ->> -endobj -1747 0 obj -<< -/Title (\r${VSJf\nVК%o7w3W 0) -/Dest ( eURPj) -/Parent 1737 0 R -/Prev 1748 0 R -/Next 1743 0 R ->> -endobj -1748 0 obj -<< -/Title (^೮vitAY'%=RP'\)Յ.Xc]R7GJ) -/Dest (XXI) -/Parent 1737 0 R -/Prev 1749 0 R -/Next 1747 0 R ->> -endobj -1749 0 obj -<< -/Title (>"*h) -/Dest (e) -/Parent 1737 0 R -/Prev 1750 0 R -/Next 1748 0 R -/First 1751 0 R -/Last 1751 0 R -/Count -1 ->> -endobj -1750 0 obj -<< -/Title (R5sB> -endobj -1751 0 obj -<< -/Title (?hC@&) -/Dest (0> -endobj -1752 0 obj -<< -/Title (T|@5@TQ:! ڛ4N[) -/Dest (L/) -/Parent 1737 0 R -/Prev 1753 0 R -/Next 1750 0 R -/First 1754 0 R -/Last 1755 0 R -/Count -3 ->> -endobj -1753 0 obj -<< -/Title (\)aA/ʧį%_\n0) -/Dest (v.k) -/Parent 1737 0 R -/Prev 1757 0 R -/Next 1752 0 R ->> -endobj -1754 0 obj -<< -/Title (*4\n~ujzM) -/Dest (V'\n) -/Parent 1752 0 R -/Next 1756 0 R ->> -endobj -1755 0 obj -<< -/Title ( &2'$ln-~W) -/Dest (adq) -/Prev 1756 0 R -/Parent 1752 0 R ->> -endobj -1756 0 obj -<< -/Title (a=Oxn;Ȣ q) -/Dest (ۺ"jX) -/Next 1755 0 R -/Prev 1754 0 R -/Parent 1752 0 R ->> -endobj -1757 0 obj -<< -/Title ( rg/FFN2"we) -/Dest (U44k) -/Parent 1737 0 R -/Prev 1758 0 R -/Next 1753 0 R -/First 1759 0 R -/Last 1759 0 R -/Count -1 ->> -endobj -1758 0 obj -<< -/Title (=~l~S݀}cOS2Ry\n-< 4Q ) -/Dest (`1V*-) -/Parent 1737 0 R -/Prev 1760 0 R -/Next 1757 0 R -/First 1761 0 R -/Last 1762 0 R -/Count -4 ->> -endobj -1759 0 obj -<< -/Title ( J;`Ip{) -/Dest (7S\r\)2) -/Parent 1757 0 R ->> -endobj -1760 0 obj -<< -/Title (cϼ㎩Mbo) -/Dest (?V) -/Parent 1737 0 R -/Next 1758 0 R -/First 1765 0 R -/Last 1766 0 R -/Count -4 -/Prev 1767 0 R ->> -endobj -1761 0 obj -<< -/Title (\)?&>/sm) -/Dest (uupc9J) -/Parent 1758 0 R -/Next 1764 0 R ->> -endobj -1762 0 obj -<< -/Title (TW) -/Dest (\rJ) -/Parent 1758 0 R -/Prev 1763 0 R ->> -endobj -1763 0 obj -<< -/Title (†U[Pg) -/Dest ( _U) -/Parent 1758 0 R -/Prev 1764 0 R -/Next 1762 0 R ->> -endobj -1764 0 obj -<< -/Title (b$CᘎiO>D) -/Dest ("sT) -/Parent 1758 0 R -/Prev 1761 0 R -/Next 1763 0 R ->> -endobj -1765 0 obj -<< -/Title (a|Ǜ') -/Dest (q\\ !) -/Next 1774 0 R -/Parent 1760 0 R ->> -endobj -1766 0 obj -<< -/Title ({.ʇY c}4) -/Dest (hc) -/Count -2 -/First 1771 0 R -/Last 1772 0 R -/Prev 1773 0 R -/Parent 1760 0 R ->> -endobj -1767 0 obj -<< -/Title ($/N8VI|) -/Next 1760 0 R -/Prev 1768 0 R -/Parent 1737 0 R -/A 1769 0 R ->> -endobj -1768 0 obj -<< -/Title (0Cw]/Z%p) -/A 1770 0 R -/Next 1767 0 R -/Prev 1738 0 R -/Parent 1737 0 R ->> -endobj -1769 0 obj -<< -/S /GoTo -/D [ 6 0 R /Fit ] ->> -endobj -1770 0 obj -<< -/S /GoTo -/D [ 1 0 R /Fit ] ->> -endobj -1771 0 obj -<< -/Title (y׶z> -endobj -1772 0 obj -<< -/Title ( wm WrWc톬?>y) -/Dest (>6S) -/Parent 1766 0 R -/Prev 1771 0 R ->> -endobj -1773 0 obj -<< -/Title (!sqRc6#) -/Dest (%/],;) -/Next 1766 0 R -/Prev 1774 0 R -/Parent 1760 0 R ->> -endobj -1774 0 obj -<< -/Title (V\n/$6}&w) -/Dest (4a~\\[) -/Next 1773 0 R -/Prev 1765 0 R -/Parent 1760 0 R ->> -endobj -1775 0 obj -<< -/Title (se7"ط˓P\(\(?Ŏ>%d8/vɁ~>I7% \rnnIv) -/Dest (r:wpɽ) -/Next 1776 0 R -/Prev 1745 0 R -/Parent 1743 0 R ->> -endobj -1776 0 obj -<< -/Title (lpL鯚s8 C>G\n^0E ϵϺm?݁Iy.؀L) -/Dest (%]bJ) -/Next 1777 0 R -/Prev 1775 0 R -/Parent 1743 0 R ->> -endobj -1777 0 obj -<< -/Title (GYQRt?YH) -/Dest (FHFU) -/Count 0 -/Next 1778 0 R -/Prev 1776 0 R -/Parent 1743 0 R ->> -endobj -1778 0 obj -<< -/Title ( ?#R]*aLP.2m) -/Dest (TPʇ) -/Next 1744 0 R -/Prev 1777 0 R -/Parent 1743 0 R ->> -endobj -1779 0 obj -<< -/Title (R{͗?3\n Gjhwndd]13G) -/Dest (cʳ) -/Next 1780 0 R -/Prev 1741 0 R -/Parent 1739 0 R ->> -endobj -1780 0 obj -<< -/Title (%3h>\\ Pb3Mgr 6;2) -/Dest (67iJ") -/Count 0 -/Next 1781 0 R -/Prev 1779 0 R -/Parent 1739 0 R ->> -endobj -1781 0 obj -<< -/Title (?-|\\Y;$-sѲ:&pMz>BQSkصP) -/Dest (,u0/) -/Next 1782 0 R -/Prev 1780 0 R -/Parent 1739 0 R ->> -endobj -1782 0 obj -<< -/Title (C,Sk0tJpzGxP'zE1-Y \nűJ@) -/Dest (?'=) -/Next 1783 0 R -/Prev 1781 0 R -/Parent 1739 0 R ->> -endobj -1783 0 obj -<< -/Title (Aq_G?nm%uM{.KBkoP%;L s5sOb) -/Dest (Q%Ha:) -/Next 1784 0 R -/Prev 1782 0 R -/Parent 1739 0 R ->> -endobj -1784 0 obj -<< -/Title (Ώ4ۜ<3m~,RkQ'W<<ّ;@eg.> -endobj -1785 0 obj -<< -/Title (]Ef?7:\)OnjD) -/Dest (\\7) -/Next 1740 0 R -/Prev 1784 0 R -/Parent 1739 0 R ->> -endobj -1786 0 obj -<< -/S /GoTo -/D [ 10 0 R /Fit ] ->> -endobj -1787 0 obj -<< -/N 1788 0 R -/P 1735 0 R -/R [ 99 534 387 600 ] -/V 1789 0 R -/T 1733 0 R ->> -endobj -1788 0 obj -<< -/P 1735 0 R -/R [ 99 225 387 513 ] -/V 1787 0 R -/N 1832 0 R -/T 1733 0 R ->> -endobj -1789 0 obj -<< -/P 186 0 R -/R [ 99 122 522 670 ] -/V 1790 0 R -/N 1787 0 R -/T 1733 0 R ->> -endobj -1790 0 obj -<< -/P 182 0 R -/R [ 90 122 513 670 ] -/V 1791 0 R -/N 1789 0 R -/T 1733 0 R ->> -endobj -1791 0 obj -<< -/P 178 0 R -/R [ 99 122 522 642 ] -/V 1792 0 R -/N 1790 0 R -/T 1733 0 R ->> -endobj -1792 0 obj -<< -/P 178 0 R -/R [ 456 629 522 702 ] -/V 1793 0 R -/N 1791 0 R -/T 1733 0 R ->> -endobj -1793 0 obj -<< -/P 174 0 R -/R [ 99 122 522 670 ] -/V 1794 0 R -/N 1792 0 R -/T 1733 0 R ->> -endobj -1794 0 obj -<< -/P 170 0 R -/R [ 90 122 513 670 ] -/V 1795 0 R -/N 1793 0 R -/T 1733 0 R ->> -endobj -1795 0 obj -<< -/P 166 0 R -/R [ 99 122 522 670 ] -/V 1796 0 R -/N 1794 0 R -/T 1733 0 R ->> -endobj -1796 0 obj -<< -/P 162 0 R -/R [ 90 122 513 670 ] -/V 1797 0 R -/N 1795 0 R -/T 1733 0 R ->> -endobj -1797 0 obj -<< -/P 158 0 R -/R [ 99 122 522 642 ] -/V 1798 0 R -/N 1796 0 R -/T 1733 0 R ->> -endobj -1798 0 obj -<< -/P 158 0 R -/R [ 456 629 522 702 ] -/V 1799 0 R -/N 1797 0 R -/T 1733 0 R ->> -endobj -1799 0 obj -<< -/P 154 0 R -/R [ 99 122 522 670 ] -/V 1800 0 R -/N 1798 0 R -/T 1733 0 R ->> -endobj -1800 0 obj -<< -/P 150 0 R -/R [ 90 122 513 670 ] -/V 1801 0 R -/N 1799 0 R -/T 1733 0 R ->> -endobj -1801 0 obj -<< -/P 146 0 R -/R [ 99 122 522 670 ] -/V 1802 0 R -/N 1800 0 R -/T 1733 0 R ->> -endobj -1802 0 obj -<< -/P 142 0 R -/R [ 90 122 513 670 ] -/V 1803 0 R -/N 1801 0 R -/T 1733 0 R ->> -endobj -1803 0 obj -<< -/P 138 0 R -/R [ 99 122 522 670 ] -/V 1804 0 R -/N 1802 0 R -/T 1733 0 R ->> -endobj -1804 0 obj -<< -/P 134 0 R -/R [ 90 122 513 670 ] -/V 1805 0 R -/N 1803 0 R -/T 1733 0 R ->> -endobj -1805 0 obj -<< -/P 130 0 R -/R [ 99 122 522 642 ] -/V 1806 0 R -/N 1804 0 R -/T 1733 0 R ->> -endobj -1806 0 obj -<< -/P 130 0 R -/R [ 456 629 522 702 ] -/V 1807 0 R -/N 1805 0 R -/T 1733 0 R ->> -endobj -1807 0 obj -<< -/P 126 0 R -/R [ 99 122 522 642 ] -/V 1808 0 R -/N 1806 0 R -/T 1733 0 R ->> -endobj -1808 0 obj -<< -/P 126 0 R -/R [ 456 629 522 702 ] -/V 1809 0 R -/N 1807 0 R -/T 1733 0 R ->> -endobj -1809 0 obj -<< -/P 122 0 R -/R [ 99 122 522 670 ] -/V 1810 0 R -/N 1808 0 R -/T 1733 0 R ->> -endobj -1810 0 obj -<< -/P 118 0 R -/R [ 90 122 513 670 ] -/V 1811 0 R -/N 1809 0 R -/T 1733 0 R ->> -endobj -1811 0 obj -<< -/P 114 0 R -/R [ 99 122 522 642 ] -/V 1812 0 R -/N 1810 0 R -/T 1733 0 R ->> -endobj -1812 0 obj -<< -/P 114 0 R -/R [ 456 629 522 702 ] -/V 1813 0 R -/N 1811 0 R -/T 1733 0 R ->> -endobj -1813 0 obj -<< -/P 110 0 R -/R [ 90 122 513 670 ] -/V 1814 0 R -/N 1812 0 R -/T 1733 0 R ->> -endobj -1814 0 obj -<< -/P 106 0 R -/R [ 99 122 522 642 ] -/V 1815 0 R -/N 1813 0 R -/T 1733 0 R ->> -endobj -1815 0 obj -<< -/P 106 0 R -/R [ 456 629 522 702 ] -/V 1816 0 R -/N 1814 0 R -/T 1733 0 R ->> -endobj -1816 0 obj -<< -/P 102 0 R -/R [ 99 122 522 670 ] -/V 1817 0 R -/N 1815 0 R -/T 1733 0 R ->> -endobj -1817 0 obj -<< -/P 98 0 R -/R [ 90 122 513 670 ] -/V 1818 0 R -/N 1816 0 R -/T 1733 0 R ->> -endobj -1818 0 obj -<< -/P 94 0 R -/R [ 99 122 522 642 ] -/V 1819 0 R -/N 1817 0 R -/T 1733 0 R ->> -endobj -1819 0 obj -<< -/P 94 0 R -/R [ 456 629 522 702 ] -/V 1820 0 R -/N 1818 0 R -/T 1733 0 R ->> -endobj -1820 0 obj -<< -/P 90 0 R -/R [ 90 122 513 670 ] -/V 1821 0 R -/N 1819 0 R -/T 1733 0 R ->> -endobj -1821 0 obj -<< -/P 86 0 R -/R [ 99 122 522 642 ] -/V 1822 0 R -/N 1820 0 R -/T 1733 0 R ->> -endobj -1822 0 obj -<< -/P 86 0 R -/R [ 456 629 522 702 ] -/V 1823 0 R -/N 1821 0 R -/T 1733 0 R ->> -endobj -1823 0 obj -<< -/P 82 0 R -/R [ 99 122 522 670 ] -/V 1824 0 R -/N 1822 0 R -/T 1733 0 R ->> -endobj -1824 0 obj -<< -/P 78 0 R -/R [ 90 122 513 670 ] -/V 1825 0 R -/N 1823 0 R -/T 1733 0 R ->> -endobj -1825 0 obj -<< -/P 74 0 R -/R [ 99 122 522 642 ] -/V 1826 0 R -/N 1824 0 R -/T 1733 0 R ->> -endobj -1826 0 obj -<< -/P 74 0 R -/R [ 456 629 522 702 ] -/V 1827 0 R -/N 1825 0 R -/T 1733 0 R ->> -endobj -1827 0 obj -<< -/P 46 0 R -/R [ 90 122 513 670 ] -/V 1828 0 R -/N 1826 0 R -/T 1733 0 R ->> -endobj -1828 0 obj -<< -/P 10 0 R -/R [ 99 122 522 626 ] -/V 1829 0 R -/N 1827 0 R -/T 1733 0 R ->> -endobj -1829 0 obj -<< -/P 10 0 R -/R [ 99 648 522 685 ] -/V 1830 0 R -/N 1828 0 R -/T 1733 0 R ->> -endobj -1830 0 obj -<< -/P 6 0 R -/R [ 99 122 522 626 ] -/V 1831 0 R -/N 1829 0 R -/T 1733 0 R ->> -endobj -1831 0 obj -<< -/P 6 0 R -/R [ 99 648 522 685 ] -/V 1832 0 R -/N 1830 0 R -/T 1733 0 R ->> -endobj -1832 0 obj -<< -/P 1735 0 R -/R [ 405 99 522 137 ] -/V 1788 0 R -/N 1831 0 R -/T 1733 0 R ->> -endobj -1833 0 obj -[ -/CalRGB << /WhitePoint [ 0.9505 1 1.089 ] /Gamma [ 2.22221 2.22221 2.22221 ] -/Matrix [ 0.4124 0.2126 0.0193 0.3576 0.71519 0.1192 0.1805 0.0722 0.9505 ] >> - -] -endobj -1834 0 obj -<< /Filter /FlateDecode /Length 1835 0 R >> -stream -#Άi=^ ctˉ-,@fOe7a3ki5+e^{1[DkrQ{Kwo_ɛʰPQ)z GyE@Z&ZP'ElW l.gx5`> ~Z/-²)0vDXFyi=1 I?C7?JnB#%ԣw{[> -endobj -1837 0 obj -<< -/Type /Font -/Subtype /Type1 -/FirstChar 32 -/LastChar 114 -/Widths [ 315 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 630 630 630 630 630 0 0 0 0 0 -0 0 0 0 0 0 742 668 667 761 0 0 0 0 0 0 0 556 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 592 0 0 0 572 0 0 0 320 0 629 0 990 664 0 -0 0 463 ] -/Encoding /WinAnsiEncoding -/BaseFont /GFGILM+StoneSans-Bold -/FontDescriptor 1836 0 R ->> -endobj -1838 0 obj -<< -/Type /Font -/Subtype /Type1 -/FirstChar 32 -/LastChar 121 -/Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 333 333 0 0 500 500 500 500 500 500 0 -0 0 0 0 0 0 0 0 0 556 556 556 611 0 500 611 611 278 0 0 500 778 -611 611 556 0 611 556 500 0 556 833 0 0 0 0 0 0 0 0 0 500 500 444 -500 500 278 500 500 278 0 444 278 778 500 500 500 500 333 444 278 -500 0 667 444 444 ] -/Encoding /WinAnsiEncoding -/BaseFont /GFGIMD+Helvetica-Condensed-Bold -/FontDescriptor 1839 0 R ->> -endobj -1839 0 obj -<< -/Type /FontDescriptor -/Ascent 750 -/CapHeight 750 -/Descent -189 -/Flags 262176 -/FontBBox [ -169 -250 1091 991 ] -/FontName /GFGIMD+Helvetica-Condensed-Bold -/ItalicAngle 0 -/StemV 130 -/XHeight 564 -/CharSet (e\nuLI4L_+Y1X'\rP/j OӨmTt^B\ -/{\rtG #Dо&1kr aBFՄ xGC0d ) -/FontFile3 1843 0 R ->> -endobj -1840 0 obj -<< -/Type /FontDescriptor -/Ascent 750 -/CapHeight 750 -/Descent -189 -/Flags 32 -/FontBBox [ -174 -250 1071 990 ] -/FontName /GFGINE+Helvetica-Condensed -/ItalicAngle 0 -/StemV 79 -/XHeight 556 -/CharSet (,?1{vN"f f9`Fzi'&{Iw XjRrsP$JfX\\!Q+F\ -JJ{ゕ8YP7\rة6!b&9}cY-"t) -/FontFile3 1844 0 R ->> -endobj -1841 0 obj -<< -/Type /Font -/Subtype /Type1 -/FirstChar 32 -/LastChar 117 -/Widths [ 250 0 0 0 0 0 0 0 333 333 0 0 250 333 0 0 500 0 500 500 0 0 500 0 -0 0 0 0 0 0 0 0 0 556 556 556 611 0 444 0 0 278 0 0 500 778 611 -611 556 0 611 556 0 0 0 0 0 0 0 0 0 0 0 0 0 444 500 444 500 444 -278 500 500 222 0 444 222 778 500 500 500 0 333 444 278 500 ] -/Encoding /WinAnsiEncoding -/BaseFont /GFGINE+Helvetica-Condensed -/FontDescriptor 1840 0 R ->> -endobj -1842 0 obj -<< /Filter /FlateDecode /Length 1481 /Subtype /Type1C >> -stream -pOGGifyv!y9÷vB -jǓz/kt QNg)6XВ^}L0vٳ'tk3_J-n`A`i -EJTֵD6zNJIGۆ4po.2J+i`C*[ wcdBX̾v dfu>[([%ExmrCLÒUw7F+_wX_ -}6b&zDuICAk\⒟cʾ.٨ZK'_zto -'IkIv3n3ؠrNn\hv7&T36A+ [;^:cF,Bf N.M79h_φ8D8!'[D>w ?9L/͚Ο,侄ÝelIQhy//ZߞȦb.vEly5 -JhbJeZ ?vEF{s ҼIoG^G Fj( -.ֿf|4 VOeZa B[sY r=n%2ouA=Y̲gi \!d,||Ex:L,ia7D nc}ε[0RYuD{+ -zPdKmQepuN0lmɄ&!Es}9_G-.MapV! ӶkAq;!/j qWOvBm6`քkr|50'ӺT5J,0{7OG9ӧvm(DL+%'0Jy^,;:[PFґBhA03 -CNh;kD&w2\V91(XnzAT`A9nsw#1NKu0qNK|QSX6: CRA}@X^~߇7,F[}Jsn<0S}.h/m+'Ĭ$*tv$ePb\XAC/NºA7:-C,o?O &G3z?#5m*ÓW)c=VO Д+#lT#$Û4L{|X*5 맳{9,6sJtEyk55ķQFl&IiHf@6Ihw9ʗCt6EQI ,? RIHVtS\r3Q [Éoܯ}&X'.A[jRIH7ƶ?uß>헔舼~ 8 aW=B< =L -endstream -endobj -1843 0 obj -<< /Filter /FlateDecode /Length 3876 /Subtype /Type1C >> -stream -EDih 웠K-D.z2IrJ~h:=Unu^Un;{!P'V Hn.]Lvt8~Fcy ->ᓗ^rDؗO_'i;MY"#]p|xΠ_9xD:eΗ%-w13> -g[.1eKġ 4В.2[Wu(:|)D]ϫbcRˡ"/,F;.ŕ_6EvTK ,n.="Jxʳ,R'[4xF+%ŽU\R'AÏ@mܳ*(&[yBZ4Ms ,1KL* <^ -ط-sG1E3d) ^5w#l5rd 5>Lzb$c<b%Mx:2ǐ/WD.@auiD !(TZ ܻ2b_ j%E5!)y0Y-]ΝTLAη-j7NBt'`mfКXs6$;a)`5 ;&d8qWRVȝ1;]XPn9?Or?TD/D+|ϯplش2Cdb#c_>}OK8fW-R;t Y&xSGkQX%!1u9fnIU=`I-MկsU4i-s,bC?aaLٵ1R5\'xGہ.Kr -bhXWFf.M(Y}/N@)MQWøIՔMm~N,m -RzkaJdz{xY$Y[շ.>ݗ?wSh׍:BCeshF@9OŁO૎}Ι%Y% p d'=T2PaRX-x&?3ou- -_zkI~Lo ,uh"a4?K=WlyO -he0זF-hDv;;NlSť`?2z T G/zi z͍h A4ﯩFoĝ7 }AeeQ8a4Q[- Хui5 -0NjU0%XٕI k¾>ME2HIt6ȗ9X]@/Km T7pgJ/z[09ߣuE>Ql$ٜ -#rqM 6$@)lBJ"uW9y-;Bk0| zux`}M[ -}rf7}00RƔ!Yo`l$hǁ[{ -A܁HOf@, ~pIu^k}B`xj3?S, U[=87^5$VuAD,(`_%q}-d&>Drt&':8cSYKjy!GIt*C,4BN]x~D?vըj0Er  @ 08`&8eezg$e= [{:,#^eu},? Vl\>C]Z!? ~~EwsfߤWajL'f:2],ʥɖ{DoL'uͬ= t3hXyN"OGFɟGTz[;xuهys5!Jh(X7_PB(+ ˰[\jjTGО{hG!]NH-Pe'nl\oڞdy4?g: -M*6f*,)YrWԕu!ëZhƼϦ$%a3:@kx,uFSݷsQ|1YkGՁ7e'`)*h9{Gĺ ԝىr -h 6 9sg JCN*4KdrjМUfr1ɕnytoQeod_ H'*ۉc1J̀DT`.l+ IaD -Nz?4@)h$eT-YvhM$`4+$jw -%!TOmhVΪrJ-YP>4LLP?6UmL~}^{(3~Ǧ !!p +V~AkzJŸi?;2ÊB_C4 o _+ItR}ls&.ONRkfHtj+']OF1i1Mӈ$eO. ^) 'WP2#,h%[KN!/Iv8ɕ ib hx7CgΥX*E~nM? NR<AιxSHjѓ),nil9KV%X[̿Z)imWi+LS8EYįY4኿r)Rn#/%n) -쀶 5aY+=rr'm7V/5a suZ8Hpnh((MDkxI Y܌LTRNSwgftZJk -œ.jÛv"hwK!$+=2抜wQN@:+BDrDX{F&巇OJ"{mX`l!Nr!0|2V8+= 2+ `u%F zҸ_PAKylPdԼ%wA#V>8Cބ{ȤtVm%7DLw <mCWsgwWm*%r}lo Ȳ`?2$ߘ!ꃒ"4%Rg5A򑙠6Jl>'(; ?_|ʖ76U9c7h_MERFnhY!#[DLlDD iK\kUaYk,hn*S@~UV.aϴ;ͦOi?'Af|:Wq{~ه$&D8qbim`Y0{~' -уtD3u#^ѿeg* -QP'Eh4/6𗪅!G:3Xh4@5EK5pBI~jzN>i?LTLc3OSǡI}NkF^MOfG3{XɄa22O -PguiLgʂjc/vX"}^ CסgSLy/"[h -endstream -endobj -1844 0 obj -<< /Filter /FlateDecode /Length 3139 /Subtype /Type1C >> -stream - |P1O4.u/)=d}E٠NEf*609#F~c -mشte5nx1G`c֕ͭ'0惢F`#*85Lv>3-!T|~#rR}e R8Y`V-Sށ,M61تI&;SܐkF_"jDfWc X2 `[#}3!(I_eVr襏8EJqov-ʁwԭ,px m/e.C%3P[Z`d[PauF%UNϺE.k)i|SR@M -#ew>doە@,d\] b?YٶՉ:䗑RK'DY]@aq3d4Ω^۶e b;2HQuW -sinx9'r -A33"{lR >i*ڦ? qA&qZ'V"B^gPA(t-u>/vH(l(6qʯ C-XouS|h8{N&\ @˸*DgyȰ -|^XYyc5B$KcVr5f(3۟gid04裐sbwo*亞F%@E"!>`m21: -;)Pwr Hϱg;hzf[.[$xQԊMe&4KN>[wJ[zZ5!@ej'\*}l>.i<56J$[FٶXE+-m:2MrSE)y[+ұc 9pWl &''9s5ŪB"AAJw0ϵ.zډ8v`\5ZW=D.Z -=|p+[)fWgIJ꾢>/99 /f1{Hy</ZF<ccU+2?+u۬%:] {qdd x}GΎvRgβԺ ۺ#n`aAO233q~Z -VPd%=boo=lG9]-%1ڷy1_v'޺Gscz)fPTM|V٢e;'Q©3se:S9ChgU_, T&'ݢ]f[V:T 'U}6e\= t` Lh^ }mf>yS~;ŽcO‰Ҕ#B!(A opg)B"#=X^C:F'daK̲ .@{S8dZ2ҤCr9>ĐӆsGCImnOI(*VH*,PFzp_Y#4h+7`X"NQi{ۛE@~ez?d-Vf(F\T+W -o/"(o6\8p'D˗4OeUv -k/h}0% -DqSe;TQwƷn5D*:cOZ* A!w=)Hr(k%ݖ*Q6+Rn Lͦ׾t@UPٖaZZ?"2t:]R-!ըaqƠ0iӨ;Ƙ&ϠY37;9UʹW_`[~#O4Ff|d1M -HdNJ Y~*ٺحޑ+%(NƓu]ox-yX,#2"Jȶ$̍ _ɂP[W{m@RnV[N.$siǠϢ|YR7[+]s )!c<O &Hjƕg*)n3HI\M?q?ԝY)Mg;y5v\WTx\ N~|%@˲S`,~?VJn^zS>Cm}XYJ{`:juL - - +u:-TvRZ?*q.lYkQQs| -endstream -endobj -1845 0 obj -<< -/Type /ExtGState -/SA false -/SM 0.02 -/TR /Identity ->> -endobj -1 0 obj -<< -/Type /Page -/Parent 1723 0 R -/Resources 3 0 R -/Contents 4 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 2 0 R ] -/B [ null null ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -2 0 obj -<< -/Dest ( ^) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -3 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 208 0 R /F5 205 0 R /F6 190 0 R >> -/ExtGState << /GS1 5 0 R >> -/ColorSpace << /Cs5 204 0 R >> ->> -endobj -4 0 obj -<< /Length 1624 /Filter /FlateDecode >> -stream -Fw{mӁ|0р$y)‹h =C=,i>Z1|+tA~ ->@pYcq)F\YGA8(a V;wbB'-O)WE -L5%5o3o׿cfWU2ahNM0OAm4Ĭ5Fi!njwE.%5Xj h e[`~S6*[jw0eӀOMV! {HS/oF Wބz3NR<LIy*XDe V' N{BQ %u>M=w;~``JRl#$ۨPKbG_whMQ`Q.q'^1;KN( O)w'qWwpqQߝG{d-ș5]$o> -endobj -6 0 obj -<< -/Type /Page -/Parent 1723 0 R -/Resources 8 0 R -/Contents 9 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 7 0 R ] -/B [ 1831 0 R 1830 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -7 0 obj -<< -/Dest (^:5\nZTuݼbp1Q2liwnHH\rs~&z Nmt) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -8 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F5 201 0 R /F7 191 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -9 0 obj -<< /Length 661 /Filter /FlateDecode >> -stream -\ji_lA!VҼ]9"֩ƑF#&E -V}]& -BF$ݮo60o{$<&.O:&111C~vWt$LQWI̧O1 ݓ?HF?ڟ7(!mi˅wsݼHWQp cYݏpwTFS=4)4 ֥̀fȦ]/?R~{PL|BZ">;4eӥ=3Y5Z.HRG6&o 헧z884#ᓋ@^\Tsu D' f!4a;j`b"ccn  `Ea{_cSM5 -ktkg%6\JQjȟ/NyʄKtF!2>i9{ZB!en-MnNhnVSR՗[ \| -1y8|d/'J2Ly4郘G%,<=ęPZ),;nTTÍ-R!DN#UEvcc -endstream -endobj -10 0 obj -<< -/Type /Page -/Parent 1723 0 R -/Resources 41 0 R -/Contents 42 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R -21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R -31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R -] -/B [ 1829 0 R 1828 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -11 0 obj -<< -/A 43 0 R -/Type /Annot -/Subtype /Link -/Rect [ 108 604 513 622 ] -/Border [ 0 0 0 ] -/H /I ->> -endobj -12 0 obj -<< -/A 44 0 R -/Type /Annot -/Subtype /Link -/Rect [ 108 591 513 602 ] -/Border [ 0 0 0 ] -/H /I ->> -endobj -13 0 obj -<< -/A 45 0 R -/Type /Annot -/Subtype /Link -/Rect [ 108 579 513 590 ] -/Border [ 0 0 0 ] -/H /I ->> -endobj -14 0 obj -<< -/Dest (U!jb) -/Type /Annot -/Subtype /Link -/Rect [ 108 551 513 569 ] -/Border [ 0 0 0 ] ->> -endobj -15 0 obj -<< -/Dest (:') -/Type /Annot -/Subtype /Link -/Rect [ 108 522 513 540 ] -/Border [ 0 0 0 ] ->> -endobj -16 0 obj -<< -/Dest (OJ) -/Type /Annot -/Subtype /Link -/Rect [ 108 505 513 523 ] -/Border [ 0 0 0 ] ->> -endobj -17 0 obj -<< -/Dest (=Z5) -/Type /Annot -/Subtype /Link -/Rect [ 108 492 513 503 ] -/Border [ 0 0 0 ] ->> -endobj -18 0 obj -<< -/Dest (ET!=S) -/Type /Annot -/Subtype /Link -/Rect [ 108 480 513 491 ] -/Border [ 0 0 0 ] ->> -endobj -19 0 obj -<< -/Dest (\\斜) -/Type /Annot -/Subtype /Link -/Rect [ 108 468 513 479 ] -/Border [ 0 0 0 ] ->> -endobj -20 0 obj -<< -/Dest (,ic) -/Type /Annot -/Subtype /Link -/Rect [ 108 456 513 467 ] -/Border [ 0 0 0 ] ->> -endobj -21 0 obj -<< -/Dest (qoH1) -/Type /Annot -/Subtype /Link -/Rect [ 108 444 513 455 ] -/Border [ 0 0 0 ] ->> -endobj -22 0 obj -<< -/Dest (/VZl) -/Type /Annot -/Subtype /Link -/Rect [ 108 432 513 443 ] -/Border [ 0 0 0 ] ->> -endobj -23 0 obj -<< -/Dest (mK:A) -/Type /Annot -/Subtype /Link -/Rect [ 108 404 513 422 ] -/Border [ 0 0 0 ] ->> -endobj -24 0 obj -<< -/Dest (GPj>) -/Type /Annot -/Subtype /Link -/Rect [ 108 387 513 405 ] -/Border [ 0 0 0 ] ->> -endobj -25 0 obj -<< -/Dest ("O6) -/Type /Annot -/Subtype /Link -/Rect [ 108 374 513 385 ] -/Border [ 0 0 0 ] ->> -endobj -26 0 obj -<< -/Dest (,"a) -/Type /Annot -/Subtype /Link -/Rect [ 108 362 513 373 ] -/Border [ 0 0 0 ] ->> -endobj -27 0 obj -<< -/Dest (ت0U|) -/Type /Annot -/Subtype /Link -/Rect [ 108 350 513 361 ] -/Border [ 0 0 0 ] ->> -endobj -28 0 obj -<< -/Dest (f) -/Type /Annot -/Subtype /Link -/Rect [ 108 338 513 349 ] -/Border [ 0 0 0 ] ->> -endobj -29 0 obj -<< -/Dest (.Ś\(y) -/Type /Annot -/Subtype /Link -/Rect [ 108 310 513 327 ] -/Border [ 0 0 0 ] ->> -endobj -30 0 obj -<< -/Dest (##) -/Type /Annot -/Subtype /Link -/Rect [ 108 293 513 311 ] -/Border [ 0 0 0 ] ->> -endobj -31 0 obj -<< -/Dest (#0!m) -/Type /Annot -/Subtype /Link -/Rect [ 108 280 513 291 ] -/Border [ 0 0 0 ] ->> -endobj -32 0 obj -<< -/Dest (ܮ) -/Type /Annot -/Subtype /Link -/Rect [ 108 252 513 270 ] -/Border [ 0 0 0 ] ->> -endobj -33 0 obj -<< -/Dest (O\r) -/Type /Annot -/Subtype /Link -/Rect [ 108 235 513 252 ] -/Border [ 0 0 0 ] ->> -endobj -34 0 obj -<< -/Dest ($Mۭ`) -/Type /Annot -/Subtype /Link -/Rect [ 108 206 108 224 ] -/Border [ 0 0 0 ] ->> -endobj -35 0 obj -<< -/Dest (RR) -/Type /Annot -/Subtype /Link -/Rect [ 108 206 513 224 ] -/Border [ 0 0 0 ] ->> -endobj -36 0 obj -<< -/Dest (l{A) -/Type /Annot -/Subtype /Link -/Rect [ 108 189 513 207 ] -/Border [ 0 0 0 ] ->> -endobj -37 0 obj -<< -/Dest (t%2D) -/Type /Annot -/Subtype /Link -/Rect [ 108 176 513 187 ] -/Border [ 0 0 0 ] ->> -endobj -38 0 obj -<< -/Dest (AhR͛) -/Type /Annot -/Subtype /Link -/Rect [ 108 164 513 175 ] -/Border [ 0 0 0 ] ->> -endobj -39 0 obj -<< -/Dest (OtP[) -/Type /Annot -/Subtype /Link -/Rect [ 108 152 513 163 ] -/Border [ 0 0 0 ] ->> -endobj -40 0 obj -<< -/Dest (#εUIpžk`OoVOXiTWDEa6\)&5U릓\)>&t62;) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -41 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F5 201 0 R /F7 191 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -42 0 obj -<< /Length 1200 /Filter /FlateDecode >> -stream -, Rp"!%2=tNQN['^AeG$㛁χ .kH|;|jHT@ FHb!-\9a%r<&/l3tc8%Q'ǤVkYj#01Ա)~3_iȇM9zHkw-5À^sg&ŧg_H$u;CrwU[ȲAI7/"KC9a3v` -b#̸ -y*~;3yX[4UZ;?YrVPLݐY[Z: f%pO;=bmDnPW@]"lAWPjZ)ASL[mQl7zGV{/ QRmBB2*j5q -1uc35)6s4b~&Jן`a0m/VNWjw -AuP%&܃ -jye55~@3 - T FvyA14]_ٳ?qv2IǠ`r@ -/[喳PהP^QN@;QC$n'& ˿-6 R^ML'(Wŋ\d!:04!.5qNDup\ -Dl"1?u? װ&~L-d[& -dpygo~PכAukz4O~Ou?IpNgur#,7yp2Kwf f?wU96&XASş~oU%v?[lгp5⛥f!/T\tБQoHpYkbv> -endobj -44 0 obj -<< -/S /GoTo -/D [ 1 0 R /Fit ] ->> -endobj -45 0 obj -<< -/S /GoTo -/D [ 1 0 R /Fit ] ->> -endobj -46 0 obj -<< -/Type /Page -/Parent 1723 0 R -/Resources 72 0 R -/Contents 73 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R -57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R -67 0 R 68 0 R 69 0 R 70 0 R 71 0 R ] -/B [ 1827 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -47 0 obj -<< -/Dest (M?) -/Type /Annot -/Subtype /Link -/Rect [ 135 451 504 462 ] -/Border [ 0 0 0 ] ->> -endobj -48 0 obj -<< -/Dest (|za5FP) -/Type /Annot -/Subtype /Link -/Rect [ 99 427 504 438 ] -/Border [ 0 0 0 ] ->> -endobj -49 0 obj -<< -/Dest (L) -/Type /Annot -/Subtype /Link -/Rect [ 99 415 504 426 ] -/Border [ 0 0 0 ] ->> -endobj -50 0 obj -<< -/Dest (/wI) -/Type /Annot -/Subtype /Link -/Rect [ 99 391 504 402 ] -/Border [ 0 0 0 ] ->> -endobj -51 0 obj -<< -/Dest (jּq-m) -/Type /Annot -/Subtype /Link -/Rect [ 99 367 504 378 ] -/Border [ 0 0 0 ] ->> -endobj -52 0 obj -<< -/Dest (_.3=) -/Type /Annot -/Subtype /Link -/Rect [ 99 355 504 366 ] -/Border [ 0 0 0 ] ->> -endobj -53 0 obj -<< -/Dest (sX0~v) -/Type /Annot -/Subtype /Link -/Rect [ 99 314 504 325 ] -/Border [ 0 0 0 ] ->> -endobj -54 0 obj -<< -/Dest (eeRR) -/Type /Annot -/Subtype /Link -/Rect [ 108 152 513 163 ] -/Border [ 0 0 0 ] ->> -endobj -55 0 obj -<< -/Dest ( m) -/Type /Annot -/Subtype /Link -/Rect [ 99 648 504 665 ] -/Border [ 0 0 0 ] ->> -endobj -56 0 obj -<< -/Dest (F1Np|) -/Type /Annot -/Subtype /Link -/Rect [ 99 290 504 301 ] -/Border [ 0 0 0 ] ->> -endobj -57 0 obj -<< -/Dest (p s=) -/Type /Annot -/Subtype /Link -/Rect [ 99 631 504 648 ] -/Border [ 0 0 0 ] ->> -endobj -58 0 obj -<< -/Dest (IJi&) -/Type /Annot -/Subtype /Link -/Rect [ 99 266 504 277 ] -/Border [ 0 0 0 ] ->> -endobj -59 0 obj -<< -/Dest (rmw1٦$X) -/Type /Annot -/Subtype /Link -/Rect [ 99 242 504 253 ] -/Border [ 0 0 0 ] ->> -endobj -60 0 obj -<< -/Dest (퀮;e~) -/Type /Annot -/Subtype /Link -/Rect [ 99 230 504 241 ] -/Border [ 0 0 0 ] ->> -endobj -61 0 obj -<< -/Dest (ǫti) -/Type /Annot -/Subtype /Link -/Rect [ 99 218 504 229 ] -/Border [ 0 0 0 ] ->> -endobj -62 0 obj -<< -/Dest (BRr ) -/Type /Annot -/Subtype /Link -/Rect [ 99 194 504 205 ] -/Border [ 0 0 0 ] ->> -endobj -63 0 obj -<< -/Dest (fRY) -/Type /Annot -/Subtype /Link -/Rect [ 135 182 504 193 ] -/Border [ 0 0 0 ] ->> -endobj -64 0 obj -<< -/Dest (Le*O) -/Type /Annot -/Subtype /Link -/Rect [ 99 602 504 619 ] -/Border [ 0 0 0 ] ->> -endobj -65 0 obj -<< -/Dest (+PS~? >G) -/Type /Annot -/Subtype /Link -/Rect [ 99 585 504 602 ] -/Border [ 0 0 0 ] ->> -endobj -66 0 obj -<< -/Dest (VTtr/) -/Type /Annot -/Subtype /Link -/Rect [ 99 556 504 573 ] -/Border [ 0 0 0 ] ->> -endobj -67 0 obj -<< -/Dest (63@A) -/Type /Annot -/Subtype /Link -/Rect [ 99 539 504 556 ] -/Border [ 0 0 0 ] ->> -endobj -68 0 obj -<< -/Dest (RZ2) -/Type /Annot -/Subtype /Link -/Rect [ 99 510 504 527 ] -/Border [ 0 0 0 ] ->> -endobj -69 0 obj -<< -/Dest (G{1) -/Type /Annot -/Subtype /Link -/Rect [ 99 493 504 510 ] -/Border [ 0 0 0 ] ->> -endobj -70 0 obj -<< -/Dest (ʖ&^ Z6) -/Type /Annot -/Subtype /Link -/Rect [ 135 451 135 462 ] -/Border [ 0 0 0 ] ->> -endobj -71 0 obj -<< -/Dest (G@\nSey~*Wqj 24{́]#w\\畢Dr}`5nZB") -/Type /Annot -/Subtype /Link -/Rect [ 99 100 184 110 ] -/Border [ 0 0 0 ] ->> -endobj -72 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F5 201 0 R /F7 191 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -73 0 obj -<< /Length 1189 /Filter /FlateDecode >> -stream -#kt .J"_):# -ޮ' `HoNcQJȂAm`Yi'dY%&"`\yqwxxGFE9)$4%G+*[ -IS>U>cWj+Q"&P -N{~daaMv R6ψmΔJ.{BH|SNzr6؆ -PH,51f{r(ˉӽd|mT|"5 ?stGPTt@̅.jI6U&IpS^_D%CRsnm:)%]K-BE z 6cb:6빱gh}1]¬=sux>}zwy*:zRF) |9)jf(Hv2'p\ -|4Ӹe6[FfKV!/M|d4" -j~.קŒߏݡmAV*[sݭD$K7@*#J]zurI3]S)lV$mwʹ]OI_37Sr7ly? -{3T -|uH0)+]?QC. [cu~%h>r>oB -4Dݝiq-NK͵XU<"1ꓐ:v@ Zbth7Hhll[9&B#DNC1 Ygsh -}go -]5ly!H?XXd -endstream -endobj -74 0 obj -<< -/Type /Page -/Parent 1723 0 R -/Resources 76 0 R -/Contents 77 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 75 0 R ] -/B [ 1826 0 R 1825 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -75 0 obj -<< -/Dest (f; S_X K"Ovp x?˓8]HL#$~.) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -76 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F2 1837 0 R /F3 1838 0 R /F5 201 0 R /F7 191 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -77 0 obj -<< /Length 2022 /Filter /FlateDecode >> -stream -7& -KP4V*J ayy=L(mٵo݂ y}9T0J|pw \6%b΄ÉCG3` Vz aWy߶O0X^ތ6S/2dwgӣ}Kcy$W]x}}e: ,ѧ~6߉ Kt2Cu*1qz-95\QK嗐 Veg(a&s,*6 gW -t5IdP3{!W5ym:, -9Eq8'ӥ3^VG6-Tv0q -#o0'ёdn)<2c|'P@RG^b(hQ#bu;} |k>XHY"MN^F~K(*׈=A3<)#^Q/>u1P|y̳42DZ]i"ڒ&~z1W!yDdeEPծSzXhiM8<׍2rh~AGBß7/2 5<"! L!B %Kx7plmG_ɁȮ wdm|8hJPɊΓ!‡QBѯNۉS -Z۲Zxj -`kel'@st2Ρ1V*B;t0iw(umfB?e"L-ڣd6Mv*%/bs"$DҗV 9H -mЁ# -f3#O"cd \W-Z Xpܷq&mzhefar1a@=Iy;Q=!Fҷ -2u?Iy<( -|%94Pk|/'m#9<6W)=qmPbKѕG0g=+upD)Sutxug.iktݎhH9o( -PI8ڥiv'ܓS -endstream -endobj -78 0 obj -<< -/Type /Page -/Parent 1723 0 R -/Resources 80 0 R -/Contents 81 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 79 0 R ] -/B [ 1824 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -79 0 obj -<< -/Dest (\)Co`$Sk/]g^Hi~,}*X"AɝE}֫=U) -/Type /Annot -/Subtype /Link -/Rect [ 99 100 184 110 ] -/Border [ 0 0 0 ] ->> -endobj -80 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F9 192 0 R /F10 193 0 R >> -/ExtGState << /GS1 1845 0 R /GS2 194 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -81 0 obj -<< /Length 6028 /Filter /FlateDecode >> -stream -|im6ɚpbZIL_NZ̰q@8ȇe+HB$GBp ,f"A -a H -(5ai$AT'Ye[% "y"v'F9]s_]L}ݧ}p$YIggd5ʪ@2:}|j!_1򷫯<.GoP2y!n;RDYM Y9͸؝ csʖ23Sc3az]Sab{f_OOTDXW>5vX>Jok=WSؿ&"bߔ`p۽AAGid2Y1~BWם#;0D5 Y -v4F84&om ;EVUe/U<+ٲM Rk{J(}m@Pv>!da>ѧ:v: P28\/*_QmzMo -/s"؈8P8T*JSi -7a[Ca簊J nONvȶ p}h/l13cˬ۵-[qHnxXJJiK2st;Ltjw~~  -YZ 7Mqv7Q]DD쳞tJ6DK Z8!:5Ek?u/3N aTd=F)MXKv}QsO4S,Bq\%P+Brp=? ?- -Bl"q3<eIx棿Op{Z) щ"BɬsCrWǟ?HA"ɧ-NkAe~e8.dN LVy0OeNktn%U3X,W 2M6RBPH""6qfչ|2lzvhLVSLl'%|X ]%7ڧ8}gM3E2ւQ2=iP}R .ZF'>c -˨st%JŒ5Ԣ -W^VK=}櫷!: )a&K%u.;L3LT}.~d 00(K҅quG#nkKilWo ۂOwX\^M[ȳ q^4YOp7-szC[NSڐ!- W};FZ -:8FreKڊth>6Lfg5| Ͻ)JwќӁd<l&o -w kSԫ3ڃ&~+HUv͎b~H;HqK™IZZvE[VLēٔZ3!w[ Ӷ -35+;d(Kё}Cuv5Mtt?h騗Ǐ:-boTɰmrC: -BXWQZnav>H%˵PMwwlo"j?LH2![vץ(GVjg>{3xa?v*PԸ]~ݢ)몁WgƗ˄+\&y6 ][:ge"YL8;{!juGMX#&ޗyV.(#YD:X-Psa -^fKT$E-DFmqwWI#jq /dҽ<ҎlYZcL]gWvZiH -⭓㍺H3[VL)a}2ūe,0,=+iVbSZ4K?LMl"y #un +`#mv%4C6l#к2 u8s3(8LAG'ZEe͛QmPH.0drl%MSWfg#)>ӽE==QçE A_p5i "eEdTBL@7.F:61a/PӈsE1wVk> -LA9j帹cTz0]^ԍqUoAS>ox@cO xbDj䀧~bcgQd9Ui/#◵ӳ}I\[Z#1ȧ!j\~6ŃsKم-l&[yKҮ&Rp(l?f7nNR\DܜP;ׁ3HWU !V*-ר+-` v a71Ⓖq/Jx1# x|Fvm<] -W" -'胒G>f7m,K3r6 giF#NhX)P, Ml؈5g O=,5!JOHF"q[mX$0_5F݂ TEleѸN$׼<9 #ėYa&~$f,#QyxtӉs{NhegBҭApf6OaㄨMYkE> ٮ~3 ߶OT_ur"z,CbK :(asa/sW]Ŏ*YZa (IBX_YNQ%$ί=*iCҐ -L^ }Oh4)R񔺱cs'gك|4uT$9xv'd8)A$`6gނ J#M- h\P-u/jzY;^mfߤ˲te:`ڗv6D:YaO֚;K&?*_,q?΋sb*{[$j -7KXP/Il(mwX޾4c9!I ([MV 7ir?:-#ha}z\A)] -\Cȳsfvma^0C3:cd{'wG5pSɶ2ǪpK kBH_ϜF3Q,x;٧T:2 (aE>(7nI^:XM#;tnW)8NzeBi-$ [9'dCU%R-f6TT&7+ZqL[I# a|_+\ՒWAk(] ڜq;Tv k@S: %/"Bkh8d-3:g7l*k֋O"յB -dTN8j -N~P?.OY'.{]X$q&cK -#)CIF]!-I7=YT@glnΨ4O33-6ӛ?sM gp>_㓍=8(),?ˡ:AֻoF[B&ڮ:{ߞ6DI.`śsRSY'c -#YcŞ9 -&kk8?o:*̭;MЦ;PO*N; 5fIǎJ«47MzO<%"QUapà9v[)D?4ͤ!8K,Ќ3-UY"/ -ջ#OŤ]}A;&0\S0ETa}5 $qugd5{~-dt-r?3ʘ[ $ İ~ZuB\.0~ (Ql?+&?rťB=4m'pw'b rkO=5m,okCNe!)x B8 N1]ihyP!OTѾ\QaC*Qϗy{dՊ2+U!Pt]~|GZi~Y1h3#'34ydz?]#t)9Q5y[@U 4*.fi]1-'.PKo\ -18~}u+cX »&Zv<k^fnNȰm)GY=^qޑJ4#/I*G=G --%qk}1&s -V*O97[X4pm8ڔW5k.yUI|㖞dډk^#uGrثed$TG.9wZtɌ@ s.HzN+눐Pu,}cʄ,`{0fڡoHPi\G=,[Ϧ8 t.[Jm椦]{,BsN{ -a~?Y -endstream -endobj -82 0 obj -<< -/Type /Page -/Parent 1723 0 R -/Resources 84 0 R -/Contents 85 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 83 0 R ] -/B [ 1823 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -83 0 obj -<< -/Dest (\)CċU$PgW̚9ZUj_8DɌVS<9uyv['\($n ) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -84 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F5 201 0 R /F6 190 0 R /F7 191 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -85 0 obj -<< /Length 807 /Filter /FlateDecode >> -stream -!狟 Bc&R[B`&8 P8SғS.e2vG~ [|-#API$tgGL1 CfϮ36=7&49ˌS@{R6dKnRHB]ڕK1>FM B==L~LV_^iJm1U,SX{I*|[m"('([ƒ+L F=BV&>=K7,ߩ9l`(R6 ?,5 5'|LJm5R(ťؒ}@êS#NZL'nbjUa6!K<[0%̋*YJ>ᴹAso6pnߑ@RǪAcbY5t\ @E>U!JgDty1nZ-B5\U= B[Wo<c7f.[[-pGD9 :nEOp8Ƶ7fA^ /սeL)_D)Hs)a_KY]w> -endobj -87 0 obj -<< -/Dest (&Mے~XzGw}k.Cd6+Z{X]v\\`K.\\%Q:u [w+;O3) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -88 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F2 1837 0 R /F3 1838 0 R /F5 201 0 R /F6 190 0 R /F7 191 0 R /F12 195 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -89 0 obj -<< /Length 1874 /Filter /FlateDecode >> -stream -wwxrp[C@'OϮ~/1rlywVqj|(*ѽRBqטyA}WK"":;nPU;F#gUHm?(h0 # ߾Aű4IpM+i7b蝌sUXD^ԡ<z/vVȸeTʯ=0攢xU=W -wۗnS-xXK,UҒloԍ"0 D6֑ݗK!dL{x,g -EBlFNsvfl]43ӷ#IA >:KvX`So~ڙb2~ªX -QGy̻[I zj^J*St9|TG{K)V;1倻 Ε)CM3iI7 /QM2Go=,΀ F74a` û>xv{x-;XW) 7d0똉盄GZO0=Ɏ7c!ణ^X#)Ў7H!"|I2 =GC@,ڏTMQg5YWͽ -VG`} -%)ţ\P嫊=y -w6={̺gl6x._.qPbX`W-3Ĕy{fI+;Gxv/r7"rta2Vgd$0(l*\㇡C#Z`LH(<pCoMqkbN&߂8nSq$eIچXSڇ0Hq/wE-$G҆wzd\m{JO(/&? #"6ol"&{־`\0⩮v)O4xA=F߱JlJ)LU[|: aC4); N?7§{5mx_kK/nG>9kfHc]"lVRjPuĺ'.Ԯ:ߊ$h|rI~mt*zY ʍ kY+o+T ;*HQ&7A=0$d:αp]3 ;H sgh)JW-r ݙc$ $-EhwT t+=dÞbWLPg?m` -58SsT|U&& -k}BMʇK2UEdl)'5 Lx -fD XL,._x'm@F%\08¹ܘ91fY&7=kDZ}[$n6~IzC2\ia0!Gc8;U`s%!( -V&> -\>tR 1I#5QF -R8ϣBRh>ŗߛ<'=*d![MN&0ýcShۏ8A&"4)WN{nfl̴QFoDDQ؄$ +J$Sɓ -H;:F,D6G2YundP緷jjMK"]ʺ=(6{`W z]'=\dRVψd -endstream -endobj -90 0 obj -<< -/Type /Page -/Parent 1725 0 R -/Resources 92 0 R -/Contents 93 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 91 0 R ] -/B [ 1820 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -91 0 obj -<< -/Dest (\\p\(S7D,w9e R_\r#+aC` #ԍW {;`=QR4B) -/Type /Annot -/Subtype /Link -/Rect [ 99 100 184 110 ] -/Border [ 0 0 0 ] ->> -endobj -92 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F5 201 0 R /F6 190 0 R /F7 191 0 R /F12 195 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -93 0 obj -<< /Length 1609 /Filter /FlateDecode >> -stream -7\RpsAU{ZJɠlZX]cH<RuT{Sl$@ '1sP+e8 -qӥzU'` `nA^7 F&!o'?5/!9j8)CŠ ~Nwॡ4OX򑞛 <>B4je1<ˢ}g&!?kr2b5Z9@Ƃy.$ -1졓Yyx xQ% -0E; C6&7W8m31SXI"$7p7w4TlH%JߢNm|#m!DJZ)K"V@0ۀ""%9'f|7͇5 -rwJ/piP~/ѠH ZE S5~7 - ݁sl߹1Aꆴ@Xt{GjJ1MOf߈j\=WYmeI -<"HԳ$i)XKp7)n){,m"[NoI=Xi -l{ȈE0MG. -۾稅_9<\z=]׬ڂz8;pNSIJ:/2$겜*2H -;Uyt|킐3Ku9RtL$C }NЀgPNT:,\8`ऻJ|HbACU=3(HŇ:|#;V%F y@ nwb2"mAmH`u_.g=&# <;HԀv [ zJ=C%)GH0 &&?7V.IۑFVY%q p%wnW+fZ:s^L -4+I\ - ɼ͐uR}2N\PjnT-E0K8/$SIYÓ&ȟKv!f[$2GHDd ?,̓tu?Kɬ&)B-Wbi"v"?( p8H-܀#vpm?cUDEۣU Nuat~}l!krNZ]9 -{C4S߁=mͧkS8l eC_':&RK-O+ꠢQ}pԔtPa&g jePu֮ߟ/}&0~^'Ͳcj~&2K%bhM - -endstream -endobj -94 0 obj -<< -/Type /Page -/Parent 1725 0 R -/Resources 96 0 R -/Contents 97 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 95 0 R ] -/B [ 1819 0 R 1818 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -95 0 obj -<< -/Dest (hTKFhu]beRYv5Ư5ȏJW `z\\ԔLˆq\({0) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -96 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F2 1837 0 R /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F6 190 0 R /F7 191 0 R -/F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -97 0 obj -<< /Length 1760 /Filter /FlateDecode >> -stream -T -/z/)!.GN,v^cf-B=D谉%R'r!ũj /QgA6}HP͊74`v !aADC+`?@7AU~ vHn% -G7Li vi`#>XGI>ė||{ k3,4 n(C&ꂾ%o{O3vn69L†MMT,[Tt ~Ǚb[ OJ"xkYj";қKHTF_PP]mW#i$>-uvf:#G7^]vF,!6`f5g(ߦ Tt}([Pۇ?Q -1S6Ia08}To[ cv%a/S/olIHd&{ )~j3{}ۆS46+nT]IE{* -\`Dd;l~+D3ϓ3GL"2א]cuA -: -=6|˚l)Zxݗ/::cW.#]BdAD<̐ a|SH řvN -K;Xa}[lyr b~4 -P!?ҫ1K1 -ncP ೉1 "5'f;p!AM|I-P 5;Pӹq2]O `ຌl+ -5T-ne$?ub.+EkopS͔3Qpʹfj,]_DyEdZ_X#2! --[ׯ#$Dx@M`WRYPr0VhCݐuEقTi.ʡxʔxљ0TS8:Ϸʘ{g?I*j~w,ħ.467-LT{ HH{!@l^q7 -(>+ptB{ͫ)ظ99G\jvx=hfY`U<:॥U i7xVSnֱBT7QܞpF=&xm|:'p^uJIl,yE>?#gתj@/cFo@u6־('€Zj>%E$ICG.f5gQt2N_G`}y9$1c9:% qF=AG18\?2lE.,!P=,%d9vj*vơ.xׇTCTnO _u L1|k.k\!=S ʻϷb%c[?$ z0lc7a7s>?Ae|=ONzcmQ%bوIgo9 Jl^RਪsutGš).:c[#O - -Oy1l*|x&wVn785 8AKÚ[/=*|g"ri] N3ݷ ieQ)G/-] /^X\0LUFq-(frܙՎ]uRF%minyNU]g:#F_|(@Z<,\64,yL. fi;JOYZz§G%5bIY;3\D.xV -endstream -endobj -98 0 obj -<< -/Type /Page -/Parent 1725 0 R -/Resources 100 0 R -/Contents 101 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 99 0 R ] -/B [ 1817 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -99 0 obj -<< -/Dest (fA!"NŰޓ=Խ+S2IBQi4SBO&@&#P]Pؒy) -/Type /Annot -/Subtype /Link -/Rect [ 99 100 184 110 ] -/Border [ 0 0 0 ] ->> -endobj -100 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F9 192 0 R /F15 197 0 R >> -/ExtGState << /GS1 1845 0 R /GS2 194 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -101 0 obj -<< /Length 2481 /Filter /FlateDecode >> -stream -bcv>SeN'A{MΞ!ay7:HGwb|%|R/PВnM -Ӽ:INb=R -_ :kh[G؅cۭOuHEFw3u@#(qfiHvE!n}K"kPbŗ6bt{+Ŭhl<{k*\,Q~(afB=ߊhe2h1ֽ_ -Ș[ wF '8F*/ 4 NKwmz -yAAnRA9kSfjՍ+ojj^mN(ZgzxSyЭ\:`I{kDI? M -E`&yF:2/2T~ Ω^ĹM=v 4:6 *@0..) -d!SFnJhE^M;)|kwQL -&ȵc%(RҟJC"I7[bOJFL M/$]C(#*%1UރK/u]u[l${O9UԄu߄ Y:vXN,|9WymqK$E! -8|9 -;xth4۔!,qbꝍ5Xj{DW -Zb҈7 -9 -kHr4J?{"e&VB2%K06E6PX`{ԝNCdWcNj]|6|aEFÔ3e?C$!\Hjh-M(>9'ԒyX3Ve u"qB ǡ\LQ+/qt:yO=7֙9 gkPfgz.D$ `kPnZ9ҮE5T­!Ehɥ%Ed?v1+ 'ptղv\6!,̹$fzT}w!rBtLf[c *L a!kq/AQq=,^?C}Wkߠk) - A{3L, -@/ -ŲNy8h;@h:яJ1k#N!Su7`Æ`V# ؐ-\-|1W Pw|!~>BJh(_])eBm\ xnAV.{!"vyKZr)%BȲ+UqJL8Z ؃xZaʍ[|wAđ-j"MD~R^Ě3#SpV<CZ+d&i-jɑ?h}dcNՊ!NQ\z  -oTpI]YQK[.g>Zt& ll=Ζ]!4s݈@L{PehJM,=LʁQɫdVf1P$qctVڢTՈf1;Zޘ=߀8jNjPbt!>ID_3 Qn\Kk;/ëVN.&aE\/|HpS]YrtZ!Y^g+OXɧs~;{Gbh :7k1v->ģ۫Pef;z/ -D陈F -H§C| @(44 -̕RI[<nOM%䁵oK(t2fMv!JYdWR = -ăzmS6ߴ - x3.NHR{[Qmn8vj0cKt-E}gƖXOi5In'3Uh7 - L'MDAM$V]PS -@i=G)y\[(~'}i_-ċ~X{wS7޽VI$JYXax"$"rZJ+(ݦ@1 !3_ -endstream -endobj -102 0 obj -<< -/Type /Page -/Parent 1725 0 R -/Resources 104 0 R -/Contents 105 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 103 0 R ] -/B [ 1816 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -103 0 obj -<< -/Dest ("ih8 =Kcj6뮇O+NPy듔$ځ? Tg? ) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -104 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F9 192 0 R >> -/ExtGState << /GS1 1845 0 R /GS2 194 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -105 0 obj -<< /Length 4127 /Filter /FlateDecode >> -stream -_/'t!VIJ?OJjnqE;V߆^30%G&Mv8|8`V.1Lly :}"#n{F 1w4_]~<ɥ6rHZL賧a%:u&p&M9p1M ah+Ju]b "2Ly>EUL:X-Q5g;:$ŦPԐS@b"QZ\1ϷCJZT˄g^[곓R9.TPm~|ܡxTb ˜m;5c@0vwːigW?ݠK>g_KkK@P@\7Jok{* V: -Q k;⒫ЫԼTȺ]7?؝$$Nt^Hb"Q}"btuEBb`͊*+0rYi1rC!y -}Z̋}У+{gb39:gZ}09N/~q`х5v'eJp v>b3gJčmeR$qs5ʕr;0fz7 -ꀐh4@!,ua\LXɑ Kt_}7Yr1a _fy_;CQ%3+0`¤01Pp42%^P`' [iځCQ+`k){898UV4`;+ S(wEqnƃ~qd\f[do26S*)tLԢ]Êg ݛ;l9߈/PD5[yz -@-x,Hx腐pRMj"ؑTHܐ禆T9D_\H3 -]6~HQhf;h:(46uF+هj%zOωU,ŏeM*~s}dTPѲ;c?cvv_= -7NyHc~IR2q`~+ؠ<-[C5Q D203 B6#K?`6og)*=6мMLDyU]w&BaQ%$YW"q/T-^df'mU^2|U-yG\R+}3}~pZ?lM2Pv\L_ƍ[1@Aȟ`rW@Gùgs}>us&u`jHU[E :3ݦ%ČY] n:Hku!xg -%}׺'w$\0 -INkU-N0ޱ:13exp Vt -ܸzWlw.&bϯ'P홾**HeYNڄ()r -'%$a(>/Mlj"ۈ0@|+_2q{t!(>vYW?ngg}Kw.((` mN2WlzYy2ҲF -SA*|$'W2d:?\s+=CAܪh\ 5$LZ -|($kCz1jъxY~DA57Uxrז -($:8h{6J)%7ImN !W*擘Xag[[{HwFFSz-kXlijAx2UgMQAMZ888QRMmRC -{ -u!O FJ'MS3XIT,H7FryiW_U e_JЀJ8rO+yj aG -p+4o(aeeO'M+:7n> -1 "G>G ҮhF:/ -xI52]YCdHN>5 Qdֽ6|Y(s=34A`_z3z}\Qth6k ^0hD&j'YBB d?oN2G|ي@d8cM5py(ÞAԐ|]62@_.F-v">R~>բH)^du>uXa$:1󭌒Jg2nhQ,ks^ʛiW;)ٓpLb&?e -IX_C* -(AhFGRiI/}:2 R}dFѵ ;`&ed-[ ;4žAr)\DFz!2M;v.m5h2d3E'dRLG,0=oz h2m3-r\1 M{+D(YŒYr(ةg$ji8M.ӣP\RUykx!NQWis"DتW ++N&y~P=˨#Ǻ'[6,|~ Оimg{8~ʉ&sܾ|d6*B3ųG'`hgg,atg 6VgsFHKs4A%8kxD,S&ok(@}j1"k -'YT]eMLB8}# -' -s+ft'I4-TP W.=aZ+/b3RD1 :rQ7بrE x}߼f3Wt3,I[l`^Z$3ݔ;zNKjb?I7__-V`R,,@UАJHȼ{/sVu)ZTx =mᦅfwGQ.Oxz:#DonlnZUL;N Rˋ'YP -H1V2l7w,=,7'Ȟ)s\ץzBԗkpqwRŻf֍e煬AhzOQW -B$Krz\EQ+5YKlOSEQ:,[^x-m>64+ -S.?K:TOqJ 6*p픬kWY1fg -endstream -endobj -106 0 obj -<< -/Type /Page -/Parent 1725 0 R -/Resources 108 0 R -/Contents 109 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 107 0 R ] -/B [ 1815 0 R 1814 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -107 0 obj -<< -/Dest (҄|l1K!K.Pgt0?\(b&k8_ >ޢ,Ρ DH) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -108 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F2 1837 0 R /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F12 195 0 R -/F13 196 0 R >> -/ExtGState << /GS1 1845 0 R /GS2 194 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -109 0 obj -<< /Length 3126 /Filter /FlateDecode >> -stream --K0Lt>•x!ʸb^ 6FСo)XFld ¶ -.#+=*d|}ذmV8о59" -ZUW/靌<pһtRnabCRi06"O>"۔%)PL{)dz756u#eu&Q+3ʱCٸTxĘ0b˭U_o$iĩ5Z7<뛬NB+ݦѤMC?J?7^BGoG1(ى%42HBݳ~Mh<;!`\(rl#Si -/箐۹o9nCt%ov6r9J%lA̦rg1"|a:'׵nJ#8)G8NrPi(BC|E/_[ABU^f 8ƫ -oFWZp>BI"x`!S1"͓DyfB6tgZey1ˁP? 1$VM&ХDݶ&@̄C0wmT?H!_R\Ďtu=P1L c.TC_|;湍zڈK! C -BJγefYnL{+`^d92|{2BwJ,t\tDq%_A%3dW> _4ژ5 -pdqcSHhU ֏9_'<\DCF -6~' &Jb ̌^.!L];tH>kX=LxƄGKvO$-I] -_:n]a)Pr-1G7#B jNSeu֭Ά+'T1գ 9+UVgپVU: N1, yQt02O-g -j r,su }`YiB{˖qb$eLeal† -? -HKP7YSC(#S񎔅[(E)Ω^yr~KWER1 -R9.0Q膥ʏȘH@1֨*F+m -!,ަVE@6AOȔI`bĻɢ;0p̣)K 5 UZQ2\8\QfD@vB稱UrDͰbIstt!ӬH>tsO?>KPDD 2{<=zc -VtuO.9$k)QzVTXmZ_dDPf|#U7ՅEٷz@^' %0&c.6T,*UTm )auU>Ǎ,X|jr (B<#eLٟ -c4뒻Z]u[͙vxq{_Lգ^t=&"V _\!ʠ=vw -endstream -endobj -110 0 obj -<< -/Type /Page -/Parent 1725 0 R -/Resources 112 0 R -/Contents 113 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 111 0 R ] -/B [ 1813 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -111 0 obj -<< -/Dest (GX:\r&B]>򇬈~۔N$u\ru< 9*I$7) -/Type /Annot -/Subtype /Link -/Rect [ 99 100 184 110 ] -/Border [ 0 0 0 ] ->> -endobj -112 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -113 0 obj -<< /Length 1005 /Filter /FlateDecode >> -stream -RYHyAǢEr!vu.,Io(f8%*PF:d -k.hѬ:Sd)- /2k;fKj߄JiHƕ4,1uv*$;ܦj'zDli0O_KyXC)41n~|}dkqP[rpԮMU3̌:,,ڤ4\,xYC1fDqS;leF} byHbs -;0<IE^pZC0ُ?lf޻KdEBhKe#˜vN}e<`D}<Xc##Ș,W8Qv)P0q<ew3QY3FVeQl"S' gvx3T&ӎ[cJT;^MN0qwR1Fw ߒf#ZAZ [ }݉dVq*=+<xv. #= -4KG_\U(>pG`N/h˵3HМQHIE,Z3͜a A/#|,_ 0`R9nfF -耏%ÙTe!1\ҥS@PC]RK.ڈڥ^@^>n 'MZwO@ =4hc!?A{!w#1Ba5{-+Ciww~mSw'1%=vCN3^ - Wh2ȋU{V:}1!TDﰰi$h_cΝ3FU#MFeIp]&{.9FUВ /ƱMH}[5cm /b!6+hlb -endstream -endobj -114 0 obj -<< -/Type /Page -/Parent 1725 0 R -/Resources 116 0 R -/Contents 117 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 115 0 R ] -/B [ 1812 0 R 1811 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -115 0 obj -<< -/Dest (YangDD䏤"Պ2Wq"$drdEF) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -116 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F2 1837 0 R /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F9 192 0 R >> -/ExtGState << /GS1 1845 0 R /GS2 194 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -117 0 obj -<< /Length 3912 /Filter /FlateDecode >> -stream -kaǠ#HHnъZ),Hȯx;9th/ͮ dB0]JB֪w"~VjyN;~T\w+&;#̥ -}k=3&-zqdx0n)\?JrAE'Ր)| -i&tsA/% VVxR\cY\{obvxqae 댂n -h;b -g08(,֥pVު96k/1ΟB?| -X4#Pg[cs6aNu-Gd# -$".n*M}Sd$\:ړe 7(rq$h {9gmiv;ЬAIJoifXS.q+.Vj[īDS_ܸt5|٥gqdw5M@=#߾[̝qS=[y/$VX%kPxF焆]M -qțY$?g= -/\滇4!3t:s RQu:Ľ+ݤkimT%1k1d8V{2fЃln94M|}^-8lҁ~P%)xV +V@x;oZ(S$ #5ڃ3_'isuMh-Q0H8-aFuȳ&:#8V/W&GgM;(Sf`fѸbc"˳ F[MŜ5.5 -/nEBom@3{R|S#m(qH/x\N@9q!9%X -+!6me{նS=*Xn6X#O;hx1޴ޞ W!6h:0 -yt>#+աluܾTz(n7@ό('迗 |NaKj_g/b2)v}Uඌ|*_JS"U4u֛l7'^1o\vn& .{lb%1QCC̄t)Py_Bho.v-?7xڝ*6KʘrwZTꮉiq 2DR$jc -lcc:i5߅hN/9b;Ydq,! zkG͊Gr$͡6g#,^^΄@HD -mL)YmR= qNpaMg$`PBxs1}-憧یŶZ6a֜uTmԈiŷk]g(m -U?lo' -JoX2?6NTIX5 FsE~U4=w&JAʴJCox1Uy1޴D5gL4 iUuݒơٷ2DɜTC rW(<0w71ݸI^ڴRPCSmMib& -yY~Q6u8pD-4|B}׿IB|?ܳR%9Nt묖K -O F^)b-LLƻi$%|@sjQaCe/nj"Cx܌y3C m9_ͤ(\&Yq/V٨)^6 EvfgqOE)ߵg(g}'bVtP"DN 6Vu[FS3@^{pwPյ;$J-|+|&\OhH9 u! q.9JF4Dl{}l[HپK:/赒GFAP0)ƫ+F8nQubCsÜF -j"vp*T˵Xa)` 4\6!y!1'(o - 1![`z_.xj+8/G, f4-d&hTc12tig7:W"xm)$d݂i,Bp㪛cX0μfJN@L<U^rX0&@(Qڠ2K"_1quȊWgqՒB)q_}Wu|2+h] ->`S5p^U -9Ǡ -($>[~`1 [{&I/E*xZg[UK@sY(K嚁dRt:rGjZ/gբ"5;t|l7hx=5,*l6aEw>(4L2ڲ(=H&WgSQƶX#Wښ*h]#KՄ2 -endstream -endobj -118 0 obj -<< -/Type /Page -/Parent 1725 0 R -/Resources 120 0 R -/Contents 121 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 119 0 R ] -/B [ 1810 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -119 0 obj -<< -/Dest (~J.oZmie{ ߫VVԁcƿ%Nn].Q2F$~$I ) -/Type /Annot -/Subtype /Link -/Rect [ 99 100 184 110 ] -/Border [ 0 0 0 ] ->> -endobj -120 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F10 193 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -121 0 obj -<< /Length 2830 /Filter /FlateDecode >> -stream -*M@'Sf5_ g*PN"{*[᧬F颐=kNt*"޿9Ü@kĭ?U M `ncmX*S_0]h!"瀫y&% -ߓ`֞_6CWI֒9o%[҇CsQEB1|ġbWVd$GD; -j1JWōƛXޠߠR -VآJ"ϯTq܀XlRQ_XTJ[) -{Pʵ3S0DD u,C~* -ĪJjE_U!yZ|L9EӖ0"3;/6m:JJM{z҉1瘫)P*R)ؿv!y4$duJ?FO!yr8iѓ,@h5>%=H5MBF)SuQ{B^H E!}p{cDK8)etĞi;[oE7EЖ:$ZXIy{Ml#wWh2&O8$?O_XpN};> -zw7? -׆~ެȗnBM5(ꆴު9`c;];uRA5E<CɅWet!EAW|hU`vիJ2pFG6+~+[O -Go[Hlr03C]Ǽu`:z(V7zs9dWZ'(d;X.n%.rGx;Mn -ޯwPŧg#:5QVz -HP4!d{|uTƋI2PeU<qbQ'v#)N+A"Ͳb6ģ0p=ݹEP/AU찔ןΔov3ꇗM_A>f^ Zcޣ<{@V)%ݶᎽ{W롱o\ST4FkZYMAAl -lxGl:P",h<'ɞN\=L6$COɼZG$z|3(Q!% -=~!c^dLn#:hoO t8˫($h 3,&+|3]ɐO.%#[/e}fI$Uhj|J;oH=;YNqtKkO(z .q<.`DڊOg\I.[@r C՞KGN(ZD6Cq[cݱ_.YqvzŽhgO-]\* ov~* j+ -W1AyW;el9 Y&fSpSЄ%vn5D@gMJ9qϑƇ&Z:ȼ,NZ -Oz^HX6S9.@E/YF<\1tO-V QS 9m:DloAq"<+}]XK `E -P}=iLC@+eZNj -mfREЃ{ 'Kq8y.k -B:U `_/Yt0^޾+/I&7A}B_xAENiA^2U_N77%o6op -O18)XHPHŃ΃̢?2qJ2]Ing\?BcQuH -oȽ@d*{dNS8'V%>$˥]3.  -8㦷wFĄ -endstream -endobj -122 0 obj -<< -/Type /Page -/Parent 1726 0 R -/Resources 124 0 R -/Contents 125 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 123 0 R ] -/B [ 1809 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -123 0 obj -<< -/Dest (/\([9>ik:lڶYy|B!]DJ%.$) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -124 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F10 193 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R /GS2 194 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -125 0 obj -<< /Length 3832 /Filter /FlateDecode >> -stream -0`)~̅[%E8J10~dMJ-p1#= QJ~6^9i4ݻHMǝhYXFHJmI-o"~W -2C1c6=͍;*@m&L Wy3;gw r$=n#;|G1*3uuyTxQذ|̷]Ebv Pr1?nWT<=1}].ȥP xI r|ԺJߍꡦ%m]% d -H#qh$!YmIrV*2zڻU ˭QZf#0-# }أe橱T$*X3٦a)Wvs -p SQ+fbFNÖF -_1ޭ ~ a5*[vꥵ$}&TNEDe dd/tl/58j -(UE詍 i(|_0|U7>ԪY!PA -pxVTb&DI†ogtS7TTtVO2<ÿ/fi)Rw(DgU#Y^U@tcW > *ṽ,[[ -""7W*8tӌ&~8t c󹒫2Ќ"icAF=s(o G2ڷCOtg벆qGCx@zӓ'I>"^񜹌;f;.[󛂵 a)?dl1RzvP,+g |tGՓ? -LGuhn]/RNzH,*xnxca -_1v'aDyIk&y6 v_gtrlseQl&Q&$}O紐A;J7y4c" -F4. CCdY^IЫ} -$A&\8`CrtD&"3/ -Yr`֧d5i$Q@Iw9qS{x64`ʀNF=A"Lc˿VN͸gn f%\N̨&52!ŻOԈCqV< LOA)/TN)Sacv0"F1ncr4 n Vt`]LRw5&㟅 -R~Z*zٷs;1H_tLd>z6Fu -9G>W+PfC-]% VnMd}!f}ߺB ݴ;kEShl|VΐsRl/dwP@NejH -i̿㴔`1'hv zMX1?q6a\5Ͱ#[5qܽ`>$7˕Ack΂ X*>u>E4.Lϧ|T?ѵ> -endobj -127 0 obj -<< -/Dest (۰~"\rgjx>nJo }\(ij5`]ýاDh Fj) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -128 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F2 1837 0 R /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -129 0 obj -<< /Length 1975 /Filter /FlateDecode >> -stream -5a؁qLG+c^M -W1tRDGOt1Udy -m1涭އE$gDeh]o[$&7A {݄Dt L=0aZЌ.Ai)v)".d޵և1W '3i&ìh-Z{tMM]&T7aw2ҶX?WLء$4H^X &}Z[TFKIL->ΓbK#\oZ3L2̤ۨx>nٴ#*͵hUiGŸ S4sU_DzunݮCLIzNӘ>z9,6(93#l➂ .\UƻwkH1@3S` 7g <6Gi~pAstH&V0Byvy^Dzſp[,zAJNY ]_¡=2Gn4Q\Wm`a}BuF;kJ$\SO7*JWԎQXFjE7LV#߸1sFC:?ƭh;mzk $(!TRKC#vf}w 浛#u_C}0o]a5 -g>sZ?Q!-.AaF {]v]6ZjxưET1νh?`T#S/OK;$h y"]7-> -Gkx#\?JWr~=Kf9Wuezn#ƲP{(Bat7!āݣ4 ssUV DCLGg@zm'^*ndj!F4!q~w}Ai#]C8UQ`)tנμ O3&,mݧ -7ô38|#=[J!} f&g7N.\ b#C6'R - -.mIBՔEɷ46-A0(kٔݐR,fo4 ߀d؞qTS - ݆ -'\ŧ2߱7X-,9 HŜ2C-f٨J& ǕRj0Z[r@2łRv -R?"@?On`)NSFF=<+iba;.9bLz=ZaΉ!`%$w 6 -%,ܐkG;[Z mAqjȪ5s)xY1d$gNūI *ǃo -C[D!~לKdys*938Rn#q -endstream -endobj -130 0 obj -<< -/Type /Page -/Parent 1726 0 R -/Resources 132 0 R -/Contents 133 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 131 0 R ] -/B [ 1806 0 R 1805 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -131 0 obj -<< -/Dest (3Z{Wd5jjC.~0\\[ [2U[z󊗩) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -132 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F1 198 0 R /F2 1837 0 R /F3 1838 0 R /F5 201 0 R /F6 190 0 R /F7 191 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -133 0 obj -<< /Length 1249 /Filter /FlateDecode >> -stream - [Q dc4t"jkfisd&_ iBJI="[93=iYboIrz# -I"=U`0_ `rmee%fetZ٬? -bsc(v;'vItIF)/v5nD08)8t'<3(A5_h $UtJ1ٙsLe!_+sy02f43+ْ& 瑭[2ZTldfq[}?FىD<%sˢ -S#atɜ9k%x3Pk?Mvj.ݺ':HnO9t!)B;mKY2 +ݕH!gQm a&u4/®Nמ6]L]xטœI.`߰V쮀և3X{68;]&5V9RSf0vW(s4 NEBBrɎC &Lh.*m:S}lys${JV--֠TG r>Q`V#2/^KBEcnV@"z"vn84Q,*70/L g,3ituQzVO!3V|<ץ6t2kԷ`o:49%WM%bR J5=,] lKYKuC%ۏt9˽;: hFWˆI CΜt0\qL ;*~Pwqc-oǹ@`H\Sn|ʷ;|ࡠv"4z?3sgjVjebn@vk|x1xQg4^_聨LUSǙ+0> Ap6,?V*/=F3u!߀ -S(yNT> -endobj -135 0 obj -<< -/Dest (,`OKbrL\) a9oaMZ?\(6@Jz =`.5 ) -/Type /Annot -/Subtype /Link -/Rect [ 99 100 184 110 ] -/Border [ 0 0 0 ] ->> -endobj -136 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F1 198 0 R /F3 1838 0 R /F5 201 0 R /F6 190 0 R /F7 191 0 R /F12 195 0 R -/F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -137 0 obj -<< /Length 1611 /Filter /FlateDecode >> -stream -T Je1 -+s?5ټ cJ3ja.$zZt&L$ >F(H=}s||G0È@8/DZXvSNdz|t)7$ {[Ƹp1U"ɀ:Ж.MⰟ2s1j垰D <0O?eF¤Lt9#: Y6.!9-xn=TSoA jӏ>2XooGXF%kws| @~Jߋ%MkV@AG'$B;s},> -endobj -139 0 obj -<< -/Dest (#Ȁ A\n'g_ vM\)0C|xJG- J ifsR&.) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -140 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F1 198 0 R /F3 1838 0 R /F5 201 0 R /F6 190 0 R /F7 191 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -141 0 obj -<< /Length 1905 /Filter /FlateDecode >> -stream -n -{+w:i/R/෉t]8B\?,#sn܇%-p| -#φySO'KM5VXYi\ȋ7㉆+=ӳu! -׶͐ _6g^j危ދ -frD ?x@N hd]HmzW`@$IP| ϴ3К؜M[6+*ͿE:"T|2@vv(7~/-Q. -[ NѮ]y*7O&EhNՁ}5!~)GefHEgUخv!xbq!ҞYx̙)#TNߖ,̭:>gu;ڈPe3K3)r-= -rx(]CqdMɄoJC:!V)ve(MYNw&*Awќ߁ Tz+o$+4QQ\bErW7r -7(dmsxțe_Bɫ# -|#-w:C.'S}#f-w~o|RM~2HOdBزa:'.6(^Md* -]G^ ?.:6\?FA:չZ"xosz@#Վ. _]VYIz|xR=D-B -Y.'g|z[בpnVuBelq]CkrL,[?[4|ϘS7Fnf1W)cpQm}&&s(_dB6(@4yFނ -X -U8 GY'"@*LoI>' Sg&S?m,s7+?c֏N`n=Zk -ֆ_dQL/T{ߤiy>Cƚ<1K}!Ec}B4 d!"9HHkA6݋Q;gb]M7h")uyGaJ2zb G!> -endstream -endobj -142 0 obj -<< -/Type /Page -/Parent 1726 0 R -/Resources 144 0 R -/Contents 145 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 143 0 R ] -/B [ 1802 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -143 0 obj -<< -/Dest (q*m'L×e'D,9V%MG|;/^&9zƙvX) -/Type /Annot -/Subtype /Link -/Rect [ 99 101 184 111 ] -/Border [ 0 0 0 ] ->> -endobj -144 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F1 198 0 R /F3 1838 0 R /F5 201 0 R /F6 190 0 R /F7 191 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -145 0 obj -<< /Length 1781 /Filter /FlateDecode >> -stream -"'ptP4Y&sڪ8x@gCю/pgz6 ΃^ޤ!FnhZg6S0&䌔f|{2@/:wc.>O'%f;ыT(Vds3u::iGvZ#=8<qܻ}/TR`d]ܺ}}f\WB~y*֞IѼf㯔{̩ft2dy#>i@hE68̨z~d Mpso -{TCHVVi=g?QvJYD} fa@[ -~jva@"0=Y&.U^ ;AAewz]di٠A"nKsE"ԝ2I%>>|2ec4)HkK\?qގ 0:Sg+4@{J(Wǧ!R+~.s*${}GJCztv=4C7HO2넇$zOaaRn'0Jʬ|ɜJ{_½2uƭ-%Q\>A0sz";!Ր5X0e@ͯbhκ2n- T0З{b Ap|Y,W4ߊC -#.eYJ6E5mvB8 ic=t-( -poTyӮX]Bn<}qp~2ZgDƗR^sX׉uN -9 "3\VzM+YcFXDV]!E54C8L6F 1'iPRwDep֋>M)|olH9 [bNp*s։(Geo&ax #`@M);͐tNt%v6Moyqlr`9$ D .|FÜCF1(i|][ݗtBe})&e~9ٚqMFdK]Ѯ?Po] ژ FqOuvۅ*K7Q`>ߟlk=B - -s/O=AMoJ+a!W> -endobj -147 0 obj -<< -/Dest (\\\(-BdghWOD$IOwf%=ؘ+}Է) -/Type /Annot -/Subtype /Link -/Rect [ 428 101 513 111 ] -/Border [ 0 0 0 ] ->> -endobj -148 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F1 198 0 R /F3 1838 0 R /F5 201 0 R /F6 190 0 R /F7 191 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -149 0 obj -<< /Length 1248 /Filter /FlateDecode >> -stream -lYabk 8B!φp -| - - edԋAe(Aք$٢bKmKs -¡C_(F* R\ph,W+Jl-_b θk>C6mX وγLxH]cK@d. PI$aS*"%ձE!9˼HfIPZ=̺ Un5j`'nR+HnTN|)^&S_Mڕ,dcN@dǮQa1%,6!l›J4;`AD1 3naLbyc{Q(`==瓺jC mogH-˂rkRɩli{~oe3L,{d}fMBiv|oナ6,vؕYe;G!S%ǩeXE[9wU@K0=X$iz2e-D,o5Ofa(ӂ?5\=6DWjLa}quԾ ג`ŢV4| KG -7 "}۴]w!-mhAlcC.8{YkRv]?8~fx v+U -Cy > -pĪ~9EH"[UǢU:V -T~p(a,`ޕAN.1'~lfJ`͚c\"yB4x^MG -~U<ɝbh5,Tbk@ISw&\ݎC0:N#`?J5"ang@o3bYEry]P -I)7 _?q4#ğ (K@nSJ`Trяf"N/S&L9),X Y?5/'v{wc -xPo -#Tr -endstream -endobj -150 0 obj -<< -/Type /Page -/Parent 1726 0 R -/Resources 152 0 R -/Contents 153 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 151 0 R ] -/B [ 1800 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -151 0 obj -<< -/Dest ( 3+1/|yte׿3_VKsH,X;_XVyX) -/Type /Annot -/Subtype /Link -/Rect [ 99 101 184 111 ] -/Border [ 0 0 0 ] ->> -endobj -152 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F1 198 0 R /F3 1838 0 R /F5 201 0 R /F7 191 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -153 0 obj -<< /Length 788 /Filter /FlateDecode >> -stream -7:t^)Z(Q8䀷4ΖHI -s`yC0V}u 5\7?:%ۚ?\\~utWZ,YM - lm  -endstream -endobj -154 0 obj -<< -/Type /Page -/Parent 1727 0 R -/Resources 156 0 R -/Contents 157 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 155 0 R ] -/B [ 1799 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -155 0 obj -<< -/Dest (']!.\(ewnvҪ9HR0w hU]"TWΦ=+Zp5TJ.) -/Type /Annot -/Subtype /Link -/Rect [ 428 101 513 111 ] -/Border [ 0 0 0 ] ->> -endobj -156 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F1 198 0 R /F3 1838 0 R /F5 201 0 R /F7 191 0 R >> -/ExtGState << /GS1 1845 0 R /GS2 194 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -157 0 obj -<< /Length 2276 /Filter /FlateDecode >> -stream -CCfGro֎4UO%ؑcSn=jQ/.#^ /YȈMl0~GzuL -i;plu5ei*D3c3(/]̜+AUJFtAK8>$@ r-OItBdXTBKEu{m -07ѐMq1hEMnCAcZ G"lO .h ۴w9w2QХ71GNa1h7t“X%33'@365cR"s+N+a}w8GUooː78nU?RඈRZ&A,ImRpAvǃRnز">( Q kRnϴnP:gsZt`/'Ӏz(PZt8zTy<݃zuj@ZwϽ#;>o~sj)x(M'ChUFQ^aMwZu1HGjH9W1fH*(xz[hfG[L]S<|*a{2 -IK1-rN,Mrj2/LsyqmbEq+X.(nd{AlE=M~wvކ$HL LBդg"t e:?%vt%&٪^8U -E 7d^!9>u3T>`SHӑl~vOWX -UCͮW]b*Z;-4N޺/:?Ok]ǖwUPĝ` R.wE2hgTҲXIA_8qh\a+ofڌ4&x$ jXEؤ˖+fcQP -njP&(ӔUĎ8Px]'_X)^ߓV,([&"|%V7\*죣暣~?rP v }X»CMH%/rՀ˭:!yc5v/{j|.鉑) U9K=W~ȁ+% >z&= y>uD'_$Ȟ&s<4t¹o:2Y) @/CFuσri;a֦! -endstream -endobj -158 0 obj -<< -/Type /Page -/Parent 1727 0 R -/Resources 160 0 R -/Contents 161 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 159 0 R ] -/B [ 1798 0 R 1797 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -159 0 obj -<< -/Dest ('vyIxZŧ뮹7hZ#\(”{C Ø*) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -160 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F2 1837 0 R /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -161 0 obj -<< /Length 2555 /Filter /FlateDecode >> -stream -V,@8$eCPYILBГL~^g3hrZ"WO_ r2< e%Hَ)xItp&J] 0D  -# lLW@j BŪTBD2&#\HK3}ٷM\g> Zv]g%HZߕE&mjVL),LVYbrdD,="]]dk!]=߃{ڍEmş!m§}(JacbD_sEO`8O#5֮[Ҁ"e/@'x ^{RpTbW~h @q999F㰱 XWhs``2~階qWg"{&Ў)*;HbG)/ߒr:op?Ep<OSB <X1Z]*Us#F"knsZ7)'؟Ed9L ]99 aTȿ x+r:XsXPVꉀ4Y -SbQ89 ƶ {*!i ^ ³نnwOMKVX7jLB}gX<2z]G[CUʝ>&Pw+VY/CИ<6 37lBj?ꗢ. >ˡXf+BHE1 je7co;8U*<5mUjOfuu+H@hqjiA}P|߼"Cޖ)aQmUcHmŅn3EGJD+_ >7:]|08D7baVThii U`kQtT۞ ) k+Pt֏aKZ -tdᏱx@J74Q-EbbߚV/f#)[1ɥ -0p489WM҇ɚ]-Uy~P"::YݰUHVV͑g_a:H0,g͞E4=U@S ~8PbXO# ->Z1_]vM`g@Xo,Й`3U5F;{Ukhׯ6óT|W,zx‹ -!9OzÒ3Q2ErTܞܸ;X^+r)fq^-`'jEZ$43=/.v}0LvʨT|..j\s5dAi(yl {YeSz - -&("e}zZcxƍ#yɘk-aټlK0˒=TFE_EvT@~59к߄s8GfZv˜_niGT 5 -),riR$ʅ,*lC.(gV5TLm8ZѴH)/18l6} -:pXp|/]RL\& -wA  :ۤ8# -_`9sDgԿF<);bv׳uc? {\KSqW;δ_zWlVVR%HO\ jyO T -w م@> -endobj -163 0 obj -<< -/Dest (3 m&I;T6}BCإGZ9" ƞ}V HVòI?*t@g]) -/Type /Annot -/Subtype /Link -/Rect [ 99 100 184 110 ] -/Border [ 0 0 0 ] ->> -endobj -164 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -165 0 obj -<< /Length 3044 /Filter /FlateDecode >> -stream ->N3v1RM4r~1o}|8B1XG௵ї>v9lPwRgǚ7`Ο!AdJݑ +6 {ԡr 6oc\"OtGtrn[FN,p -ˆ!"f*8Q.J+s@}' j̱/q쫊/;@D;, -#+~T IXPij>4ZoLOfN -`,ŏ2K|b)ހ.; fqIwE>CTc.x: -]ɓ"+($F-3^R G=ekK0H͚_ȵ7 !&|w\ݦڰޮHލ>"$ƆjabN'vb*ne^ג=27R0Aа'@$z.oRaV [̗'w| -ڠ -Ɓ)y3a 9Ƅ5 -x x?ԡY,0]V],!ay"W>A"L8`@m.X}l_]йS̑P@Kn8f -v~mt&@;CMefHl2ׁ؈+my5bh;M)_fzd>6Rodֳ:ؘf83wjPꏅ4ՅWBNEq5|t,Elsgώ -~x(? Ax9F!tEK\*Bx\i{b PC[ؾHӸZՖ-i֕RDM;nBU> -Xf>d@ѡ>`[O#K8v%S -/T[fNlWr -U:'N}A"sQc4'6;{#ΡDg;j5t&=4zSM@fYΪcU56&6Dsjd<1u÷?+|` W k.):>D{q&u#ȟɎ&k9`ޭSzh%> Yw_ /*7Rb%r4iV%8ۢow]}"ҵq{D4+mMb RL}g!_9:i/ $Ne|`˼jk`rW=Z<yՈoH*BJU GFl n_wE̵BL.r<9T 4! -26btenKxRޟ7 e+$✴cV!8[+I7ڝ#&U'o1vd̂f5iɂn1-EVY^kIUx%yBEUjCDNX~zfnC*OB`^8tRKĻ.DLggj*tΰffEGU!;8Ϯ?ĉw{:f9ՄP<%}eBGA-,?7 OBsP>bG>2kBo*:Nޚ~,Ja)|5UF@B%p%`G?1Z4y] ˲ xpclnmToub0N'n\MKF@2`+N/#Y؀J6w+$*Y65 GoZ$θ BڅebOˍr?1/ĸov؉uE¾wi7Emۄ+j$ʙ9;v:KN;'ٚ'ǢPNǔlLo{4nA*Յ=,`WVv9!(jaGnhf(rzS"Y] -G$̨r.Prk+ -TAAT琔AJql=㸯&g|sf/&~8nq3_j \)urtt-)Er3c~(tp;;~ɽ`_td-:ƵaC~̿hgHJ2 hyyJJySpچq`r2!D;΍W`wFbOUfr(f9إ!+H)h\2/tQKu z|=5QQJkzpN¬G)ь/e{Qԑ2^%~!8mf뻟~#W-٭o@9$޸o)E>`QRsd -C{ iފ:ԸKFQL9Yh3}w -ټ` C&mm=q*qʴ0m:taNMKdgk/ӆjTak_d[)vhY -%8pw?G@Y{Z̴UGb^nKC`;jQsj JZ -m e|\,'"p2S5NiMfLX*]> -fxsFȢWen1#| -1h1YX=TWp;n]x=uAl%;?=]RhNGMG?K,1ko?kf&c?YRmK+Ht𶶒69ibJWnRxo蕄> w{]"otN -`.HqghH9j+rW8$x(rr>o 0訧>0? -<78ɥC%Y({3ӵ+}m,aF4z7 )e菉0*g/)ך.xR,@1@n( -,$\)vplM*|x?> Q$Y-c()Y"D|' -endstream -endobj -166 0 obj -<< -/Type /Page -/Parent 1727 0 R -/Resources 168 0 R -/Contents 169 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 167 0 R ] -/B [ 1795 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -167 0 obj -<< -/Dest (_; X̨kߠ?1va2\)f\)ƯHC[馹$h) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -168 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -169 0 obj -<< /Length 2505 /Filter /FlateDecode >> -stream -1e]ʹQ(]7/$|.IBbpBEh&3tA.Ӈ[;XlY7gfBσ~+^h7(Y+s+F -7?YC4> -#:CBJ-wOٯFq. -RVX$YTFVGϡ@#.o؇j{<3917eAowQ A2Aˠ1U1PE2ˠ˽1=grox1EX  -e -h;m;3MO2TD/ -:TXt qrw-x(\)fxDyҴ -Ê+gm-\|sc - 'rgw -{qE5d0921: EP0xD 71 Hq8IUN.MEHN6ra:6/?hCm=cUGc>+#<qEӀngGu)^hJ%شpڜE;_w"U+rGe+j0Bmkٶ^o+O -ף IF2SuiOKx>at|O|6agw~3#&oE/URr'5aI#sQ#Ůûȇ+Jx vDEɞ^J,@LmlD@xv0 Y -ď1F*$ʲof BNn Jg}BPFL. ѕtmX39]6)RwZ -Opwr0I5ؽx:p"I;jUx"E3ADV#b4Biv_;&fppj;8"YLC.静k0fӀm1Lb`5X'mȧ:վj{5(c{~:N/޹emf3QZڪrEK[B @#FB?&= aWPWQl;du*fZ]ӯq2tq!^Wm𺚊jϗKT:(#<LrqyҮ{9o%pڭm+e~%aH.b| 054Ԕ/р]%[WH7b>0,t8 -Ϗor3u)rcs btz|Ϯ4Rl!8Bz3s/dždk<ŭ%xu-б5hT_S!Mz+4>q  -3WQ?}PSIi -oԥb\@k㩦|JL!`C % r9덓:ve<œUذ bOzSt (x9 ,OKz9&C9Iin3(r|C@X-wEUJ!Y7jaa>qǸWֲL -LΛ*i<ϩsyH -YY)w9u9>[{C`N];Ic&ubo$d[dۡ -5j':̢r˜Y ʾA>i]V%!ZDQ f<,¸+%J` -=//likK([s{}Ti7Xdn<4a†fx R@O_쳣+Op U28 -bt&pmJ]ݐӧWuORs U[hX[#`HR!,ٵ8D=JjP5%Onp'Wҁ12-mnOB -!anK/'?U>4s1BQ -endstream -endobj -170 0 obj -<< -/Type /Page -/Parent 1727 0 R -/Resources 172 0 R -/Contents 173 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 171 0 R ] -/B [ 1794 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -171 0 obj -<< -/Dest (!pѓ^m\n^,e21kdCZVB\nYfqK<"I4x9) -/Type /Annot -/Subtype /Link -/Rect [ 99 101 184 111 ] -/Border [ 0 0 0 ] ->> -endobj -172 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -173 0 obj -<< /Length 2731 /Filter /FlateDecode >> -stream -ÑZjL84BJb=Z.->4O1GɹMY/|kz@A,>tl?VMy'{PkW̘3l<СDb[2Xm_ĵC&(|JBv6쁦7k'}ڣHFM24A4A7act)_~ɡ&*7&ΨЏJnfB\+UC!I^Ty^$'ۉ%zBr1m !K:N0\zb)u`94c m+Ƴ/{L;I1l ̦}XFס醋J,϶9Z0NZG2q.J<| -NEFz(aF}PQwi<6LgBҀQ>;g+FsbwH_%^ PALetLz,S̬;x0lRm^4!_'}ʳ~G0J? -|y}Jr$<'Ue/qZ[jK*K*" -(pu݅_#qMlL,)fԺ7sB*ѮjŃi,jF!PPK@jh!ҍ$}O{ǻDMc1_9u>h$! -u.U'@촉! $|eoQ>9-yt]γ\y7mz4pq{@?K:T/g>d{`!> J'B~"ȧxR |O?odcd5Gm(!xvįpɓ@*`ntv<\^\ˎ٭TN.=na{6=flSi=wXk̒v/A"$|pZPXF7Ǐa$jH -vȭ3*jy#N2v a:WM4$%N޾_@Z>Hݾ{ d9)Z)!N=jđjA~s --Kԫu08j:pU,XJmbv|` -mcGbWIac8 `= NƯ1TTČ*d>Ѷ(HA1%b/b9q5f,L;H? ԃchD9b3 s*b]v**(A7r=n#sd`UecF1{{VXFYת٨J޳t>-5;{m7ǟG[|.P$)YԎ:>RQyk< lccHAtÌ"15[)ֺmJ{̌#'š;ʠӫ  -Se@At(# 8'%ai9 ~i:+EǭPqQ:`tZ%]n^7;O>ӈ@B -. -h/UpBz2I J ^y* -W54W8L ar p`Rp9 L[Xhrjt,-:oOSx2*^LY9%0DK,֮+҅Ɇ󼊾szT -jPAg,> -endstream -endobj -174 0 obj -<< -/Type /Page -/Parent 1727 0 R -/Resources 176 0 R -/Contents 177 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 175 0 R ] -/B [ 1793 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -175 0 obj -<< -/Dest (=7mG sv0 23^r#\\GnkCTڐ X KM_\n~Z) -/Type /Annot -/Subtype /Link -/Rect [ 428 101 513 111 ] -/Border [ 0 0 0 ] ->> -endobj -176 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -177 0 obj -<< /Length 1919 /Filter /FlateDecode >> -stream -jQ2|XLoSUьOH-UDorκeAթkөsiP+(tYNÑ<\^] /5Gڡ(}np_@/x<{9*{slSU_^[:Ni|PcLԶa,anȚxb@>,2g~E.̷2H Kl4{fHWo-* yw}\ -MLUf| ;!R",0'ǟ0afqsHL0FȦ -"{s (sӚ -Aq&I6q3, -%:rbuU{yq0(`J L後Œ9s 6Mx0Miy -/i8Q&SHBZKgsfu$IqD3L XDH+(Q'"ƮkLJLG;90Kח[G82aؼI N޵U[3HC>%@>%8 ]):PkΖ p)(G-B2gD -;1Lװ5Ka -Mj/ -u4sytz]w鍃@kcu/rɃD1>ٻg袪 Ij1%>O~XXn#9u6 d% -$e?J3 L޶%5'جPC5?B"cs#Ocߔ늲wQaD;MjKxK"]sP>,[rdZC#(QR䥛@ۘ9č>ng!T[V2鎬'c/WFB=s I_5W,I hj$S|#("mXzGi} -oS -TZҙ:*6lߥK5x8P#%J7{(j; -HkBT̹; -endstream -endobj -178 0 obj -<< -/Type /Page -/Parent 1727 0 R -/Resources 180 0 R -/Contents 181 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 179 0 R ] -/B [ 1792 0 R 1791 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -179 0 obj -<< -/Dest (Y9tWoJa#>_{VDUX_ꥉiPJu) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -180 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F2 1837 0 R /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F6 190 0 R /F7 191 0 R -/F9 192 0 R >> -/ExtGState << /GS1 1845 0 R /GS2 194 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -181 0 obj -<< /Length 3882 /Filter /FlateDecode >> -stream -g>867?jX;cΠe\ -cϞL]qqf -0mG%~t~ex Y~I2\q̀}"Cn/C,|h&%(_@ XB]?X{x:9 qovmm?L.ɯH(H5,+){࿣RD&LDyM87Օщ`Gd9TA̔'"8W|2Z> ,a*rL?v;7L4khZȈ7/4muma"(5făzQ}ֈȆ`vSMH -1z~29qc4dQ9s~W̚Az;eo'6~Qv]i@,饛dߚ]AȈHd-  -S2a2ZؙAxCdbF]?'A2<mN`>Rak2> -{ -OFYV# '8(EkK^h\xnUƷuG^^$YntIJRչ68+Nwg $x{kw !V5&-K9%U߇):V$#qyy."@[Zz~ -Z`>p3.!Qw0;ͯuiA;>OH;2@|k:.]9'QGFGO7.mv~J"E -EƵs[i6zي$l»'鬬19a&K9zȥduٺ@vH4 - 71Ah]6;J_DhUjZޓ&y*F0x;#Iz1)=ꭑ0Z|^YmO-z?$ߕ[js\؊I*1*wF -B]'qpä0Ӛ^) `4_-QkHB3;{漇:0fwƓ3j --w=p089JeoDZ[+C]szw*qzwExbr36 -1u;[̅׻C~czI[^#&).ww= -p*jP2#E`ckƒ _8m8^ݫ#NVu'Y" - -A:Ef+\ PĎutNúp֑Ama㩷lUYfK@ƐOULE4B`V:=2EZ̖[*Yc0f_|,J$nɿ^TY e-qBs[a];祏z4[ -ݦu07V?%=$(%)h 3]+CjH0[[Ȣ*W^zj - -x [yڤ[9[=5tT]n: PQ@E(D%)7m뻛o)5Lz Nqm1̷j!_O5yHL;)|D܁?٤A.1f 59qA7U}5)#ӊeK-rbdQ3}~ G֖ r2Uan&vX5F w!6Ԛ6R^ѹi{%Ni\5СmF"kfŽ5D]S4 `kf\RxJ#ܸ(/.'pA;ڐ[+)}~Q&7/NH(xDiŵSPCӯ6 İ:>d8fZ%_o=<b-:DgicVUuM?.y&ý8 YHZ-4s׬BXf }~7軱+3v@яbY:I'ǡ:'t' -P8o/gʔۙnKعٺ94Z+r.Nh0y6gq!(bl(8C̡j 7-m)mi^HGKo1A 61BR]-nqQgV˜<#Ui -d>}i mUnֲZҦL:;4hù@6>-|BGޢ)6&cQ?IQ\b79|z"?]? ;T7Ca<9l<8[(8^(@W|*EojI_e -=I_h6fOsub@L`P<0؃ ng@$]Chbae8@ukUH z 1f PDv=v-1q\F`d$ABn5zk\ZUhJOKHųY`$,8zfO}I9yEb=a):Ǻpj\d>FGZ;x46* -l&rAWўnp/Pwt]MˌǯvuD٬asȿ+fM[ 'ʠkք֠6kcm}ߙе]-\a<ށa%?/>5^gJYRj] -ypeǥ -xPEqyvF_?國=P] Dھ_6\+$tP0AfڧpĴ8}fڧmjSYh1z3˟18B7!HW%Ul?~Dx5b.eV.D0#xԻ 8[q0,-)6,dYW1#| P* kZS뀧@@#ؔ[f&8D)~pQsȩ>PhwP-E;styVW&/͂bɂsO4jT[v0Nl HWV -mb)E"k .)\cXUQdhb6{qg){Gh%ߊ/xCKhsz8;" -PoNN,)yȩ8-QrS:e.[=ba Ҹ>&>5PV5̲v gj߃)hB=sj}nd9֏ -];Vu *+\m - *,OLz -endstream -endobj -182 0 obj -<< -/Type /Page -/Parent 1727 0 R -/Resources 184 0 R -/Contents 185 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 183 0 R ] -/B [ 1790 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -183 0 obj -<< -/Dest (D<1߿ioB^+I^8{KJqLGy`E{_be8<=NP) -/Type /Annot -/Subtype /Link -/Rect [ 99 100 184 110 ] -/Border [ 0 0 0 ] ->> -endobj -184 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F9 192 0 R /F13 196 0 R -/F15 197 0 R >> -/ExtGState << /GS1 1845 0 R /GS2 194 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -185 0 obj -<< /Length 1455 /Filter /FlateDecode >> -stream -^҃GrCVdQ&Gܹ>,+ʚE"']!9k;n()'B&>o ݷ.F2MDﵴۻNހąwnUOJª]$ӌ#$FLڇj- -Q%d;x%2~  kEޱ7'ec3b;Вo -DܡdAt4_/C` 32a~[ -ý2il%=Оfo߮iF])xG2A,޲ -Z%ɪCjf|0] G.iz(8Yr1 -a SUd[굆3PMN탵9w ٢:oiە;ud"5/΢|3JDNYĔ6>{t.H-L,Of0ߘ9u7ׂȐbxM2PuPEBFrawX$ϯvNUO#-'"3 #B9 Q|]Wf(sM>v6kX`ZHD)ܝ9oEt1bfXV;-Pן4:}KWC2\Ĕ ? M(~ oB-T)ԛ}gۉ?lzdaKDt09NeK-"$ -ࣁ -lx -!56gS'v -FԐ9 -wUб;<>ns&m4kpܵ~w3/;MKij(vjFi/*6ƕ@;iWJk$(4[wD>v{_V5ڼm[PƠ,WhZm:6)2FҲe3gjNnI~4F Af!UϾZ;5wK/F!B1o 9$5ٞ̿y0_.IX=/YQXE&Ըj -GhA6}~LjG -Qy(d8UA%lQ8H04q9{M'6l~&~l7%JiG^wP3-luO"aV-q~DN2@}'4tzԉ`Y͌OtUd7[Iw3t -9 -#NSGCgns - {G 5q@EfAh埒kN0CP~W[_C}}@fG{6>5<1ҾǰHTaO1f=oRRBxwO->M,^yo\{qIt.^{:Hggm)L -endstream -endobj -186 0 obj -<< -/Type /Page -/Parent 1728 0 R -/Resources 188 0 R -/Contents 189 0 R -/CropBox [ 54 72 558 720 ] -/Annots [ 187 0 R ] -/B [ 1789 0 R ] -/MediaBox [ 0 0 612 792 ] -/Rotate 0 ->> -endobj -187 0 obj -<< -/Dest (c*y\)-IqR~\(tPA F`Il.\(gs*Nh\\6`9s^ھ/e) -/Type /Annot -/Subtype /Link -/Rect [ 428 100 513 110 ] -/Border [ 0 0 0 ] ->> -endobj -188 0 obj -<< -/ProcSet [ /PDF /Text ] -/Font << /F3 1838 0 R /F4 1841 0 R /F5 201 0 R /F7 191 0 R /F13 196 0 R >> -/ExtGState << /GS1 1845 0 R >> -/ColorSpace << /Cs5 1833 0 R >> ->> -endobj -189 0 obj -<< /Length 913 /Filter /FlateDecode >> -stream -a:3Oat|VH@Ls*GtۘQKtb=7S?rK/5/0TpEAt' $ՙϬC&KuoE꓿KSaYo 2&(T pa _z\)niaCJ[9 j]q#}@ahؽA낛 -Zk9 ~BȨ dJ(ry,L4Y֔Fm\bVHBU'{( z){nYt -sSFa -l˓3aj+`F|O,F1_EVHuJG) (z79!%-g޴~M[1]sQ 5IhOX2rO9rgYOo֔ P~Hsi@ ->UfP\A -bi]~!Fdy"hDl.*pYνe&1{ODc/ٯ[H/@D~VӰzcy$t |7ŧ c R+pߺN,rYoTP,Н(yNlؗTƉɁlc~ ^"n3dG*luG ٲjI4n -ky5k7~,Da0ZgvJ< -իey}PB2N`} -8RBu܏vo5_ Mc(r{OȴymEl䫝JI^ɡ6 -endstream -endobj -190 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding /WinAnsiEncoding -/BaseFont /Times-Roman ->> -endobj -191 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding /WinAnsiEncoding -/BaseFont /Times-Roman ->> -endobj -192 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding /WinAnsiEncoding -/BaseFont /Helvetica ->> -endobj -193 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding 199 0 R -/BaseFont /Symbol -/ToUnicode 200 0 R ->> -endobj -194 0 obj -<< -/Type /ExtGState -/SA true -/SM 0.02 -/TR /Identity ->> -endobj -195 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding /WinAnsiEncoding -/BaseFont /Times-Italic ->> -endobj -196 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding /WinAnsiEncoding -/BaseFont /Times-Bold ->> -endobj -197 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding /WinAnsiEncoding -/BaseFont /Helvetica-Bold ->> -endobj -198 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding /WinAnsiEncoding -/BaseFont /Courier ->> -endobj -199 0 obj -<< -/Type /Encoding -/Differences [ 1 /Omega /one /zero /space ] ->> -endobj -200 0 obj -<< /Filter /FlateDecode /Length 234 >> -stream -@t8s܍MlH2]>ᤶ-2f?Rl\e!l+6 .( -^mV%x'kpUe@\"w;Rhr?l]ompǰIcW5':TVti`S|mXWrx]NfCxLI;rH n<~0]f\+S'):BW)gsJ6 -* -endstream -endobj -201 0 obj -<< -/Type /Font -/Subtype /Type1 -/FirstChar 32 -/LastChar 121 -/Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 250 333 250 0 0 500 500 500 500 500 500 -500 0 0 0 0 0 0 0 0 0 556 556 556 611 0 0 0 0 0 0 0 500 0 0 0 0 -0 0 556 500 0 0 0 0 0 0 0 0 0 0 0 0 444 500 444 500 444 278 500 -500 222 222 444 222 778 500 500 500 0 333 444 278 500 444 667 0 -444 ] -/Encoding /WinAnsiEncoding -/BaseFont /GFGIOF+Helvetica-Condensed-Oblique -/FontDescriptor 202 0 R ->> -endobj -202 0 obj -<< -/Type /FontDescriptor -/Ascent 750 -/CapHeight 750 -/Descent -189 -/Flags 96 -/FontBBox [ -174 -250 1118 990 ] -/FontName /GFGIOF+Helvetica-Condensed-Oblique -/ItalicAngle -12 -/StemV 79 -/XHeight 556 -/CharSet (H^{ 3&ލnH2Ԛ';{%-"nbHP T0m͟_S!\ -vo"THiJ2j2\n;-vN #6%B$ InT) -/FontFile3 203 0 R ->> -endobj -203 0 obj -<< /Filter /FlateDecode /Length 2841 /Subtype /Type1C >> -stream -Onv7ɗг¸;>̼UL!qõzw2ĖI #GUC)kɻٽ^_i+Nmdysy3Fŭzw^zDzG2XĘ[DU -l&<6jX;z'AGS;?xpPr -04 ތ/x4ǂkb>R0ěd$a': ǃ+8zY.6™V(I2; Ax7=ǔgSb)mü@t -kA^SjFqcEޮ {&w_.k" O~$rM~9֕Ϗ3-c4yf @r4Dͥ -a)B&Ģ38855R.{>DE{ʀ$jfSIv%f~"EХ"d2r~f{kJ|"ekw8h?l3弲 -`uK<ЭQ%a9Nap}%ς?-`1GyCtMմd^ޱȲIXn<.>ԉtTm p[֮ٓۃE 9> $; i&2l:C7ICo{ā21Jt7bGYH8.>Z - -AcyפBR35շcm2/gu DQmv1;Hv4;CZ,k f3COq| ɄCw;dw^k(52i@d -όNRo<׻fe4q#rX^Q(M:=_\a;e9m ->·@6\]H9Ĺ%GE24H'HݢZʸbS>Ym(u[ QĂ*)oN O!;8& $0Ew25זЈ8J=D Y`+2#\Fzox$X8Ci7"DU)1c"GIМͲgsFr6l">Wfo+y>~:"H? ;6[\Ժ<X4 IKξ)ozSB^AGȂ)x?y6x9hN˷=,NcHsQi.ERݚ5mm*f-1wsP/M4)~QdU^jUdCeWJc*MF(.6)c(zrH$.vYW -8j g=5?0, --s/dRqz oxg(Fl@]"6 7lDWf{[UϲJ`8I#/M>7(~~༏ilMmpƸ/P:a\ۢ c!L / ->~3Pr/O<PUi3l#)].xP&4րmf5 Þg@m7nЬzCn2i&dd1nX itwCǮR`?-ӎv]JY[r<,lj|Wtz1ok_":cS=0\ҽToL/`=crs_&6URBVI j2>`?؀8$tK|+gܒ0Oa'^Xrcb2J!^L|LfflN>ScJBI9 -)ߟ5o#H,u)wTz*\ؤ35[ʙPGk\C&H:ʻG~;"Wp;FtM5*rmXݣa Kĵ,=Fw<،Iql۬*H8x*ڗ?. }3,"S7akdglzïݞGC\#USn,=X~K16pɚ]ud-] -P1 -жYcWUL3b Dm?Q=M(9Fkᩂ瑈P)]>+Q'4ϓ;9V#{C@w}ފjnR:NiXtovV"B FXUIg]j>ʧ3:3`NTO8 k%Si(mXD_̦}wm5Z md Z -endstream -endobj -204 0 obj -[ -/CalRGB << /WhitePoint [ 0.9505 1 1.089 ] /Gamma [ 2.22221 2.22221 2.22221 ] -/Matrix [ 0.4124 0.2126 0.0193 0.3576 0.71519 0.1192 0.1805 0.0722 0.9505 ] >> - -] -endobj -205 0 obj -<< -/Type /Font -/Subtype /Type1 -/FirstChar 32 -/LastChar 116 -/Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 556 0 0 0 0 0 0 0 0 500 0 0 0 0 0 0 556 0 0 0 0 0 0 0 0 0 -0 0 0 0 444 0 444 0 444 278 0 0 222 0 444 0 778 500 500 500 0 333 -444 278 ] -/Encoding /WinAnsiEncoding -/BaseFont /NHFIBB+Helvetica-Condensed-Oblique -/FontDescriptor 206 0 R ->> -endobj -206 0 obj -<< -/Type /FontDescriptor -/Ascent 750 -/CapHeight 750 -/Descent -189 -/Flags 96 -/FontBBox [ -174 -250 1118 990 ] -/FontName /NHFIBB+Helvetica-Condensed-Oblique -/ItalicAngle -12 -/StemV 79 -/XHeight 556 -/CharSet (SqɮUm mňy^;UoА~>z) -/FontFile3 207 0 R ->> -endobj -207 0 obj -<< /Filter /FlateDecode /Length 1407 /Subtype /Type1C >> -stream -gM +·̿&m3H8ӌ_Yow9us}r~Ta(1~H Ze҃{H#Buuxxb 3?)ߪ+>hA}И0  6ȏx+P"<7>֚OшDht|ݤTV{ْ.M/w\Ͻr]9CubFq< 5Y)Eη01to'5;eʵATT̀fyuxz^lm"TRPeᇋ|E$5~c੫쩶(( X3`P:T·'8Wfo8QdSIm1ߋy0ڮK[ -[GHu.\r3C<&ۋTF|e" S5+ʝlC/x@SHmh|]2.EM WRw\ъ驪K0yߍ{P4bB5C{gtK -%68fMQLF/Y!ac߱uxX. `kB]u%iu󅬟ȯU,%? >D\#. O6g`Qx ׋-Z vdŊ -{ʫ娨 F",_ -J% EF[!sj; -8wD ,ދ+#|DVPĀ99a-ysONlywX{ϼȠBWf[X -ID=)k 9$K?p +zz(T>w)5%|HF89r* -^zgCq2i9/GF[$H}V; -;QMAi;ئ'o'O"k<-hXF -N2VN̜Gz?.鐈09ةpwCfkyX#m/] nSn+͌_ZS.rxP훏wY7h:A&x=*Q$+B\+ 4ڔ),"ITs:A1كQC._O -endstream -endobj -208 0 obj -<< -/Type /Font -/Subtype /Type1 -/FirstChar 32 -/LastChar 119 -/Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 556 0 556 611 0 500 611 0 278 0 0 500 0 0 0 556 0 611 556 500 -0 0 0 0 0 0 0 0 0 0 0 0 500 500 444 500 500 278 500 500 278 0 444 -278 778 500 500 500 0 333 444 278 0 0 667 ] -/Encoding /WinAnsiEncoding -/BaseFont /NHFHMH+Helvetica-Condensed-Bold -/FontDescriptor 209 0 R ->> -endobj -209 0 obj -<< -/Type /FontDescriptor -/Ascent 750 -/CapHeight 750 -/Descent -189 -/Flags 262176 -/FontBBox [ -169 -250 1091 991 ] -/FontName /NHFHMH+Helvetica-Condensed-Bold -/ItalicAngle 0 -/StemV 130 -/XHeight 564 -/CharSet (I2w:!\rs?gal\(uNS0g$k/ ¶VKUc) -/FontFile3 210 0 R ->> -endobj -210 0 obj -<< /Filter /FlateDecode /Length 2518 /Subtype /Type1C >> -stream -u t -o=t2 lߺЙp -=F.'[? yfjH8d3JthĨ\ěM@ƶRah -;>m.F4&"嵨KL%lu ,lm/jjW\/< -' h3%Px5rSp%s.!t#+NBswqGem~HvW^G8n8/nvx%ˠEO*m|WyZĴdngX0'4a2T`i -Jz3)0yXug+MGq4[}!L"Cw- %}8XI gO8}!6EGKU-3iȄA8gC~Zvoqw -t lfJK{.I˵&hzݶɬ16q2}Ɵpv.3 :q}jxbD'$O447#&2Qa.THi3rm|Ya_y^0+*$r'=ce}{I.?V/"_{IJ{!>6?;P)GD'6clـSW$8/F9שcFL#-d^õݩYcT\z{~ -k0Q46pwyr[_(.w#ɳ镚8W -Gq. rOx ㆽA% -xq -Ы*X 3)uj5LTiVl.EzF$}B` 6=eS$ۍ&.Р=/?+]a^ !)tXaqN -\7J8eξ˵ -C.0A -!(Lܴͣ-CXxqôV5"*A-,fm:?C`*2 -m1ALbJҺ0"c»Ze -PZm<.{\"RXo% LbŒpP1X{r3lKp?r$%KԒPp+GR,ytN!-J.F<@!U@ H>n&G+B%:qICU=2YEO?:ЍFbog0q"ū!}@B\`]>ՏG{ROWAf1:{gzúDDƒqV8weS"/j+QqOt+igzlhRJ,RPrᣧQ3hx"M+hgFC'|8_/եM{/t*c%^4H -D<KB) ROKFe6L"{: W ;',g'xi8D05UP\a\8 1gBEK!Հ3J>3Z kon31kM<S T΀!b-7롣Ďw&ENv)y4xnN6Ρ]b(d@5MڍDp8x)`8-iy;&q#8GB*dm[ 3@P9G*j{`?Mj+hӚeoMm|HКX3NB2B#cr0n)zaX A뚏6& -0M))4 kD䜲:GH%A9Mi@8ZG\JJ Ӵ5|#Nft p+TTsdB.ATD -ZZE|haH'cˍ -/nq4˕*F^}= ^34_,m1N0T4Ty L.4OP)S2Nͤig]=锨sZ'Q"8{tx(oF];, гΣnI >OɌ -*MBo5-gA4-.βB -endstream -endobj -211 0 obj -<< -/D [ 1735 0 R /XYZ null null null ] ->> -endobj -212 0 obj -<< -/D [ 1735 0 R /XYZ null null null ] ->> -endobj -213 0 obj -<< -/D [ 1735 0 R /XYZ 107 374 null ] ->> -endobj -214 0 obj -<< -/D [ 1735 0 R /XYZ 107 374 null ] ->> -endobj -215 0 obj -<< -/D [ 1735 0 R /XYZ 107 601 null ] ->> -endobj -216 0 obj -<< -/D [ 1735 0 R /XYZ 107 511 null ] ->> -endobj -217 0 obj -<< -/D [ 1735 0 R /XYZ 107 369 null ] ->> -endobj -218 0 obj -<< -/D [ 1735 0 R /XYZ 107 346 null ] ->> -endobj -219 0 obj -<< -/D [ 1735 0 R /XYZ 107 325 null ] ->> -endobj -220 0 obj -<< -/D [ 1735 0 R /XYZ 107 304 null ] ->> -endobj -221 0 obj -<< -/D [ 1735 0 R /XYZ 107 283 null ] ->> -endobj -222 0 obj -<< -/D [ 1735 0 R /XYZ 107 262 null ] ->> -endobj -223 0 obj -<< -/D [ 1735 0 R /XYZ 413 130 null ] ->> -endobj -224 0 obj -<< -/D [ 1735 0 R /XYZ 197 292 null ] ->> -endobj -225 0 obj -<< -/D [ 1735 0 R /XYZ 197 277 null ] ->> -endobj -226 0 obj -<< -/D [ 1735 0 R /XYZ 197 261 null ] ->> -endobj -227 0 obj -<< -/D [ 1735 0 R /XYZ 197 250 null ] ->> -endobj -228 0 obj -<< -/D [ 1 0 R /XYZ null null null ] ->> -endobj -229 0 obj -<< -/D [ 1 0 R /XYZ null null null ] ->> -endobj -230 0 obj -<< -/D [ 1 0 R /XYZ 107 110 null ] ->> -endobj -231 0 obj -<< -/D [ 1 0 R /XYZ 107 684 null ] ->> -endobj -232 0 obj -<< -/D [ 1 0 R /XYZ 107 623 null ] ->> -endobj -233 0 obj -<< -/D [ 1 0 R /XYZ 107 600 null ] ->> -endobj -234 0 obj -<< -/D [ 1 0 R /XYZ 107 572 null ] ->> -endobj -235 0 obj -<< -/D [ 1 0 R /XYZ 107 556 null ] ->> -endobj -236 0 obj -<< -/D [ 1 0 R /XYZ 107 540 null ] ->> -endobj -237 0 obj -<< -/D [ 1 0 R /XYZ 107 524 null ] ->> -endobj -238 0 obj -<< -/D [ 1 0 R /XYZ 107 508 null ] ->> -endobj -239 0 obj -<< -/D [ 1 0 R /XYZ 107 492 null ] ->> -endobj -240 0 obj -<< -/D [ 1 0 R /XYZ 107 476 null ] ->> -endobj -241 0 obj -<< -/D [ 1 0 R /XYZ 107 460 null ] ->> -endobj -242 0 obj -<< -/D [ 1 0 R /XYZ 107 444 null ] ->> -endobj -243 0 obj -<< -/D [ 1 0 R /XYZ 107 428 null ] ->> -endobj -244 0 obj -<< -/D [ 1 0 R /XYZ 107 412 null ] ->> -endobj -245 0 obj -<< -/D [ 1 0 R /XYZ 107 396 null ] ->> -endobj -246 0 obj -<< -/D [ 1 0 R /XYZ 107 380 null ] ->> -endobj -247 0 obj -<< -/D [ 1 0 R /XYZ 107 357 null ] ->> -endobj -248 0 obj -<< -/D [ 1 0 R /XYZ 107 324 null ] ->> -endobj -249 0 obj -<< -/D [ 1 0 R /XYZ 107 218 null ] ->> -endobj -250 0 obj -<< -/D [ 1 0 R /XYZ 107 196 null ] ->> -endobj -251 0 obj -<< -/D [ 1 0 R /XYZ 107 174 null ] ->> -endobj -252 0 obj -<< -/D [ 6 0 R /XYZ null null null ] ->> -endobj -253 0 obj -<< -/D [ 6 0 R /XYZ null null null ] ->> -endobj -254 0 obj -<< -/D [ 6 0 R /XYZ 107 110 null ] ->> -endobj -255 0 obj -<< -/D [ 6 0 R /XYZ 107 684 null ] ->> -endobj -256 0 obj -<< -/D [ 6 0 R /XYZ 107 620 null ] ->> -endobj -257 0 obj -<< -/D [ 1746 0 R /XYZ null null null ] ->> -endobj -258 0 obj -<< -/D [ 1746 0 R /XYZ null null null ] ->> -endobj -259 0 obj -<< -/D [ 1746 0 R /XYZ 98 695 null ] ->> -endobj -260 0 obj -<< -/D [ 1746 0 R /XYZ 98 110 null ] ->> -endobj -261 0 obj -<< -/D [ 10 0 R /XYZ null null null ] ->> -endobj -262 0 obj -<< -/D [ 10 0 R /XYZ 107 625 null ] ->> -endobj -263 0 obj -<< -/D [ 10 0 R /XYZ 143 608 null ] ->> -endobj -264 0 obj -<< -/D [ 10 0 R /XYZ 143 596 null ] ->> -endobj -265 0 obj -<< -/D [ 10 0 R /XYZ 107 572 null ] ->> -endobj -266 0 obj -<< -/D [ 10 0 R /XYZ 107 543 null ] ->> -endobj -267 0 obj -<< -/D [ 10 0 R /XYZ 107 526 null ] ->> -endobj -268 0 obj -<< -/D [ 10 0 R /XYZ 143 509 null ] ->> -endobj -269 0 obj -<< -/D [ 10 0 R /XYZ 143 497 null ] ->> -endobj -270 0 obj -<< -/D [ 10 0 R /XYZ 143 485 null ] ->> -endobj -271 0 obj -<< -/D [ 10 0 R /XYZ 143 473 null ] ->> -endobj -272 0 obj -<< -/D [ 10 0 R /XYZ 179 461 null ] ->> -endobj -273 0 obj -<< -/D [ 10 0 R /XYZ 179 449 null ] ->> -endobj -274 0 obj -<< -/D [ 10 0 R /XYZ 107 425 null ] ->> -endobj -275 0 obj -<< -/D [ 10 0 R /XYZ 107 408 null ] ->> -endobj -276 0 obj -<< -/D [ 10 0 R /XYZ 179 391 null ] ->> -endobj -277 0 obj -<< -/D [ 10 0 R /XYZ 179 379 null ] ->> -endobj -278 0 obj -<< -/D [ 10 0 R /XYZ 179 367 null ] ->> -endobj -279 0 obj -<< -/D [ 10 0 R /XYZ 179 355 null ] ->> -endobj -280 0 obj -<< -/D [ 10 0 R /XYZ 107 331 null ] ->> -endobj -281 0 obj -<< -/D [ 10 0 R /XYZ 107 314 null ] ->> -endobj -282 0 obj -<< -/D [ 10 0 R /XYZ 179 297 null ] ->> -endobj -283 0 obj -<< -/D [ 10 0 R /XYZ 107 273 null ] ->> -endobj -284 0 obj -<< -/D [ 10 0 R /XYZ 107 256 null ] ->> -endobj -285 0 obj -<< -/D [ 10 0 R /XYZ 107 227 null ] ->> -endobj -286 0 obj -<< -/D [ 10 0 R /XYZ 107 227 null ] ->> -endobj -287 0 obj -<< -/D [ 10 0 R /XYZ 107 210 null ] ->> -endobj -288 0 obj -<< -/D [ 10 0 R /XYZ 179 193 null ] ->> -endobj -289 0 obj -<< -/D [ 10 0 R /XYZ 179 181 null ] ->> -endobj -290 0 obj -<< -/D [ 10 0 R /XYZ 179 169 null ] ->> -endobj -291 0 obj -<< -/D [ 10 0 R /XYZ 107 110 null ] ->> -endobj -292 0 obj -<< -/D [ 10 0 R /XYZ 107 684 null ] ->> -endobj -293 0 obj -<< -/D [ 10 0 R /XYZ 107 621 null ] ->> -endobj -294 0 obj -<< -/D [ 10 0 R /XYZ 107 603 null ] ->> -endobj -295 0 obj -<< -/D [ 10 0 R /XYZ 107 591 null ] ->> -endobj -296 0 obj -<< -/D [ 10 0 R /XYZ 107 568 null ] ->> -endobj -297 0 obj -<< -/D [ 10 0 R /XYZ 107 539 null ] ->> -endobj -298 0 obj -<< -/D [ 10 0 R /XYZ 107 522 null ] ->> -endobj -299 0 obj -<< -/D [ 10 0 R /XYZ 107 504 null ] ->> -endobj -300 0 obj -<< -/D [ 10 0 R /XYZ 107 492 null ] ->> -endobj -301 0 obj -<< -/D [ 10 0 R /XYZ 107 480 null ] ->> -endobj -302 0 obj -<< -/D [ 10 0 R /XYZ 107 468 null ] ->> -endobj -303 0 obj -<< -/D [ 10 0 R /XYZ 107 456 null ] ->> -endobj -304 0 obj -<< -/D [ 10 0 R /XYZ 107 444 null ] ->> -endobj -305 0 obj -<< -/D [ 10 0 R /XYZ 107 421 null ] ->> -endobj -306 0 obj -<< -/D [ 10 0 R /XYZ 107 404 null ] ->> -endobj -307 0 obj -<< -/D [ 10 0 R /XYZ 107 386 null ] ->> -endobj -308 0 obj -<< -/D [ 10 0 R /XYZ 107 374 null ] ->> -endobj -309 0 obj -<< -/D [ 10 0 R /XYZ 107 362 null ] ->> -endobj -310 0 obj -<< -/D [ 10 0 R /XYZ 107 350 null ] ->> -endobj -311 0 obj -<< -/D [ 10 0 R /XYZ 107 327 null ] ->> -endobj -312 0 obj -<< -/D [ 10 0 R /XYZ 107 310 null ] ->> -endobj -313 0 obj -<< -/D [ 10 0 R /XYZ 107 292 null ] ->> -endobj -314 0 obj -<< -/D [ 10 0 R /XYZ 107 269 null ] ->> -endobj -315 0 obj -<< -/D [ 10 0 R /XYZ 107 252 null ] ->> -endobj -316 0 obj -<< -/D [ 10 0 R /XYZ 107 223 null ] ->> -endobj -317 0 obj -<< -/D [ 10 0 R /XYZ 107 206 null ] ->> -endobj -318 0 obj -<< -/D [ 10 0 R /XYZ 107 188 null ] ->> -endobj -319 0 obj -<< -/D [ 10 0 R /XYZ 107 176 null ] ->> -endobj -320 0 obj -<< -/D [ 10 0 R /XYZ 107 164 null ] ->> -endobj -321 0 obj -<< -/D [ 46 0 R /XYZ null null null ] ->> -endobj -322 0 obj -<< -/D [ 46 0 R /XYZ null null null ] ->> -endobj -323 0 obj -<< -/D [ 46 0 R /XYZ 134 468 null ] ->> -endobj -324 0 obj -<< -/D [ 46 0 R /XYZ 134 444 null ] ->> -endobj -325 0 obj -<< -/D [ 46 0 R /XYZ 134 432 null ] ->> -endobj -326 0 obj -<< -/D [ 46 0 R /XYZ 134 408 null ] ->> -endobj -327 0 obj -<< -/D [ 46 0 R /XYZ 134 384 null ] ->> -endobj -328 0 obj -<< -/D [ 46 0 R /XYZ 134 372 null ] ->> -endobj -329 0 obj -<< -/D [ 46 0 R /XYZ 134 331 null ] ->> -endobj -330 0 obj -<< -/D [ 46 0 R /XYZ 98 669 null ] ->> -endobj -331 0 obj -<< -/D [ 46 0 R /XYZ 134 307 null ] ->> -endobj -332 0 obj -<< -/D [ 46 0 R /XYZ 98 652 null ] ->> -endobj -333 0 obj -<< -/D [ 46 0 R /XYZ 134 283 null ] ->> -endobj -334 0 obj -<< -/D [ 46 0 R /XYZ 134 259 null ] ->> -endobj -335 0 obj -<< -/D [ 46 0 R /XYZ 134 247 null ] ->> -endobj -336 0 obj -<< -/D [ 46 0 R /XYZ 134 235 null ] ->> -endobj -337 0 obj -<< -/D [ 46 0 R /XYZ 134 211 null ] ->> -endobj -338 0 obj -<< -/D [ 46 0 R /XYZ 134 199 null ] ->> -endobj -339 0 obj -<< -/D [ 46 0 R /XYZ 98 623 null ] ->> -endobj -340 0 obj -<< -/D [ 46 0 R /XYZ 98 606 null ] ->> -endobj -341 0 obj -<< -/D [ 46 0 R /XYZ 98 577 null ] ->> -endobj -342 0 obj -<< -/D [ 46 0 R /XYZ 98 560 null ] ->> -endobj -343 0 obj -<< -/D [ 46 0 R /XYZ 98 531 null ] ->> -endobj -344 0 obj -<< -/D [ 46 0 R /XYZ 98 514 null ] ->> -endobj -345 0 obj -<< -/D [ 46 0 R /XYZ 134 468 null ] ->> -endobj -346 0 obj -<< -/D [ 46 0 R /XYZ 98 695 null ] ->> -endobj -347 0 obj -<< -/D [ 46 0 R /XYZ 98 110 null ] ->> -endobj -348 0 obj -<< -/D [ 46 0 R /XYZ 98 665 null ] ->> -endobj -349 0 obj -<< -/D [ 46 0 R /XYZ 98 648 null ] ->> -endobj -350 0 obj -<< -/D [ 46 0 R /XYZ 98 619 null ] ->> -endobj -351 0 obj -<< -/D [ 46 0 R /XYZ 98 602 null ] ->> -endobj -352 0 obj -<< -/D [ 46 0 R /XYZ 98 573 null ] ->> -endobj -353 0 obj -<< -/D [ 46 0 R /XYZ 98 556 null ] ->> -endobj -354 0 obj -<< -/D [ 46 0 R /XYZ 98 527 null ] ->> -endobj -355 0 obj -<< -/D [ 46 0 R /XYZ 98 510 null ] ->> -endobj -356 0 obj -<< -/D [ 46 0 R /XYZ 98 481 null ] ->> -endobj -357 0 obj -<< -/D [ 46 0 R /XYZ 98 462 null ] ->> -endobj -358 0 obj -<< -/D [ 46 0 R /XYZ 98 450 null ] ->> -endobj -359 0 obj -<< -/D [ 46 0 R /XYZ 98 438 null ] ->> -endobj -360 0 obj -<< -/D [ 46 0 R /XYZ 98 426 null ] ->> -endobj -361 0 obj -<< -/D [ 46 0 R /XYZ 98 414 null ] ->> -endobj -362 0 obj -<< -/D [ 46 0 R /XYZ 98 402 null ] ->> -endobj -363 0 obj -<< -/D [ 46 0 R /XYZ 98 390 null ] ->> -endobj -364 0 obj -<< -/D [ 46 0 R /XYZ 98 378 null ] ->> -endobj -365 0 obj -<< -/D [ 46 0 R /XYZ 98 366 null ] ->> -endobj -366 0 obj -<< -/D [ 46 0 R /XYZ 98 344 null ] ->> -endobj -367 0 obj -<< -/D [ 46 0 R /XYZ 98 325 null ] ->> -endobj -368 0 obj -<< -/D [ 46 0 R /XYZ 98 313 null ] ->> -endobj -369 0 obj -<< -/D [ 46 0 R /XYZ 98 301 null ] ->> -endobj -370 0 obj -<< -/D [ 46 0 R /XYZ 98 289 null ] ->> -endobj -371 0 obj -<< -/D [ 46 0 R /XYZ 98 277 null ] ->> -endobj -372 0 obj -<< -/D [ 46 0 R /XYZ 98 265 null ] ->> -endobj -373 0 obj -<< -/D [ 46 0 R /XYZ 98 253 null ] ->> -endobj -374 0 obj -<< -/D [ 46 0 R /XYZ 98 241 null ] ->> -endobj -375 0 obj -<< -/D [ 46 0 R /XYZ 98 229 null ] ->> -endobj -376 0 obj -<< -/D [ 46 0 R /XYZ 98 217 null ] ->> -endobj -377 0 obj -<< -/D [ 46 0 R /XYZ 98 205 null ] ->> -endobj -378 0 obj -<< -/D [ 46 0 R /XYZ 98 193 null ] ->> -endobj -379 0 obj -<< -/D [ 74 0 R /XYZ null null null ] ->> -endobj -380 0 obj -<< -/D [ 74 0 R /XYZ null null null ] ->> -endobj -381 0 obj -<< -/D [ 74 0 R /XYZ 513 701 null ] ->> -endobj -382 0 obj -<< -/D [ 74 0 R /XYZ 513 701 null ] ->> -endobj -383 0 obj -<< -/D [ 74 0 R /XYZ 107 110 null ] ->> -endobj -384 0 obj -<< -/D [ 74 0 R /XYZ 464 717 null ] ->> -endobj -385 0 obj -<< -/D [ 74 0 R /XYZ 107 640 null ] ->> -endobj -386 0 obj -<< -/D [ 74 0 R /XYZ 107 582 null ] ->> -endobj -387 0 obj -<< -/D [ 74 0 R /XYZ 107 549 null ] ->> -endobj -388 0 obj -<< -/D [ 74 0 R /XYZ 107 503 null ] ->> -endobj -389 0 obj -<< -/D [ 74 0 R /XYZ 107 409 null ] ->> -endobj -390 0 obj -<< -/D [ 74 0 R /XYZ 107 326 null ] ->> -endobj -391 0 obj -<< -/D [ 74 0 R /XYZ 107 293 null ] ->> -endobj -392 0 obj -<< -/D [ 78 0 R /XYZ null null null ] ->> -endobj -393 0 obj -<< -/D [ 78 0 R /XYZ 355 531 null ] ->> -endobj -394 0 obj -<< -/D [ 78 0 R /XYZ 98 695 null ] ->> -endobj -395 0 obj -<< -/D [ 78 0 R /XYZ 98 110 null ] ->> -endobj -396 0 obj -<< -/D [ 78 0 R /XYZ 98 666 null ] ->> -endobj -397 0 obj -<< -/D [ 78 0 R /XYZ 98 633 null ] ->> -endobj -398 0 obj -<< -/D [ 78 0 R /XYZ 98 525 null ] ->> -endobj -399 0 obj -<< -/D [ 78 0 R /XYZ 98 216 null ] ->> -endobj -400 0 obj -<< -/D [ 82 0 R /XYZ null null null ] ->> -endobj -401 0 obj -<< -/D [ 82 0 R /XYZ 107 695 null ] ->> -endobj -402 0 obj -<< -/D [ 82 0 R /XYZ 107 110 null ] ->> -endobj -403 0 obj -<< -/D [ 82 0 R /XYZ 107 666 null ] ->> -endobj -404 0 obj -<< -/D [ 82 0 R /XYZ 107 621 null ] ->> -endobj -405 0 obj -<< -/D [ 82 0 R /XYZ 107 600 null ] ->> -endobj -406 0 obj -<< -/D [ 82 0 R /XYZ 107 540 null ] ->> -endobj -407 0 obj -<< -/D [ 82 0 R /XYZ 107 519 null ] ->> -endobj -408 0 obj -<< -/D [ 82 0 R /XYZ 107 485 null ] ->> -endobj -409 0 obj -<< -/D [ 1786 0 R /XYZ null null null ] ->> -endobj -410 0 obj -<< -/D [ 1786 0 R /XYZ null null null ] ->> -endobj -411 0 obj -<< -/D [ 86 0 R /XYZ null null null ] ->> -endobj -412 0 obj -<< -/D [ 86 0 R /XYZ 513 701 null ] ->> -endobj -413 0 obj -<< -/D [ 86 0 R /XYZ 513 701 null ] ->> -endobj -414 0 obj -<< -/D [ 86 0 R /XYZ 107 641 null ] ->> -endobj -415 0 obj -<< -/D [ 86 0 R /XYZ 107 641 null ] ->> -endobj -416 0 obj -<< -/D [ 86 0 R /XYZ 107 110 null ] ->> -endobj -417 0 obj -<< -/D [ 86 0 R /XYZ 464 717 null ] ->> -endobj -418 0 obj -<< -/D [ 86 0 R /XYZ 107 640 null ] ->> -endobj -419 0 obj -<< -/D [ 86 0 R /XYZ 107 579 null ] ->> -endobj -420 0 obj -<< -/D [ 86 0 R /XYZ 107 531 null ] ->> -endobj -421 0 obj -<< -/D [ 86 0 R /XYZ 107 510 null ] ->> -endobj -422 0 obj -<< -/D [ 86 0 R /XYZ 107 470 null ] ->> -endobj -423 0 obj -<< -/D [ 86 0 R /XYZ 107 454 null ] ->> -endobj -424 0 obj -<< -/D [ 86 0 R /XYZ 107 438 null ] ->> -endobj -425 0 obj -<< -/D [ 86 0 R /XYZ 107 422 null ] ->> -endobj -426 0 obj -<< -/D [ 86 0 R /XYZ 107 400 null ] ->> -endobj -427 0 obj -<< -/D [ 86 0 R /XYZ 107 366 null ] ->> -endobj -428 0 obj -<< -/D [ 86 0 R /XYZ 107 318 null ] ->> -endobj -429 0 obj -<< -/D [ 86 0 R /XYZ 107 297 null ] ->> -endobj -430 0 obj -<< -/D [ 86 0 R /XYZ 107 245 null ] ->> -endobj -431 0 obj -<< -/D [ 86 0 R /XYZ 107 229 null ] ->> -endobj -432 0 obj -<< -/D [ 86 0 R /XYZ 107 213 null ] ->> -endobj -433 0 obj -<< -/D [ 86 0 R /XYZ 107 197 null ] ->> -endobj -434 0 obj -<< -/D [ 90 0 R /XYZ null null null ] ->> -endobj -435 0 obj -<< -/D [ 90 0 R /XYZ 98 695 null ] ->> -endobj -436 0 obj -<< -/D [ 90 0 R /XYZ 98 110 null ] ->> -endobj -437 0 obj -<< -/D [ 90 0 R /XYZ 98 665 null ] ->> -endobj -438 0 obj -<< -/D [ 90 0 R /XYZ 98 644 null ] ->> -endobj -439 0 obj -<< -/D [ 90 0 R /XYZ 98 604 null ] ->> -endobj -440 0 obj -<< -/D [ 90 0 R /XYZ 98 576 null ] ->> -endobj -441 0 obj -<< -/D [ 90 0 R /XYZ 98 554 null ] ->> -endobj -442 0 obj -<< -/D [ 90 0 R /XYZ 98 520 null ] ->> -endobj -443 0 obj -<< -/D [ 90 0 R /XYZ 98 412 null ] ->> -endobj -444 0 obj -<< -/D [ 90 0 R /XYZ 98 391 null ] ->> -endobj -445 0 obj -<< -/D [ 90 0 R /XYZ 98 345 null ] ->> -endobj -446 0 obj -<< -/D [ 94 0 R /XYZ null null null ] ->> -endobj -447 0 obj -<< -/D [ 94 0 R /XYZ 513 701 null ] ->> -endobj -448 0 obj -<< -/D [ 94 0 R /XYZ 513 701 null ] ->> -endobj -449 0 obj -<< -/D [ 94 0 R /XYZ 107 110 null ] ->> -endobj -450 0 obj -<< -/D [ 94 0 R /XYZ 464 717 null ] ->> -endobj -451 0 obj -<< -/D [ 94 0 R /XYZ 107 640 null ] ->> -endobj -452 0 obj -<< -/D [ 94 0 R /XYZ 107 579 null ] ->> -endobj -453 0 obj -<< -/D [ 94 0 R /XYZ 107 527 null ] ->> -endobj -454 0 obj -<< -/D [ 94 0 R /XYZ 107 511 null ] ->> -endobj -455 0 obj -<< -/D [ 94 0 R /XYZ 107 495 null ] ->> -endobj -456 0 obj -<< -/D [ 94 0 R /XYZ 107 471 null ] ->> -endobj -457 0 obj -<< -/D [ 94 0 R /XYZ 107 450 null ] ->> -endobj -458 0 obj -<< -/D [ 94 0 R /XYZ 107 404 null ] ->> -endobj -459 0 obj -<< -/D [ 94 0 R /XYZ 107 381 null ] ->> -endobj -460 0 obj -<< -/D [ 94 0 R /XYZ 107 368 null ] ->> -endobj -461 0 obj -<< -/D [ 94 0 R /XYZ 107 336 null ] ->> -endobj -462 0 obj -<< -/D [ 94 0 R /XYZ 208 336 null ] ->> -endobj -463 0 obj -<< -/D [ 94 0 R /XYZ 310 336 null ] ->> -endobj -464 0 obj -<< -/D [ 94 0 R /XYZ 411 348 null ] ->> -endobj -465 0 obj -<< -/D [ 94 0 R /XYZ 107 317 null ] ->> -endobj -466 0 obj -<< -/D [ 94 0 R /XYZ 208 317 null ] ->> -endobj -467 0 obj -<< -/D [ 94 0 R /XYZ 310 317 null ] ->> -endobj -468 0 obj -<< -/D [ 94 0 R /XYZ 411 317 null ] ->> -endobj -469 0 obj -<< -/D [ 94 0 R /XYZ 107 298 null ] ->> -endobj -470 0 obj -<< -/D [ 94 0 R /XYZ 208 298 null ] ->> -endobj -471 0 obj -<< -/D [ 94 0 R /XYZ 310 298 null ] ->> -endobj -472 0 obj -<< -/D [ 94 0 R /XYZ 411 298 null ] ->> -endobj -473 0 obj -<< -/D [ 94 0 R /XYZ 107 279 null ] ->> -endobj -474 0 obj -<< -/D [ 94 0 R /XYZ 208 279 null ] ->> -endobj -475 0 obj -<< -/D [ 94 0 R /XYZ 310 279 null ] ->> -endobj -476 0 obj -<< -/D [ 94 0 R /XYZ 411 279 null ] ->> -endobj -477 0 obj -<< -/D [ 98 0 R /XYZ 355 669 null ] ->> -endobj -478 0 obj -<< -/D [ 98 0 R /XYZ 98 695 null ] ->> -endobj -479 0 obj -<< -/D [ 98 0 R /XYZ 98 110 null ] ->> -endobj -480 0 obj -<< -/D [ 98 0 R /XYZ 98 663 null ] ->> -endobj -481 0 obj -<< -/D [ 98 0 R /XYZ 98 305 null ] ->> -endobj -482 0 obj -<< -/D [ 98 0 R /XYZ 98 285 null ] ->> -endobj -483 0 obj -<< -/D [ 102 0 R /XYZ 364 669 null ] ->> -endobj -484 0 obj -<< -/D [ 102 0 R /XYZ 107 695 null ] ->> -endobj -485 0 obj -<< -/D [ 102 0 R /XYZ 107 110 null ] ->> -endobj -486 0 obj -<< -/D [ 102 0 R /XYZ 107 663 null ] ->> -endobj -487 0 obj -<< -/D [ 102 0 R /XYZ 107 229 null ] ->> -endobj -488 0 obj -<< -/D [ 102 0 R /XYZ 107 208 null ] ->> -endobj -489 0 obj -<< -/D [ 1769 0 R /XYZ null null null ] ->> -endobj -490 0 obj -<< -/D [ 106 0 R /XYZ null null null ] ->> -endobj -491 0 obj -<< -/D [ 106 0 R /XYZ 513 701 null ] ->> -endobj -492 0 obj -<< -/D [ 106 0 R /XYZ 513 701 null ] ->> -endobj -493 0 obj -<< -/D [ 106 0 R /XYZ 107 110 null ] ->> -endobj -494 0 obj -<< -/D [ 106 0 R /XYZ 464 717 null ] ->> -endobj -495 0 obj -<< -/D [ 106 0 R /XYZ 107 640 null ] ->> -endobj -496 0 obj -<< -/D [ 106 0 R /XYZ 107 579 null ] ->> -endobj -497 0 obj -<< -/D [ 106 0 R /XYZ 107 553 null ] ->> -endobj -498 0 obj -<< -/D [ 106 0 R /XYZ 215 491 null ] ->> -endobj -499 0 obj -<< -/D [ 106 0 R /XYZ 215 485 null ] ->> -endobj -500 0 obj -<< -/D [ 106 0 R /XYZ 215 465 null ] ->> -endobj -501 0 obj -<< -/D [ 106 0 R /XYZ 364 465 null ] ->> -endobj -502 0 obj -<< -/D [ 106 0 R /XYZ 215 446 null ] ->> -endobj -503 0 obj -<< -/D [ 106 0 R /XYZ 364 446 null ] ->> -endobj -504 0 obj -<< -/D [ 106 0 R /XYZ 215 427 null ] ->> -endobj -505 0 obj -<< -/D [ 106 0 R /XYZ 364 427 null ] ->> -endobj -506 0 obj -<< -/D [ 106 0 R /XYZ 215 408 null ] ->> -endobj -507 0 obj -<< -/D [ 106 0 R /XYZ 364 408 null ] ->> -endobj -508 0 obj -<< -/D [ 106 0 R /XYZ 215 389 null ] ->> -endobj -509 0 obj -<< -/D [ 106 0 R /XYZ 364 389 null ] ->> -endobj -510 0 obj -<< -/D [ 106 0 R /XYZ 215 370 null ] ->> -endobj -511 0 obj -<< -/D [ 106 0 R /XYZ 364 370 null ] ->> -endobj -512 0 obj -<< -/D [ 106 0 R /XYZ 215 351 null ] ->> -endobj -513 0 obj -<< -/D [ 106 0 R /XYZ 364 351 null ] ->> -endobj -514 0 obj -<< -/D [ 106 0 R /XYZ 215 332 null ] ->> -endobj -515 0 obj -<< -/D [ 106 0 R /XYZ 364 332 null ] ->> -endobj -516 0 obj -<< -/D [ 106 0 R /XYZ 215 313 null ] ->> -endobj -517 0 obj -<< -/D [ 106 0 R /XYZ 364 313 null ] ->> -endobj -518 0 obj -<< -/D [ 106 0 R /XYZ 215 294 null ] ->> -endobj -519 0 obj -<< -/D [ 106 0 R /XYZ 364 294 null ] ->> -endobj -520 0 obj -<< -/D [ 106 0 R /XYZ 215 275 null ] ->> -endobj -521 0 obj -<< -/D [ 106 0 R /XYZ 364 275 null ] ->> -endobj -522 0 obj -<< -/D [ 106 0 R /XYZ 215 256 null ] ->> -endobj -523 0 obj -<< -/D [ 106 0 R /XYZ 364 256 null ] ->> -endobj -524 0 obj -<< -/D [ 106 0 R /XYZ 215 237 null ] ->> -endobj -525 0 obj -<< -/D [ 106 0 R /XYZ 364 237 null ] ->> -endobj -526 0 obj -<< -/D [ 106 0 R /XYZ 215 218 null ] ->> -endobj -527 0 obj -<< -/D [ 106 0 R /XYZ 364 218 null ] ->> -endobj -528 0 obj -<< -/D [ 106 0 R /XYZ 215 199 null ] ->> -endobj -529 0 obj -<< -/D [ 106 0 R /XYZ 364 199 null ] ->> -endobj -530 0 obj -<< -/D [ 106 0 R /XYZ 215 180 null ] ->> -endobj -531 0 obj -<< -/D [ 106 0 R /XYZ 364 180 null ] ->> -endobj -532 0 obj -<< -/D [ 106 0 R /XYZ 215 161 null ] ->> -endobj -533 0 obj -<< -/D [ 106 0 R /XYZ 364 161 null ] ->> -endobj -534 0 obj -<< -/D [ 110 0 R /XYZ null null null ] ->> -endobj -535 0 obj -<< -/D [ 110 0 R /XYZ 98 695 null ] ->> -endobj -536 0 obj -<< -/D [ 110 0 R /XYZ 98 110 null ] ->> -endobj -537 0 obj -<< -/D [ 110 0 R /XYZ 98 361 null ] ->> -endobj -538 0 obj -<< -/D [ 110 0 R /XYZ 206 616 null ] ->> -endobj -539 0 obj -<< -/D [ 110 0 R /XYZ 355 616 null ] ->> -endobj -540 0 obj -<< -/D [ 110 0 R /XYZ 206 597 null ] ->> -endobj -541 0 obj -<< -/D [ 110 0 R /XYZ 355 597 null ] ->> -endobj -542 0 obj -<< -/D [ 110 0 R /XYZ 206 578 null ] ->> -endobj -543 0 obj -<< -/D [ 110 0 R /XYZ 355 578 null ] ->> -endobj -544 0 obj -<< -/D [ 110 0 R /XYZ 206 559 null ] ->> -endobj -545 0 obj -<< -/D [ 110 0 R /XYZ 355 559 null ] ->> -endobj -546 0 obj -<< -/D [ 110 0 R /XYZ 206 540 null ] ->> -endobj -547 0 obj -<< -/D [ 110 0 R /XYZ 355 540 null ] ->> -endobj -548 0 obj -<< -/D [ 110 0 R /XYZ 206 521 null ] ->> -endobj -549 0 obj -<< -/D [ 110 0 R /XYZ 355 521 null ] ->> -endobj -550 0 obj -<< -/D [ 110 0 R /XYZ 206 502 null ] ->> -endobj -551 0 obj -<< -/D [ 110 0 R /XYZ 355 502 null ] ->> -endobj -552 0 obj -<< -/D [ 110 0 R /XYZ 206 483 null ] ->> -endobj -553 0 obj -<< -/D [ 110 0 R /XYZ 355 483 null ] ->> -endobj -554 0 obj -<< -/D [ 110 0 R /XYZ 206 464 null ] ->> -endobj -555 0 obj -<< -/D [ 110 0 R /XYZ 355 464 null ] ->> -endobj -556 0 obj -<< -/D [ 110 0 R /XYZ 206 445 null ] ->> -endobj -557 0 obj -<< -/D [ 110 0 R /XYZ 355 445 null ] ->> -endobj -558 0 obj -<< -/D [ 110 0 R /XYZ 206 426 null ] ->> -endobj -559 0 obj -<< -/D [ 110 0 R /XYZ 355 426 null ] ->> -endobj -560 0 obj -<< -/D [ 110 0 R /XYZ 206 407 null ] ->> -endobj -561 0 obj -<< -/D [ 110 0 R /XYZ 355 407 null ] ->> -endobj -562 0 obj -<< -/D [ 110 0 R /XYZ 206 388 null ] ->> -endobj -563 0 obj -<< -/D [ 110 0 R /XYZ 355 388 null ] ->> -endobj -564 0 obj -<< -/D [ 114 0 R /XYZ null null null ] ->> -endobj -565 0 obj -<< -/D [ 114 0 R /XYZ 513 701 null ] ->> -endobj -566 0 obj -<< -/D [ 114 0 R /XYZ 513 701 null ] ->> -endobj -567 0 obj -<< -/D [ 114 0 R /XYZ 364 506 null ] ->> -endobj -568 0 obj -<< -/D [ 114 0 R /XYZ 107 110 null ] ->> -endobj -569 0 obj -<< -/D [ 114 0 R /XYZ 464 717 null ] ->> -endobj -570 0 obj -<< -/D [ 114 0 R /XYZ 107 640 null ] ->> -endobj -571 0 obj -<< -/D [ 114 0 R /XYZ 107 581 null ] ->> -endobj -572 0 obj -<< -/D [ 114 0 R /XYZ 107 560 null ] ->> -endobj -573 0 obj -<< -/D [ 114 0 R /XYZ 107 500 null ] ->> -endobj -574 0 obj -<< -/D [ 114 0 R /XYZ 107 337 null ] ->> -endobj -575 0 obj -<< -/D [ 118 0 R /XYZ 265 632 null ] ->> -endobj -576 0 obj -<< -/D [ 118 0 R /XYZ 265 632 null ] ->> -endobj -577 0 obj -<< -/D [ 118 0 R /XYZ 98 695 null ] ->> -endobj -578 0 obj -<< -/D [ 118 0 R /XYZ 98 110 null ] ->> -endobj -579 0 obj -<< -/D [ 118 0 R /XYZ 98 665 null ] ->> -endobj -580 0 obj -<< -/D [ 118 0 R /XYZ 98 644 null ] ->> -endobj -581 0 obj -<< -/D [ 118 0 R /XYZ 98 632 null ] ->> -endobj -582 0 obj -<< -/D [ 118 0 R /XYZ 98 626 null ] ->> -endobj -583 0 obj -<< -/D [ 118 0 R /XYZ 98 594 null ] ->> -endobj -584 0 obj -<< -/D [ 118 0 R /XYZ 272 594 null ] ->> -endobj -585 0 obj -<< -/D [ 118 0 R /XYZ 330 606 null ] ->> -endobj -586 0 obj -<< -/D [ 118 0 R /XYZ 98 563 null ] ->> -endobj -587 0 obj -<< -/D [ 118 0 R /XYZ 156 575 null ] ->> -endobj -588 0 obj -<< -/D [ 118 0 R /XYZ 214 575 null ] ->> -endobj -589 0 obj -<< -/D [ 118 0 R /XYZ 272 563 null ] ->> -endobj -590 0 obj -<< -/D [ 118 0 R /XYZ 330 563 null ] ->> -endobj -591 0 obj -<< -/D [ 118 0 R /XYZ 387 575 null ] ->> -endobj -592 0 obj -<< -/D [ 118 0 R /XYZ 445 575 null ] ->> -endobj -593 0 obj -<< -/D [ 118 0 R /XYZ 98 532 null ] ->> -endobj -594 0 obj -<< -/D [ 118 0 R /XYZ 156 532 null ] ->> -endobj -595 0 obj -<< -/D [ 118 0 R /XYZ 214 532 null ] ->> -endobj -596 0 obj -<< -/D [ 118 0 R /XYZ 272 532 null ] ->> -endobj -597 0 obj -<< -/D [ 118 0 R /XYZ 330 532 null ] ->> -endobj -598 0 obj -<< -/D [ 118 0 R /XYZ 387 532 null ] ->> -endobj -599 0 obj -<< -/D [ 118 0 R /XYZ 445 532 null ] ->> -endobj -600 0 obj -<< -/D [ 118 0 R /XYZ 98 501 null ] ->> -endobj -601 0 obj -<< -/D [ 118 0 R /XYZ 156 501 null ] ->> -endobj -602 0 obj -<< -/D [ 118 0 R /XYZ 214 501 null ] ->> -endobj -603 0 obj -<< -/D [ 118 0 R /XYZ 272 501 null ] ->> -endobj -604 0 obj -<< -/D [ 118 0 R /XYZ 330 501 null ] ->> -endobj -605 0 obj -<< -/D [ 118 0 R /XYZ 387 501 null ] ->> -endobj -606 0 obj -<< -/D [ 118 0 R /XYZ 445 501 null ] ->> -endobj -607 0 obj -<< -/D [ 118 0 R /XYZ 98 470 null ] ->> -endobj -608 0 obj -<< -/D [ 118 0 R /XYZ 156 470 null ] ->> -endobj -609 0 obj -<< -/D [ 118 0 R /XYZ 214 470 null ] ->> -endobj -610 0 obj -<< -/D [ 118 0 R /XYZ 272 470 null ] ->> -endobj -611 0 obj -<< -/D [ 118 0 R /XYZ 330 470 null ] ->> -endobj -612 0 obj -<< -/D [ 118 0 R /XYZ 387 470 null ] ->> -endobj -613 0 obj -<< -/D [ 118 0 R /XYZ 445 470 null ] ->> -endobj -614 0 obj -<< -/D [ 118 0 R /XYZ 98 451 null ] ->> -endobj -615 0 obj -<< -/D [ 118 0 R /XYZ 156 451 null ] ->> -endobj -616 0 obj -<< -/D [ 118 0 R /XYZ 214 451 null ] ->> -endobj -617 0 obj -<< -/D [ 118 0 R /XYZ 272 451 null ] ->> -endobj -618 0 obj -<< -/D [ 118 0 R /XYZ 330 451 null ] ->> -endobj -619 0 obj -<< -/D [ 118 0 R /XYZ 387 451 null ] ->> -endobj -620 0 obj -<< -/D [ 118 0 R /XYZ 445 451 null ] ->> -endobj -621 0 obj -<< -/D [ 118 0 R /XYZ 98 432 null ] ->> -endobj -622 0 obj -<< -/D [ 118 0 R /XYZ 156 432 null ] ->> -endobj -623 0 obj -<< -/D [ 118 0 R /XYZ 214 432 null ] ->> -endobj -624 0 obj -<< -/D [ 118 0 R /XYZ 272 432 null ] ->> -endobj -625 0 obj -<< -/D [ 118 0 R /XYZ 330 432 null ] ->> -endobj -626 0 obj -<< -/D [ 118 0 R /XYZ 387 432 null ] ->> -endobj -627 0 obj -<< -/D [ 118 0 R /XYZ 445 432 null ] ->> -endobj -628 0 obj -<< -/D [ 118 0 R /XYZ 98 413 null ] ->> -endobj -629 0 obj -<< -/D [ 118 0 R /XYZ 156 413 null ] ->> -endobj -630 0 obj -<< -/D [ 118 0 R /XYZ 214 413 null ] ->> -endobj -631 0 obj -<< -/D [ 118 0 R /XYZ 272 413 null ] ->> -endobj -632 0 obj -<< -/D [ 118 0 R /XYZ 330 413 null ] ->> -endobj -633 0 obj -<< -/D [ 118 0 R /XYZ 387 413 null ] ->> -endobj -634 0 obj -<< -/D [ 118 0 R /XYZ 445 413 null ] ->> -endobj -635 0 obj -<< -/D [ 118 0 R /XYZ 98 394 null ] ->> -endobj -636 0 obj -<< -/D [ 118 0 R /XYZ 156 394 null ] ->> -endobj -637 0 obj -<< -/D [ 118 0 R /XYZ 214 394 null ] ->> -endobj -638 0 obj -<< -/D [ 118 0 R /XYZ 272 394 null ] ->> -endobj -639 0 obj -<< -/D [ 118 0 R /XYZ 330 394 null ] ->> -endobj -640 0 obj -<< -/D [ 118 0 R /XYZ 387 394 null ] ->> -endobj -641 0 obj -<< -/D [ 118 0 R /XYZ 445 394 null ] ->> -endobj -642 0 obj -<< -/D [ 118 0 R /XYZ 98 375 null ] ->> -endobj -643 0 obj -<< -/D [ 118 0 R /XYZ 156 375 null ] ->> -endobj -644 0 obj -<< -/D [ 118 0 R /XYZ 214 375 null ] ->> -endobj -645 0 obj -<< -/D [ 118 0 R /XYZ 272 375 null ] ->> -endobj -646 0 obj -<< -/D [ 118 0 R /XYZ 330 375 null ] ->> -endobj -647 0 obj -<< -/D [ 118 0 R /XYZ 387 375 null ] ->> -endobj -648 0 obj -<< -/D [ 118 0 R /XYZ 445 375 null ] ->> -endobj -649 0 obj -<< -/D [ 118 0 R /XYZ 98 356 null ] ->> -endobj -650 0 obj -<< -/D [ 118 0 R /XYZ 156 356 null ] ->> -endobj -651 0 obj -<< -/D [ 118 0 R /XYZ 214 356 null ] ->> -endobj -652 0 obj -<< -/D [ 118 0 R /XYZ 272 356 null ] ->> -endobj -653 0 obj -<< -/D [ 118 0 R /XYZ 330 356 null ] ->> -endobj -654 0 obj -<< -/D [ 118 0 R /XYZ 387 356 null ] ->> -endobj -655 0 obj -<< -/D [ 118 0 R /XYZ 445 356 null ] ->> -endobj -656 0 obj -<< -/D [ 118 0 R /XYZ 98 337 null ] ->> -endobj -657 0 obj -<< -/D [ 118 0 R /XYZ 156 337 null ] ->> -endobj -658 0 obj -<< -/D [ 118 0 R /XYZ 214 337 null ] ->> -endobj -659 0 obj -<< -/D [ 118 0 R /XYZ 272 337 null ] ->> -endobj -660 0 obj -<< -/D [ 118 0 R /XYZ 330 337 null ] ->> -endobj -661 0 obj -<< -/D [ 118 0 R /XYZ 387 337 null ] ->> -endobj -662 0 obj -<< -/D [ 118 0 R /XYZ 445 337 null ] ->> -endobj -663 0 obj -<< -/D [ 118 0 R /XYZ 98 318 null ] ->> -endobj -664 0 obj -<< -/D [ 118 0 R /XYZ 156 318 null ] ->> -endobj -665 0 obj -<< -/D [ 118 0 R /XYZ 214 318 null ] ->> -endobj -666 0 obj -<< -/D [ 118 0 R /XYZ 272 318 null ] ->> -endobj -667 0 obj -<< -/D [ 118 0 R /XYZ 330 318 null ] ->> -endobj -668 0 obj -<< -/D [ 118 0 R /XYZ 387 318 null ] ->> -endobj -669 0 obj -<< -/D [ 118 0 R /XYZ 445 318 null ] ->> -endobj -670 0 obj -<< -/D [ 118 0 R /XYZ 98 299 null ] ->> -endobj -671 0 obj -<< -/D [ 118 0 R /XYZ 156 299 null ] ->> -endobj -672 0 obj -<< -/D [ 118 0 R /XYZ 214 299 null ] ->> -endobj -673 0 obj -<< -/D [ 118 0 R /XYZ 272 299 null ] ->> -endobj -674 0 obj -<< -/D [ 118 0 R /XYZ 330 299 null ] ->> -endobj -675 0 obj -<< -/D [ 118 0 R /XYZ 387 299 null ] ->> -endobj -676 0 obj -<< -/D [ 118 0 R /XYZ 445 299 null ] ->> -endobj -677 0 obj -<< -/D [ 118 0 R /XYZ 98 280 null ] ->> -endobj -678 0 obj -<< -/D [ 118 0 R /XYZ 156 280 null ] ->> -endobj -679 0 obj -<< -/D [ 118 0 R /XYZ 214 280 null ] ->> -endobj -680 0 obj -<< -/D [ 118 0 R /XYZ 272 280 null ] ->> -endobj -681 0 obj -<< -/D [ 118 0 R /XYZ 330 280 null ] ->> -endobj -682 0 obj -<< -/D [ 118 0 R /XYZ 387 280 null ] ->> -endobj -683 0 obj -<< -/D [ 118 0 R /XYZ 445 280 null ] ->> -endobj -684 0 obj -<< -/D [ 118 0 R /XYZ 98 261 null ] ->> -endobj -685 0 obj -<< -/D [ 118 0 R /XYZ 156 261 null ] ->> -endobj -686 0 obj -<< -/D [ 118 0 R /XYZ 214 261 null ] ->> -endobj -687 0 obj -<< -/D [ 118 0 R /XYZ 272 261 null ] ->> -endobj -688 0 obj -<< -/D [ 118 0 R /XYZ 330 261 null ] ->> -endobj -689 0 obj -<< -/D [ 118 0 R /XYZ 387 261 null ] ->> -endobj -690 0 obj -<< -/D [ 118 0 R /XYZ 445 261 null ] ->> -endobj -691 0 obj -<< -/D [ 118 0 R /XYZ 98 242 null ] ->> -endobj -692 0 obj -<< -/D [ 118 0 R /XYZ 156 242 null ] ->> -endobj -693 0 obj -<< -/D [ 118 0 R /XYZ 214 242 null ] ->> -endobj -694 0 obj -<< -/D [ 118 0 R /XYZ 272 242 null ] ->> -endobj -695 0 obj -<< -/D [ 118 0 R /XYZ 330 242 null ] ->> -endobj -696 0 obj -<< -/D [ 118 0 R /XYZ 387 242 null ] ->> -endobj -697 0 obj -<< -/D [ 118 0 R /XYZ 445 242 null ] ->> -endobj -698 0 obj -<< -/D [ 118 0 R /XYZ 98 223 null ] ->> -endobj -699 0 obj -<< -/D [ 118 0 R /XYZ 156 223 null ] ->> -endobj -700 0 obj -<< -/D [ 118 0 R /XYZ 214 223 null ] ->> -endobj -701 0 obj -<< -/D [ 118 0 R /XYZ 272 223 null ] ->> -endobj -702 0 obj -<< -/D [ 118 0 R /XYZ 330 223 null ] ->> -endobj -703 0 obj -<< -/D [ 118 0 R /XYZ 387 223 null ] ->> -endobj -704 0 obj -<< -/D [ 118 0 R /XYZ 445 223 null ] ->> -endobj -705 0 obj -<< -/D [ 118 0 R /XYZ 98 204 null ] ->> -endobj -706 0 obj -<< -/D [ 118 0 R /XYZ 156 204 null ] ->> -endobj -707 0 obj -<< -/D [ 118 0 R /XYZ 214 204 null ] ->> -endobj -708 0 obj -<< -/D [ 118 0 R /XYZ 272 204 null ] ->> -endobj -709 0 obj -<< -/D [ 118 0 R /XYZ 330 204 null ] ->> -endobj -710 0 obj -<< -/D [ 118 0 R /XYZ 387 204 null ] ->> -endobj -711 0 obj -<< -/D [ 118 0 R /XYZ 445 204 null ] ->> -endobj -712 0 obj -<< -/D [ 118 0 R /XYZ 98 185 null ] ->> -endobj -713 0 obj -<< -/D [ 118 0 R /XYZ 156 185 null ] ->> -endobj -714 0 obj -<< -/D [ 118 0 R /XYZ 214 185 null ] ->> -endobj -715 0 obj -<< -/D [ 118 0 R /XYZ 272 185 null ] ->> -endobj -716 0 obj -<< -/D [ 118 0 R /XYZ 330 185 null ] ->> -endobj -717 0 obj -<< -/D [ 118 0 R /XYZ 387 185 null ] ->> -endobj -718 0 obj -<< -/D [ 118 0 R /XYZ 445 185 null ] ->> -endobj -719 0 obj -<< -/D [ 118 0 R /XYZ 98 166 null ] ->> -endobj -720 0 obj -<< -/D [ 118 0 R /XYZ 156 166 null ] ->> -endobj -721 0 obj -<< -/D [ 118 0 R /XYZ 214 166 null ] ->> -endobj -722 0 obj -<< -/D [ 118 0 R /XYZ 272 166 null ] ->> -endobj -723 0 obj -<< -/D [ 118 0 R /XYZ 330 166 null ] ->> -endobj -724 0 obj -<< -/D [ 118 0 R /XYZ 387 166 null ] ->> -endobj -725 0 obj -<< -/D [ 118 0 R /XYZ 445 166 null ] ->> -endobj -726 0 obj -<< -/D [ 118 0 R /XYZ 98 147 null ] ->> -endobj -727 0 obj -<< -/D [ 118 0 R /XYZ 156 147 null ] ->> -endobj -728 0 obj -<< -/D [ 118 0 R /XYZ 214 147 null ] ->> -endobj -729 0 obj -<< -/D [ 118 0 R /XYZ 272 147 null ] ->> -endobj -730 0 obj -<< -/D [ 118 0 R /XYZ 330 147 null ] ->> -endobj -731 0 obj -<< -/D [ 118 0 R /XYZ 387 147 null ] ->> -endobj -732 0 obj -<< -/D [ 118 0 R /XYZ 445 147 null ] ->> -endobj -733 0 obj -<< -/D [ 122 0 R /XYZ 107 695 null ] ->> -endobj -734 0 obj -<< -/D [ 122 0 R /XYZ 107 110 null ] ->> -endobj -735 0 obj -<< -/D [ 122 0 R /XYZ 107 398 null ] ->> -endobj -736 0 obj -<< -/D [ 122 0 R /XYZ 107 377 null ] ->> -endobj -737 0 obj -<< -/D [ 122 0 R /XYZ 107 279 null ] ->> -endobj -738 0 obj -<< -/D [ 122 0 R /XYZ 107 229 null ] ->> -endobj -739 0 obj -<< -/D [ 122 0 R /XYZ 107 561 null ] ->> -endobj -740 0 obj -<< -/D [ 122 0 R /XYZ 165 561 null ] ->> -endobj -741 0 obj -<< -/D [ 122 0 R /XYZ 223 561 null ] ->> -endobj -742 0 obj -<< -/D [ 122 0 R /XYZ 281 561 null ] ->> -endobj -743 0 obj -<< -/D [ 122 0 R /XYZ 339 561 null ] ->> -endobj -744 0 obj -<< -/D [ 122 0 R /XYZ 396 561 null ] ->> -endobj -745 0 obj -<< -/D [ 122 0 R /XYZ 454 561 null ] ->> -endobj -746 0 obj -<< -/D [ 122 0 R /XYZ 107 542 null ] ->> -endobj -747 0 obj -<< -/D [ 122 0 R /XYZ 165 542 null ] ->> -endobj -748 0 obj -<< -/D [ 122 0 R /XYZ 223 542 null ] ->> -endobj -749 0 obj -<< -/D [ 122 0 R /XYZ 281 542 null ] ->> -endobj -750 0 obj -<< -/D [ 122 0 R /XYZ 339 542 null ] ->> -endobj -751 0 obj -<< -/D [ 122 0 R /XYZ 396 542 null ] ->> -endobj -752 0 obj -<< -/D [ 122 0 R /XYZ 454 542 null ] ->> -endobj -753 0 obj -<< -/D [ 122 0 R /XYZ 107 523 null ] ->> -endobj -754 0 obj -<< -/D [ 122 0 R /XYZ 165 523 null ] ->> -endobj -755 0 obj -<< -/D [ 122 0 R /XYZ 223 523 null ] ->> -endobj -756 0 obj -<< -/D [ 122 0 R /XYZ 281 523 null ] ->> -endobj -757 0 obj -<< -/D [ 122 0 R /XYZ 339 523 null ] ->> -endobj -758 0 obj -<< -/D [ 122 0 R /XYZ 396 523 null ] ->> -endobj -759 0 obj -<< -/D [ 122 0 R /XYZ 454 523 null ] ->> -endobj -760 0 obj -<< -/D [ 122 0 R /XYZ 107 504 null ] ->> -endobj -761 0 obj -<< -/D [ 122 0 R /XYZ 165 504 null ] ->> -endobj -762 0 obj -<< -/D [ 122 0 R /XYZ 223 504 null ] ->> -endobj -763 0 obj -<< -/D [ 122 0 R /XYZ 281 504 null ] ->> -endobj -764 0 obj -<< -/D [ 122 0 R /XYZ 339 504 null ] ->> -endobj -765 0 obj -<< -/D [ 122 0 R /XYZ 396 504 null ] ->> -endobj -766 0 obj -<< -/D [ 122 0 R /XYZ 454 504 null ] ->> -endobj -767 0 obj -<< -/D [ 122 0 R /XYZ 107 485 null ] ->> -endobj -768 0 obj -<< -/D [ 122 0 R /XYZ 165 485 null ] ->> -endobj -769 0 obj -<< -/D [ 122 0 R /XYZ 223 485 null ] ->> -endobj -770 0 obj -<< -/D [ 122 0 R /XYZ 281 485 null ] ->> -endobj -771 0 obj -<< -/D [ 122 0 R /XYZ 339 485 null ] ->> -endobj -772 0 obj -<< -/D [ 122 0 R /XYZ 396 485 null ] ->> -endobj -773 0 obj -<< -/D [ 122 0 R /XYZ 454 485 null ] ->> -endobj -774 0 obj -<< -/D [ 122 0 R /XYZ 107 466 null ] ->> -endobj -775 0 obj -<< -/D [ 122 0 R /XYZ 165 466 null ] ->> -endobj -776 0 obj -<< -/D [ 122 0 R /XYZ 223 466 null ] ->> -endobj -777 0 obj -<< -/D [ 122 0 R /XYZ 281 466 null ] ->> -endobj -778 0 obj -<< -/D [ 122 0 R /XYZ 339 466 null ] ->> -endobj -779 0 obj -<< -/D [ 122 0 R /XYZ 396 466 null ] ->> -endobj -780 0 obj -<< -/D [ 122 0 R /XYZ 454 466 null ] ->> -endobj -781 0 obj -<< -/D [ 122 0 R /XYZ 107 435 null ] ->> -endobj -782 0 obj -<< -/D [ 122 0 R /XYZ 165 435 null ] ->> -endobj -783 0 obj -<< -/D [ 122 0 R /XYZ 223 435 null ] ->> -endobj -784 0 obj -<< -/D [ 122 0 R /XYZ 281 435 null ] ->> -endobj -785 0 obj -<< -/D [ 122 0 R /XYZ 339 435 null ] ->> -endobj -786 0 obj -<< -/D [ 122 0 R /XYZ 396 435 null ] ->> -endobj -787 0 obj -<< -/D [ 122 0 R /XYZ 454 435 null ] ->> -endobj -788 0 obj -<< -/D [ 1721 0 R /XYZ null null null ] ->> -endobj -789 0 obj -<< -/D [ 126 0 R /XYZ null null null ] ->> -endobj -790 0 obj -<< -/D [ 126 0 R /XYZ 107 110 null ] ->> -endobj -791 0 obj -<< -/D [ 126 0 R /XYZ 464 717 null ] ->> -endobj -792 0 obj -<< -/D [ 126 0 R /XYZ 107 640 null ] ->> -endobj -793 0 obj -<< -/D [ 126 0 R /XYZ 107 579 null ] ->> -endobj -794 0 obj -<< -/D [ 126 0 R /XYZ 107 495 null ] ->> -endobj -795 0 obj -<< -/D [ 126 0 R /XYZ 107 246 null ] ->> -endobj -796 0 obj -<< -/D [ 126 0 R /XYZ 107 200 null ] ->> -endobj -797 0 obj -<< -/D [ 126 0 R /XYZ 107 185 null ] ->> -endobj -798 0 obj -<< -/D [ 126 0 R /XYZ 215 485 null ] ->> -endobj -799 0 obj -<< -/D [ 126 0 R /XYZ 215 465 null ] ->> -endobj -800 0 obj -<< -/D [ 126 0 R /XYZ 314 465 null ] ->> -endobj -801 0 obj -<< -/D [ 126 0 R /XYZ 413 465 null ] ->> -endobj -802 0 obj -<< -/D [ 126 0 R /XYZ 215 446 null ] ->> -endobj -803 0 obj -<< -/D [ 126 0 R /XYZ 314 446 null ] ->> -endobj -804 0 obj -<< -/D [ 126 0 R /XYZ 413 446 null ] ->> -endobj -805 0 obj -<< -/D [ 126 0 R /XYZ 215 427 null ] ->> -endobj -806 0 obj -<< -/D [ 126 0 R /XYZ 314 427 null ] ->> -endobj -807 0 obj -<< -/D [ 126 0 R /XYZ 413 427 null ] ->> -endobj -808 0 obj -<< -/D [ 126 0 R /XYZ 215 408 null ] ->> -endobj -809 0 obj -<< -/D [ 126 0 R /XYZ 314 408 null ] ->> -endobj -810 0 obj -<< -/D [ 126 0 R /XYZ 413 408 null ] ->> -endobj -811 0 obj -<< -/D [ 126 0 R /XYZ 215 389 null ] ->> -endobj -812 0 obj -<< -/D [ 126 0 R /XYZ 314 389 null ] ->> -endobj -813 0 obj -<< -/D [ 126 0 R /XYZ 413 389 null ] ->> -endobj -814 0 obj -<< -/D [ 126 0 R /XYZ 215 370 null ] ->> -endobj -815 0 obj -<< -/D [ 126 0 R /XYZ 314 370 null ] ->> -endobj -816 0 obj -<< -/D [ 126 0 R /XYZ 413 370 null ] ->> -endobj -817 0 obj -<< -/D [ 126 0 R /XYZ 215 351 null ] ->> -endobj -818 0 obj -<< -/D [ 126 0 R /XYZ 314 351 null ] ->> -endobj -819 0 obj -<< -/D [ 126 0 R /XYZ 413 351 null ] ->> -endobj -820 0 obj -<< -/D [ 126 0 R /XYZ 215 332 null ] ->> -endobj -821 0 obj -<< -/D [ 126 0 R /XYZ 314 332 null ] ->> -endobj -822 0 obj -<< -/D [ 126 0 R /XYZ 413 332 null ] ->> -endobj -823 0 obj -<< -/D [ 126 0 R /XYZ 215 313 null ] ->> -endobj -824 0 obj -<< -/D [ 126 0 R /XYZ 314 313 null ] ->> -endobj -825 0 obj -<< -/D [ 126 0 R /XYZ 413 313 null ] ->> -endobj -826 0 obj -<< -/D [ 126 0 R /XYZ 215 294 null ] ->> -endobj -827 0 obj -<< -/D [ 126 0 R /XYZ 314 294 null ] ->> -endobj -828 0 obj -<< -/D [ 126 0 R /XYZ 413 294 null ] ->> -endobj -829 0 obj -<< -/D [ 126 0 R /XYZ 215 275 null ] ->> -endobj -830 0 obj -<< -/D [ 126 0 R /XYZ 314 275 null ] ->> -endobj -831 0 obj -<< -/D [ 126 0 R /XYZ 413 275 null ] ->> -endobj -832 0 obj -<< -/D [ null /XYZ null null null ] ->> -endobj -833 0 obj -<< -/D [ 130 0 R /XYZ null null null ] ->> -endobj -834 0 obj -<< -/D [ 130 0 R /XYZ 107 641 null ] ->> -endobj -835 0 obj -<< -/D [ 130 0 R /XYZ 107 641 null ] ->> -endobj -836 0 obj -<< -/D [ 130 0 R /XYZ 107 110 null ] ->> -endobj -837 0 obj -<< -/D [ 130 0 R /XYZ 464 717 null ] ->> -endobj -838 0 obj -<< -/D [ 130 0 R /XYZ 107 640 null ] ->> -endobj -839 0 obj -<< -/D [ 130 0 R /XYZ 107 579 null ] ->> -endobj -840 0 obj -<< -/D [ 130 0 R /XYZ 107 497 null ] ->> -endobj -841 0 obj -<< -/D [ 130 0 R /XYZ 107 457 null ] ->> -endobj -842 0 obj -<< -/D [ 130 0 R /XYZ 107 429 null ] ->> -endobj -843 0 obj -<< -/D [ 130 0 R /XYZ 107 413 null ] ->> -endobj -844 0 obj -<< -/D [ 130 0 R /XYZ 107 397 null ] ->> -endobj -845 0 obj -<< -/D [ 134 0 R /XYZ 98 695 null ] ->> -endobj -846 0 obj -<< -/D [ 134 0 R /XYZ 98 110 null ] ->> -endobj -847 0 obj -<< -/D [ 134 0 R /XYZ 98 665 null ] ->> -endobj -848 0 obj -<< -/D [ 134 0 R /XYZ 98 628 null ] ->> -endobj -849 0 obj -<< -/D [ 134 0 R /XYZ 98 612 null ] ->> -endobj -850 0 obj -<< -/D [ 134 0 R /XYZ 98 590 null ] ->> -endobj -851 0 obj -<< -/D [ 134 0 R /XYZ 98 574 null ] ->> -endobj -852 0 obj -<< -/D [ 134 0 R /XYZ 98 539 null ] ->> -endobj -853 0 obj -<< -/D [ 134 0 R /XYZ 98 516 null ] ->> -endobj -854 0 obj -<< -/D [ 134 0 R /XYZ 98 331 null ] ->> -endobj -855 0 obj -<< -/D [ 134 0 R /XYZ 98 315 null ] ->> -endobj -856 0 obj -<< -/D [ 134 0 R /XYZ 98 299 null ] ->> -endobj -857 0 obj -<< -/D [ 134 0 R /XYZ 98 283 null ] ->> -endobj -858 0 obj -<< -/D [ 134 0 R /XYZ 98 267 null ] ->> -endobj -859 0 obj -<< -/D [ 134 0 R /XYZ 134 489 null ] ->> -endobj -860 0 obj -<< -/D [ 134 0 R /XYZ 242 489 null ] ->> -endobj -861 0 obj -<< -/D [ 134 0 R /XYZ 350 489 null ] ->> -endobj -862 0 obj -<< -/D [ 134 0 R /XYZ 134 467 null ] ->> -endobj -863 0 obj -<< -/D [ 134 0 R /XYZ 242 467 null ] ->> -endobj -864 0 obj -<< -/D [ 134 0 R /XYZ 350 467 null ] ->> -endobj -865 0 obj -<< -/D [ 134 0 R /XYZ 134 397 null ] ->> -endobj -866 0 obj -<< -/D [ 134 0 R /XYZ 242 397 null ] ->> -endobj -867 0 obj -<< -/D [ 134 0 R /XYZ 350 397 null ] ->> -endobj -868 0 obj -<< -/D [ 138 0 R /XYZ 107 695 null ] ->> -endobj -869 0 obj -<< -/D [ 138 0 R /XYZ 107 110 null ] ->> -endobj -870 0 obj -<< -/D [ 138 0 R /XYZ 107 665 null ] ->> -endobj -871 0 obj -<< -/D [ 138 0 R /XYZ 107 628 null ] ->> -endobj -872 0 obj -<< -/D [ 138 0 R /XYZ 107 612 null ] ->> -endobj -873 0 obj -<< -/D [ 138 0 R /XYZ 107 579 null ] ->> -endobj -874 0 obj -<< -/D [ 138 0 R /XYZ 107 563 null ] ->> -endobj -875 0 obj -<< -/D [ 138 0 R /XYZ 107 540 null ] ->> -endobj -876 0 obj -<< -/D [ 138 0 R /XYZ 107 524 null ] ->> -endobj -877 0 obj -<< -/D [ 138 0 R /XYZ 107 259 null ] ->> -endobj -878 0 obj -<< -/D [ 138 0 R /XYZ 107 243 null ] ->> -endobj -879 0 obj -<< -/D [ 138 0 R /XYZ 107 227 null ] ->> -endobj -880 0 obj -<< -/D [ 138 0 R /XYZ 107 211 null ] ->> -endobj -881 0 obj -<< -/D [ 138 0 R /XYZ 107 195 null ] ->> -endobj -882 0 obj -<< -/D [ 138 0 R /XYZ 143 497 null ] ->> -endobj -883 0 obj -<< -/D [ 138 0 R /XYZ 251 497 null ] ->> -endobj -884 0 obj -<< -/D [ 138 0 R /XYZ 359 497 null ] ->> -endobj -885 0 obj -<< -/D [ 138 0 R /XYZ 143 475 null ] ->> -endobj -886 0 obj -<< -/D [ 138 0 R /XYZ 251 475 null ] ->> -endobj -887 0 obj -<< -/D [ 138 0 R /XYZ 359 475 null ] ->> -endobj -888 0 obj -<< -/D [ 138 0 R /XYZ 143 441 null ] ->> -endobj -889 0 obj -<< -/D [ 138 0 R /XYZ 251 441 null ] ->> -endobj -890 0 obj -<< -/D [ 138 0 R /XYZ 359 441 null ] ->> -endobj -891 0 obj -<< -/D [ 138 0 R /XYZ 143 383 null ] ->> -endobj -892 0 obj -<< -/D [ 138 0 R /XYZ 251 383 null ] ->> -endobj -893 0 obj -<< -/D [ 138 0 R /XYZ 359 383 null ] ->> -endobj -894 0 obj -<< -/D [ 138 0 R /XYZ 143 301 null ] ->> -endobj -895 0 obj -<< -/D [ 138 0 R /XYZ 251 301 null ] ->> -endobj -896 0 obj -<< -/D [ 138 0 R /XYZ 359 301 null ] ->> -endobj -897 0 obj -<< -/D [ 142 0 R /XYZ 98 665 null ] ->> -endobj -898 0 obj -<< -/D [ 142 0 R /XYZ 98 628 null ] ->> -endobj -899 0 obj -<< -/D [ 142 0 R /XYZ 98 612 null ] ->> -endobj -900 0 obj -<< -/D [ 142 0 R /XYZ 98 579 null ] ->> -endobj -901 0 obj -<< -/D [ 142 0 R /XYZ 98 563 null ] ->> -endobj -902 0 obj -<< -/D [ 142 0 R /XYZ 98 540 null ] ->> -endobj -903 0 obj -<< -/D [ 142 0 R /XYZ 98 524 null ] ->> -endobj -904 0 obj -<< -/D [ 142 0 R /XYZ 98 283 null ] ->> -endobj -905 0 obj -<< -/D [ 142 0 R /XYZ 98 267 null ] ->> -endobj -906 0 obj -<< -/D [ 142 0 R /XYZ 98 251 null ] ->> -endobj -907 0 obj -<< -/D [ 142 0 R /XYZ 98 235 null ] ->> -endobj -908 0 obj -<< -/D [ 142 0 R /XYZ 98 219 null ] ->> -endobj -909 0 obj -<< -/D [ 142 0 R /XYZ 134 497 null ] ->> -endobj -910 0 obj -<< -/D [ 142 0 R /XYZ 242 497 null ] ->> -endobj -911 0 obj -<< -/D [ 142 0 R /XYZ 350 497 null ] ->> -endobj -912 0 obj -<< -/D [ 142 0 R /XYZ 134 475 null ] ->> -endobj -913 0 obj -<< -/D [ 142 0 R /XYZ 242 475 null ] ->> -endobj -914 0 obj -<< -/D [ 142 0 R /XYZ 350 475 null ] ->> -endobj -915 0 obj -<< -/D [ 142 0 R /XYZ 134 441 null ] ->> -endobj -916 0 obj -<< -/D [ 142 0 R /XYZ 242 441 null ] ->> -endobj -917 0 obj -<< -/D [ 142 0 R /XYZ 350 441 null ] ->> -endobj -918 0 obj -<< -/D [ 142 0 R /XYZ 134 407 null ] ->> -endobj -919 0 obj -<< -/D [ 142 0 R /XYZ 242 407 null ] ->> -endobj -920 0 obj -<< -/D [ 142 0 R /XYZ 350 407 null ] ->> -endobj -921 0 obj -<< -/D [ 142 0 R /XYZ 134 325 null ] ->> -endobj -922 0 obj -<< -/D [ 142 0 R /XYZ 242 325 null ] ->> -endobj -923 0 obj -<< -/D [ 142 0 R /XYZ 350 325 null ] ->> -endobj -924 0 obj -<< -/D [ 146 0 R /XYZ null null null ] ->> -endobj -925 0 obj -<< -/D [ 146 0 R /XYZ 107 665 null ] ->> -endobj -926 0 obj -<< -/D [ 146 0 R /XYZ 107 628 null ] ->> -endobj -927 0 obj -<< -/D [ 146 0 R /XYZ 107 612 null ] ->> -endobj -928 0 obj -<< -/D [ 146 0 R /XYZ 107 590 null ] ->> -endobj -929 0 obj -<< -/D [ 146 0 R /XYZ 107 574 null ] ->> -endobj -930 0 obj -<< -/D [ 146 0 R /XYZ 107 539 null ] ->> -endobj -931 0 obj -<< -/D [ 146 0 R /XYZ 107 523 null ] ->> -endobj -932 0 obj -<< -/D [ 146 0 R /XYZ 107 420 null ] ->> -endobj -933 0 obj -<< -/D [ 146 0 R /XYZ 107 404 null ] ->> -endobj -934 0 obj -<< -/D [ 146 0 R /XYZ 107 388 null ] ->> -endobj -935 0 obj -<< -/D [ 146 0 R /XYZ 107 372 null ] ->> -endobj -936 0 obj -<< -/D [ 146 0 R /XYZ 107 356 null ] ->> -endobj -937 0 obj -<< -/D [ 146 0 R /XYZ 143 496 null ] ->> -endobj -938 0 obj -<< -/D [ 146 0 R /XYZ 251 496 null ] ->> -endobj -939 0 obj -<< -/D [ 146 0 R /XYZ 359 496 null ] ->> -endobj -940 0 obj -<< -/D [ 146 0 R /XYZ 143 474 null ] ->> -endobj -941 0 obj -<< -/D [ 146 0 R /XYZ 251 474 null ] ->> -endobj -942 0 obj -<< -/D [ 146 0 R /XYZ 359 474 null ] ->> -endobj -943 0 obj -<< -/D [ 150 0 R /XYZ null null null ] ->> -endobj -944 0 obj -<< -/D [ 150 0 R /XYZ 98 666 null ] ->> -endobj -945 0 obj -<< -/D [ 150 0 R /XYZ 98 633 null ] ->> -endobj -946 0 obj -<< -/D [ 150 0 R /XYZ 98 621 null ] ->> -endobj -947 0 obj -<< -/D [ 150 0 R /XYZ 98 610 null ] ->> -endobj -948 0 obj -<< -/D [ 150 0 R /XYZ 98 599 null ] ->> -endobj -949 0 obj -<< -/D [ 150 0 R /XYZ 98 588 null ] ->> -endobj -950 0 obj -<< -/D [ 150 0 R /XYZ 98 577 null ] ->> -endobj -951 0 obj -<< -/D [ 150 0 R /XYZ 98 566 null ] ->> -endobj -952 0 obj -<< -/D [ 150 0 R /XYZ 98 555 null ] ->> -endobj -953 0 obj -<< -/D [ 150 0 R /XYZ 98 544 null ] ->> -endobj -954 0 obj -<< -/D [ 150 0 R /XYZ 98 533 null ] ->> -endobj -955 0 obj -<< -/D [ 150 0 R /XYZ 98 522 null ] ->> -endobj -956 0 obj -<< -/D [ 150 0 R /XYZ 98 511 null ] ->> -endobj -957 0 obj -<< -/D [ 150 0 R /XYZ 98 500 null ] ->> -endobj -958 0 obj -<< -/D [ 150 0 R /XYZ 98 489 null ] ->> -endobj -959 0 obj -<< -/D [ 150 0 R /XYZ 98 478 null ] ->> -endobj -960 0 obj -<< -/D [ 150 0 R /XYZ 98 467 null ] ->> -endobj -961 0 obj -<< -/D [ 150 0 R /XYZ 98 456 null ] ->> -endobj -962 0 obj -<< -/D [ 150 0 R /XYZ 98 445 null ] ->> -endobj -963 0 obj -<< -/D [ 150 0 R /XYZ 98 434 null ] ->> -endobj -964 0 obj -<< -/D [ 150 0 R /XYZ 98 423 null ] ->> -endobj -965 0 obj -<< -/D [ 150 0 R /XYZ 98 412 null ] ->> -endobj -966 0 obj -<< -/D [ 150 0 R /XYZ 98 401 null ] ->> -endobj -967 0 obj -<< -/D [ 150 0 R /XYZ 98 390 null ] ->> -endobj -968 0 obj -<< -/D [ 150 0 R /XYZ 98 379 null ] ->> -endobj -969 0 obj -<< -/D [ 150 0 R /XYZ 98 368 null ] ->> -endobj -970 0 obj -<< -/D [ 150 0 R /XYZ 98 357 null ] ->> -endobj -971 0 obj -<< -/D [ 150 0 R /XYZ 98 346 null ] ->> -endobj -972 0 obj -<< -/D [ 150 0 R /XYZ 98 335 null ] ->> -endobj -973 0 obj -<< -/D [ 150 0 R /XYZ 98 324 null ] ->> -endobj -974 0 obj -<< -/D [ 150 0 R /XYZ 98 313 null ] ->> -endobj -975 0 obj -<< -/D [ 150 0 R /XYZ 98 302 null ] ->> -endobj -976 0 obj -<< -/D [ 150 0 R /XYZ 98 291 null ] ->> -endobj -977 0 obj -<< -/D [ 150 0 R /XYZ 98 280 null ] ->> -endobj -978 0 obj -<< -/D [ 150 0 R /XYZ 98 269 null ] ->> -endobj -979 0 obj -<< -/D [ 150 0 R /XYZ 98 258 null ] ->> -endobj -980 0 obj -<< -/D [ 150 0 R /XYZ 98 247 null ] ->> -endobj -981 0 obj -<< -/D [ 154 0 R /XYZ null null null ] ->> -endobj -982 0 obj -<< -/D [ 154 0 R /XYZ 107 663 null ] ->> -endobj -983 0 obj -<< -/D [ null /XYZ null null null ] ->> -endobj -984 0 obj -<< -/D [ null /XYZ null null null ] ->> -endobj -985 0 obj -<< -/D [ 158 0 R /XYZ null null null ] ->> -endobj -986 0 obj -<< -/D [ 158 0 R /XYZ 107 110 null ] ->> -endobj -987 0 obj -<< -/D [ 158 0 R /XYZ 464 717 null ] ->> -endobj -988 0 obj -<< -/D [ 158 0 R /XYZ 107 640 null ] ->> -endobj -989 0 obj -<< -/D [ 158 0 R /XYZ 107 551 null ] ->> -endobj -990 0 obj -<< -/D [ 158 0 R /XYZ 107 541 null ] ->> -endobj -991 0 obj -<< -/D [ 158 0 R /XYZ 107 521 null ] ->> -endobj -992 0 obj -<< -/D [ 158 0 R /XYZ 107 490 null ] ->> -endobj -993 0 obj -<< -/D [ 158 0 R /XYZ 165 502 null ] ->> -endobj -994 0 obj -<< -/D [ 158 0 R /XYZ 223 502 null ] ->> -endobj -995 0 obj -<< -/D [ 158 0 R /XYZ 281 502 null ] ->> -endobj -996 0 obj -<< -/D [ 158 0 R /XYZ 339 490 null ] ->> -endobj -997 0 obj -<< -/D [ 158 0 R /XYZ 396 490 null ] ->> -endobj -998 0 obj -<< -/D [ 158 0 R /XYZ 454 502 null ] ->> -endobj -999 0 obj -<< -/D [ 158 0 R /XYZ 107 471 null ] ->> -endobj -1000 0 obj -<< -/D [ 158 0 R /XYZ 165 471 null ] ->> -endobj -1001 0 obj -<< -/D [ 158 0 R /XYZ 223 471 null ] ->> -endobj -1002 0 obj -<< -/D [ 158 0 R /XYZ 281 471 null ] ->> -endobj -1003 0 obj -<< -/D [ 158 0 R /XYZ 339 471 null ] ->> -endobj -1004 0 obj -<< -/D [ 158 0 R /XYZ 396 471 null ] ->> -endobj -1005 0 obj -<< -/D [ 158 0 R /XYZ 454 471 null ] ->> -endobj -1006 0 obj -<< -/D [ 158 0 R /XYZ 107 452 null ] ->> -endobj -1007 0 obj -<< -/D [ 158 0 R /XYZ 165 452 null ] ->> -endobj -1008 0 obj -<< -/D [ 158 0 R /XYZ 223 452 null ] ->> -endobj -1009 0 obj -<< -/D [ 158 0 R /XYZ 281 452 null ] ->> -endobj -1010 0 obj -<< -/D [ 158 0 R /XYZ 339 452 null ] ->> -endobj -1011 0 obj -<< -/D [ 158 0 R /XYZ 396 452 null ] ->> -endobj -1012 0 obj -<< -/D [ 158 0 R /XYZ 454 452 null ] ->> -endobj -1013 0 obj -<< -/D [ 158 0 R /XYZ 107 433 null ] ->> -endobj -1014 0 obj -<< -/D [ 158 0 R /XYZ 165 433 null ] ->> -endobj -1015 0 obj -<< -/D [ 158 0 R /XYZ 223 433 null ] ->> -endobj -1016 0 obj -<< -/D [ 158 0 R /XYZ 281 433 null ] ->> -endobj -1017 0 obj -<< -/D [ 158 0 R /XYZ 339 433 null ] ->> -endobj -1018 0 obj -<< -/D [ 158 0 R /XYZ 396 433 null ] ->> -endobj -1019 0 obj -<< -/D [ 158 0 R /XYZ 454 433 null ] ->> -endobj -1020 0 obj -<< -/D [ 158 0 R /XYZ 107 414 null ] ->> -endobj -1021 0 obj -<< -/D [ 158 0 R /XYZ 165 414 null ] ->> -endobj -1022 0 obj -<< -/D [ 158 0 R /XYZ 223 414 null ] ->> -endobj -1023 0 obj -<< -/D [ 158 0 R /XYZ 281 414 null ] ->> -endobj -1024 0 obj -<< -/D [ 158 0 R /XYZ 339 414 null ] ->> -endobj -1025 0 obj -<< -/D [ 158 0 R /XYZ 396 414 null ] ->> -endobj -1026 0 obj -<< -/D [ 158 0 R /XYZ 454 414 null ] ->> -endobj -1027 0 obj -<< -/D [ 158 0 R /XYZ 107 395 null ] ->> -endobj -1028 0 obj -<< -/D [ 158 0 R /XYZ 165 395 null ] ->> -endobj -1029 0 obj -<< -/D [ 158 0 R /XYZ 223 395 null ] ->> -endobj -1030 0 obj -<< -/D [ 158 0 R /XYZ 281 395 null ] ->> -endobj -1031 0 obj -<< -/D [ 158 0 R /XYZ 339 395 null ] ->> -endobj -1032 0 obj -<< -/D [ 158 0 R /XYZ 396 395 null ] ->> -endobj -1033 0 obj -<< -/D [ 158 0 R /XYZ 454 395 null ] ->> -endobj -1034 0 obj -<< -/D [ 158 0 R /XYZ 107 376 null ] ->> -endobj -1035 0 obj -<< -/D [ 158 0 R /XYZ 165 376 null ] ->> -endobj -1036 0 obj -<< -/D [ 158 0 R /XYZ 223 376 null ] ->> -endobj -1037 0 obj -<< -/D [ 158 0 R /XYZ 281 376 null ] ->> -endobj -1038 0 obj -<< -/D [ 158 0 R /XYZ 339 376 null ] ->> -endobj -1039 0 obj -<< -/D [ 158 0 R /XYZ 396 376 null ] ->> -endobj -1040 0 obj -<< -/D [ 158 0 R /XYZ 454 376 null ] ->> -endobj -1041 0 obj -<< -/D [ 158 0 R /XYZ 107 357 null ] ->> -endobj -1042 0 obj -<< -/D [ 158 0 R /XYZ 165 357 null ] ->> -endobj -1043 0 obj -<< -/D [ 158 0 R /XYZ 223 357 null ] ->> -endobj -1044 0 obj -<< -/D [ 158 0 R /XYZ 281 357 null ] ->> -endobj -1045 0 obj -<< -/D [ 158 0 R /XYZ 339 357 null ] ->> -endobj -1046 0 obj -<< -/D [ 158 0 R /XYZ 396 357 null ] ->> -endobj -1047 0 obj -<< -/D [ 158 0 R /XYZ 454 357 null ] ->> -endobj -1048 0 obj -<< -/D [ 158 0 R /XYZ 107 338 null ] ->> -endobj -1049 0 obj -<< -/D [ 158 0 R /XYZ 165 338 null ] ->> -endobj -1050 0 obj -<< -/D [ 158 0 R /XYZ 223 338 null ] ->> -endobj -1051 0 obj -<< -/D [ 158 0 R /XYZ 281 338 null ] ->> -endobj -1052 0 obj -<< -/D [ 158 0 R /XYZ 339 338 null ] ->> -endobj -1053 0 obj -<< -/D [ 158 0 R /XYZ 396 338 null ] ->> -endobj -1054 0 obj -<< -/D [ 158 0 R /XYZ 454 338 null ] ->> -endobj -1055 0 obj -<< -/D [ 158 0 R /XYZ 107 319 null ] ->> -endobj -1056 0 obj -<< -/D [ 158 0 R /XYZ 165 319 null ] ->> -endobj -1057 0 obj -<< -/D [ 158 0 R /XYZ 223 319 null ] ->> -endobj -1058 0 obj -<< -/D [ 158 0 R /XYZ 281 319 null ] ->> -endobj -1059 0 obj -<< -/D [ 158 0 R /XYZ 339 319 null ] ->> -endobj -1060 0 obj -<< -/D [ 158 0 R /XYZ 396 319 null ] ->> -endobj -1061 0 obj -<< -/D [ 158 0 R /XYZ 454 319 null ] ->> -endobj -1062 0 obj -<< -/D [ 158 0 R /XYZ 107 300 null ] ->> -endobj -1063 0 obj -<< -/D [ 158 0 R /XYZ 165 300 null ] ->> -endobj -1064 0 obj -<< -/D [ 158 0 R /XYZ 223 300 null ] ->> -endobj -1065 0 obj -<< -/D [ 158 0 R /XYZ 281 300 null ] ->> -endobj -1066 0 obj -<< -/D [ 158 0 R /XYZ 339 300 null ] ->> -endobj -1067 0 obj -<< -/D [ 158 0 R /XYZ 396 300 null ] ->> -endobj -1068 0 obj -<< -/D [ 158 0 R /XYZ 454 300 null ] ->> -endobj -1069 0 obj -<< -/D [ 158 0 R /XYZ 107 281 null ] ->> -endobj -1070 0 obj -<< -/D [ 158 0 R /XYZ 165 281 null ] ->> -endobj -1071 0 obj -<< -/D [ 158 0 R /XYZ 223 281 null ] ->> -endobj -1072 0 obj -<< -/D [ 158 0 R /XYZ 281 281 null ] ->> -endobj -1073 0 obj -<< -/D [ 158 0 R /XYZ 339 281 null ] ->> -endobj -1074 0 obj -<< -/D [ 158 0 R /XYZ 396 281 null ] ->> -endobj -1075 0 obj -<< -/D [ 158 0 R /XYZ 454 281 null ] ->> -endobj -1076 0 obj -<< -/D [ 158 0 R /XYZ 107 262 null ] ->> -endobj -1077 0 obj -<< -/D [ 158 0 R /XYZ 165 262 null ] ->> -endobj -1078 0 obj -<< -/D [ 158 0 R /XYZ 223 262 null ] ->> -endobj -1079 0 obj -<< -/D [ 158 0 R /XYZ 281 262 null ] ->> -endobj -1080 0 obj -<< -/D [ 158 0 R /XYZ 339 262 null ] ->> -endobj -1081 0 obj -<< -/D [ 158 0 R /XYZ 396 262 null ] ->> -endobj -1082 0 obj -<< -/D [ 158 0 R /XYZ 454 262 null ] ->> -endobj -1083 0 obj -<< -/D [ 158 0 R /XYZ 107 243 null ] ->> -endobj -1084 0 obj -<< -/D [ 158 0 R /XYZ 165 243 null ] ->> -endobj -1085 0 obj -<< -/D [ 158 0 R /XYZ 223 243 null ] ->> -endobj -1086 0 obj -<< -/D [ 158 0 R /XYZ 281 243 null ] ->> -endobj -1087 0 obj -<< -/D [ 158 0 R /XYZ 339 243 null ] ->> -endobj -1088 0 obj -<< -/D [ 158 0 R /XYZ 396 243 null ] ->> -endobj -1089 0 obj -<< -/D [ 158 0 R /XYZ 454 243 null ] ->> -endobj -1090 0 obj -<< -/D [ 158 0 R /XYZ 107 224 null ] ->> -endobj -1091 0 obj -<< -/D [ 158 0 R /XYZ 165 224 null ] ->> -endobj -1092 0 obj -<< -/D [ 158 0 R /XYZ 223 224 null ] ->> -endobj -1093 0 obj -<< -/D [ 158 0 R /XYZ 281 224 null ] ->> -endobj -1094 0 obj -<< -/D [ 158 0 R /XYZ 339 224 null ] ->> -endobj -1095 0 obj -<< -/D [ 158 0 R /XYZ 396 224 null ] ->> -endobj -1096 0 obj -<< -/D [ 158 0 R /XYZ 454 224 null ] ->> -endobj -1097 0 obj -<< -/D [ 158 0 R /XYZ 107 205 null ] ->> -endobj -1098 0 obj -<< -/D [ 158 0 R /XYZ 165 205 null ] ->> -endobj -1099 0 obj -<< -/D [ 158 0 R /XYZ 223 205 null ] ->> -endobj -1100 0 obj -<< -/D [ 158 0 R /XYZ 281 205 null ] ->> -endobj -1101 0 obj -<< -/D [ 158 0 R /XYZ 339 205 null ] ->> -endobj -1102 0 obj -<< -/D [ 158 0 R /XYZ 396 205 null ] ->> -endobj -1103 0 obj -<< -/D [ 158 0 R /XYZ 454 205 null ] ->> -endobj -1104 0 obj -<< -/D [ 158 0 R /XYZ 107 186 null ] ->> -endobj -1105 0 obj -<< -/D [ 158 0 R /XYZ 165 186 null ] ->> -endobj -1106 0 obj -<< -/D [ 158 0 R /XYZ 223 186 null ] ->> -endobj -1107 0 obj -<< -/D [ 158 0 R /XYZ 281 186 null ] ->> -endobj -1108 0 obj -<< -/D [ 158 0 R /XYZ 339 186 null ] ->> -endobj -1109 0 obj -<< -/D [ 158 0 R /XYZ 396 186 null ] ->> -endobj -1110 0 obj -<< -/D [ 158 0 R /XYZ 454 186 null ] ->> -endobj -1111 0 obj -<< -/D [ 158 0 R /XYZ 107 167 null ] ->> -endobj -1112 0 obj -<< -/D [ 158 0 R /XYZ 165 167 null ] ->> -endobj -1113 0 obj -<< -/D [ 158 0 R /XYZ 223 167 null ] ->> -endobj -1114 0 obj -<< -/D [ 158 0 R /XYZ 281 167 null ] ->> -endobj -1115 0 obj -<< -/D [ 158 0 R /XYZ 339 167 null ] ->> -endobj -1116 0 obj -<< -/D [ 158 0 R /XYZ 396 167 null ] ->> -endobj -1117 0 obj -<< -/D [ 158 0 R /XYZ 454 167 null ] ->> -endobj -1118 0 obj -<< -/D [ 158 0 R /XYZ 107 148 null ] ->> -endobj -1119 0 obj -<< -/D [ 158 0 R /XYZ 165 148 null ] ->> -endobj -1120 0 obj -<< -/D [ 158 0 R /XYZ 223 148 null ] ->> -endobj -1121 0 obj -<< -/D [ 158 0 R /XYZ 281 148 null ] ->> -endobj -1122 0 obj -<< -/D [ 158 0 R /XYZ 339 148 null ] ->> -endobj -1123 0 obj -<< -/D [ 158 0 R /XYZ 396 148 null ] ->> -endobj -1124 0 obj -<< -/D [ 158 0 R /XYZ 454 148 null ] ->> -endobj -1125 0 obj -<< -/D [ 162 0 R /XYZ 98 695 null ] ->> -endobj -1126 0 obj -<< -/D [ 162 0 R /XYZ 98 110 null ] ->> -endobj -1127 0 obj -<< -/D [ 162 0 R /XYZ 98 454 null ] ->> -endobj -1128 0 obj -<< -/D [ 162 0 R /XYZ 98 593 null ] ->> -endobj -1129 0 obj -<< -/D [ 162 0 R /XYZ 156 593 null ] ->> -endobj -1130 0 obj -<< -/D [ 162 0 R /XYZ 214 593 null ] ->> -endobj -1131 0 obj -<< -/D [ 162 0 R /XYZ 272 593 null ] ->> -endobj -1132 0 obj -<< -/D [ 162 0 R /XYZ 330 593 null ] ->> -endobj -1133 0 obj -<< -/D [ 162 0 R /XYZ 387 593 null ] ->> -endobj -1134 0 obj -<< -/D [ 162 0 R /XYZ 445 593 null ] ->> -endobj -1135 0 obj -<< -/D [ 162 0 R /XYZ 98 574 null ] ->> -endobj -1136 0 obj -<< -/D [ 162 0 R /XYZ 156 574 null ] ->> -endobj -1137 0 obj -<< -/D [ 162 0 R /XYZ 214 574 null ] ->> -endobj -1138 0 obj -<< -/D [ 162 0 R /XYZ 272 574 null ] ->> -endobj -1139 0 obj -<< -/D [ 162 0 R /XYZ 330 574 null ] ->> -endobj -1140 0 obj -<< -/D [ 162 0 R /XYZ 387 574 null ] ->> -endobj -1141 0 obj -<< -/D [ 162 0 R /XYZ 445 574 null ] ->> -endobj -1142 0 obj -<< -/D [ 162 0 R /XYZ 98 555 null ] ->> -endobj -1143 0 obj -<< -/D [ 162 0 R /XYZ 156 555 null ] ->> -endobj -1144 0 obj -<< -/D [ 162 0 R /XYZ 214 555 null ] ->> -endobj -1145 0 obj -<< -/D [ 162 0 R /XYZ 272 555 null ] ->> -endobj -1146 0 obj -<< -/D [ 162 0 R /XYZ 330 555 null ] ->> -endobj -1147 0 obj -<< -/D [ 162 0 R /XYZ 387 555 null ] ->> -endobj -1148 0 obj -<< -/D [ 162 0 R /XYZ 445 555 null ] ->> -endobj -1149 0 obj -<< -/D [ 162 0 R /XYZ 98 536 null ] ->> -endobj -1150 0 obj -<< -/D [ 162 0 R /XYZ 156 536 null ] ->> -endobj -1151 0 obj -<< -/D [ 162 0 R /XYZ 214 536 null ] ->> -endobj -1152 0 obj -<< -/D [ 162 0 R /XYZ 272 536 null ] ->> -endobj -1153 0 obj -<< -/D [ 162 0 R /XYZ 330 536 null ] ->> -endobj -1154 0 obj -<< -/D [ 162 0 R /XYZ 387 536 null ] ->> -endobj -1155 0 obj -<< -/D [ 162 0 R /XYZ 445 536 null ] ->> -endobj -1156 0 obj -<< -/D [ 162 0 R /XYZ 98 517 null ] ->> -endobj -1157 0 obj -<< -/D [ 162 0 R /XYZ 156 517 null ] ->> -endobj -1158 0 obj -<< -/D [ 162 0 R /XYZ 214 517 null ] ->> -endobj -1159 0 obj -<< -/D [ 162 0 R /XYZ 272 517 null ] ->> -endobj -1160 0 obj -<< -/D [ 162 0 R /XYZ 330 517 null ] ->> -endobj -1161 0 obj -<< -/D [ 162 0 R /XYZ 387 517 null ] ->> -endobj -1162 0 obj -<< -/D [ 162 0 R /XYZ 445 517 null ] ->> -endobj -1163 0 obj -<< -/D [ 162 0 R /XYZ 98 498 null ] ->> -endobj -1164 0 obj -<< -/D [ 162 0 R /XYZ 156 498 null ] ->> -endobj -1165 0 obj -<< -/D [ 162 0 R /XYZ 214 498 null ] ->> -endobj -1166 0 obj -<< -/D [ 162 0 R /XYZ 272 498 null ] ->> -endobj -1167 0 obj -<< -/D [ 162 0 R /XYZ 330 498 null ] ->> -endobj -1168 0 obj -<< -/D [ 162 0 R /XYZ 387 498 null ] ->> -endobj -1169 0 obj -<< -/D [ 162 0 R /XYZ 445 498 null ] ->> -endobj -1170 0 obj -<< -/D [ 162 0 R /XYZ 98 479 null ] ->> -endobj -1171 0 obj -<< -/D [ 162 0 R /XYZ 118 444 null ] ->> -endobj -1172 0 obj -<< -/D [ 162 0 R /XYZ 118 424 null ] ->> -endobj -1173 0 obj -<< -/D [ 162 0 R /XYZ 118 405 null ] ->> -endobj -1174 0 obj -<< -/D [ 162 0 R /XYZ 176 405 null ] ->> -endobj -1175 0 obj -<< -/D [ 162 0 R /XYZ 233 405 null ] ->> -endobj -1176 0 obj -<< -/D [ 162 0 R /XYZ 304 405 null ] ->> -endobj -1177 0 obj -<< -/D [ 162 0 R /XYZ 371 405 null ] ->> -endobj -1178 0 obj -<< -/D [ 162 0 R /XYZ 437 405 null ] ->> -endobj -1179 0 obj -<< -/D [ 162 0 R /XYZ 118 386 null ] ->> -endobj -1180 0 obj -<< -/D [ 162 0 R /XYZ 176 386 null ] ->> -endobj -1181 0 obj -<< -/D [ 162 0 R /XYZ 233 386 null ] ->> -endobj -1182 0 obj -<< -/D [ 162 0 R /XYZ 304 386 null ] ->> -endobj -1183 0 obj -<< -/D [ 162 0 R /XYZ 371 386 null ] ->> -endobj -1184 0 obj -<< -/D [ 162 0 R /XYZ 437 386 null ] ->> -endobj -1185 0 obj -<< -/D [ 162 0 R /XYZ 118 367 null ] ->> -endobj -1186 0 obj -<< -/D [ 162 0 R /XYZ 176 367 null ] ->> -endobj -1187 0 obj -<< -/D [ 162 0 R /XYZ 233 367 null ] ->> -endobj -1188 0 obj -<< -/D [ 162 0 R /XYZ 304 367 null ] ->> -endobj -1189 0 obj -<< -/D [ 162 0 R /XYZ 371 367 null ] ->> -endobj -1190 0 obj -<< -/D [ 162 0 R /XYZ 437 367 null ] ->> -endobj -1191 0 obj -<< -/D [ 162 0 R /XYZ 118 348 null ] ->> -endobj -1192 0 obj -<< -/D [ 162 0 R /XYZ 176 348 null ] ->> -endobj -1193 0 obj -<< -/D [ 162 0 R /XYZ 233 348 null ] ->> -endobj -1194 0 obj -<< -/D [ 162 0 R /XYZ 304 348 null ] ->> -endobj -1195 0 obj -<< -/D [ 162 0 R /XYZ 371 348 null ] ->> -endobj -1196 0 obj -<< -/D [ 162 0 R /XYZ 437 348 null ] ->> -endobj -1197 0 obj -<< -/D [ 162 0 R /XYZ 118 329 null ] ->> -endobj -1198 0 obj -<< -/D [ 162 0 R /XYZ 176 329 null ] ->> -endobj -1199 0 obj -<< -/D [ 162 0 R /XYZ 233 329 null ] ->> -endobj -1200 0 obj -<< -/D [ 162 0 R /XYZ 304 329 null ] ->> -endobj -1201 0 obj -<< -/D [ 162 0 R /XYZ 371 329 null ] ->> -endobj -1202 0 obj -<< -/D [ 162 0 R /XYZ 437 329 null ] ->> -endobj -1203 0 obj -<< -/D [ 162 0 R /XYZ 118 310 null ] ->> -endobj -1204 0 obj -<< -/D [ 162 0 R /XYZ 176 310 null ] ->> -endobj -1205 0 obj -<< -/D [ 162 0 R /XYZ 233 310 null ] ->> -endobj -1206 0 obj -<< -/D [ 162 0 R /XYZ 304 310 null ] ->> -endobj -1207 0 obj -<< -/D [ 162 0 R /XYZ 371 310 null ] ->> -endobj -1208 0 obj -<< -/D [ 162 0 R /XYZ 437 310 null ] ->> -endobj -1209 0 obj -<< -/D [ 162 0 R /XYZ 118 291 null ] ->> -endobj -1210 0 obj -<< -/D [ 162 0 R /XYZ 176 291 null ] ->> -endobj -1211 0 obj -<< -/D [ 162 0 R /XYZ 233 291 null ] ->> -endobj -1212 0 obj -<< -/D [ 162 0 R /XYZ 304 291 null ] ->> -endobj -1213 0 obj -<< -/D [ 162 0 R /XYZ 371 291 null ] ->> -endobj -1214 0 obj -<< -/D [ 162 0 R /XYZ 437 291 null ] ->> -endobj -1215 0 obj -<< -/D [ 162 0 R /XYZ 118 272 null ] ->> -endobj -1216 0 obj -<< -/D [ 162 0 R /XYZ 176 272 null ] ->> -endobj -1217 0 obj -<< -/D [ 162 0 R /XYZ 233 272 null ] ->> -endobj -1218 0 obj -<< -/D [ 162 0 R /XYZ 304 272 null ] ->> -endobj -1219 0 obj -<< -/D [ 162 0 R /XYZ 371 272 null ] ->> -endobj -1220 0 obj -<< -/D [ 162 0 R /XYZ 437 272 null ] ->> -endobj -1221 0 obj -<< -/D [ 162 0 R /XYZ 118 253 null ] ->> -endobj -1222 0 obj -<< -/D [ 162 0 R /XYZ 176 253 null ] ->> -endobj -1223 0 obj -<< -/D [ 162 0 R /XYZ 233 253 null ] ->> -endobj -1224 0 obj -<< -/D [ 162 0 R /XYZ 304 253 null ] ->> -endobj -1225 0 obj -<< -/D [ 162 0 R /XYZ 371 253 null ] ->> -endobj -1226 0 obj -<< -/D [ 162 0 R /XYZ 437 253 null ] ->> -endobj -1227 0 obj -<< -/D [ 162 0 R /XYZ 118 234 null ] ->> -endobj -1228 0 obj -<< -/D [ 162 0 R /XYZ 176 234 null ] ->> -endobj -1229 0 obj -<< -/D [ 162 0 R /XYZ 233 234 null ] ->> -endobj -1230 0 obj -<< -/D [ 162 0 R /XYZ 304 234 null ] ->> -endobj -1231 0 obj -<< -/D [ 162 0 R /XYZ 371 234 null ] ->> -endobj -1232 0 obj -<< -/D [ 162 0 R /XYZ 437 234 null ] ->> -endobj -1233 0 obj -<< -/D [ 162 0 R /XYZ 118 215 null ] ->> -endobj -1234 0 obj -<< -/D [ 162 0 R /XYZ 176 215 null ] ->> -endobj -1235 0 obj -<< -/D [ 162 0 R /XYZ 233 215 null ] ->> -endobj -1236 0 obj -<< -/D [ 162 0 R /XYZ 304 215 null ] ->> -endobj -1237 0 obj -<< -/D [ 162 0 R /XYZ 371 215 null ] ->> -endobj -1238 0 obj -<< -/D [ 162 0 R /XYZ 437 215 null ] ->> -endobj -1239 0 obj -<< -/D [ 162 0 R /XYZ 118 196 null ] ->> -endobj -1240 0 obj -<< -/D [ 162 0 R /XYZ 176 196 null ] ->> -endobj -1241 0 obj -<< -/D [ 162 0 R /XYZ 233 196 null ] ->> -endobj -1242 0 obj -<< -/D [ 162 0 R /XYZ 304 196 null ] ->> -endobj -1243 0 obj -<< -/D [ 162 0 R /XYZ 371 196 null ] ->> -endobj -1244 0 obj -<< -/D [ 162 0 R /XYZ 437 196 null ] ->> -endobj -1245 0 obj -<< -/D [ 162 0 R /XYZ 118 177 null ] ->> -endobj -1246 0 obj -<< -/D [ 162 0 R /XYZ 176 177 null ] ->> -endobj -1247 0 obj -<< -/D [ 162 0 R /XYZ 233 177 null ] ->> -endobj -1248 0 obj -<< -/D [ 162 0 R /XYZ 304 177 null ] ->> -endobj -1249 0 obj -<< -/D [ 162 0 R /XYZ 371 177 null ] ->> -endobj -1250 0 obj -<< -/D [ 162 0 R /XYZ 437 177 null ] ->> -endobj -1251 0 obj -<< -/D [ 162 0 R /XYZ 118 158 null ] ->> -endobj -1252 0 obj -<< -/D [ 162 0 R /XYZ 176 158 null ] ->> -endobj -1253 0 obj -<< -/D [ 162 0 R /XYZ 233 158 null ] ->> -endobj -1254 0 obj -<< -/D [ 162 0 R /XYZ 304 158 null ] ->> -endobj -1255 0 obj -<< -/D [ 162 0 R /XYZ 371 158 null ] ->> -endobj -1256 0 obj -<< -/D [ 162 0 R /XYZ 437 158 null ] ->> -endobj -1257 0 obj -<< -/D [ 166 0 R /XYZ 107 695 null ] ->> -endobj -1258 0 obj -<< -/D [ 166 0 R /XYZ 107 110 null ] ->> -endobj -1259 0 obj -<< -/D [ 166 0 R /XYZ 127 605 null ] ->> -endobj -1260 0 obj -<< -/D [ 166 0 R /XYZ 185 605 null ] ->> -endobj -1261 0 obj -<< -/D [ 166 0 R /XYZ 242 605 null ] ->> -endobj -1262 0 obj -<< -/D [ 166 0 R /XYZ 313 605 null ] ->> -endobj -1263 0 obj -<< -/D [ 166 0 R /XYZ 380 605 null ] ->> -endobj -1264 0 obj -<< -/D [ 166 0 R /XYZ 446 605 null ] ->> -endobj -1265 0 obj -<< -/D [ 166 0 R /XYZ 127 586 null ] ->> -endobj -1266 0 obj -<< -/D [ 166 0 R /XYZ 185 586 null ] ->> -endobj -1267 0 obj -<< -/D [ 166 0 R /XYZ 242 586 null ] ->> -endobj -1268 0 obj -<< -/D [ 166 0 R /XYZ 313 586 null ] ->> -endobj -1269 0 obj -<< -/D [ 166 0 R /XYZ 380 586 null ] ->> -endobj -1270 0 obj -<< -/D [ 166 0 R /XYZ 446 586 null ] ->> -endobj -1271 0 obj -<< -/D [ 166 0 R /XYZ 127 567 null ] ->> -endobj -1272 0 obj -<< -/D [ 166 0 R /XYZ 185 567 null ] ->> -endobj -1273 0 obj -<< -/D [ 166 0 R /XYZ 242 567 null ] ->> -endobj -1274 0 obj -<< -/D [ 166 0 R /XYZ 313 567 null ] ->> -endobj -1275 0 obj -<< -/D [ 166 0 R /XYZ 380 567 null ] ->> -endobj -1276 0 obj -<< -/D [ 166 0 R /XYZ 446 567 null ] ->> -endobj -1277 0 obj -<< -/D [ 166 0 R /XYZ 127 548 null ] ->> -endobj -1278 0 obj -<< -/D [ 166 0 R /XYZ 185 548 null ] ->> -endobj -1279 0 obj -<< -/D [ 166 0 R /XYZ 242 548 null ] ->> -endobj -1280 0 obj -<< -/D [ 166 0 R /XYZ 313 548 null ] ->> -endobj -1281 0 obj -<< -/D [ 166 0 R /XYZ 380 548 null ] ->> -endobj -1282 0 obj -<< -/D [ 166 0 R /XYZ 446 548 null ] ->> -endobj -1283 0 obj -<< -/D [ 166 0 R /XYZ 127 529 null ] ->> -endobj -1284 0 obj -<< -/D [ 166 0 R /XYZ 185 529 null ] ->> -endobj -1285 0 obj -<< -/D [ 166 0 R /XYZ 242 529 null ] ->> -endobj -1286 0 obj -<< -/D [ 166 0 R /XYZ 313 529 null ] ->> -endobj -1287 0 obj -<< -/D [ 166 0 R /XYZ 380 529 null ] ->> -endobj -1288 0 obj -<< -/D [ 166 0 R /XYZ 446 529 null ] ->> -endobj -1289 0 obj -<< -/D [ 166 0 R /XYZ 127 510 null ] ->> -endobj -1290 0 obj -<< -/D [ 166 0 R /XYZ 185 510 null ] ->> -endobj -1291 0 obj -<< -/D [ 166 0 R /XYZ 242 510 null ] ->> -endobj -1292 0 obj -<< -/D [ 166 0 R /XYZ 313 510 null ] ->> -endobj -1293 0 obj -<< -/D [ 166 0 R /XYZ 380 510 null ] ->> -endobj -1294 0 obj -<< -/D [ 166 0 R /XYZ 446 510 null ] ->> -endobj -1295 0 obj -<< -/D [ 166 0 R /XYZ 127 491 null ] ->> -endobj -1296 0 obj -<< -/D [ 166 0 R /XYZ 185 491 null ] ->> -endobj -1297 0 obj -<< -/D [ 166 0 R /XYZ 242 491 null ] ->> -endobj -1298 0 obj -<< -/D [ 166 0 R /XYZ 313 491 null ] ->> -endobj -1299 0 obj -<< -/D [ 166 0 R /XYZ 380 491 null ] ->> -endobj -1300 0 obj -<< -/D [ 166 0 R /XYZ 446 491 null ] ->> -endobj -1301 0 obj -<< -/D [ 166 0 R /XYZ 127 472 null ] ->> -endobj -1302 0 obj -<< -/D [ 166 0 R /XYZ 185 472 null ] ->> -endobj -1303 0 obj -<< -/D [ 166 0 R /XYZ 242 472 null ] ->> -endobj -1304 0 obj -<< -/D [ 166 0 R /XYZ 313 472 null ] ->> -endobj -1305 0 obj -<< -/D [ 166 0 R /XYZ 380 472 null ] ->> -endobj -1306 0 obj -<< -/D [ 166 0 R /XYZ 446 472 null ] ->> -endobj -1307 0 obj -<< -/D [ 166 0 R /XYZ 127 453 null ] ->> -endobj -1308 0 obj -<< -/D [ 166 0 R /XYZ 185 453 null ] ->> -endobj -1309 0 obj -<< -/D [ 166 0 R /XYZ 242 453 null ] ->> -endobj -1310 0 obj -<< -/D [ 166 0 R /XYZ 313 453 null ] ->> -endobj -1311 0 obj -<< -/D [ 166 0 R /XYZ 380 453 null ] ->> -endobj -1312 0 obj -<< -/D [ 166 0 R /XYZ 446 453 null ] ->> -endobj -1313 0 obj -<< -/D [ 166 0 R /XYZ 127 434 null ] ->> -endobj -1314 0 obj -<< -/D [ 166 0 R /XYZ 185 434 null ] ->> -endobj -1315 0 obj -<< -/D [ 166 0 R /XYZ 242 434 null ] ->> -endobj -1316 0 obj -<< -/D [ 166 0 R /XYZ 313 434 null ] ->> -endobj -1317 0 obj -<< -/D [ 166 0 R /XYZ 380 434 null ] ->> -endobj -1318 0 obj -<< -/D [ 166 0 R /XYZ 446 434 null ] ->> -endobj -1319 0 obj -<< -/D [ 166 0 R /XYZ 127 415 null ] ->> -endobj -1320 0 obj -<< -/D [ 166 0 R /XYZ 185 415 null ] ->> -endobj -1321 0 obj -<< -/D [ 166 0 R /XYZ 242 415 null ] ->> -endobj -1322 0 obj -<< -/D [ 166 0 R /XYZ 313 415 null ] ->> -endobj -1323 0 obj -<< -/D [ 166 0 R /XYZ 380 415 null ] ->> -endobj -1324 0 obj -<< -/D [ 166 0 R /XYZ 446 415 null ] ->> -endobj -1325 0 obj -<< -/D [ 166 0 R /XYZ 127 396 null ] ->> -endobj -1326 0 obj -<< -/D [ 166 0 R /XYZ 185 396 null ] ->> -endobj -1327 0 obj -<< -/D [ 166 0 R /XYZ 242 396 null ] ->> -endobj -1328 0 obj -<< -/D [ 166 0 R /XYZ 313 396 null ] ->> -endobj -1329 0 obj -<< -/D [ 166 0 R /XYZ 380 396 null ] ->> -endobj -1330 0 obj -<< -/D [ 166 0 R /XYZ 446 396 null ] ->> -endobj -1331 0 obj -<< -/D [ 166 0 R /XYZ 127 377 null ] ->> -endobj -1332 0 obj -<< -/D [ 166 0 R /XYZ 185 377 null ] ->> -endobj -1333 0 obj -<< -/D [ 166 0 R /XYZ 242 377 null ] ->> -endobj -1334 0 obj -<< -/D [ 166 0 R /XYZ 313 377 null ] ->> -endobj -1335 0 obj -<< -/D [ 166 0 R /XYZ 380 377 null ] ->> -endobj -1336 0 obj -<< -/D [ 166 0 R /XYZ 446 377 null ] ->> -endobj -1337 0 obj -<< -/D [ 166 0 R /XYZ 127 358 null ] ->> -endobj -1338 0 obj -<< -/D [ 166 0 R /XYZ 185 358 null ] ->> -endobj -1339 0 obj -<< -/D [ 166 0 R /XYZ 242 358 null ] ->> -endobj -1340 0 obj -<< -/D [ 166 0 R /XYZ 313 358 null ] ->> -endobj -1341 0 obj -<< -/D [ 166 0 R /XYZ 380 358 null ] ->> -endobj -1342 0 obj -<< -/D [ 166 0 R /XYZ 446 358 null ] ->> -endobj -1343 0 obj -<< -/D [ 166 0 R /XYZ 127 339 null ] ->> -endobj -1344 0 obj -<< -/D [ 166 0 R /XYZ 185 339 null ] ->> -endobj -1345 0 obj -<< -/D [ 166 0 R /XYZ 242 339 null ] ->> -endobj -1346 0 obj -<< -/D [ 166 0 R /XYZ 313 339 null ] ->> -endobj -1347 0 obj -<< -/D [ 166 0 R /XYZ 380 339 null ] ->> -endobj -1348 0 obj -<< -/D [ 166 0 R /XYZ 446 339 null ] ->> -endobj -1349 0 obj -<< -/D [ 166 0 R /XYZ 127 320 null ] ->> -endobj -1350 0 obj -<< -/D [ 166 0 R /XYZ 185 320 null ] ->> -endobj -1351 0 obj -<< -/D [ 166 0 R /XYZ 242 320 null ] ->> -endobj -1352 0 obj -<< -/D [ 166 0 R /XYZ 313 320 null ] ->> -endobj -1353 0 obj -<< -/D [ 166 0 R /XYZ 380 320 null ] ->> -endobj -1354 0 obj -<< -/D [ 166 0 R /XYZ 446 320 null ] ->> -endobj -1355 0 obj -<< -/D [ 166 0 R /XYZ 127 301 null ] ->> -endobj -1356 0 obj -<< -/D [ 166 0 R /XYZ 185 301 null ] ->> -endobj -1357 0 obj -<< -/D [ 166 0 R /XYZ 242 301 null ] ->> -endobj -1358 0 obj -<< -/D [ 166 0 R /XYZ 313 301 null ] ->> -endobj -1359 0 obj -<< -/D [ 166 0 R /XYZ 380 301 null ] ->> -endobj -1360 0 obj -<< -/D [ 166 0 R /XYZ 446 301 null ] ->> -endobj -1361 0 obj -<< -/D [ 166 0 R /XYZ 127 282 null ] ->> -endobj -1362 0 obj -<< -/D [ 166 0 R /XYZ 185 282 null ] ->> -endobj -1363 0 obj -<< -/D [ 166 0 R /XYZ 242 282 null ] ->> -endobj -1364 0 obj -<< -/D [ 166 0 R /XYZ 313 282 null ] ->> -endobj -1365 0 obj -<< -/D [ 166 0 R /XYZ 380 282 null ] ->> -endobj -1366 0 obj -<< -/D [ 166 0 R /XYZ 446 282 null ] ->> -endobj -1367 0 obj -<< -/D [ 166 0 R /XYZ 127 263 null ] ->> -endobj -1368 0 obj -<< -/D [ 166 0 R /XYZ 185 263 null ] ->> -endobj -1369 0 obj -<< -/D [ 166 0 R /XYZ 242 263 null ] ->> -endobj -1370 0 obj -<< -/D [ 166 0 R /XYZ 313 263 null ] ->> -endobj -1371 0 obj -<< -/D [ 166 0 R /XYZ 380 263 null ] ->> -endobj -1372 0 obj -<< -/D [ 166 0 R /XYZ 446 263 null ] ->> -endobj -1373 0 obj -<< -/D [ 166 0 R /XYZ 127 244 null ] ->> -endobj -1374 0 obj -<< -/D [ 166 0 R /XYZ 185 244 null ] ->> -endobj -1375 0 obj -<< -/D [ 166 0 R /XYZ 242 244 null ] ->> -endobj -1376 0 obj -<< -/D [ 166 0 R /XYZ 313 244 null ] ->> -endobj -1377 0 obj -<< -/D [ 166 0 R /XYZ 380 244 null ] ->> -endobj -1378 0 obj -<< -/D [ 166 0 R /XYZ 446 244 null ] ->> -endobj -1379 0 obj -<< -/D [ 166 0 R /XYZ 127 225 null ] ->> -endobj -1380 0 obj -<< -/D [ 166 0 R /XYZ 185 225 null ] ->> -endobj -1381 0 obj -<< -/D [ 166 0 R /XYZ 242 225 null ] ->> -endobj -1382 0 obj -<< -/D [ 166 0 R /XYZ 313 225 null ] ->> -endobj -1383 0 obj -<< -/D [ 166 0 R /XYZ 380 225 null ] ->> -endobj -1384 0 obj -<< -/D [ 166 0 R /XYZ 446 225 null ] ->> -endobj -1385 0 obj -<< -/D [ 166 0 R /XYZ 127 206 null ] ->> -endobj -1386 0 obj -<< -/D [ 166 0 R /XYZ 185 206 null ] ->> -endobj -1387 0 obj -<< -/D [ 166 0 R /XYZ 242 206 null ] ->> -endobj -1388 0 obj -<< -/D [ 166 0 R /XYZ 313 206 null ] ->> -endobj -1389 0 obj -<< -/D [ 166 0 R /XYZ 380 206 null ] ->> -endobj -1390 0 obj -<< -/D [ 166 0 R /XYZ 446 206 null ] ->> -endobj -1391 0 obj -<< -/D [ 166 0 R /XYZ 127 187 null ] ->> -endobj -1392 0 obj -<< -/D [ 166 0 R /XYZ 185 187 null ] ->> -endobj -1393 0 obj -<< -/D [ 166 0 R /XYZ 242 187 null ] ->> -endobj -1394 0 obj -<< -/D [ 166 0 R /XYZ 313 187 null ] ->> -endobj -1395 0 obj -<< -/D [ 166 0 R /XYZ 380 187 null ] ->> -endobj -1396 0 obj -<< -/D [ 166 0 R /XYZ 446 187 null ] ->> -endobj -1397 0 obj -<< -/D [ 166 0 R /XYZ 127 168 null ] ->> -endobj -1398 0 obj -<< -/D [ 166 0 R /XYZ 185 168 null ] ->> -endobj -1399 0 obj -<< -/D [ 166 0 R /XYZ 242 168 null ] ->> -endobj -1400 0 obj -<< -/D [ 166 0 R /XYZ 313 168 null ] ->> -endobj -1401 0 obj -<< -/D [ 166 0 R /XYZ 380 168 null ] ->> -endobj -1402 0 obj -<< -/D [ 166 0 R /XYZ 446 168 null ] ->> -endobj -1403 0 obj -<< -/D [ 166 0 R /XYZ 127 149 null ] ->> -endobj -1404 0 obj -<< -/D [ 166 0 R /XYZ 185 149 null ] ->> -endobj -1405 0 obj -<< -/D [ 166 0 R /XYZ 242 149 null ] ->> -endobj -1406 0 obj -<< -/D [ 166 0 R /XYZ 313 149 null ] ->> -endobj -1407 0 obj -<< -/D [ 166 0 R /XYZ 380 149 null ] ->> -endobj -1408 0 obj -<< -/D [ 166 0 R /XYZ 446 149 null ] ->> -endobj -1409 0 obj -<< -/D [ 170 0 R /XYZ 98 407 null ] ->> -endobj -1410 0 obj -<< -/D [ 170 0 R /XYZ 118 605 null ] ->> -endobj -1411 0 obj -<< -/D [ 170 0 R /XYZ 176 605 null ] ->> -endobj -1412 0 obj -<< -/D [ 170 0 R /XYZ 233 605 null ] ->> -endobj -1413 0 obj -<< -/D [ 170 0 R /XYZ 304 605 null ] ->> -endobj -1414 0 obj -<< -/D [ 170 0 R /XYZ 371 605 null ] ->> -endobj -1415 0 obj -<< -/D [ 170 0 R /XYZ 437 605 null ] ->> -endobj -1416 0 obj -<< -/D [ 170 0 R /XYZ 118 586 null ] ->> -endobj -1417 0 obj -<< -/D [ 170 0 R /XYZ 176 586 null ] ->> -endobj -1418 0 obj -<< -/D [ 170 0 R /XYZ 233 586 null ] ->> -endobj -1419 0 obj -<< -/D [ 170 0 R /XYZ 304 586 null ] ->> -endobj -1420 0 obj -<< -/D [ 170 0 R /XYZ 371 586 null ] ->> -endobj -1421 0 obj -<< -/D [ 170 0 R /XYZ 437 586 null ] ->> -endobj -1422 0 obj -<< -/D [ 170 0 R /XYZ 118 567 null ] ->> -endobj -1423 0 obj -<< -/D [ 170 0 R /XYZ 176 567 null ] ->> -endobj -1424 0 obj -<< -/D [ 170 0 R /XYZ 233 567 null ] ->> -endobj -1425 0 obj -<< -/D [ 170 0 R /XYZ 304 567 null ] ->> -endobj -1426 0 obj -<< -/D [ 170 0 R /XYZ 371 567 null ] ->> -endobj -1427 0 obj -<< -/D [ 170 0 R /XYZ 437 567 null ] ->> -endobj -1428 0 obj -<< -/D [ 170 0 R /XYZ 118 548 null ] ->> -endobj -1429 0 obj -<< -/D [ 170 0 R /XYZ 176 548 null ] ->> -endobj -1430 0 obj -<< -/D [ 170 0 R /XYZ 233 548 null ] ->> -endobj -1431 0 obj -<< -/D [ 170 0 R /XYZ 304 548 null ] ->> -endobj -1432 0 obj -<< -/D [ 170 0 R /XYZ 371 548 null ] ->> -endobj -1433 0 obj -<< -/D [ 170 0 R /XYZ 437 548 null ] ->> -endobj -1434 0 obj -<< -/D [ 170 0 R /XYZ 118 529 null ] ->> -endobj -1435 0 obj -<< -/D [ 170 0 R /XYZ 176 529 null ] ->> -endobj -1436 0 obj -<< -/D [ 170 0 R /XYZ 233 529 null ] ->> -endobj -1437 0 obj -<< -/D [ 170 0 R /XYZ 304 529 null ] ->> -endobj -1438 0 obj -<< -/D [ 170 0 R /XYZ 371 529 null ] ->> -endobj -1439 0 obj -<< -/D [ 170 0 R /XYZ 437 529 null ] ->> -endobj -1440 0 obj -<< -/D [ 170 0 R /XYZ 118 510 null ] ->> -endobj -1441 0 obj -<< -/D [ 170 0 R /XYZ 176 510 null ] ->> -endobj -1442 0 obj -<< -/D [ 170 0 R /XYZ 233 510 null ] ->> -endobj -1443 0 obj -<< -/D [ 170 0 R /XYZ 304 510 null ] ->> -endobj -1444 0 obj -<< -/D [ 170 0 R /XYZ 371 510 null ] ->> -endobj -1445 0 obj -<< -/D [ 170 0 R /XYZ 437 510 null ] ->> -endobj -1446 0 obj -<< -/D [ 170 0 R /XYZ 118 491 null ] ->> -endobj -1447 0 obj -<< -/D [ 170 0 R /XYZ 176 491 null ] ->> -endobj -1448 0 obj -<< -/D [ 170 0 R /XYZ 233 491 null ] ->> -endobj -1449 0 obj -<< -/D [ 170 0 R /XYZ 304 491 null ] ->> -endobj -1450 0 obj -<< -/D [ 170 0 R /XYZ 371 491 null ] ->> -endobj -1451 0 obj -<< -/D [ 170 0 R /XYZ 437 491 null ] ->> -endobj -1452 0 obj -<< -/D [ 170 0 R /XYZ 118 472 null ] ->> -endobj -1453 0 obj -<< -/D [ 170 0 R /XYZ 176 472 null ] ->> -endobj -1454 0 obj -<< -/D [ 170 0 R /XYZ 233 472 null ] ->> -endobj -1455 0 obj -<< -/D [ 170 0 R /XYZ 304 472 null ] ->> -endobj -1456 0 obj -<< -/D [ 170 0 R /XYZ 371 472 null ] ->> -endobj -1457 0 obj -<< -/D [ 170 0 R /XYZ 437 472 null ] ->> -endobj -1458 0 obj -<< -/D [ 170 0 R /XYZ 118 453 null ] ->> -endobj -1459 0 obj -<< -/D [ 170 0 R /XYZ 176 453 null ] ->> -endobj -1460 0 obj -<< -/D [ 170 0 R /XYZ 233 453 null ] ->> -endobj -1461 0 obj -<< -/D [ 170 0 R /XYZ 304 453 null ] ->> -endobj -1462 0 obj -<< -/D [ 170 0 R /XYZ 371 453 null ] ->> -endobj -1463 0 obj -<< -/D [ 170 0 R /XYZ 437 453 null ] ->> -endobj -1464 0 obj -<< -/D [ 170 0 R /XYZ 118 434 null ] ->> -endobj -1465 0 obj -<< -/D [ 170 0 R /XYZ 176 434 null ] ->> -endobj -1466 0 obj -<< -/D [ 170 0 R /XYZ 233 434 null ] ->> -endobj -1467 0 obj -<< -/D [ 170 0 R /XYZ 304 434 null ] ->> -endobj -1468 0 obj -<< -/D [ 170 0 R /XYZ 371 434 null ] ->> -endobj -1469 0 obj -<< -/D [ 170 0 R /XYZ 437 434 null ] ->> -endobj -1470 0 obj -<< -/D [ 170 0 R /XYZ 206 397 null ] ->> -endobj -1471 0 obj -<< -/D [ 170 0 R /XYZ 206 376 null ] ->> -endobj -1472 0 obj -<< -/D [ 170 0 R /XYZ 206 357 null ] ->> -endobj -1473 0 obj -<< -/D [ 170 0 R /XYZ 275 357 null ] ->> -endobj -1474 0 obj -<< -/D [ 170 0 R /XYZ 344 357 null ] ->> -endobj -1475 0 obj -<< -/D [ 170 0 R /XYZ 365 357 null ] ->> -endobj -1476 0 obj -<< -/D [ 170 0 R /XYZ 434 357 null ] ->> -endobj -1477 0 obj -<< -/D [ 170 0 R /XYZ 206 338 null ] ->> -endobj -1478 0 obj -<< -/D [ 170 0 R /XYZ 275 338 null ] ->> -endobj -1479 0 obj -<< -/D [ 170 0 R /XYZ 344 338 null ] ->> -endobj -1480 0 obj -<< -/D [ 170 0 R /XYZ 365 338 null ] ->> -endobj -1481 0 obj -<< -/D [ 170 0 R /XYZ 434 338 null ] ->> -endobj -1482 0 obj -<< -/D [ 170 0 R /XYZ 206 319 null ] ->> -endobj -1483 0 obj -<< -/D [ 170 0 R /XYZ 275 319 null ] ->> -endobj -1484 0 obj -<< -/D [ 170 0 R /XYZ 344 319 null ] ->> -endobj -1485 0 obj -<< -/D [ 170 0 R /XYZ 365 319 null ] ->> -endobj -1486 0 obj -<< -/D [ 170 0 R /XYZ 434 319 null ] ->> -endobj -1487 0 obj -<< -/D [ 170 0 R /XYZ 206 300 null ] ->> -endobj -1488 0 obj -<< -/D [ 170 0 R /XYZ 275 300 null ] ->> -endobj -1489 0 obj -<< -/D [ 170 0 R /XYZ 344 300 null ] ->> -endobj -1490 0 obj -<< -/D [ 170 0 R /XYZ 365 300 null ] ->> -endobj -1491 0 obj -<< -/D [ 170 0 R /XYZ 434 300 null ] ->> -endobj -1492 0 obj -<< -/D [ 170 0 R /XYZ 206 281 null ] ->> -endobj -1493 0 obj -<< -/D [ 170 0 R /XYZ 275 281 null ] ->> -endobj -1494 0 obj -<< -/D [ 170 0 R /XYZ 344 281 null ] ->> -endobj -1495 0 obj -<< -/D [ 170 0 R /XYZ 365 281 null ] ->> -endobj -1496 0 obj -<< -/D [ 170 0 R /XYZ 434 281 null ] ->> -endobj -1497 0 obj -<< -/D [ 170 0 R /XYZ 206 262 null ] ->> -endobj -1498 0 obj -<< -/D [ 170 0 R /XYZ 275 262 null ] ->> -endobj -1499 0 obj -<< -/D [ 170 0 R /XYZ 344 262 null ] ->> -endobj -1500 0 obj -<< -/D [ 170 0 R /XYZ 365 262 null ] ->> -endobj -1501 0 obj -<< -/D [ 170 0 R /XYZ 434 262 null ] ->> -endobj -1502 0 obj -<< -/D [ 170 0 R /XYZ 206 243 null ] ->> -endobj -1503 0 obj -<< -/D [ 170 0 R /XYZ 275 243 null ] ->> -endobj -1504 0 obj -<< -/D [ 170 0 R /XYZ 344 243 null ] ->> -endobj -1505 0 obj -<< -/D [ 170 0 R /XYZ 365 243 null ] ->> -endobj -1506 0 obj -<< -/D [ 170 0 R /XYZ 434 243 null ] ->> -endobj -1507 0 obj -<< -/D [ 170 0 R /XYZ 206 224 null ] ->> -endobj -1508 0 obj -<< -/D [ 170 0 R /XYZ 275 224 null ] ->> -endobj -1509 0 obj -<< -/D [ 170 0 R /XYZ 344 224 null ] ->> -endobj -1510 0 obj -<< -/D [ 170 0 R /XYZ 365 224 null ] ->> -endobj -1511 0 obj -<< -/D [ 170 0 R /XYZ 434 224 null ] ->> -endobj -1512 0 obj -<< -/D [ 170 0 R /XYZ 206 205 null ] ->> -endobj -1513 0 obj -<< -/D [ 170 0 R /XYZ 275 205 null ] ->> -endobj -1514 0 obj -<< -/D [ 170 0 R /XYZ 344 205 null ] ->> -endobj -1515 0 obj -<< -/D [ 170 0 R /XYZ 365 205 null ] ->> -endobj -1516 0 obj -<< -/D [ 170 0 R /XYZ 434 205 null ] ->> -endobj -1517 0 obj -<< -/D [ 170 0 R /XYZ 206 186 null ] ->> -endobj -1518 0 obj -<< -/D [ 170 0 R /XYZ 275 186 null ] ->> -endobj -1519 0 obj -<< -/D [ 170 0 R /XYZ 344 186 null ] ->> -endobj -1520 0 obj -<< -/D [ 170 0 R /XYZ 365 186 null ] ->> -endobj -1521 0 obj -<< -/D [ 170 0 R /XYZ 434 186 null ] ->> -endobj -1522 0 obj -<< -/D [ 170 0 R /XYZ 206 167 null ] ->> -endobj -1523 0 obj -<< -/D [ 170 0 R /XYZ 275 167 null ] ->> -endobj -1524 0 obj -<< -/D [ 170 0 R /XYZ 344 167 null ] ->> -endobj -1525 0 obj -<< -/D [ 170 0 R /XYZ 365 167 null ] ->> -endobj -1526 0 obj -<< -/D [ 170 0 R /XYZ 434 167 null ] ->> -endobj -1527 0 obj -<< -/D [ 170 0 R /XYZ 206 148 null ] ->> -endobj -1528 0 obj -<< -/D [ 170 0 R /XYZ 275 148 null ] ->> -endobj -1529 0 obj -<< -/D [ 170 0 R /XYZ 344 148 null ] ->> -endobj -1530 0 obj -<< -/D [ 170 0 R /XYZ 365 148 null ] ->> -endobj -1531 0 obj -<< -/D [ 170 0 R /XYZ 434 148 null ] ->> -endobj -1532 0 obj -<< -/D [ 174 0 R /XYZ 107 197 null ] ->> -endobj -1533 0 obj -<< -/D [ 174 0 R /XYZ 215 604 null ] ->> -endobj -1534 0 obj -<< -/D [ 174 0 R /XYZ 284 604 null ] ->> -endobj -1535 0 obj -<< -/D [ 174 0 R /XYZ 353 604 null ] ->> -endobj -1536 0 obj -<< -/D [ 174 0 R /XYZ 374 604 null ] ->> -endobj -1537 0 obj -<< -/D [ 174 0 R /XYZ 443 604 null ] ->> -endobj -1538 0 obj -<< -/D [ 174 0 R /XYZ 215 585 null ] ->> -endobj -1539 0 obj -<< -/D [ 174 0 R /XYZ 284 585 null ] ->> -endobj -1540 0 obj -<< -/D [ 174 0 R /XYZ 353 585 null ] ->> -endobj -1541 0 obj -<< -/D [ 174 0 R /XYZ 374 585 null ] ->> -endobj -1542 0 obj -<< -/D [ 174 0 R /XYZ 443 585 null ] ->> -endobj -1543 0 obj -<< -/D [ 174 0 R /XYZ 215 566 null ] ->> -endobj -1544 0 obj -<< -/D [ 174 0 R /XYZ 284 566 null ] ->> -endobj -1545 0 obj -<< -/D [ 174 0 R /XYZ 353 566 null ] ->> -endobj -1546 0 obj -<< -/D [ 174 0 R /XYZ 374 566 null ] ->> -endobj -1547 0 obj -<< -/D [ 174 0 R /XYZ 443 566 null ] ->> -endobj -1548 0 obj -<< -/D [ 174 0 R /XYZ 215 547 null ] ->> -endobj -1549 0 obj -<< -/D [ 174 0 R /XYZ 284 547 null ] ->> -endobj -1550 0 obj -<< -/D [ 174 0 R /XYZ 353 547 null ] ->> -endobj -1551 0 obj -<< -/D [ 174 0 R /XYZ 374 547 null ] ->> -endobj -1552 0 obj -<< -/D [ 174 0 R /XYZ 443 547 null ] ->> -endobj -1553 0 obj -<< -/D [ 174 0 R /XYZ 215 528 null ] ->> -endobj -1554 0 obj -<< -/D [ 174 0 R /XYZ 284 528 null ] ->> -endobj -1555 0 obj -<< -/D [ 174 0 R /XYZ 353 528 null ] ->> -endobj -1556 0 obj -<< -/D [ 174 0 R /XYZ 374 528 null ] ->> -endobj -1557 0 obj -<< -/D [ 174 0 R /XYZ 443 528 null ] ->> -endobj -1558 0 obj -<< -/D [ 174 0 R /XYZ 215 509 null ] ->> -endobj -1559 0 obj -<< -/D [ 174 0 R /XYZ 284 509 null ] ->> -endobj -1560 0 obj -<< -/D [ 174 0 R /XYZ 353 509 null ] ->> -endobj -1561 0 obj -<< -/D [ 174 0 R /XYZ 374 509 null ] ->> -endobj -1562 0 obj -<< -/D [ 174 0 R /XYZ 443 509 null ] ->> -endobj -1563 0 obj -<< -/D [ 174 0 R /XYZ 215 490 null ] ->> -endobj -1564 0 obj -<< -/D [ 174 0 R /XYZ 284 490 null ] ->> -endobj -1565 0 obj -<< -/D [ 174 0 R /XYZ 353 490 null ] ->> -endobj -1566 0 obj -<< -/D [ 174 0 R /XYZ 374 490 null ] ->> -endobj -1567 0 obj -<< -/D [ 174 0 R /XYZ 443 490 null ] ->> -endobj -1568 0 obj -<< -/D [ 174 0 R /XYZ 215 471 null ] ->> -endobj -1569 0 obj -<< -/D [ 174 0 R /XYZ 284 471 null ] ->> -endobj -1570 0 obj -<< -/D [ 174 0 R /XYZ 353 471 null ] ->> -endobj -1571 0 obj -<< -/D [ 174 0 R /XYZ 374 471 null ] ->> -endobj -1572 0 obj -<< -/D [ 174 0 R /XYZ 443 471 null ] ->> -endobj -1573 0 obj -<< -/D [ 174 0 R /XYZ 215 452 null ] ->> -endobj -1574 0 obj -<< -/D [ 174 0 R /XYZ 284 452 null ] ->> -endobj -1575 0 obj -<< -/D [ 174 0 R /XYZ 353 452 null ] ->> -endobj -1576 0 obj -<< -/D [ 174 0 R /XYZ 374 452 null ] ->> -endobj -1577 0 obj -<< -/D [ 174 0 R /XYZ 443 452 null ] ->> -endobj -1578 0 obj -<< -/D [ 174 0 R /XYZ 215 433 null ] ->> -endobj -1579 0 obj -<< -/D [ 174 0 R /XYZ 284 433 null ] ->> -endobj -1580 0 obj -<< -/D [ 174 0 R /XYZ 353 433 null ] ->> -endobj -1581 0 obj -<< -/D [ 174 0 R /XYZ 374 433 null ] ->> -endobj -1582 0 obj -<< -/D [ 174 0 R /XYZ 443 433 null ] ->> -endobj -1583 0 obj -<< -/D [ 174 0 R /XYZ 215 414 null ] ->> -endobj -1584 0 obj -<< -/D [ 174 0 R /XYZ 284 414 null ] ->> -endobj -1585 0 obj -<< -/D [ 174 0 R /XYZ 353 414 null ] ->> -endobj -1586 0 obj -<< -/D [ 174 0 R /XYZ 374 414 null ] ->> -endobj -1587 0 obj -<< -/D [ 174 0 R /XYZ 443 414 null ] ->> -endobj -1588 0 obj -<< -/D [ 174 0 R /XYZ 215 395 null ] ->> -endobj -1589 0 obj -<< -/D [ 174 0 R /XYZ 284 395 null ] ->> -endobj -1590 0 obj -<< -/D [ 174 0 R /XYZ 353 395 null ] ->> -endobj -1591 0 obj -<< -/D [ 174 0 R /XYZ 374 395 null ] ->> -endobj -1592 0 obj -<< -/D [ 174 0 R /XYZ 443 395 null ] ->> -endobj -1593 0 obj -<< -/D [ 174 0 R /XYZ 215 376 null ] ->> -endobj -1594 0 obj -<< -/D [ 174 0 R /XYZ 284 376 null ] ->> -endobj -1595 0 obj -<< -/D [ 174 0 R /XYZ 353 376 null ] ->> -endobj -1596 0 obj -<< -/D [ 174 0 R /XYZ 374 376 null ] ->> -endobj -1597 0 obj -<< -/D [ 174 0 R /XYZ 443 376 null ] ->> -endobj -1598 0 obj -<< -/D [ 174 0 R /XYZ 215 357 null ] ->> -endobj -1599 0 obj -<< -/D [ 174 0 R /XYZ 284 357 null ] ->> -endobj -1600 0 obj -<< -/D [ 174 0 R /XYZ 353 357 null ] ->> -endobj -1601 0 obj -<< -/D [ 174 0 R /XYZ 374 357 null ] ->> -endobj -1602 0 obj -<< -/D [ 174 0 R /XYZ 443 357 null ] ->> -endobj -1603 0 obj -<< -/D [ 174 0 R /XYZ 215 338 null ] ->> -endobj -1604 0 obj -<< -/D [ 174 0 R /XYZ 284 338 null ] ->> -endobj -1605 0 obj -<< -/D [ 174 0 R /XYZ 353 338 null ] ->> -endobj -1606 0 obj -<< -/D [ 174 0 R /XYZ 374 338 null ] ->> -endobj -1607 0 obj -<< -/D [ 174 0 R /XYZ 443 338 null ] ->> -endobj -1608 0 obj -<< -/D [ 174 0 R /XYZ 215 319 null ] ->> -endobj -1609 0 obj -<< -/D [ 174 0 R /XYZ 284 319 null ] ->> -endobj -1610 0 obj -<< -/D [ 174 0 R /XYZ 353 319 null ] ->> -endobj -1611 0 obj -<< -/D [ 174 0 R /XYZ 374 319 null ] ->> -endobj -1612 0 obj -<< -/D [ 174 0 R /XYZ 443 319 null ] ->> -endobj -1613 0 obj -<< -/D [ 174 0 R /XYZ 215 300 null ] ->> -endobj -1614 0 obj -<< -/D [ 174 0 R /XYZ 284 300 null ] ->> -endobj -1615 0 obj -<< -/D [ 174 0 R /XYZ 353 300 null ] ->> -endobj -1616 0 obj -<< -/D [ 174 0 R /XYZ 374 300 null ] ->> -endobj -1617 0 obj -<< -/D [ 174 0 R /XYZ 443 300 null ] ->> -endobj -1618 0 obj -<< -/D [ 174 0 R /XYZ 215 281 null ] ->> -endobj -1619 0 obj -<< -/D [ 174 0 R /XYZ 284 281 null ] ->> -endobj -1620 0 obj -<< -/D [ 174 0 R /XYZ 353 281 null ] ->> -endobj -1621 0 obj -<< -/D [ 174 0 R /XYZ 374 281 null ] ->> -endobj -1622 0 obj -<< -/D [ 174 0 R /XYZ 443 281 null ] ->> -endobj -1623 0 obj -<< -/D [ 174 0 R /XYZ 215 262 null ] ->> -endobj -1624 0 obj -<< -/D [ 174 0 R /XYZ 284 262 null ] ->> -endobj -1625 0 obj -<< -/D [ 174 0 R /XYZ 353 262 null ] ->> -endobj -1626 0 obj -<< -/D [ 174 0 R /XYZ 374 262 null ] ->> -endobj -1627 0 obj -<< -/D [ 174 0 R /XYZ 443 262 null ] ->> -endobj -1628 0 obj -<< -/D [ 174 0 R /XYZ 215 243 null ] ->> -endobj -1629 0 obj -<< -/D [ 174 0 R /XYZ 284 243 null ] ->> -endobj -1630 0 obj -<< -/D [ 174 0 R /XYZ 353 243 null ] ->> -endobj -1631 0 obj -<< -/D [ 174 0 R /XYZ 374 243 null ] ->> -endobj -1632 0 obj -<< -/D [ 174 0 R /XYZ 443 243 null ] ->> -endobj -1633 0 obj -<< -/D [ 174 0 R /XYZ 215 224 null ] ->> -endobj -1634 0 obj -<< -/D [ 174 0 R /XYZ 284 224 null ] ->> -endobj -1635 0 obj -<< -/D [ 174 0 R /XYZ 353 224 null ] ->> -endobj -1636 0 obj -<< -/D [ 174 0 R /XYZ 374 224 null ] ->> -endobj -1637 0 obj -<< -/D [ 174 0 R /XYZ 443 224 null ] ->> -endobj -1638 0 obj -<< -/D [ null /XYZ null null null ] ->> -endobj -1639 0 obj -<< -/D [ 178 0 R /XYZ null null null ] ->> -endobj -1640 0 obj -<< -/D [ 178 0 R /XYZ 107 110 null ] ->> -endobj -1641 0 obj -<< -/D [ 178 0 R /XYZ 464 717 null ] ->> -endobj -1642 0 obj -<< -/D [ 178 0 R /XYZ 107 640 null ] ->> -endobj -1643 0 obj -<< -/D [ 178 0 R /XYZ 107 551 null ] ->> -endobj -1644 0 obj -<< -/D [ 178 0 R /XYZ 107 527 null ] ->> -endobj -1645 0 obj -<< -/D [ 178 0 R /XYZ 107 410 null ] ->> -endobj -1646 0 obj -<< -/D [ 178 0 R /XYZ 107 387 null ] ->> -endobj -1647 0 obj -<< -/D [ 178 0 R /XYZ 107 366 null ] ->> -endobj -1648 0 obj -<< -/D [ 178 0 R /XYZ 107 318 null ] ->> -endobj -1649 0 obj -<< -/D [ 178 0 R /XYZ 107 297 null ] ->> -endobj -1650 0 obj -<< -/D [ 178 0 R /XYZ 107 257 null ] ->> -endobj -1651 0 obj -<< -/D [ 178 0 R /XYZ 107 205 null ] ->> -endobj -1652 0 obj -<< -/D [ 182 0 R /XYZ 98 695 null ] ->> -endobj -1653 0 obj -<< -/D [ 182 0 R /XYZ 98 110 null ] ->> -endobj -1654 0 obj -<< -/D [ 182 0 R /XYZ 98 663 null ] ->> -endobj -1655 0 obj -<< -/D [ 182 0 R /XYZ 98 545 null ] ->> -endobj -1656 0 obj -<< -/D [ 182 0 R /XYZ 98 502 null ] ->> -endobj -1657 0 obj -<< -/D [ 182 0 R /XYZ 98 466 null ] ->> -endobj -1658 0 obj -<< -/D [ 182 0 R /XYZ 98 445 null ] ->> -endobj -1659 0 obj -<< -/D [ 182 0 R /XYZ 98 314 null ] ->> -endobj -1660 0 obj -<< -/D [ 182 0 R /XYZ 206 653 null ] ->> -endobj -1661 0 obj -<< -/D [ 182 0 R /XYZ 206 633 null ] ->> -endobj -1662 0 obj -<< -/D [ 182 0 R /XYZ 296 633 null ] ->> -endobj -1663 0 obj -<< -/D [ 182 0 R /XYZ 386 633 null ] ->> -endobj -1664 0 obj -<< -/D [ 182 0 R /XYZ 206 614 null ] ->> -endobj -1665 0 obj -<< -/D [ 182 0 R /XYZ 296 614 null ] ->> -endobj -1666 0 obj -<< -/D [ 182 0 R /XYZ 386 614 null ] ->> -endobj -1667 0 obj -<< -/D [ 182 0 R /XYZ 206 583 null ] ->> -endobj -1668 0 obj -<< -/D [ 182 0 R /XYZ 296 583 null ] ->> -endobj -1669 0 obj -<< -/D [ 182 0 R /XYZ 386 583 null ] ->> -endobj -1670 0 obj -<< -/D [ 186 0 R /XYZ 107 695 null ] ->> -endobj -1671 0 obj -<< -/D [ 186 0 R /XYZ 107 110 null ] ->> -endobj -1672 0 obj -<< -/D [ 186 0 R /XYZ 107 665 null ] ->> -endobj -1673 0 obj -<< -/D [ 186 0 R /XYZ 107 644 null ] ->> -endobj -1674 0 obj -<< -/D [ 186 0 R /XYZ 107 632 null ] ->> -endobj -1675 0 obj -<< -/D [ 186 0 R /XYZ 107 478 null ] ->> -endobj -1676 0 obj -<< -/D [ 186 0 R /XYZ 133 622 null ] ->> -endobj -1677 0 obj -<< -/D [ 186 0 R /XYZ 133 602 null ] ->> -endobj -1678 0 obj -<< -/D [ 186 0 R /XYZ 274 602 null ] ->> -endobj -1679 0 obj -<< -/D [ 186 0 R /XYZ 407 602 null ] ->> -endobj -1680 0 obj -<< -/D [ 186 0 R /XYZ 133 583 null ] ->> -endobj -1681 0 obj -<< -/D [ 186 0 R /XYZ 274 583 null ] ->> -endobj -1682 0 obj -<< -/D [ 186 0 R /XYZ 407 583 null ] ->> -endobj -1683 0 obj -<< -/D [ 186 0 R /XYZ 133 564 null ] ->> -endobj -1684 0 obj -<< -/D [ 186 0 R /XYZ 274 564 null ] ->> -endobj -1685 0 obj -<< -/D [ 186 0 R /XYZ 407 564 null ] ->> -endobj -1686 0 obj -<< -/D [ 186 0 R /XYZ 133 545 null ] ->> -endobj -1687 0 obj -<< -/D [ 186 0 R /XYZ 274 545 null ] ->> -endobj -1688 0 obj -<< -/D [ 186 0 R /XYZ 407 545 null ] ->> -endobj -1689 0 obj -<< -/D [ 186 0 R /XYZ 133 526 null ] ->> -endobj -1690 0 obj -<< -/D [ 186 0 R /XYZ 274 526 null ] ->> -endobj -1691 0 obj -<< -/D [ 186 0 R /XYZ 407 526 null ] ->> -endobj -1692 0 obj -<< -/D [ 186 0 R /XYZ 133 507 null ] ->> -endobj -1693 0 obj -<< -/D [ 186 0 R /XYZ 274 507 null ] ->> -endobj -1694 0 obj -<< -/D [ 186 0 R /XYZ 407 507 null ] ->> -endobj -1695 0 obj -<< -/D [ null /XYZ null null null ] ->> -endobj -1696 0 obj -<< -/Limits [ (on)(nnTz##)] -/Names [ (on)212 0 R (onT)833 0 R (onU)985 0 R (onV)1639 0 R (om)253 0 R (ol) -261 0 R (ok)380 0 R (oj)411 0 R (oi)446 0 R (oh)490 0 R (og)564 0 R -(of)789 0 R (nnJz)218 0 R (nnJz)219 0 R (nnJz)220 0 R (nnJz) -221 0 R (nnJ)224 0 R (nnJ)225 0 R (nnJ)226 0 R (nnJ) -227 0 R (nnJ)215 0 R (nnJ)216 0 R (nnJ)217 0 R (nnJ) -222 0 R (nnJ~)230 0 R (nnJ})223 0 R (nnJ})232 0 R (nnJ}) -233 0 R (nnJ})234 0 R (nnJ})235 0 R (nnJ})236 0 R (nnJ}) -237 0 R (nnJ})238 0 R (nnJ})239 0 R (nnJ})240 0 R (nnJ}) -241 0 R (nnJ})242 0 R (nnJ})243 0 R (nnJ})244 0 R (nnJ}) -245 0 R (nnJ})246 0 R (nnJ})247 0 R (nnJ})248 0 R (nnJ}) -249 0 R (nnJ})250 0 R (nnJ})251 0 R (nnJ})231 0 R (nnTz"/) -839 0 R (nnTz".)840 0 R (nnTz+.)841 0 R (nnTz* )842 0 R -(nnTz*/)843 0 R (nnTz*.)844 0 R (nnTz\(&)847 0 R (nnTz\(/) -848 0 R (nnTz/%)852 0 R (nnTz# )853 0 R (nnTz"$)854 0 R -(nnTz+')855 0 R (nnTz+&)856 0 R (nnTz+")857 0 R (nnTz+.) -858 0 R (nnTz#')851 0 R (nnTz##)849 0 R ] ->> -endobj -1697 0 obj -<< -/Limits [ (Mׅ)(Mׅ)] -/Names [ (Mׅ)850 0 R (Mׅ)870 0 R (Mׅ)871 0 R (Mׅ) -872 0 R (Mׅ)873 0 R (Mׅ)874 0 R (Mׅ)875 0 R -(Mׅ)876 0 R (Mׅ)878 0 R (Mׅ)879 0 R (Mׅ) -880 0 R (Mׅ)881 0 R (Mׅ)897 0 R (Mׅ)898 0 R -(Mׅ)899 0 R (Mׅ)900 0 R (Mׅ)901 0 R (Mׅ) -902 0 R (Mׅ)903 0 R (Mׅ)925 0 R (Mׅ)905 0 R -(Mׅ)906 0 R (Mׅ)907 0 R (Mׅ)908 0 R (Mׅ) -926 0 R (Mׅ)927 0 R (Mׅ)928 0 R (Mׅ)929 0 R -(Mׅ)930 0 R (Mׅ)931 0 R (Mׅ)944 0 R (Mׅ) -933 0 R (Mׅ)934 0 R (Mׅ)935 0 R (Mׅ)936 0 R -(Mׅ)982 0 R (Mׅ)945 0 R (Mׅ)952 0 R (Mׅ) -953 0 R (Mׅ)954 0 R (Mׅ)955 0 R (Mׅ)956 0 R -(Mׅ)957 0 R (Mׅ)958 0 R (Mׅ)959 0 R (Mׅ) -960 0 R (Mׅ)961 0 R (Mׅ)962 0 R (Mׅ)963 0 R -(Mׅ)964 0 R (Mׅ)965 0 R (Mׅ)966 0 R (Mׅ) -967 0 R (Mׅ)968 0 R (Mׅ)969 0 R (Mׅ)970 0 R -(Mׅ)971 0 R (Mׅ)976 0 R (Mׅ)977 0 R (Mׅ) -978 0 R (Mׅ)980 0 R (Mׅ)979 0 R (Mׅ)975 0 R -(Mׅ)972 0 R ] ->> -endobj -1698 0 obj -<< -/Limits [ (fcs)(fcs)] -/Names [ (fcs)973 0 R (fcs)974 0 R (fcr)949 0 R (fcr) -950 0 R (fcr)951 0 R (fcr)946 0 R (fcr)947 0 R -(fcr)948 0 R (fcv)837 0 R (fcv)838 0 R (fc{) -845 0 R (fc{)846 0 R (fcs)868 0 R (fcs)869 0 R -(fcw)836 0 R (fct)859 0 R (fct)860 0 R (fct) -861 0 R (fct)862 0 R (fct)863 0 R (fc{)864 0 R -(fc{)865 0 R (fc{)866 0 R (fc{)867 0 R (fcz) -882 0 R (fcz)883 0 R (fcz)884 0 R (fcz)885 0 R -(fcz)886 0 R (fcs)887 0 R (fcs)888 0 R (fcs) -889 0 R (fcs)890 0 R (fcr)909 0 R (fcr)910 0 R -(fcr)911 0 R (fcr)912 0 R (fcq)913 0 R (fcq) -914 0 R (fcq)915 0 R (fcq)916 0 R (fcq)917 0 R -(fcp)937 0 R (fcp)938 0 R (fcw)939 0 R (fcw) -940 0 R (fcw)941 0 R (fcw)942 0 R (fcu)894 0 R -(fcu)895 0 R (fcu)896 0 R (fcu)891 0 R (fcu) -892 0 R (fct)893 0 R (fcs)877 0 R (fc{)921 0 R -(fc{)922 0 R (fc{)923 0 R (fcz)918 0 R (fcz) -919 0 R (fcz)920 0 R (fcw)904 0 R (fc{)932 0 R -(fcs)987 0 R ] ->> -endobj -1699 0 obj -<< -/Limits [ (I*L)(I*J)] -/Names [ (I*L)988 0 R (I*I)991 0 R (I*H)999 0 R (I*J) -1000 0 R (I*D)1001 0 R (I*L)1002 0 R (I*N)1003 0 R -(I*H)1004 0 R (I*J)1005 0 R (I*D)1006 0 R (I*L) -1007 0 R (I*N)1008 0 R (I*H)1009 0 R (I*J)1010 0 R -(I*D)1011 0 R (I*L)1012 0 R (I*N)1013 0 R (I*H) -1014 0 R (I*J)1015 0 R (I*D)1016 0 R (I*L)1017 0 R -(I*N)1018 0 R (I*H)1019 0 R (I*J)1020 0 R (I*D) -1021 0 R (I*L)1022 0 R (I*N)1023 0 R (I*H)1024 0 R -(I*J)1025 0 R (I*D)1026 0 R (I*L)1027 0 R (I*N) -1028 0 R (I*H)1029 0 R (I*J)1030 0 R (I*D)1031 0 R -(I*L)1032 0 R (I*N)1033 0 R (I*H)1034 0 R (I*J) -1035 0 R (I*D)1036 0 R (I*L)1037 0 R (I*N)1038 0 R -(I*H)1039 0 R (I*J)1040 0 R (I*D)1041 0 R (I*L) -1042 0 R (I*N)1043 0 R (I*H)1044 0 R (I*J)1045 0 R -(I*D)1046 0 R (I*L)1047 0 R (I*N)1048 0 R (I*H) -1049 0 R (I*J)1050 0 R (I*D)1051 0 R (I*L)1052 0 R -(I*N)1053 0 R (I*H)1054 0 R (I*J)1055 0 R (I*D) -1056 0 R (I*L)1057 0 R (I*N)1058 0 R (I*H)1059 0 R -(I*J)1060 0 R ] ->> -endobj -1700 0 obj -<< -/Limits [ (|=h )(|=h\r)] -/Names [ (|=h )1061 0 R (|=h )1062 0 R (|=h )1063 0 R (|=h ) -1064 0 R (|=h )1065 0 R (|=h )1066 0 R (|=h )1067 0 R -(|=h )1068 0 R (|=h )1069 0 R (|=h )1070 0 R (|=h ) -1071 0 R (|=h )1072 0 R (|=h )1073 0 R (|=h )1074 0 R -(|=h )1075 0 R (|=h )1076 0 R (|=h )1077 0 R (|=h ) -1078 0 R (|=h )1079 0 R (|=h )1080 0 R (|=h )1081 0 R -(|=h )1082 0 R (|=h )1083 0 R (|=h )1084 0 R (|=h ) -1085 0 R (|=h )1086 0 R (|=h )1087 0 R (|=h )1088 0 R -(|=h )1089 0 R (|=h )1090 0 R (|=h )1091 0 R (|=h ) -1092 0 R (|=h )1093 0 R (|=h )1094 0 R (|=h )1095 0 R -(|=h )1096 0 R (|=h )1097 0 R (|=h )1098 0 R (|=h ) -1099 0 R (|=h )1100 0 R (|=h )1101 0 R (|=h )1102 0 R -(|=h )1103 0 R (|=h )1104 0 R (|=h )1105 0 R (|=h ) -1106 0 R (|=h\r)1107 0 R (|=h\r)1108 0 R (|=h\r)1109 0 R -(|=h\r)1110 0 R (|=h\r)1111 0 R (|=h\r)1112 0 R (|=h\r) -1113 0 R (|=h\r)1114 0 R (|=h\r)1115 0 R (|=h\r)1116 0 R -(|=h\r)1117 0 R (|=h\r)1118 0 R (|=h\r)1119 0 R (|=h\r) -1120 0 R (|=h\r)1121 0 R (|=h\r)1122 0 R (|=h\r)1123 0 R -(|=h\r)1124 0 R ] ->> -endobj -1701 0 obj -<< -/Limits [ (1ˍ)(1‰)] -/Names [ (1ˍ)1128 0 R (1ˍ)1129 0 R (1ˊ)1130 0 R (1ˊ) -1131 0 R (1ˊ)1132 0 R (1ˊ)1133 0 R (1ˊ)1134 0 R -(1ˋ)1135 0 R (1ˋ)1136 0 R (1ˋ)1137 0 R (1ˋ) -1138 0 R (1ˋ)1139 0 R (1ˈ)1140 0 R (1ˈ)1141 0 R -(1ˈ)1142 0 R (1ˈ)1143 0 R (1ˈ)1144 0 R (1ˉ) -1145 0 R (1ˉ)1146 0 R (1ˉ)1147 0 R (1ˉ)1148 0 R -(1ˉ)1149 0 R (1ˆ)1150 0 R (1ˆ)1151 0 R (1ˆ) -1152 0 R (1ˆ)1153 0 R (1ˆ)1154 0 R (1ˇ)1155 0 R -(1ˇ)1156 0 R (1ˇ)1157 0 R (1ˇ)1158 0 R (1ˇ) -1159 0 R (1Ž)1160 0 R (1Ž)1161 0 R (1Ž)1162 0 R -(1Ž)1163 0 R (1Ž)1164 0 R (1)1165 0 R (1) -1166 0 R (1)1167 0 R (1)1168 0 R (1)1169 0 R -(1Œ)989 0 R (1Œ)1172 0 R (1)1173 0 R (1) -1174 0 R (1)1175 0 R (1Š)1176 0 R (1Š)1177 0 R -(1Š)1178 0 R (1Š)1179 0 R (1Š)1180 0 R (1‹) -1181 0 R (1‹)1182 0 R (1‹)1183 0 R (1‹)1184 0 R -(1‹)1185 0 R (1ˆ)1186 0 R (1ˆ)1187 0 R (1ˆ) -1188 0 R (1ˆ)1189 0 R (1ˆ)1190 0 R (1‰)1191 0 R -(1‰)1192 0 R ] ->> -endobj -1702 0 obj -<< -/Limits [ (zEey)(zEe~)] -/Names [ (zEey)1193 0 R (zEey)1194 0 R (zEey)1195 0 R (zEev) -1196 0 R (zEev)1197 0 R (zEev)1198 0 R (zEev)1199 0 R -(zEev)1200 0 R (zEew)1201 0 R (zEew)1202 0 R (zEew) -1203 0 R (zEew)1204 0 R (zEew)1205 0 R (zEe~)1206 0 R -(zEe~)1207 0 R (zEe~)1208 0 R (zEe~)1209 0 R (zEe~) -1210 0 R (zEe)1211 0 R (zEe)1212 0 R (zEe)1213 0 R -(zEe)1214 0 R (zEe)1215 0 R (zEe|)1216 0 R (zEe|) -1217 0 R (zEe|)1218 0 R (zEe|)1219 0 R (zEe|)1220 0 R -(zEe})1221 0 R (zEe})1222 0 R (zEe})1223 0 R (zEe}) -1224 0 R (zEe})1225 0 R (zEez)1226 0 R (zEez)1227 0 R -(zEez)1228 0 R (zEez)1229 0 R (zEez)1230 0 R (zEe{) -1231 0 R (zEe{)1232 0 R (zEe{)1233 0 R (zEe{)1234 0 R -(zEe{)1235 0 R (zEex)1236 0 R (zEex)1237 0 R (zEex) -1238 0 R (zEex)1239 0 R (zEex)1240 0 R (zEey)1241 0 R -(zEey)1242 0 R (zEey)1243 0 R (zEey)1244 0 R (zEey) -1245 0 R (zEev)1246 0 R (zEev)1247 0 R (zEev)1248 0 R -(zEev)1249 0 R (zEev)1250 0 R (zEew)1251 0 R (zEew) -1252 0 R (zEew)1253 0 R (zEew)1254 0 R (zEew)1255 0 R -(zEe~)1256 0 R ] ->> -endobj -1703 0 obj -<< -/Limits [ (`=G`)(`=Gb )] -/Names [ (`=G`)1259 0 R (`=G`)1260 0 R (`=G`)1261 0 R (`=G` ) -1262 0 R (`=Ga)1263 0 R (`=Ga)1264 0 R (`=Ga)1265 0 R -(`=Ga)1266 0 R (`=Ga )1267 0 R (`=Gb)1268 0 R (`=Gb) -1269 0 R (`=Gb)1270 0 R (`=Gb)1271 0 R (`=Gb )1272 0 R -(`=Gc)1273 0 R (`=Gc)1274 0 R (`=Gc)1275 0 R (`=Gc) -1276 0 R (`=Gc )1277 0 R (`=Gd)1278 0 R (`=Gd)1279 0 R -(`=Gd)1280 0 R (`=Gd)1281 0 R (`=Gd )1282 0 R (`=Ge) -1283 0 R (`=Ge)1284 0 R (`=Ge)1285 0 R (`=Ge)1286 0 R -(`=Ge )1287 0 R (`=Gf)1288 0 R (`=Gf)1289 0 R (`=Gf) -1290 0 R (`=Gf)1291 0 R (`=Gf )1292 0 R (`=Gg)1293 0 R -(`=Gg)1294 0 R (`=Gg)1295 0 R (`=Gg)1296 0 R (`=Gg ) -1297 0 R (`=Gh)1298 0 R (`=Gh)1299 0 R (`=Gh)1300 0 R -(`=Gh)1301 0 R (`=Gh )1302 0 R (`=Gi)1303 0 R (`=Gi) -1304 0 R (`=Gi)1305 0 R (`=Gi)1306 0 R (`=Gi )1307 0 R -(`=G`)1308 0 R (`=G`)1309 0 R (`=G`)1310 0 R (`=G`) -1311 0 R (`=G` )1312 0 R (`=Ga)1313 0 R (`=Ga)1314 0 R -(`=Ga)1315 0 R (`=Ga)1316 0 R (`=Ga )1317 0 R (`=Gb) -1318 0 R (`=Gb)1319 0 R (`=Gb)1320 0 R (`=Gb)1321 0 R -(`=Gb )1322 0 R ] ->> -endobj -1704 0 obj -<< -/Limits [ (qQ%8Y\r)(qQ%8^)] -/Names [ (qQ%8Y\r)1323 0 R (qQ%8Y)1324 0 R (qQ%8Y )1325 0 R (qQ%8Y) -1326 0 R (qQ%8Y\r)1327 0 R (qQ%8Y)1328 0 R (qQ%8Y )1329 0 R -(qQ%8Y )1330 0 R (qQ%8Y)1331 0 R (qQ%8Y\r)1332 0 R (qQ%8Y) -1333 0 R (qQ%8Y )1334 0 R (qQ%8Y )1335 0 R (qQ%8Y)1336 0 R -(qQ%8Y\r)1337 0 R (qQ%8Y)1338 0 R (qQ%8Y )1339 0 R (qQ%8Y ) -1340 0 R (qQ%8Y)1341 0 R (qQ%8Y\r)1342 0 R (qQ%8Y)1343 0 R -(qQ%8Y )1344 0 R (qQ%8Y )1345 0 R (qQ%8Y)1346 0 R (qQ%8Y\r) -1347 0 R (qQ%8Y)1348 0 R (qQ%8Y )1349 0 R (qQ%8Y )1350 0 R -(qQ%8Y)1351 0 R (qQ%8^\r)1352 0 R (qQ%8^)1353 0 R (qQ%8^ ) -1354 0 R (qQ%8^ )1355 0 R (qQ%8^)1356 0 R (qQ%8^\r)1357 0 R -(qQ%8^)1358 0 R (qQ%8^ )1359 0 R (qQ%8^ )1360 0 R (qQ%8^) -1361 0 R (qQ%8^\r)1362 0 R (qQ%8^)1363 0 R (qQ%8^ )1364 0 R -(qQ%8^ )1365 0 R (qQ%8^)1366 0 R (qQ%8^\r)1367 0 R (qQ%8^) -1368 0 R (qQ%8^ )1369 0 R (qQ%8^ )1370 0 R (qQ%8^)1371 0 R -(qQ%8^\r)1372 0 R (qQ%8^)1373 0 R (qQ%8^ )1374 0 R (qQ%8^ ) -1375 0 R (qQ%8^)1376 0 R (qQ%8^\r)1377 0 R (qQ%8^)1378 0 R -(qQ%8^ )1379 0 R (qQ%8^ )1380 0 R (qQ%8^)1381 0 R (qQ%8^\r) -1382 0 R (qQ%8^)1383 0 R (qQ%8^ )1384 0 R (qQ%8^ )1385 0 R -(qQ%8^)1386 0 R ] ->> -endobj -1705 0 obj -<< -/Limits [ (M2`|3)(M2`r5)] -/Names [ (M2`|3)1387 0 R (M2`|1)1388 0 R (M2`|7)1389 0 R (M2`|5) -1390 0 R (M2`|;)1391 0 R (M2`s3)1392 0 R (M2`s1)1393 0 R -(M2`s7)1394 0 R (M2`s5)1395 0 R (M2`s;)1396 0 R (M2`r3) -1397 0 R (M2`r1)1398 0 R (M2`r7)1399 0 R (M2`r5)1400 0 R -(M2`r;)1401 0 R (M2`{3)1402 0 R (M2`{1)1403 0 R (M2`{7) -1404 0 R (M2`{5)1405 0 R (M2`{;)1406 0 R (M2`z3)1407 0 R -(M2`z1)1408 0 R (M2`z7)1410 0 R (M2`z5)1411 0 R (M2`z;) -1412 0 R (M2`y3)1413 0 R (M2`y1)1414 0 R (M2`y7)1415 0 R -(M2`y5)1416 0 R (M2`y;)1417 0 R (M2`x3)1418 0 R (M2`x1) -1419 0 R (M2`x7)1420 0 R (M2`x5)1421 0 R (M2`x;)1422 0 R -(M2`3)1423 0 R (M2`1)1424 0 R (M2`7)1425 0 R (M2`5) -1426 0 R (M2`;)1427 0 R (M2`~3)1428 0 R (M2`~1)1429 0 R -(M2`~7)1430 0 R (M2`~5)1431 0 R (M2`~;)1432 0 R (M2`}3) -1433 0 R (M2`}1)1434 0 R (M2`}7)1435 0 R (M2`}5)1436 0 R -(M2`};)1437 0 R (M2`|3)1438 0 R (M2`|1)1439 0 R (M2`|7) -1440 0 R (M2`|5)1441 0 R (M2`|;)1442 0 R (M2`s3)1443 0 R -(M2`s1)1444 0 R (M2`s7)1445 0 R (M2`s5)1446 0 R (M2`s;) -1447 0 R (M2`r3)1448 0 R (M2`r1)1449 0 R (M2`r7)1450 0 R -(M2`r5)1451 0 R ] ->> -endobj -1706 0 obj -<< -/Limits [ (c륹)(c騱)] -/Names [ (c륹)1452 0 R (c謱)1453 0 R (c謳)1454 0 R (c謵) -1455 0 R (c謷)1456 0 R (c謹)1457 0 R (c譱)1458 0 R -(c譳)1459 0 R (c譵)1460 0 R (c護)1461 0 R (c譹) -1462 0 R (c讱)1463 0 R (c讳)1464 0 R (c讵)1465 0 R -(c讷)1466 0 R (c讹)1467 0 R (c诱)1468 0 R (c诳) -1469 0 R (c说)1127 0 R (c请)1470 0 R (c訷)1471 0 R -(c詷)1472 0 R (c詹)1473 0 R (c誱)1474 0 R (c誳) -1475 0 R (c誵)1476 0 R (c誷)1477 0 R (c誹)1478 0 R -(c諱)1479 0 R (c諳)1480 0 R (c諵)1481 0 R (c諷) -1482 0 R (c諹)1483 0 R (c褱)1484 0 R (c褳)1485 0 R -(c褵)1486 0 R (c褷)1487 0 R (c褹)1488 0 R (c襱) -1489 0 R (c襳)1490 0 R (c襵)1491 0 R (c襷)1492 0 R -(c襹)1493 0 R (c鬱)1494 0 R (c鬳)1495 0 R (c鬵) -1496 0 R (c鬷)1497 0 R (c鬹)1498 0 R (c魱)1499 0 R -(c魳)1500 0 R (c魵)1501 0 R (c魷)1502 0 R (c魹) -1503 0 R (c鮱)1504 0 R (c鮳)1505 0 R (c鮵)1506 0 R -(c鮷)1507 0 R (c鮹)1508 0 R (c鯱)1509 0 R (c鯳) -1510 0 R (c鯵)1511 0 R (c鯷)1512 0 R (c鯹)1513 0 R -(c騱)1514 0 R ] ->> -endobj -1707 0 obj -<< -/Limits [ (?j~)(?j|)] -/Names [ (?j~)1515 0 R (?j~)1516 0 R (?j~)1517 0 R (?j~) -1518 0 R (?j)1519 0 R (?j)1520 0 R (?j)1521 0 R -(?j)1522 0 R (?j)1523 0 R (?j|)1524 0 R (?j|) -1525 0 R (?j|)1526 0 R (?j|)1527 0 R (?j|)1528 0 R -(?j})1529 0 R (?j})1530 0 R (?j})1531 0 R (?j}) -1533 0 R (?j})1534 0 R (?jr)1535 0 R (?jr)1536 0 R -(?jr)1537 0 R (?jr)1538 0 R (?jr)1539 0 R (?js) -1540 0 R (?js)1541 0 R (?js)1542 0 R (?js)1543 0 R -(?js)1544 0 R (?jz)1545 0 R (?jz)1546 0 R (?jz) -1547 0 R (?jz)1548 0 R (?jz)1549 0 R (?j{)1550 0 R -(?j{)1551 0 R (?j{)1552 0 R (?j{)1553 0 R (?j{) -1554 0 R (?jx)1555 0 R (?jx)1556 0 R (?jx)1557 0 R -(?jx)1558 0 R (?jx)1559 0 R (?jy)1560 0 R (?jy) -1561 0 R (?jy)1562 0 R (?jy)1563 0 R (?jy)1564 0 R -(?j~)1565 0 R (?j~)1566 0 R (?j~)1567 0 R (?j~) -1568 0 R (?j~)1569 0 R (?j)1570 0 R (?j)1571 0 R -(?j)1572 0 R (?j)1573 0 R (?j)1574 0 R (?j|) -1575 0 R (?j|)1576 0 R (?j|)1577 0 R (?j|)1578 0 R -(?j|)1579 0 R ] ->> -endobj -1708 0 obj -<< -/Limits [ ( vW5)( vVw0)] -/Names [ ( vW5)1580 0 R ( vW7)1581 0 R ( vW1)1582 0 R ( vW3) -1583 0 R ( vW=)1584 0 R ( vW5)1585 0 R ( vW7)1586 0 R -( vW1)1587 0 R ( vW3)1588 0 R ( vW=)1589 0 R ( vW5) -1590 0 R ( vW7)1591 0 R ( vW1)1592 0 R ( vW3)1593 0 R -( vW=)1594 0 R ( vW~5)1595 0 R ( vW~7)1596 0 R ( vW~1) -1597 0 R ( vW~3)1598 0 R ( vW~=)1599 0 R ( vW~5)1600 0 R -( vW~7)1601 0 R ( vW~1)1602 0 R ( vW~3)1603 0 R ( vW~=) -1604 0 R ( vW~5)1605 0 R ( vW~7)1606 0 R ( vW~1)1607 0 R -( vW~3)1608 0 R ( vW~=)1609 0 R ( vW~5)1610 0 R ( vW~7) -1611 0 R ( vW~1)1612 0 R ( vW~3)1613 0 R ( vW~=)1614 0 R -( vW~5)1615 0 R ( vW~7)1616 0 R ( vW~1)1617 0 R ( vW~3) -1618 0 R ( vW~=)1619 0 R ( vW~5)1620 0 R ( vW~7)1621 0 R -( vW~1)1622 0 R ( vW~3)1623 0 R ( vW~=)1624 0 R ( vW~5) -1625 0 R ( vW~7)1626 0 R ( vW~1)1627 0 R ( vW~3)1628 0 R -( vW~=)1629 0 R ( vW~5)1630 0 R ( vW~7)1631 0 R ( vW~1) -1632 0 R ( vW~3)1633 0 R ( vW~=)1634 0 R ( vW~5)1635 0 R -( vW~7)1636 0 R ( vW~1)1637 0 R ( vW~2)1409 0 R ( vVw3) -990 0 R ( vVw<)992 0 R ( vVw4)993 0 R ( vVw6)994 0 R -( vVw0)995 0 R ] ->> -endobj -1709 0 obj -<< -/Limits [ (GX)(DY)] -/Names [ (GX)996 0 R (GX)997 0 R (GX)998 0 R (GX) -1170 0 R (GX)1171 0 R (GV)1125 0 R (GV)1126 0 R -(GV)1257 0 R (GV)1258 0 R (GV)986 0 R (GV) -1532 0 R (DZ)1641 0 R (DZ)1654 0 R (DZ)1642 0 R -(DZ)1643 0 R (DZ)1644 0 R (DZ)1645 0 R (DZ) -1646 0 R (DZ)1647 0 R (DZ)1648 0 R (DZ)1649 0 R -(DZ)1650 0 R (DZ)1651 0 R (DZ)1660 0 R (DZ) -1661 0 R (DZ)1662 0 R (DZ)1663 0 R (DZ)1664 0 R -(DZ)1665 0 R (DZ)1666 0 R (DZ)1667 0 R (DZ) -1668 0 R (DZ)1669 0 R (DZ)1675 0 R (DZ)1655 0 R -(DZ)1656 0 R (DZ)1657 0 R (DZ)1658 0 R (DZ) -1659 0 R (DZ)1672 0 R (DZ)1673 0 R (DZ)1676 0 R -(DZ)1677 0 R (DZ)1678 0 R (DZ)1679 0 R (DZ) -1680 0 R (DZ)1681 0 R (DZ)1682 0 R (DZ)1683 0 R -(DZ)1684 0 R (DZ)1685 0 R (DZ)1686 0 R (DZ) -1687 0 R (DZ)1688 0 R (DZ)1689 0 R (DZ)1690 0 R -(DZ)1691 0 R (DZ)1692 0 R (DZ)1693 0 R (DZ) -1694 0 R (DZ)1674 0 R (DY)1652 0 R (DY)1653 0 R -(DY)1670 0 R ] ->> -endobj -1710 0 obj -<< -/Limits [ (,l$NZ!)(,n8L\\!)] -/Names [ (,l$NZ!)1671 0 R (,l$NZ!)1640 0 R (,o8KU)259 0 R (,o8J\\) -260 0 R (,o8J_)254 0 R (,o8I\\)255 0 R (,o8I\\)256 0 R (,n8MT%) -292 0 R (,n8MU$)346 0 R (,n8MU')347 0 R (,n8MU")291 0 R -(,n8MU )371 0 R (,n8MU')372 0 R (,n8MU%)373 0 R (,n8MU+) -374 0 R (,n8MU#)375 0 R (,n8MU")376 0 R (,n8MU )377 0 R -(,n8MU&)378 0 R (,n8L\\')293 0 R (,n8L\\%)294 0 R (,n8L\\+) -295 0 R (,n8L\\#)296 0 R (,n8L\\!)297 0 R (,n8L\\')298 0 R -(,n8L\\%)299 0 R (,n8L\\+)300 0 R (,n8L\\#)301 0 R (,n8L\\') -302 0 R (,n8L\\%)303 0 R (,n8L\\+)304 0 R (,n8L\\#)305 0 R -(,n8L\\!)306 0 R (,n8L\\')307 0 R (,n8L\\%)308 0 R (,n8L\\+) -309 0 R (,n8L\\#)310 0 R (,n8L\\!)311 0 R (,n8L\\')312 0 R -(,n8L\\%)313 0 R (,n8L\\')314 0 R (,n8L\\%)315 0 R (,n8L\\#) -316 0 R (,n8L\\!)317 0 R (,n8L\\')318 0 R (,n8L\\+)319 0 R -(,n8L\\!)320 0 R (,n8L\\')348 0 R (,n8L\\%)349 0 R (,n8L\\#) -350 0 R (,n8L\\!)351 0 R (,n8L\\%)352 0 R (,n8L\\+)353 0 R -(,n8L\\%)354 0 R (,n8L\\+)355 0 R (,n8L\\$)357 0 R (,n8L\\+) -358 0 R (,n8L\\#)359 0 R (,n8L\\!)360 0 R (,n8L\\ )361 0 R -(,n8L\\&)362 0 R (,n8L\\%)363 0 R (,n8L\\+)364 0 R (,n8L\\!) -365 0 R ] ->> -endobj -1711 0 obj -<< -/Limits [ (@L.v)(@I.)] -/Names [ (@L.v)367 0 R (@L.w)368 0 R (@L.u)369 0 R (@L.z) -370 0 R (@L.{)356 0 R (@L.\rq)366 0 R (@K.\n)384 0 R -(@K.)383 0 R (@K.)408 0 R (@K.)385 0 R (@K.\r) -386 0 R (@K. )387 0 R (@K.)388 0 R (@K.)389 0 R (@K.) -390 0 R (@K.)391 0 R (@K. )396 0 R (@K.\n)397 0 R (@K.) -398 0 R (@K.\r)399 0 R (@K. )403 0 R (@K.)404 0 R (@K.) -405 0 R (@K. )406 0 R (@K.\n)407 0 R (@K.)394 0 R (@K.) -395 0 R (@K. )401 0 R (@K.)402 0 R (@J.\n)417 0 R (@J.) -445 0 R (@J.)418 0 R (@J.\r)419 0 R (@J. )420 0 R (@J.) -421 0 R (@J.)422 0 R (@J. )423 0 R (@J.\n)424 0 R (@J. ) -425 0 R (@J.)426 0 R (@J.)427 0 R (@J.)428 0 R (@J.\r) -429 0 R (@J. )430 0 R (@J.)431 0 R (@J.)432 0 R (@J. ) -433 0 R (@J.\n)437 0 R (@J. )438 0 R (@J.)439 0 R (@J.) -440 0 R (@J.)441 0 R (@J.\r)443 0 R (@J. )444 0 R (@J.) -435 0 R (@J. )436 0 R (@J.)416 0 R (@J.)442 0 R (@I.\n) -450 0 R (@I.)488 0 R (@I.)451 0 R (@I.\r)452 0 R (@I. ) -453 0 R (@I.)454 0 R ] ->> -endobj -1712 0 obj -<< -/Limits [ (#'Է? )(#&Է1)] -/Names [ (#'Է? )455 0 R (#'Է?\n)456 0 R (#'Է?\n)457 0 R (#'Է?\n) -458 0 R (#'Է?\n)460 0 R (#'Է?)461 0 R (#'Է?)462 0 R (#'Է?) -463 0 R (#'Է?)464 0 R (#'Է?)465 0 R (#'Է?)466 0 R (#'Է?) -467 0 R (#'Է?)468 0 R (#'Է?)469 0 R (#'Է>\r)470 0 R (#'Է>\r) -471 0 R (#'Է>\r)472 0 R (#'Է>\r)473 0 R (#'Է>\r)474 0 R -(#'Է> )475 0 R (#'Է> )476 0 R (#'Է> )459 0 R (#'Է> ) -480 0 R (#'Է> )481 0 R (#'Է>)482 0 R (#'Է>)486 0 R (#'Է>) -487 0 R (#'Զ8)478 0 R (#'Զ8)479 0 R (#'Զ;\r)484 0 R (#'Զ;\r) -485 0 R (#'Զ; )449 0 R (#&Դ9\n)494 0 R (#&Է? )495 0 R (#&Է? ) -496 0 R (#&Է1)497 0 R (#&Է1)498 0 R (#&Է1)499 0 R (#&Է1) -500 0 R (#&Է1)501 0 R (#&Է1)502 0 R (#&Է1 )503 0 R (#&Է1 ) -504 0 R (#&Է1 )505 0 R (#&Է1 )506 0 R (#&Է1 )507 0 R (#&Է1) -508 0 R (#&Է1)509 0 R (#&Է1)510 0 R (#&Է1)511 0 R (#&Է1) -512 0 R (#&Է1 )513 0 R (#&Է1 )514 0 R (#&Է1 )515 0 R (#&Է1 ) -516 0 R (#&Է1 )517 0 R (#&Է1\n)518 0 R (#&Է1\n)519 0 R -(#&Է1\n)520 0 R (#&Է1\n)521 0 R (#&Է1\n)522 0 R (#&Է1) -523 0 R (#&Է1)524 0 R (#&Է1)525 0 R ] ->> -endobj -1713 0 obj -<< -/Limits [ (ȫa)(Ȥa)] -/Names [ (ȫa)526 0 R (ȫa)527 0 R (ȫa)528 0 R (ȫa)529 0 R -(ȫa)530 0 R (ȫa)531 0 R (ȫa)532 0 R (ȫa) -533 0 R (ȫa)538 0 R (ȫa)539 0 R (ȫa)540 0 R (ȫa) -541 0 R (ȫa)542 0 R (ȫa)543 0 R (ȫa)544 0 R (ȫa) -545 0 R (ȫa)546 0 R (ȫa)547 0 R (ȫa)548 0 R (ȫa) -549 0 R (ȫa)550 0 R (ȫa)551 0 R (ȫa)552 0 R (ȫa) -553 0 R (ȫa)554 0 R (ȫa)555 0 R (ȫa)556 0 R (ȫa) -557 0 R (ȫa)558 0 R (ȫa)559 0 R (ȫa)560 0 R (ȫa) -561 0 R (ȫa)562 0 R (ȫa)563 0 R (ȫa)537 0 R (ȫ`) -535 0 R (ȫ`)536 0 R (ȫ`)493 0 R (Ȥb)569 0 R (Ȥa) -738 0 R (Ȥa)570 0 R (Ȥa)571 0 R (Ȥa)572 0 R (Ȥa) -573 0 R (Ȥa)574 0 R (Ȥa)579 0 R (Ȥa)581 0 R (Ȥa) -582 0 R (Ȥa)583 0 R (Ȥa)584 0 R (Ȥa)585 0 R (Ȥa) -586 0 R (Ȥa)587 0 R (Ȥa)588 0 R (Ȥa)589 0 R (Ȥa) -590 0 R (Ȥa)591 0 R (Ȥa)592 0 R (Ȥa)593 0 R (Ȥa) -594 0 R (Ȥa)595 0 R (Ȥa)596 0 R (Ȥa)597 0 R (Ȥa) -598 0 R ] ->> -endobj -1714 0 obj -<< -/Limits [ ( -\n|)( " v)] -/Names [ ( -\n|)599 0 R ( -\nz)600 0 R ( -\nx)601 0 R ( -\nv) -602 0 R ( -\r~)603 0 R ( -\r|)604 0 R ( -\rz)605 0 R -( -\rx)606 0 R ( -\rv)607 0 R ( - ~)608 0 R ( - |) -609 0 R ( - z)610 0 R ( - x)611 0 R ( - v)612 0 R ( -~) -613 0 R ( -|)614 0 R ( -z)615 0 R ( -x)616 0 R ( -v) -617 0 R ( -~)618 0 R ( -|)619 0 R ( -z)620 0 R ( -x) -621 0 R ( -v)622 0 R ( -~)623 0 R ( -|)624 0 R ( -z) -625 0 R ( -x)626 0 R ( -v)627 0 R ( -~)628 0 R ( -|) -629 0 R ( -z)630 0 R ( -x)631 0 R ( -v)632 0 R ( " ~) -633 0 R ( " |)634 0 R ( " z)635 0 R ( " x)636 0 R ( " v) -637 0 R ( "~)638 0 R ( "|)639 0 R ( "z)640 0 R ( "x) -641 0 R ( "v)642 0 R ( " ~)643 0 R ( " |)644 0 R ( " z) -645 0 R ( " x)646 0 R ( " v)647 0 R ( "\n~)648 0 R ( "\n|) -649 0 R ( "\nz)650 0 R ( "\nx)651 0 R ( "\nv)652 0 R -( "\r~)653 0 R ( "\r|)654 0 R ( "\rz)655 0 R ( "\rx) -656 0 R ( "\rv)657 0 R ( " ~)658 0 R ( " |)659 0 R ( " z) -660 0 R ( " x)661 0 R ( " v)662 0 R ] ->> -endobj -1715 0 obj -<< -/Limits [ (x,)(x,)] -/Names [ (x,)663 0 R (x,)664 0 R (x,)665 0 R (x,)666 0 R -(x,)667 0 R (x,)668 0 R (x,)669 0 R (x,) -670 0 R (x,)671 0 R (x,)672 0 R (x,)673 0 R (x,) -674 0 R (x,)675 0 R (x,)676 0 R (x,)677 0 R (x,) -678 0 R (x,)679 0 R (x,)680 0 R (x,)681 0 R (x,) -682 0 R (x,)683 0 R (x,)684 0 R (x,)685 0 R (x,) -686 0 R (x,)687 0 R (x,)688 0 R (x,)689 0 R (x,) -690 0 R (x,)691 0 R (x,)692 0 R (x,)693 0 R (x,) -694 0 R (x,)695 0 R (x,)696 0 R (x,)697 0 R (x,) -698 0 R (x,)699 0 R (x,)700 0 R (x,)701 0 R (x,) -702 0 R (x,)703 0 R (x,)704 0 R (x,)705 0 R (x,) -706 0 R (x,)707 0 R (x,)708 0 R (x,)709 0 R (x,) -710 0 R (x,)711 0 R (x,)712 0 R (x,)713 0 R (x,) -714 0 R (x,)715 0 R (x,)716 0 R (x,)717 0 R (x,) -718 0 R (x,)719 0 R (x,)720 0 R (x,)721 0 R (x,) -722 0 R (x,)723 0 R (x,)724 0 R (x,)725 0 R (x,) -726 0 R ] ->> -endobj -1716 0 obj -<< -/Limits [ (Dw{)(Dwp)] -/Names [ (Dw{)727 0 R (Dw{)728 0 R (Dw{)729 0 R (Dw{)730 0 R -(Dw{)731 0 R (Dw{)732 0 R (Dw{)580 0 R (Dws) -735 0 R (Dws)736 0 R (Dws)737 0 R (Dws)781 0 R (Dws) -782 0 R (Dws)783 0 R (Dws)784 0 R (Dws)785 0 R (Dws) -786 0 R (Dws)787 0 R (Dws)774 0 R (Dws)775 0 R (Dws) -776 0 R (Dws)777 0 R (Dws)778 0 R (Dws)779 0 R (Dws) -780 0 R (Dws)767 0 R (Dws)768 0 R (Dws)769 0 R (Dws) -770 0 R (Dws)771 0 R (Dws)772 0 R (Dws)773 0 R (Dws) -760 0 R (Dws)761 0 R (Dws)762 0 R (Dws)763 0 R (Dwp) -764 0 R (Dwp)765 0 R (Dwp)766 0 R (Dwp)753 0 R (Dwp) -754 0 R (Dwp)755 0 R (Dwp)756 0 R (Dwp)757 0 R (Dwp) -758 0 R (Dwp)759 0 R (Dwp)746 0 R (Dwp)747 0 R (Dwp) -748 0 R (Dwp)749 0 R (Dwp)750 0 R (Dwp)751 0 R (Dwp) -752 0 R (Dwp)739 0 R (Dwp)740 0 R (Dwp)741 0 R (Dwp) -742 0 R (Dwp)743 0 R (Dwp)744 0 R (Dwp)745 0 R (Dwp) -577 0 R (Dwp)578 0 R (Dwp)733 0 R (Dwp)734 0 R (Dwp) -568 0 R ] ->> -endobj -1717 0 obj -<< -/Limits [ ( N')(.D<1~)] -/Names [ ( N')790 0 R ( N')791 0 R ( N')792 0 R ( N')793 0 R -( N')798 0 R ( N')799 0 R ( N')800 0 R ( N') -801 0 R ( N')802 0 R ( N')803 0 R ( N')804 0 R ( N') -805 0 R ( N')806 0 R ( N')807 0 R ( N')808 0 R ( N') -809 0 R ( N')810 0 R ( N')811 0 R ( N')812 0 R ( N') -813 0 R ( N')814 0 R ( N')815 0 R ( N')816 0 R ( N') -817 0 R ( N')818 0 R ( N')819 0 R ( N')820 0 R ( N') -821 0 R ( N')822 0 R ( N')823 0 R ( N')824 0 R ( N') -825 0 R ( N')826 0 R ( N')827 0 R ( N')828 0 R ( N') -829 0 R ( N')830 0 R ( N')831 0 R ( N')794 0 R ( N') -795 0 R ( N')796 0 R ( N')797 0 R (.F<)214 0 R (.F#1v) -835 0 R (.D<;})333 0 R (.D<;z)334 0 R (.D<;x)335 0 R -(.D<;v)336 0 R (.D<2})337 0 R (.D<2{)338 0 R (.D<2|) -262 0 R (.D<2z)263 0 R (.D<2x)264 0 R (.D<2v)265 0 R -(.D<3~)266 0 R (.D<3|)267 0 R (.D<3z)268 0 R (.D<3x) -269 0 R (.D<3v)270 0 R (.D<0|)271 0 R (.D<0z)272 0 R -(.D<0x)273 0 R (.D<0v)274 0 R (.D<1~)275 0 R ] ->> -endobj -1718 0 obj -<< -/Limits [ (N1w@\()(J1rI5ASn8pfݚ\nJEh<LWW) -] -/Names [ (N1w@\()276 0 R (N1w@.)277 0 R (N1w@,)278 0 R (N1w@") -279 0 R (N1w@*)280 0 R (N1w@\()281 0 R (N1w@.) -282 0 R (N1w@\()283 0 R (N1w@.)284 0 R (N1w@,) -285 0 R (N1w@")286 0 R (N1w@*)287 0 R (N1w@\() -288 0 R (N1w@,)289 0 R (N1w@*)290 0 R (N1w@\() -330 0 R (N1w@.)332 0 R (N1w@")339 0 R (N1w@*)340 0 R -(N1w@.)341 0 R (N1w@,)342 0 R (N1w@.)343 0 R (N1w@,) -344 0 R (N1w@")345 0 R (N1w@-)323 0 R (N1w@")324 0 R -(N1w@*)325 0 R (N1w@/)326 0 R (N1w@,)327 0 R (N1w@*) -328 0 R (N1w@\()329 0 R (N1w@-)331 0 R (N1u@)382 0 R -(N1uH)393 0 R (N1u@)413 0 R (N1uC)415 0 R (N1u@) -448 0 R (N1uD)477 0 R (N1uD)483 0 R (N1u@)492 0 R -(N1u@)566 0 R (N1uF)576 0 R (N1uD)567 0 R (K) -229 0 R (K/)984 0 R (K.)1638 0 R (K-)1695 0 R (K)258 0 R (K) -322 0 R (K)410 0 R (K)434 0 R (K)489 0 R (K)534 0 R (K)788 0 R -(K)832 0 R (J1uG5IEi&M%MH7.k˓MDy=SK j#WDX) -213 0 R (J/hH-cY{,UM-\rhm>VЈW)834 0 R (J1tF5HP_ZzJ) -381 0 R (J1tF5HP_ZzJ)412 0 R (J1I5HPJ zP$`D1ekÏ\nrm&VV) -414 0 R (J1tF5HP_ZzJ)447 0 R (J1tF5HP_ZzJ)491 0 R -(J1tF5HP_ZzJ)565 0 R (J1rI5ASn8pfݚ\nJEh<LWW) -575 0 R ] ->> -endobj -1719 0 obj -<< -/Limits [ (˷)(˷)] -/Names [ (˷)379 0 R (˷)392 0 R (˷)400 0 R (˷)409 0 R (˷)924 0 R -(˷)943 0 R (˷)981 0 R (˷)983 0 R (˷)211 0 R (˷:)228 0 R -(˷:u)252 0 R (˷%)257 0 R (˷)321 0 R ] ->> -endobj -1720 0 obj -<< -/Kids [ 1696 0 R 1697 0 R 1698 0 R 1699 0 R 1700 0 R 1701 0 R 1702 0 R 1703 0 R -1704 0 R 1705 0 R 1706 0 R 1707 0 R 1708 0 R 1709 0 R 1710 0 R 1711 0 R -1712 0 R 1713 0 R 1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R -] ->> -endobj -1721 0 obj -<< -/Linearized 1 -/O 1720 -/H [ 3316 1052 ] -/L 287810 -/E 32243 -/N 34 -/T 253410 ->> -endobj -1722 0 obj -<< -/CreationDate (\)"x<]) -/Producer (pbA*_%MÜ!k̎RJ ) -/Author (vsF&HdʕFۀ{2) -/Title (r}K: IтMl>̻aVF",8 o) -/Creator (aqC-Jn^Ҝ:) -/ModDate (\)"x5]ӝ\(k) -/Subject (pdA*Y%) ->> -endobj -1723 0 obj -<< -/Type /Pages -/Kids [ 1735 0 R 1 0 R 6 0 R 10 0 R 46 0 R 74 0 R 78 0 R 82 0 R ] -/Count 8 -/Parent 1724 0 R ->> -endobj -1724 0 obj -<< -/Type /Pages -/Kids [ 1723 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R ] -/Count 34 ->> -endobj -1725 0 obj -<< -/Type /Pages -/Kids [ 86 0 R 90 0 R 94 0 R 98 0 R 102 0 R 106 0 R 110 0 R 114 0 R 118 0 R -] -/Count 9 -/Parent 1724 0 R ->> -endobj -1726 0 obj -<< -/Type /Pages -/Kids [ 122 0 R 126 0 R 130 0 R 134 0 R 138 0 R 142 0 R 146 0 R 150 0 R ] -/Count 8 -/Parent 1724 0 R ->> -endobj -1727 0 obj -<< -/Type /Pages -/Kids [ 154 0 R 158 0 R 162 0 R 166 0 R 170 0 R 174 0 R 178 0 R 182 0 R ] -/Count 8 -/Parent 1724 0 R ->> -endobj -1728 0 obj -<< -/Type /Pages -/Kids [ 186 0 R ] -/Count 1 -/Parent 1724 0 R ->> -endobj -xref -0 1729 -0000000000 65535 f -0000027552 00000 n -0000027744 00000 n -0000027857 00000 n -0000028015 00000 n -0000029714 00000 n -0000029791 00000 n -0000029991 00000 n -0000030166 00000 n -0000030329 00000 n -0000031064 00000 n -0000031474 00000 n -0000031592 00000 n -0000031710 00000 n -0000031828 00000 n -0000031944 00000 n -0000032061 00000 n -0000032178 00000 n -0000032295 00000 n -0000032412 00000 n -0000032530 00000 n -0000032647 00000 n -0000032764 00000 n -0000032881 00000 n -0000032998 00000 n -0000033115 00000 n -0000033232 00000 n -0000033349 00000 n -0000033466 00000 n -0000033583 00000 n -0000033701 00000 n -0000033818 00000 n -0000033935 00000 n -0000034052 00000 n -0000034170 00000 n -0000034287 00000 n -0000034404 00000 n -0000034521 00000 n -0000034638 00000 n -0000034755 00000 n -0000034872 00000 n -0000035048 00000 n -0000035212 00000 n -0000036488 00000 n -0000036541 00000 n -0000036594 00000 n -0000036647 00000 n -0000037012 00000 n -0000037129 00000 n -0000037245 00000 n -0000037361 00000 n -0000037477 00000 n -0000037594 00000 n -0000037711 00000 n -0000037827 00000 n -0000037944 00000 n -0000038060 00000 n -0000038176 00000 n -0000038292 00000 n -0000038408 00000 n -0000038525 00000 n -0000038642 00000 n -0000038759 00000 n -0000038876 00000 n -0000038994 00000 n -0000039111 00000 n -0000039228 00000 n -0000039345 00000 n -0000039462 00000 n -0000039579 00000 n -0000039696 00000 n -0000039814 00000 n -0000039989 00000 n -0000040153 00000 n -0000041418 00000 n -0000041622 00000 n -0000041796 00000 n -0000041973 00000 n -0000044071 00000 n -0000044266 00000 n -0000044440 00000 n -0000044655 00000 n -0000050759 00000 n -0000050954 00000 n -0000051130 00000 n -0000051306 00000 n -0000052188 00000 n -0000052392 00000 n -0000052568 00000 n -0000052770 00000 n -0000054720 00000 n -0000054915 00000 n -0000055091 00000 n -0000055280 00000 n -0000056965 00000 n -0000057169 00000 n -0000057345 00000 n -0000057561 00000 n -0000059397 00000 n -0000059594 00000 n -0000059767 00000 n -0000059983 00000 n -0000062541 00000 n -0000062740 00000 n -0000062915 00000 n -0000063106 00000 n -0000067310 00000 n -0000067518 00000 n -0000067694 00000 n -0000067925 00000 n -0000071128 00000 n -0000071327 00000 n -0000071503 00000 n -0000071694 00000 n -0000072776 00000 n -0000072984 00000 n -0000073159 00000 n -0000073375 00000 n -0000077364 00000 n -0000077563 00000 n -0000077737 00000 n -0000077941 00000 n -0000080848 00000 n -0000081047 00000 n -0000081223 00000 n -0000081440 00000 n -0000085349 00000 n -0000085557 00000 n -0000085734 00000 n -0000085938 00000 n -0000087990 00000 n -0000088198 00000 n -0000088374 00000 n -0000088576 00000 n -0000089902 00000 n -0000090101 00000 n -0000090277 00000 n -0000090493 00000 n -0000092181 00000 n -0000092380 00000 n -0000092557 00000 n -0000092759 00000 n -0000094741 00000 n -0000094940 00000 n -0000095114 00000 n -0000095316 00000 n -0000097174 00000 n -0000097373 00000 n -0000097550 00000 n -0000097752 00000 n -0000099077 00000 n -0000099276 00000 n -0000099450 00000 n -0000099627 00000 n -0000100491 00000 n -0000100690 00000 n -0000100866 00000 n -0000101056 00000 n -0000103409 00000 n -0000103617 00000 n -0000103793 00000 n -0000103997 00000 n -0000106629 00000 n -0000106828 00000 n -0000107002 00000 n -0000107193 00000 n -0000110314 00000 n -0000110513 00000 n -0000110690 00000 n -0000110881 00000 n -0000113463 00000 n -0000113662 00000 n -0000113838 00000 n -0000114029 00000 n -0000116837 00000 n -0000117036 00000 n -0000117213 00000 n -0000117404 00000 n -0000119400 00000 n -0000119608 00000 n -0000119783 00000 n -0000120012 00000 n -0000123971 00000 n -0000124170 00000 n -0000124344 00000 n -0000124574 00000 n -0000126106 00000 n -0000126305 00000 n -0000126484 00000 n -0000126675 00000 n -0000127664 00000 n -0000127771 00000 n -0000127878 00000 n -0000127983 00000 n -0000128096 00000 n -0000128174 00000 n -0000128282 00000 n -0000128388 00000 n -0000128498 00000 n -0000128601 00000 n -0000128688 00000 n -0000128998 00000 n -0000129462 00000 n -0000129844 00000 n -0000132779 00000 n -0000132960 00000 n -0000133365 00000 n -0000133662 00000 n -0000135163 00000 n -0000135599 00000 n -0000135926 00000 n -0000138538 00000 n -0000138600 00000 n -0000138662 00000 n -0000138722 00000 n -0000138782 00000 n -0000138842 00000 n -0000138902 00000 n -0000138962 00000 n -0000139022 00000 n -0000139082 00000 n -0000139142 00000 n -0000139202 00000 n -0000139262 00000 n -0000139322 00000 n -0000139382 00000 n -0000139442 00000 n -0000139502 00000 n -0000139562 00000 n -0000139621 00000 n -0000139680 00000 n -0000139737 00000 n -0000139794 00000 n -0000139851 00000 n -0000139908 00000 n -0000139965 00000 n -0000140022 00000 n -0000140079 00000 n -0000140136 00000 n -0000140193 00000 n -0000140250 00000 n -0000140307 00000 n -0000140364 00000 n -0000140421 00000 n -0000140478 00000 n -0000140535 00000 n -0000140592 00000 n -0000140649 00000 n -0000140706 00000 n -0000140763 00000 n -0000140820 00000 n -0000140877 00000 n -0000140934 00000 n -0000140993 00000 n -0000141052 00000 n -0000141109 00000 n -0000141166 00000 n -0000141223 00000 n -0000141285 00000 n -0000141347 00000 n -0000141406 00000 n -0000141465 00000 n -0000141525 00000 n -0000141583 00000 n -0000141641 00000 n -0000141699 00000 n -0000141757 00000 n -0000141815 00000 n -0000141873 00000 n -0000141931 00000 n -0000141989 00000 n -0000142047 00000 n -0000142105 00000 n -0000142163 00000 n -0000142221 00000 n -0000142279 00000 n -0000142337 00000 n -0000142395 00000 n -0000142453 00000 n -0000142511 00000 n -0000142569 00000 n -0000142627 00000 n -0000142685 00000 n -0000142743 00000 n -0000142801 00000 n -0000142859 00000 n -0000142917 00000 n -0000142975 00000 n -0000143033 00000 n -0000143091 00000 n -0000143149 00000 n -0000143207 00000 n -0000143265 00000 n -0000143323 00000 n -0000143381 00000 n -0000143439 00000 n -0000143497 00000 n -0000143555 00000 n -0000143613 00000 n -0000143671 00000 n -0000143729 00000 n -0000143787 00000 n -0000143845 00000 n -0000143903 00000 n -0000143961 00000 n -0000144019 00000 n -0000144077 00000 n -0000144135 00000 n -0000144193 00000 n -0000144251 00000 n -0000144309 00000 n -0000144367 00000 n -0000144425 00000 n -0000144483 00000 n -0000144541 00000 n -0000144599 00000 n -0000144657 00000 n -0000144715 00000 n -0000144773 00000 n -0000144831 00000 n -0000144889 00000 n -0000144947 00000 n -0000145007 00000 n -0000145067 00000 n -0000145125 00000 n -0000145183 00000 n -0000145241 00000 n -0000145299 00000 n -0000145357 00000 n -0000145415 00000 n -0000145473 00000 n -0000145530 00000 n -0000145588 00000 n -0000145645 00000 n -0000145703 00000 n -0000145761 00000 n -0000145819 00000 n -0000145877 00000 n -0000145935 00000 n -0000145993 00000 n -0000146050 00000 n -0000146107 00000 n -0000146164 00000 n -0000146221 00000 n -0000146278 00000 n -0000146335 00000 n -0000146393 00000 n -0000146450 00000 n -0000146507 00000 n -0000146564 00000 n -0000146621 00000 n -0000146678 00000 n -0000146735 00000 n -0000146792 00000 n -0000146849 00000 n -0000146906 00000 n -0000146963 00000 n -0000147020 00000 n -0000147077 00000 n -0000147134 00000 n -0000147191 00000 n -0000147248 00000 n -0000147305 00000 n -0000147362 00000 n -0000147419 00000 n -0000147476 00000 n -0000147533 00000 n -0000147590 00000 n -0000147647 00000 n -0000147704 00000 n -0000147761 00000 n -0000147818 00000 n -0000147875 00000 n -0000147932 00000 n -0000147989 00000 n -0000148046 00000 n -0000148103 00000 n -0000148160 00000 n -0000148217 00000 n -0000148274 00000 n -0000148334 00000 n -0000148394 00000 n -0000148452 00000 n -0000148510 00000 n -0000148568 00000 n -0000148626 00000 n -0000148684 00000 n -0000148742 00000 n -0000148800 00000 n -0000148858 00000 n -0000148916 00000 n -0000148974 00000 n -0000149032 00000 n -0000149092 00000 n -0000149150 00000 n -0000149207 00000 n -0000149264 00000 n -0000149321 00000 n -0000149378 00000 n -0000149435 00000 n -0000149492 00000 n -0000149552 00000 n -0000149610 00000 n -0000149668 00000 n -0000149726 00000 n -0000149784 00000 n -0000149842 00000 n -0000149900 00000 n -0000149958 00000 n -0000150016 00000 n -0000150078 00000 n -0000150140 00000 n -0000150200 00000 n -0000150258 00000 n -0000150316 00000 n -0000150374 00000 n -0000150432 00000 n -0000150490 00000 n -0000150548 00000 n -0000150606 00000 n -0000150664 00000 n -0000150722 00000 n -0000150780 00000 n -0000150838 00000 n -0000150896 00000 n -0000150954 00000 n -0000151012 00000 n -0000151070 00000 n -0000151128 00000 n -0000151186 00000 n -0000151244 00000 n -0000151302 00000 n -0000151360 00000 n -0000151418 00000 n -0000151476 00000 n -0000151536 00000 n -0000151593 00000 n -0000151650 00000 n -0000151707 00000 n -0000151764 00000 n -0000151821 00000 n -0000151878 00000 n -0000151935 00000 n -0000151992 00000 n -0000152049 00000 n -0000152106 00000 n -0000152163 00000 n -0000152223 00000 n -0000152281 00000 n -0000152339 00000 n -0000152397 00000 n -0000152455 00000 n -0000152513 00000 n -0000152571 00000 n -0000152629 00000 n -0000152687 00000 n -0000152745 00000 n -0000152803 00000 n -0000152861 00000 n -0000152919 00000 n -0000152977 00000 n -0000153035 00000 n -0000153093 00000 n -0000153151 00000 n -0000153209 00000 n -0000153267 00000 n -0000153325 00000 n -0000153383 00000 n -0000153441 00000 n -0000153499 00000 n -0000153557 00000 n -0000153615 00000 n -0000153673 00000 n -0000153731 00000 n -0000153789 00000 n -0000153847 00000 n -0000153905 00000 n -0000153963 00000 n -0000154021 00000 n -0000154078 00000 n -0000154135 00000 n -0000154192 00000 n -0000154249 00000 n -0000154306 00000 n -0000154365 00000 n -0000154424 00000 n -0000154483 00000 n -0000154542 00000 n -0000154601 00000 n -0000154660 00000 n -0000154722 00000 n -0000154783 00000 n -0000154842 00000 n -0000154901 00000 n -0000154960 00000 n -0000155019 00000 n -0000155078 00000 n -0000155137 00000 n -0000155196 00000 n -0000155255 00000 n -0000155314 00000 n -0000155373 00000 n -0000155432 00000 n -0000155491 00000 n -0000155550 00000 n -0000155609 00000 n -0000155668 00000 n -0000155727 00000 n -0000155786 00000 n -0000155845 00000 n -0000155904 00000 n -0000155963 00000 n -0000156022 00000 n -0000156081 00000 n -0000156140 00000 n -0000156199 00000 n -0000156258 00000 n -0000156317 00000 n -0000156376 00000 n -0000156435 00000 n -0000156494 00000 n -0000156553 00000 n -0000156612 00000 n -0000156671 00000 n -0000156730 00000 n -0000156789 00000 n -0000156848 00000 n -0000156907 00000 n -0000156966 00000 n -0000157025 00000 n -0000157084 00000 n -0000157143 00000 n -0000157202 00000 n -0000157261 00000 n -0000157320 00000 n -0000157381 00000 n -0000157439 00000 n -0000157497 00000 n -0000157555 00000 n -0000157614 00000 n -0000157673 00000 n -0000157732 00000 n -0000157791 00000 n -0000157850 00000 n -0000157909 00000 n -0000157968 00000 n -0000158027 00000 n -0000158086 00000 n -0000158145 00000 n -0000158204 00000 n -0000158263 00000 n -0000158322 00000 n -0000158381 00000 n -0000158440 00000 n -0000158499 00000 n -0000158558 00000 n -0000158617 00000 n -0000158676 00000 n -0000158735 00000 n -0000158794 00000 n -0000158853 00000 n -0000158912 00000 n -0000158971 00000 n -0000159030 00000 n -0000159089 00000 n -0000159150 00000 n -0000159209 00000 n -0000159268 00000 n -0000159327 00000 n -0000159386 00000 n -0000159445 00000 n -0000159504 00000 n -0000159563 00000 n -0000159622 00000 n -0000159681 00000 n -0000159740 00000 n -0000159799 00000 n -0000159858 00000 n -0000159916 00000 n -0000159974 00000 n -0000160032 00000 n -0000160090 00000 n -0000160148 00000 n -0000160206 00000 n -0000160264 00000 n -0000160323 00000 n -0000160382 00000 n -0000160440 00000 n -0000160499 00000 n -0000160558 00000 n -0000160617 00000 n -0000160676 00000 n -0000160735 00000 n -0000160794 00000 n -0000160852 00000 n -0000160911 00000 n -0000160970 00000 n -0000161029 00000 n -0000161088 00000 n -0000161147 00000 n -0000161206 00000 n -0000161264 00000 n -0000161323 00000 n -0000161382 00000 n -0000161441 00000 n -0000161500 00000 n -0000161559 00000 n -0000161618 00000 n -0000161676 00000 n -0000161735 00000 n -0000161794 00000 n -0000161853 00000 n -0000161912 00000 n -0000161971 00000 n -0000162030 00000 n -0000162088 00000 n -0000162147 00000 n -0000162206 00000 n -0000162265 00000 n -0000162324 00000 n -0000162383 00000 n -0000162442 00000 n -0000162500 00000 n -0000162559 00000 n -0000162618 00000 n -0000162677 00000 n -0000162736 00000 n -0000162795 00000 n -0000162854 00000 n -0000162912 00000 n -0000162971 00000 n -0000163030 00000 n -0000163089 00000 n -0000163148 00000 n -0000163207 00000 n -0000163266 00000 n -0000163324 00000 n -0000163383 00000 n -0000163442 00000 n -0000163501 00000 n -0000163560 00000 n -0000163619 00000 n -0000163678 00000 n -0000163736 00000 n -0000163795 00000 n -0000163854 00000 n -0000163913 00000 n -0000163972 00000 n -0000164031 00000 n -0000164090 00000 n -0000164148 00000 n -0000164207 00000 n -0000164266 00000 n -0000164325 00000 n -0000164384 00000 n -0000164443 00000 n -0000164502 00000 n -0000164560 00000 n -0000164619 00000 n -0000164678 00000 n -0000164737 00000 n -0000164796 00000 n -0000164855 00000 n -0000164914 00000 n -0000164972 00000 n -0000165031 00000 n -0000165090 00000 n -0000165149 00000 n -0000165208 00000 n -0000165267 00000 n -0000165326 00000 n -0000165384 00000 n -0000165443 00000 n -0000165502 00000 n -0000165561 00000 n -0000165620 00000 n -0000165679 00000 n -0000165738 00000 n -0000165796 00000 n -0000165855 00000 n -0000165914 00000 n -0000165973 00000 n -0000166032 00000 n -0000166091 00000 n -0000166150 00000 n -0000166208 00000 n -0000166267 00000 n -0000166326 00000 n -0000166385 00000 n -0000166444 00000 n -0000166503 00000 n -0000166562 00000 n -0000166620 00000 n -0000166679 00000 n -0000166738 00000 n -0000166797 00000 n -0000166856 00000 n -0000166915 00000 n -0000166974 00000 n -0000167032 00000 n -0000167091 00000 n -0000167150 00000 n -0000167209 00000 n -0000167268 00000 n -0000167327 00000 n -0000167386 00000 n -0000167444 00000 n -0000167503 00000 n -0000167562 00000 n -0000167621 00000 n -0000167680 00000 n -0000167739 00000 n -0000167798 00000 n -0000167856 00000 n -0000167915 00000 n -0000167974 00000 n -0000168033 00000 n -0000168092 00000 n -0000168151 00000 n -0000168210 00000 n -0000168268 00000 n -0000168327 00000 n -0000168386 00000 n -0000168445 00000 n -0000168504 00000 n -0000168563 00000 n -0000168622 00000 n -0000168680 00000 n -0000168739 00000 n -0000168798 00000 n -0000168857 00000 n -0000168916 00000 n -0000168975 00000 n -0000169034 00000 n -0000169093 00000 n -0000169152 00000 n -0000169211 00000 n -0000169270 00000 n -0000169329 00000 n -0000169388 00000 n -0000169447 00000 n -0000169506 00000 n -0000169565 00000 n -0000169624 00000 n -0000169683 00000 n -0000169742 00000 n -0000169801 00000 n -0000169860 00000 n -0000169919 00000 n -0000169978 00000 n -0000170037 00000 n -0000170096 00000 n -0000170155 00000 n -0000170214 00000 n -0000170273 00000 n -0000170332 00000 n -0000170391 00000 n -0000170450 00000 n -0000170509 00000 n -0000170568 00000 n -0000170627 00000 n -0000170686 00000 n -0000170745 00000 n -0000170804 00000 n -0000170863 00000 n -0000170922 00000 n -0000170981 00000 n -0000171040 00000 n -0000171099 00000 n -0000171158 00000 n -0000171217 00000 n -0000171276 00000 n -0000171335 00000 n -0000171394 00000 n -0000171453 00000 n -0000171512 00000 n -0000171571 00000 n -0000171630 00000 n -0000171689 00000 n -0000171748 00000 n -0000171807 00000 n -0000171866 00000 n -0000171925 00000 n -0000171984 00000 n -0000172043 00000 n -0000172102 00000 n -0000172161 00000 n -0000172220 00000 n -0000172279 00000 n -0000172341 00000 n -0000172402 00000 n -0000172461 00000 n -0000172520 00000 n -0000172579 00000 n -0000172638 00000 n -0000172697 00000 n -0000172756 00000 n -0000172815 00000 n -0000172874 00000 n -0000172933 00000 n -0000172992 00000 n -0000173051 00000 n -0000173110 00000 n -0000173169 00000 n -0000173228 00000 n -0000173287 00000 n -0000173346 00000 n -0000173405 00000 n -0000173464 00000 n -0000173523 00000 n -0000173582 00000 n -0000173641 00000 n -0000173700 00000 n -0000173759 00000 n -0000173818 00000 n -0000173877 00000 n -0000173936 00000 n -0000173995 00000 n -0000174054 00000 n -0000174113 00000 n -0000174172 00000 n -0000174231 00000 n -0000174290 00000 n -0000174349 00000 n -0000174408 00000 n -0000174467 00000 n -0000174526 00000 n -0000174585 00000 n -0000174644 00000 n -0000174703 00000 n -0000174762 00000 n -0000174821 00000 n -0000174880 00000 n -0000174938 00000 n -0000174999 00000 n -0000175058 00000 n -0000175117 00000 n -0000175176 00000 n -0000175235 00000 n -0000175294 00000 n -0000175353 00000 n -0000175412 00000 n -0000175471 00000 n -0000175530 00000 n -0000175589 00000 n -0000175648 00000 n -0000175706 00000 n -0000175764 00000 n -0000175822 00000 n -0000175880 00000 n -0000175938 00000 n -0000175996 00000 n -0000176054 00000 n -0000176112 00000 n -0000176170 00000 n -0000176228 00000 n -0000176286 00000 n -0000176344 00000 n -0000176402 00000 n -0000176460 00000 n -0000176519 00000 n -0000176578 00000 n -0000176637 00000 n -0000176696 00000 n -0000176755 00000 n -0000176814 00000 n -0000176873 00000 n -0000176932 00000 n -0000176991 00000 n -0000177050 00000 n -0000177109 00000 n -0000177168 00000 n -0000177227 00000 n -0000177286 00000 n -0000177345 00000 n -0000177404 00000 n -0000177463 00000 n -0000177522 00000 n -0000177581 00000 n -0000177640 00000 n -0000177699 00000 n -0000177758 00000 n -0000177817 00000 n -0000177876 00000 n -0000177935 00000 n -0000177994 00000 n -0000178053 00000 n -0000178112 00000 n -0000178171 00000 n -0000178230 00000 n -0000178289 00000 n -0000178348 00000 n -0000178407 00000 n -0000178466 00000 n -0000178525 00000 n -0000178584 00000 n -0000178643 00000 n -0000178702 00000 n -0000178760 00000 n -0000178818 00000 n -0000178876 00000 n -0000178934 00000 n -0000178992 00000 n -0000179050 00000 n -0000179108 00000 n -0000179166 00000 n -0000179224 00000 n -0000179282 00000 n -0000179340 00000 n -0000179398 00000 n -0000179457 00000 n -0000179516 00000 n -0000179575 00000 n -0000179634 00000 n -0000179693 00000 n -0000179752 00000 n -0000179811 00000 n -0000179870 00000 n -0000179929 00000 n -0000179988 00000 n -0000180047 00000 n -0000180106 00000 n -0000180165 00000 n -0000180224 00000 n -0000180283 00000 n -0000180344 00000 n -0000180403 00000 n -0000180462 00000 n -0000180521 00000 n -0000180580 00000 n -0000180639 00000 n -0000180698 00000 n -0000180757 00000 n -0000180816 00000 n -0000180875 00000 n -0000180934 00000 n -0000180993 00000 n -0000181052 00000 n -0000181111 00000 n -0000181170 00000 n -0000181229 00000 n -0000181288 00000 n -0000181347 00000 n -0000181406 00000 n -0000181467 00000 n -0000181525 00000 n -0000181583 00000 n -0000181641 00000 n -0000181699 00000 n -0000181757 00000 n -0000181815 00000 n -0000181873 00000 n -0000181931 00000 n -0000181989 00000 n -0000182047 00000 n -0000182105 00000 n -0000182163 00000 n -0000182221 00000 n -0000182279 00000 n -0000182337 00000 n -0000182395 00000 n -0000182453 00000 n -0000182511 00000 n -0000182569 00000 n -0000182627 00000 n -0000182685 00000 n -0000182743 00000 n -0000182801 00000 n -0000182859 00000 n -0000182917 00000 n -0000182975 00000 n -0000183033 00000 n -0000183091 00000 n -0000183149 00000 n -0000183207 00000 n -0000183265 00000 n -0000183323 00000 n -0000183381 00000 n -0000183439 00000 n -0000183497 00000 n -0000183555 00000 n -0000183613 00000 n -0000183674 00000 n -0000183733 00000 n -0000183791 00000 n -0000183849 00000 n -0000183910 00000 n -0000183969 00000 n -0000184028 00000 n -0000184087 00000 n -0000184146 00000 n -0000184205 00000 n -0000184264 00000 n -0000184323 00000 n -0000184382 00000 n -0000184441 00000 n -0000184500 00000 n -0000184559 00000 n -0000184618 00000 n -0000184677 00000 n -0000184736 00000 n -0000184796 00000 n -0000184856 00000 n -0000184916 00000 n -0000184976 00000 n -0000185036 00000 n -0000185096 00000 n -0000185156 00000 n -0000185216 00000 n -0000185276 00000 n -0000185336 00000 n -0000185396 00000 n -0000185456 00000 n -0000185516 00000 n -0000185576 00000 n -0000185636 00000 n -0000185696 00000 n -0000185756 00000 n -0000185816 00000 n -0000185876 00000 n -0000185936 00000 n -0000185996 00000 n -0000186056 00000 n -0000186116 00000 n -0000186176 00000 n -0000186236 00000 n -0000186296 00000 n -0000186356 00000 n -0000186416 00000 n -0000186476 00000 n -0000186536 00000 n -0000186596 00000 n -0000186656 00000 n -0000186716 00000 n -0000186776 00000 n -0000186836 00000 n -0000186896 00000 n -0000186956 00000 n -0000187016 00000 n -0000187076 00000 n -0000187136 00000 n -0000187196 00000 n -0000187256 00000 n -0000187316 00000 n -0000187376 00000 n -0000187436 00000 n -0000187496 00000 n -0000187556 00000 n -0000187616 00000 n -0000187676 00000 n -0000187736 00000 n -0000187796 00000 n -0000187856 00000 n -0000187916 00000 n -0000187976 00000 n -0000188036 00000 n -0000188096 00000 n -0000188156 00000 n -0000188216 00000 n -0000188276 00000 n -0000188336 00000 n -0000188396 00000 n -0000188456 00000 n -0000188516 00000 n -0000188576 00000 n -0000188636 00000 n -0000188696 00000 n -0000188756 00000 n -0000188816 00000 n -0000188876 00000 n -0000188936 00000 n -0000188996 00000 n -0000189056 00000 n -0000189116 00000 n -0000189176 00000 n -0000189236 00000 n -0000189296 00000 n -0000189356 00000 n -0000189416 00000 n -0000189476 00000 n -0000189536 00000 n -0000189596 00000 n -0000189656 00000 n -0000189716 00000 n -0000189776 00000 n -0000189836 00000 n -0000189896 00000 n -0000189956 00000 n -0000190016 00000 n -0000190076 00000 n -0000190136 00000 n -0000190196 00000 n -0000190256 00000 n -0000190316 00000 n -0000190376 00000 n -0000190436 00000 n -0000190496 00000 n -0000190556 00000 n -0000190616 00000 n -0000190676 00000 n -0000190736 00000 n -0000190796 00000 n -0000190856 00000 n -0000190916 00000 n -0000190976 00000 n -0000191036 00000 n -0000191096 00000 n -0000191156 00000 n -0000191216 00000 n -0000191276 00000 n -0000191336 00000 n -0000191396 00000 n -0000191456 00000 n -0000191516 00000 n -0000191576 00000 n -0000191636 00000 n -0000191696 00000 n -0000191756 00000 n -0000191816 00000 n -0000191876 00000 n -0000191936 00000 n -0000191996 00000 n -0000192056 00000 n -0000192116 00000 n -0000192176 00000 n -0000192236 00000 n -0000192295 00000 n -0000192354 00000 n -0000192413 00000 n -0000192472 00000 n -0000192532 00000 n -0000192592 00000 n -0000192652 00000 n -0000192712 00000 n -0000192772 00000 n -0000192832 00000 n -0000192891 00000 n -0000192951 00000 n -0000193011 00000 n -0000193071 00000 n -0000193131 00000 n -0000193191 00000 n -0000193251 00000 n -0000193310 00000 n -0000193370 00000 n -0000193430 00000 n -0000193490 00000 n -0000193550 00000 n -0000193610 00000 n -0000193670 00000 n -0000193729 00000 n -0000193789 00000 n -0000193849 00000 n -0000193909 00000 n -0000193969 00000 n -0000194029 00000 n -0000194089 00000 n -0000194148 00000 n -0000194208 00000 n -0000194268 00000 n -0000194328 00000 n -0000194388 00000 n -0000194448 00000 n -0000194508 00000 n -0000194567 00000 n -0000194627 00000 n -0000194687 00000 n -0000194747 00000 n -0000194807 00000 n -0000194867 00000 n -0000194927 00000 n -0000194986 00000 n -0000195046 00000 n -0000195106 00000 n -0000195166 00000 n -0000195226 00000 n -0000195286 00000 n -0000195346 00000 n -0000195406 00000 n -0000195466 00000 n -0000195526 00000 n -0000195586 00000 n -0000195646 00000 n -0000195706 00000 n -0000195766 00000 n -0000195826 00000 n -0000195886 00000 n -0000195946 00000 n -0000196006 00000 n -0000196066 00000 n -0000196126 00000 n -0000196186 00000 n -0000196246 00000 n -0000196306 00000 n -0000196366 00000 n -0000196426 00000 n -0000196486 00000 n -0000196546 00000 n -0000196606 00000 n -0000196666 00000 n -0000196726 00000 n -0000196786 00000 n -0000196846 00000 n -0000196906 00000 n -0000196966 00000 n -0000197026 00000 n -0000197086 00000 n -0000197146 00000 n -0000197206 00000 n -0000197266 00000 n -0000197326 00000 n -0000197386 00000 n -0000197446 00000 n -0000197506 00000 n -0000197566 00000 n -0000197626 00000 n -0000197686 00000 n -0000197746 00000 n -0000197806 00000 n -0000197866 00000 n -0000197926 00000 n -0000197986 00000 n -0000198046 00000 n -0000198106 00000 n -0000198166 00000 n -0000198226 00000 n -0000198286 00000 n -0000198346 00000 n -0000198406 00000 n -0000198466 00000 n -0000198526 00000 n -0000198586 00000 n -0000198646 00000 n -0000198706 00000 n -0000198766 00000 n -0000198826 00000 n -0000198886 00000 n -0000198946 00000 n -0000199006 00000 n -0000199066 00000 n -0000199126 00000 n -0000199186 00000 n -0000199246 00000 n -0000199306 00000 n -0000199366 00000 n -0000199426 00000 n -0000199486 00000 n -0000199546 00000 n -0000199606 00000 n -0000199666 00000 n -0000199726 00000 n -0000199786 00000 n -0000199846 00000 n -0000199906 00000 n -0000199966 00000 n -0000200026 00000 n -0000200086 00000 n -0000200146 00000 n -0000200206 00000 n -0000200266 00000 n -0000200326 00000 n -0000200386 00000 n -0000200446 00000 n -0000200506 00000 n -0000200566 00000 n -0000200626 00000 n -0000200686 00000 n -0000200746 00000 n -0000200806 00000 n -0000200866 00000 n -0000200926 00000 n -0000200986 00000 n -0000201046 00000 n -0000201106 00000 n -0000201166 00000 n -0000201226 00000 n -0000201286 00000 n -0000201346 00000 n -0000201406 00000 n -0000201466 00000 n -0000201526 00000 n -0000201586 00000 n -0000201646 00000 n -0000201706 00000 n -0000201766 00000 n -0000201826 00000 n -0000201886 00000 n -0000201946 00000 n -0000202006 00000 n -0000202066 00000 n -0000202126 00000 n -0000202186 00000 n -0000202246 00000 n -0000202306 00000 n -0000202366 00000 n -0000202426 00000 n -0000202486 00000 n -0000202546 00000 n -0000202606 00000 n -0000202666 00000 n -0000202726 00000 n -0000202786 00000 n -0000202846 00000 n -0000202906 00000 n -0000202966 00000 n -0000203026 00000 n -0000203086 00000 n -0000203146 00000 n -0000203206 00000 n -0000203266 00000 n -0000203326 00000 n -0000203386 00000 n -0000203446 00000 n -0000203506 00000 n -0000203566 00000 n -0000203626 00000 n -0000203686 00000 n -0000203746 00000 n -0000203806 00000 n -0000203866 00000 n -0000203926 00000 n -0000203986 00000 n -0000204046 00000 n -0000204106 00000 n -0000204166 00000 n -0000204226 00000 n -0000204286 00000 n -0000204346 00000 n -0000204406 00000 n -0000204466 00000 n -0000204526 00000 n -0000204586 00000 n -0000204646 00000 n -0000204706 00000 n -0000204766 00000 n -0000204826 00000 n -0000204886 00000 n -0000204946 00000 n -0000205006 00000 n -0000205066 00000 n -0000205126 00000 n -0000205186 00000 n -0000205246 00000 n -0000205306 00000 n -0000205366 00000 n -0000205426 00000 n -0000205486 00000 n -0000205546 00000 n -0000205606 00000 n -0000205666 00000 n -0000205726 00000 n -0000205786 00000 n -0000205846 00000 n -0000205906 00000 n -0000205966 00000 n -0000206026 00000 n -0000206086 00000 n -0000206146 00000 n -0000206206 00000 n -0000206266 00000 n -0000206326 00000 n -0000206386 00000 n -0000206446 00000 n -0000206506 00000 n -0000206566 00000 n -0000206626 00000 n -0000206686 00000 n -0000206746 00000 n -0000206806 00000 n -0000206866 00000 n -0000206926 00000 n -0000206986 00000 n -0000207046 00000 n -0000207106 00000 n -0000207166 00000 n -0000207226 00000 n -0000207286 00000 n -0000207346 00000 n -0000207406 00000 n -0000207466 00000 n -0000207526 00000 n -0000207586 00000 n -0000207646 00000 n -0000207706 00000 n -0000207766 00000 n -0000207826 00000 n -0000207886 00000 n -0000207946 00000 n -0000208006 00000 n -0000208066 00000 n -0000208126 00000 n -0000208186 00000 n -0000208246 00000 n -0000208306 00000 n -0000208366 00000 n -0000208426 00000 n -0000208486 00000 n -0000208546 00000 n -0000208606 00000 n -0000208666 00000 n -0000208726 00000 n -0000208786 00000 n -0000208846 00000 n -0000208906 00000 n -0000208966 00000 n -0000209026 00000 n -0000209086 00000 n -0000209146 00000 n -0000209206 00000 n -0000209266 00000 n -0000209325 00000 n -0000209385 00000 n -0000209445 00000 n -0000209505 00000 n -0000209565 00000 n -0000209625 00000 n -0000209685 00000 n -0000209745 00000 n -0000209805 00000 n -0000209865 00000 n -0000209925 00000 n -0000209985 00000 n -0000210045 00000 n -0000210105 00000 n -0000210165 00000 n -0000210225 00000 n -0000210285 00000 n -0000210345 00000 n -0000210405 00000 n -0000210465 00000 n -0000210525 00000 n -0000210585 00000 n -0000210645 00000 n -0000210705 00000 n -0000210765 00000 n -0000210825 00000 n -0000210885 00000 n -0000210945 00000 n -0000211005 00000 n -0000211065 00000 n -0000211125 00000 n -0000211185 00000 n -0000211245 00000 n -0000211305 00000 n -0000211365 00000 n -0000211425 00000 n -0000211485 00000 n -0000211545 00000 n -0000211605 00000 n -0000211665 00000 n -0000211725 00000 n -0000211785 00000 n -0000211845 00000 n -0000211905 00000 n -0000211965 00000 n -0000212025 00000 n -0000212085 00000 n -0000212145 00000 n -0000212205 00000 n -0000212265 00000 n -0000212325 00000 n -0000212385 00000 n -0000212445 00000 n -0000212505 00000 n -0000212565 00000 n -0000212625 00000 n -0000212685 00000 n -0000212745 00000 n -0000212805 00000 n -0000212865 00000 n -0000212925 00000 n -0000212985 00000 n -0000213045 00000 n -0000213105 00000 n -0000213165 00000 n -0000213225 00000 n -0000213285 00000 n -0000213345 00000 n -0000213405 00000 n -0000213465 00000 n -0000213525 00000 n -0000213585 00000 n -0000213645 00000 n -0000213705 00000 n -0000213765 00000 n -0000213825 00000 n -0000213885 00000 n -0000213945 00000 n -0000214005 00000 n -0000214065 00000 n -0000214125 00000 n -0000214185 00000 n -0000214245 00000 n -0000214305 00000 n -0000214365 00000 n -0000214425 00000 n -0000214485 00000 n -0000214545 00000 n -0000214605 00000 n -0000214665 00000 n -0000214725 00000 n -0000214785 00000 n -0000214845 00000 n -0000214905 00000 n -0000214965 00000 n -0000215025 00000 n -0000215085 00000 n -0000215145 00000 n -0000215205 00000 n -0000215265 00000 n -0000215325 00000 n -0000215385 00000 n -0000215445 00000 n -0000215505 00000 n -0000215565 00000 n -0000215625 00000 n -0000215685 00000 n -0000215745 00000 n -0000215805 00000 n -0000215865 00000 n -0000215925 00000 n -0000215985 00000 n -0000216045 00000 n -0000216105 00000 n -0000216165 00000 n -0000216225 00000 n -0000216285 00000 n -0000216345 00000 n -0000216405 00000 n -0000216465 00000 n -0000216525 00000 n -0000216585 00000 n -0000216645 00000 n -0000216705 00000 n -0000216765 00000 n -0000216825 00000 n -0000216885 00000 n -0000216945 00000 n -0000217005 00000 n -0000217065 00000 n -0000217125 00000 n -0000217185 00000 n -0000217245 00000 n -0000217305 00000 n -0000217365 00000 n -0000217425 00000 n -0000217485 00000 n -0000217545 00000 n -0000217605 00000 n -0000217665 00000 n -0000217725 00000 n -0000217785 00000 n -0000217845 00000 n -0000217905 00000 n -0000217965 00000 n -0000218025 00000 n -0000218085 00000 n -0000218145 00000 n -0000218205 00000 n -0000218265 00000 n -0000218325 00000 n -0000218385 00000 n -0000218445 00000 n -0000218505 00000 n -0000218565 00000 n -0000218625 00000 n -0000218685 00000 n -0000218745 00000 n -0000218805 00000 n -0000218865 00000 n -0000218925 00000 n -0000218985 00000 n -0000219045 00000 n -0000219105 00000 n -0000219165 00000 n -0000219225 00000 n -0000219285 00000 n -0000219345 00000 n -0000219405 00000 n -0000219465 00000 n -0000219525 00000 n -0000219585 00000 n -0000219645 00000 n -0000219705 00000 n -0000219765 00000 n -0000219825 00000 n -0000219885 00000 n -0000219945 00000 n -0000220005 00000 n -0000220065 00000 n -0000220125 00000 n -0000220185 00000 n -0000220245 00000 n -0000220305 00000 n -0000220365 00000 n -0000220425 00000 n -0000220485 00000 n -0000220545 00000 n -0000220605 00000 n -0000220665 00000 n -0000220725 00000 n -0000220785 00000 n -0000220845 00000 n -0000220905 00000 n -0000220965 00000 n -0000221025 00000 n -0000221085 00000 n -0000221145 00000 n -0000221205 00000 n -0000221265 00000 n -0000221325 00000 n -0000221385 00000 n -0000221445 00000 n -0000221505 00000 n -0000221565 00000 n -0000221625 00000 n -0000221685 00000 n -0000221745 00000 n -0000221805 00000 n -0000221865 00000 n -0000221925 00000 n -0000221985 00000 n -0000222045 00000 n -0000222105 00000 n -0000222165 00000 n -0000222225 00000 n -0000222285 00000 n -0000222345 00000 n -0000222405 00000 n -0000222465 00000 n -0000222525 00000 n -0000222585 00000 n -0000222645 00000 n -0000222705 00000 n -0000222765 00000 n -0000222825 00000 n -0000222885 00000 n -0000222945 00000 n -0000223005 00000 n -0000223064 00000 n -0000223126 00000 n -0000223186 00000 n -0000223246 00000 n -0000223306 00000 n -0000223366 00000 n -0000223426 00000 n -0000223486 00000 n -0000223546 00000 n -0000223606 00000 n -0000223666 00000 n -0000223726 00000 n -0000223786 00000 n -0000223846 00000 n -0000223905 00000 n -0000223964 00000 n -0000224023 00000 n -0000224082 00000 n -0000224141 00000 n -0000224200 00000 n -0000224259 00000 n -0000224318 00000 n -0000224378 00000 n -0000224438 00000 n -0000224498 00000 n -0000224558 00000 n -0000224618 00000 n -0000224678 00000 n -0000224738 00000 n -0000224798 00000 n -0000224858 00000 n -0000224918 00000 n -0000224978 00000 n -0000225038 00000 n -0000225098 00000 n -0000225158 00000 n -0000225218 00000 n -0000225278 00000 n -0000225338 00000 n -0000225398 00000 n -0000225458 00000 n -0000225518 00000 n -0000225578 00000 n -0000225638 00000 n -0000225698 00000 n -0000225758 00000 n -0000225818 00000 n -0000225878 00000 n -0000225938 00000 n -0000225998 00000 n -0000226058 00000 n -0000226118 00000 n -0000226178 00000 n -0000226238 00000 n -0000226298 00000 n -0000226358 00000 n -0000226418 00000 n -0000226477 00000 n -0000227626 00000 n -0000228933 00000 n -0000230240 00000 n -0000231608 00000 n -0000232998 00000 n -0000234368 00000 n -0000235739 00000 n -0000237110 00000 n -0000238495 00000 n -0000239866 00000 n -0000241237 00000 n -0000242608 00000 n -0000243974 00000 n -0000245341 00000 n -0000246689 00000 n -0000247949 00000 n -0000249205 00000 n -0000250444 00000 n -0000251703 00000 n -0000252942 00000 n -0000254181 00000 n -0000255487 00000 n -0000257082 00000 n -0000257318 00000 n -0000257574 00000 n -0000257681 00000 n -0000257969 00000 n -0000258104 00000 n -0000258211 00000 n -0000258359 00000 n -0000258502 00000 n -0000258645 00000 n -trailer -<< -/Size 1729 -/ID[] ->> -startxref -173 -%%EOF Index: trunk/sim/libs/bfm_packages_verilog/axis_bfm.f =================================================================== --- trunk/sim/libs/bfm_packages_verilog/axis_bfm.f (revision 49) +++ trunk/sim/libs/bfm_packages_verilog/axis_bfm.f (nonexistent) @@ -1,9 +0,0 @@ -# - -${LIB_BASE_DIR}/axi4_stream_lib/sim/src/axis_bfm_pkg.sv - - - - - - Index: trunk/sim/libs/bfm_packages_verilog/axi4_models.f =================================================================== --- trunk/sim/libs/bfm_packages_verilog/axi4_models.f (revision 49) +++ trunk/sim/libs/bfm_packages_verilog/axi4_models.f (nonexistent) @@ -1,6 +0,0 @@ -# - -${LIB_BASE_DIR}/axi4_lib/sim/src/axi4_models/axi4_models_pkg.sv -${LIB_BASE_DIR}/axi4_lib/sim/src/axi4_models/axi4_memory_pkg.sv -${LIB_BASE_DIR}/axi4_lib/sim/src/axi4_models/axi4_arbiter_pkg.sv - Index: trunk/sim/libs/bfm_packages_verilog/BFM.f =================================================================== --- trunk/sim/libs/bfm_packages_verilog/BFM.f (revision 49) +++ trunk/sim/libs/bfm_packages_verilog/BFM.f (revision 50) @@ -1,4 +1,3 @@ # ${LIB_BASE_DIR}/BFM/src/tb/tb_pkg.sv -${LIB_BASE_DIR}/BFM/src/tb/tb_bfm_pkg.sv
/trunk/sim/libs/qaz_lib_verilog/basal.f
1,38 → 1,15
#
 
${LIB_BASE_DIR}/basal/src/8b10b/decode_8b10b.v
${LIB_BASE_DIR}/basal/src/8b10b/encode_8b10b.v
 
${LIB_BASE_DIR}/basal/src/FIFOs/bc_sync_fifo.v
${LIB_BASE_DIR}/basal/src/FIFOs/sync_fifo.sv
${LIB_BASE_DIR}/basal/src/FIFOs/tiny_sync_fifo.sv
${LIB_BASE_DIR}/basal/src/FIFOs/async_fifo.sv
 
${LIB_BASE_DIR}/basal/src/misc/bit_connect_big_to_little.v
${LIB_BASE_DIR}/basal/src/misc/bit_connect_little_to_big.v
${LIB_BASE_DIR}/basal/src/misc/bit_swap_big_to_little.v
${LIB_BASE_DIR}/basal/src/misc/bit_swap_little_to_big.v
${LIB_BASE_DIR}/basal/src/misc/one_hot_encoder.sv
${LIB_BASE_DIR}/basal/src/misc/pulse_stretcher.v
${LIB_BASE_DIR}/basal/src/misc/recursive_mux.sv
${LIB_BASE_DIR}/basal/src/misc/sr_latch.v
 
${LIB_BASE_DIR}/basal/src/PRBS/cf_pnmon.v
${LIB_BASE_DIR}/basal/src/PRBS/pcie_scrambler.v
${LIB_BASE_DIR}/basal/src/PRBS/prbs_23_to_16.v
${LIB_BASE_DIR}/basal/src/PRBS/prbs_23_to_64.v
${LIB_BASE_DIR}/basal/src/PRBS/prbs_23_to_8.v
${LIB_BASE_DIR}/basal/src/PRBS/prbs_7_to_14.v
${LIB_BASE_DIR}/basal/src/PRBS/prbs_7_to_8.v
 
${LIB_BASE_DIR}/basal/src/RAM/asym_ram_sdp_read_wider.v
${LIB_BASE_DIR}/basal/src/RAM/asym_ram_sdp_write_wider.v
${LIB_BASE_DIR}/basal/src/RAM/bram_tdp.v
${LIB_BASE_DIR}/basal/src/RAM/byte_enabled_simple_dual_port_ram.sv
${LIB_BASE_DIR}/basal/src/RAM/read_mixed_width_ram.sv
${LIB_BASE_DIR}/basal/src/RAM/write_mixed_width_ram.sv
 
${LIB_BASE_DIR}/basal/src/synchronize/synchronizer.v
${LIB_BASE_DIR}/basal/src/synchronize/sync_reset.v
${LIB_BASE_DIR}/basal/src/synchronize/pulse_synchronizer.v
 
/trunk/sim/libs/sim_verilog/BFM.f
1,5 → 1,5
#
 
${LIB_BASE_DIR}/BFM/src/tb/tb_base.sv
${LIB_BASE_DIR}/BFM/src/tb/tb_clk.sv
${LIB_BASE_DIR}/BFM/src/tb/tb_clk_class.sv
# ${LIB_BASE_DIR}/BFM/src/tb/tb_clk.sv
# ${LIB_BASE_DIR}/BFM/src/tb/tb_clk_class.sv
/trunk/sim/libs/tb_packages_verilog/BFM.f
1,8 → 1,5
#
 
${LIB_BASE_DIR}/BFM/src/tb/tb_clk_pkg.sv
${LIB_BASE_DIR}/BFM/src/tb/q_pkg.sv
${LIB_BASE_DIR}/BFM/src/tb/bfm_pkg.sv
${LIB_BASE_DIR}/BFM/src/tb/logger_pkg.sv
# ${LIB_BASE_DIR}/BFM/src/tb/tb_clk_pkg.sv
 
${LIB_BASE_DIR}/BFM/src/video_frame/video_frame_pkg.sv

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.