Pushing up some sample FPGA code to see if it's all set up right
This commit is contained in:
parent
ecd5c8cd09
commit
ada17c09cd
14
README.md
14
README.md
|
@ -1,3 +1,17 @@
|
||||||
# Accelerated_Wireguard
|
# Accelerated_Wireguard
|
||||||
|
|
||||||
A hardware accelerated wireguard project using commercial FPGAs
|
A hardware accelerated wireguard project using commercial FPGAs
|
||||||
|
|
||||||
|
## How to use the VHDL portion of this codebase
|
||||||
|
<p> While some of this might be being used in a synthesised image, much of the codebase *should* include the tools to simulate certain functionalities.<br>
|
||||||
|
<br>
|
||||||
|
To get the simulations up and running in linux please do the following:<br>
|
||||||
|
1) Open up a terminal window<br>
|
||||||
|
2) Label one of them "build window" and the other "results window"<br>
|
||||||
|
3) In the "build window" type in "sudo docker run -it --rm -v /tmp:/tmp -v ${MY_GIT_LOCATION}:/mnt -e DISPLAY cocotb_test". For me I use "sudo docker run -it --rm -v /tmp:/tmp -v /home/xavi/projects:/mnt -e DISPLAY cocotb_test"<br>
|
||||||
|
4) In the "build window" you will be prompted for your password. Please enter it<br>
|
||||||
|
5) In the "build window" you will find the codebase tree in the /mnt directory. You can navigate to your test from there<br>
|
||||||
|
6) In the "build window", once in your test folder, to run the test type in "make sim SIM_ARGS=--vcd=${OUTPUT_WAVE_FILE_NAME}.vcd". For me I use "make sim SIM_ARGS=--vcd=foo.vcd" often<br>
|
||||||
|
7) In your "results window" navigate to the same test folder you are in in your "build window"<br>
|
||||||
|
8) In your "results window" you will see a sub folder called "sim_build". Wnter that folder<br>
|
||||||
|
9) In your "results window" type the following to open the gtkwave viewer for the output waveform "gtkwave ${OUTPUT_WAVE_FILE_NAME}.vcd". For me I use "gtkwave foo.vcd "<br>
|
|
@ -0,0 +1,110 @@
|
||||||
|
-- This block arbitrates between multiple incoming avalon-mm transactions in a many to one fashion
|
||||||
|
-- It operates in a round robin format
|
||||||
|
-- It will wait for the current transaction to complete before sampling the next interface
|
||||||
|
-- It operates on a single clock domain
|
||||||
|
-- This operates with the "basic" port sizes used in my applications (see pkg for more details)
|
||||||
|
-- While the burstcount port exists, it currently only accepts burst_size 1 transactions
|
||||||
|
-- It can handle a variable amount of inputs, based on a generic
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
library work;
|
||||||
|
use work.math_pkg.all;
|
||||||
|
use work.avalon_mm_pkg.all;
|
||||||
|
|
||||||
|
entity avalon_mm_basic_register_arbiter is
|
||||||
|
generic
|
||||||
|
(
|
||||||
|
INPUTS : natural := 2
|
||||||
|
);
|
||||||
|
port
|
||||||
|
(
|
||||||
|
clk : in std_logic;
|
||||||
|
rst : in std_logic;
|
||||||
|
|
||||||
|
address_array : in BASIC_REGISTER_ADDRESS_ARRAY(INPUTS - 1 downto 0);
|
||||||
|
burst_count_array : in BASIC_REGISTER_BURST_COUNT_ARRAY(INPUTS - 1 downto 0);
|
||||||
|
read_array : in std_logic_vector(INPUTS - 1 downto 0);
|
||||||
|
write_array : in std_logic_vector(INPUTS - 1 downto 0);
|
||||||
|
write_data_array : in BASIC_REGISTER_DATA_ARRAY(INPUTS - 1 downto 0);
|
||||||
|
read_data_array : out BASIC_REGISTER_DATA_ARRAY(INPUTS - 1 downto 0);
|
||||||
|
read_data_valid_array : out std_logic_vector(INPUTS - 1 downto 0);
|
||||||
|
wait_request_array : out std_logic_vector(INPUTS - 1 downto 0);
|
||||||
|
|
||||||
|
address : out std_logic_vector(BASIC_REGISTER_ADDRESS_WIDTH - 1 downto 0);
|
||||||
|
burst_count : out std_logic_vector(BASIC_REGISTER_BURST_COUNT_WIDTH - 1 downto 0);
|
||||||
|
read : out std_logic;
|
||||||
|
write : out std_logic;
|
||||||
|
write_data : out std_logic_vector(BASIC_REGISTER_DATA_WIDTH - 1 downto 0);
|
||||||
|
read_data : in std_logic_vector(BASIC_REGISTER_DATA_WIDTH - 1 downto 0);
|
||||||
|
read_data_valid : in std_logic;
|
||||||
|
wait_request : in std_logic
|
||||||
|
);
|
||||||
|
end entity;
|
||||||
|
|
||||||
|
architecture rtl of avalon_mm_basic_register_arbiter is
|
||||||
|
|
||||||
|
signal address_i : std_logic_vector(BASIC_REGISTER_ADDRESS_WIDTH - 1 downto 0);
|
||||||
|
signal burst_count_i : std_logic_vector(BASIC_REGISTER_BURST_COUNT_WIDTH - 1 downto 0);
|
||||||
|
signal read_i : std_logic;
|
||||||
|
signal write_i : std_logic;
|
||||||
|
signal write_data_i : std_logic_vector(BASIC_REGISTER_DATA_WIDTH - 1 downto 0);
|
||||||
|
|
||||||
|
signal interface_index : unsigned(log_ceil(INPUTS) - 1 downto 0);
|
||||||
|
signal pending_response : std_logic;
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
interface_sampling_proc : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
-- If performing a read hold onto this interface until a response has been detected
|
||||||
|
if wait_request = '0' and read_i = '1' then
|
||||||
|
pending_response <= '1';
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- If response happens clear hold
|
||||||
|
if read_data_valid = '1' then
|
||||||
|
pending_response <= '0';
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- Increment sampled interface index
|
||||||
|
if (pending_response = '0' and not (wait_request = '0' and read = '1')) or read_data_valid = '1' then
|
||||||
|
if to_integer(interface_index) < INPUTS - 1 then
|
||||||
|
interface_index <= interface_index + 1;
|
||||||
|
else
|
||||||
|
interface_index <= (others => '0');
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if rst = '1' then
|
||||||
|
pending_response <= '0';
|
||||||
|
interface_index <= (others => '0');
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
-- Selecting which input to sample (cleaner and allows us to check internal signals)
|
||||||
|
address_i <= address_array(to_integer(interface_index)) when rst = '0' else (others => '0');
|
||||||
|
burst_count_i <= burst_count_array(to_integer(interface_index)) when rst = '0' else (others => '0');
|
||||||
|
read_i <= read_array(to_integer(interface_index)) when rst = '0' else '0';
|
||||||
|
write_i <= write_array(to_integer(interface_index)) when rst = '0' else '0';
|
||||||
|
write_data_i <= write_data_array(to_integer(interface_index)) when rst = '0' else (others => '0');
|
||||||
|
|
||||||
|
-- passing the sampled interface through to the other side
|
||||||
|
address_i <= address;
|
||||||
|
burst_count_i <= burst_count;
|
||||||
|
read_i <= read;
|
||||||
|
write_i <= write;
|
||||||
|
write_data_i <= write_data;
|
||||||
|
|
||||||
|
-- Handling returning data
|
||||||
|
response_handler_gen : for i in INPUTS - 1 downto 0 generate
|
||||||
|
read_data_array <= read_data when i = to_integer(interface_index) and rst = '0' else (others => '0');
|
||||||
|
read_data_valid_array <= read_data_valid when i = to_integer(interface_index) and rst = '0' else '0';
|
||||||
|
wait_request_array <= wait_request or pending_response when i = to_integer(interface_index) and rst = '0' else '1';
|
||||||
|
end generate;
|
||||||
|
|
||||||
|
end architecture;
|
|
@ -0,0 +1,17 @@
|
||||||
|
-- This package should cover all non-project specific avalon_mm types, constraints and functions
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
package avalon_mm_pkg is
|
||||||
|
|
||||||
|
constant BASIC_REGISTER_ADDRESS_WIDTH : natural := 16;
|
||||||
|
constant BASIC_REGISTER_BURST_COUNT_WIDTH : natural := 8;
|
||||||
|
constant BASIC_REGISTER_DATA_WIDTH : natural := 32;
|
||||||
|
|
||||||
|
type BASIC_REGISTER_ADDRESS_ARRAY is array (natural range <> of std_logic_vector(BASIC_REGISTER_ADDRESS_WIDTH - 1 downto 0);
|
||||||
|
type BASIC_REGISTER_DATA_ARRAY is array (natural range <> of std_logic_vector(BASIC_REGISTER_DATA_ARRAY - 1 downto 0);
|
||||||
|
type BASIC_REGISTER_BURST_COUNT_ARRAY is array (natural range <> of std_logic_vector(BASIC_REGISTER_BURST_COUNT_ARRAY - 1 downto 0);
|
||||||
|
|
||||||
|
end package;
|
|
@ -0,0 +1,112 @@
|
||||||
|
-- This is a MUX for avalon_st_128 signals
|
||||||
|
-- This allows us to combine multiple avalon_st_128 streams into a single stream
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
library work;
|
||||||
|
use work.avalon_st_pkg.all;
|
||||||
|
|
||||||
|
entity avalon_st_128_mux is
|
||||||
|
generic
|
||||||
|
(
|
||||||
|
NUMBER_OF_INPUTS : natural := 2;
|
||||||
|
FIFO_DEPTH : natural := 5;
|
||||||
|
BACKPRESSURE_MARGIN : natural := 4
|
||||||
|
);
|
||||||
|
port
|
||||||
|
(
|
||||||
|
clk : in std_logic;
|
||||||
|
rst : in std_logic;
|
||||||
|
|
||||||
|
mux_in : in AVALON_ST_128_ARRAY_TYPE(NUMBER_OF_INPUTS - 1 downto 0);
|
||||||
|
mux_in_rdy : out std_logic_vector(NUMBER_OF_INPUTS - 1 downto 0);
|
||||||
|
|
||||||
|
mux_out : out AVALON_ST_128;
|
||||||
|
mux_out_rdy : in std_logic
|
||||||
|
);
|
||||||
|
end entity;
|
||||||
|
|
||||||
|
architecture rtl of avalon_st_128_mux is
|
||||||
|
|
||||||
|
signal fifo_output : AVALON_ST_128_ARRAY_TYPE(NUMBER_OF_INPUTS - 1 downto 0);
|
||||||
|
signal fifo_output_rdy : std_logic_vector(NUMBER_OF_INPUTS - 1 downto 0);
|
||||||
|
|
||||||
|
signal internal_fifo_empty : std_logic_vector(NUMBER_OF_INPUTS - 1 downto 0);
|
||||||
|
signal target_input_port : unsigned(log_ceil(NUMBER_OF_INPUTS) - 1 downto 0);
|
||||||
|
|
||||||
|
signal mux_out_i : AVALON_ST_128;
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
-- Generate a fifo per input
|
||||||
|
input_fifo_gen : for i in 0 to (NUMBER_OF_INPUTS - 1) generate
|
||||||
|
input_fifo : entity avalon_st_128_synchronous_fifo
|
||||||
|
generic map
|
||||||
|
(
|
||||||
|
LOG2_DEPTH => FIFO_DEPTH,
|
||||||
|
BACKPRESSURE_MARGIN => BACKPRESSURE_MARGIN
|
||||||
|
)
|
||||||
|
port map
|
||||||
|
(
|
||||||
|
clk => clk,
|
||||||
|
rst => rst,
|
||||||
|
|
||||||
|
input => mux_in(i),
|
||||||
|
input_rdy => mux_in_rdy(i),
|
||||||
|
|
||||||
|
output => fifo_output(i),
|
||||||
|
output_rdy => fifo_output_rdy(i),
|
||||||
|
|
||||||
|
fill => open,
|
||||||
|
|
||||||
|
full => open,
|
||||||
|
empty => internal_fifo_empty(i)
|
||||||
|
);
|
||||||
|
end generate;
|
||||||
|
|
||||||
|
targetting_proc : process (clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if mux_out_rdy = '1' then
|
||||||
|
if internal_fifo_empty(to_integer(target_input_port)) /= '0' then
|
||||||
|
-- stay on port until the last cycle of data has egressed, then switch
|
||||||
|
if mux_out_i.endofpacket = '1' and mux_out_i.valid = '1' then
|
||||||
|
if to_integer(target_input_port) < NUMBER_OF_INPUTS - 1 then
|
||||||
|
target_input_port <= target_input_port + 1;
|
||||||
|
else
|
||||||
|
target_input_port <= (others => '0');
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
else
|
||||||
|
-- increment the target port if not at max port, else loop around to the lowest port
|
||||||
|
if to_integer(target_input_port) < NUMBER_OF_INPUTS - 1 then
|
||||||
|
target_input_port <= target_input_port + 1;
|
||||||
|
else
|
||||||
|
target_input_port <= (others => '0');
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if rst = '1' then
|
||||||
|
target_input_port <= (others => '0');
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
-- map the fifo outputs to the actual output(exploded view as the valid has some extra conditions)
|
||||||
|
mux_out_i.data <= fifo_output(to_integer(target_input_port)).data when rst /= '1' else (others => '0');
|
||||||
|
mux_out_i.startofpacket <= fifo_output(to_integer(target_input_port)).startofpacket when rst /= '1' else '0';
|
||||||
|
mux_out_i.endofpacket <= fifo_output(to_integer(target_input_port)).endofpacket when rst /= '1' else '0';
|
||||||
|
mux_out_i.empty <= fifo_output(to_integer(target_input_port)).empty when rst /= '1' else (others => '0');
|
||||||
|
mux_out_i.error <= fifo_output(to_integer(target_input_port)).error when rst /= '1' else '0';
|
||||||
|
mux_out_i.valid <= fifo_output(to_integer(target_input_port)).valid and mux_out_rdy when rst /= '1' else '0';
|
||||||
|
|
||||||
|
mux_out <= mux_out_i;
|
||||||
|
|
||||||
|
rdy_control_gen : for i in 0 to (NUMBER_OF_INPUTS - 1) generate
|
||||||
|
fifo_output_rdy(i) <= mux_out_rdy when to_integer(target_input_port) = i and rst /= '1' else '0';
|
||||||
|
end generate;
|
||||||
|
|
||||||
|
end architecture;
|
|
@ -0,0 +1,82 @@
|
||||||
|
-- A wrapper around our synchronous fifo that will format incoming avalon_ST_128 messages
|
||||||
|
-- into fifo transactions
|
||||||
|
-- Should be used a s a store / buffer inside my designs
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
library work;
|
||||||
|
use work.avalon_st_pkg.all;
|
||||||
|
|
||||||
|
entity avalon_st_128_synchronous_fifo is
|
||||||
|
generic
|
||||||
|
(
|
||||||
|
LOG2_DEPTH : natural := 5;
|
||||||
|
BACKPRESSURE_MARGIN : natural := 4
|
||||||
|
);
|
||||||
|
port
|
||||||
|
(
|
||||||
|
clk : in std_logic;
|
||||||
|
rst : in std_logic;
|
||||||
|
|
||||||
|
input : in AVALON_ST_128;
|
||||||
|
input_rdy : out std_logic;
|
||||||
|
|
||||||
|
output : out AVALON_ST_128;
|
||||||
|
output_rdy : in std_logic;
|
||||||
|
|
||||||
|
fill : out std_logic_vector(31 downto 0);
|
||||||
|
|
||||||
|
full : out std_logic;
|
||||||
|
empty : out std_logic
|
||||||
|
);
|
||||||
|
end entity;
|
||||||
|
|
||||||
|
architecture rtl of avalon_st_128_synchronous_fifo is
|
||||||
|
|
||||||
|
constant FIFO_WIDTH : natural := input.data'length _ input.empty'length + 3; -- input.startofpacket'length + input.endofpacket'length + input.err'length (valid is not included here)
|
||||||
|
constant FIFO_DEPTH : natural := 2**LOG2_DEPTH;
|
||||||
|
|
||||||
|
signal fifo_write_enable : std_logic;
|
||||||
|
signal fifo_write_data : std_logic_vector(FIFO_WIDTH - 1 downto 0);
|
||||||
|
|
||||||
|
signal fifo_read_enable : std_logic;
|
||||||
|
signal fifo_read_data : std_logic_vector(FIFO_WIDTH - 1 downto 0);
|
||||||
|
|
||||||
|
signal fifo_internal_count : std_logic_vector(31 downto 0);
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
fifo_write_enable <= input.valid when rst /= '1' else '0'; -- No writes will be allowed upon a reset
|
||||||
|
fifo_read_enable <= output_rdy when rst /= '1' else '0';
|
||||||
|
|
||||||
|
basic_fifo : entity synchronous_fifo
|
||||||
|
generic map
|
||||||
|
(
|
||||||
|
WIDTH => FIFO_WIDTH,
|
||||||
|
DEPTH => FIFO_DEPTH
|
||||||
|
)
|
||||||
|
port map
|
||||||
|
(
|
||||||
|
clk => clk,
|
||||||
|
rst => rst,
|
||||||
|
|
||||||
|
write_enable => fifo_write_enable,
|
||||||
|
write_data => fifo_write_data,
|
||||||
|
|
||||||
|
read_enable => fifo_read_enable,
|
||||||
|
read_data => fifo_read_data,
|
||||||
|
|
||||||
|
empty => empty,
|
||||||
|
almost_empty => open,
|
||||||
|
almost_full => open,
|
||||||
|
full => full,
|
||||||
|
|
||||||
|
count => fifo_internal_count
|
||||||
|
);
|
||||||
|
|
||||||
|
input_rdy <= '1' when (to_integer(unsigned(fifo_internal_count))) < (FIFO_DEPTH - BACKPRESSURE_MARGIN) else '0';
|
||||||
|
fill <= fifo_internal_count;
|
||||||
|
|
||||||
|
end architecture;
|
|
@ -0,0 +1,170 @@
|
||||||
|
-- This package contains all definitions relating to the implementation of the avalon_st protocol
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
|
||||||
|
package avalon_st_pkg is
|
||||||
|
type AVALON_ST_8 is record
|
||||||
|
data : std_logic_vector(7 downto 0);
|
||||||
|
valid : std_logic;
|
||||||
|
startofpacket : std_logic;
|
||||||
|
endofpacket : std_logic;
|
||||||
|
error : std_logic;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
type AVALON_ST_16 is record
|
||||||
|
data : std_logic_vector(15 downto 0);
|
||||||
|
valid : std_logic;
|
||||||
|
startofpacket : std_logic;
|
||||||
|
endofpacket : std_logic;
|
||||||
|
empty : std_logic_vector(0 downto 0);
|
||||||
|
error : std_logic;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
type AVALON_ST_32 is record
|
||||||
|
data : std_logic_vector(31 downto 0);
|
||||||
|
valid : std_logic;
|
||||||
|
startofpacket : std_logic;
|
||||||
|
endofpacket : std_logic;
|
||||||
|
empty : std_logic_vector(0 downto 0);
|
||||||
|
error : std_logic;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
type AVALON_ST_64 is record
|
||||||
|
data : std_logic_vector(63 downto 0);
|
||||||
|
valid : std_logic;
|
||||||
|
startofpacket : std_logic;
|
||||||
|
endofpacket : std_logic;
|
||||||
|
empty : std_logic_vector(1 downto 0);
|
||||||
|
error : std_logic;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
type AVALON_ST_128 is record
|
||||||
|
data : std_logic_vector(127 downto 0);
|
||||||
|
valid : std_logic;
|
||||||
|
startofpacket : std_logic;
|
||||||
|
endofpacket : std_logic;
|
||||||
|
empty : std_logic_vector(2 downto 0);
|
||||||
|
error : std_logic;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
type AVALON_ST_256 is record
|
||||||
|
data : std_logic_vector(255 downto 0);
|
||||||
|
valid : std_logic;
|
||||||
|
startofpacket : std_logic;
|
||||||
|
endofpacket : std_logic;
|
||||||
|
empty : std_logic_vector(3 downto 0);
|
||||||
|
error : std_logic;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
type AVALON_ST_512 is record
|
||||||
|
data : std_logic_vector(511 downto 0);
|
||||||
|
valid : std_logic;
|
||||||
|
startofpacket : std_logic;
|
||||||
|
endofpacket : std_logic;
|
||||||
|
empty : std_logic_vector(4 downto 0);
|
||||||
|
error : std_logic;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
type AVALON_ST_8_ARRAY_TYPE is array (natural range <>) of AVALON_ST_8;
|
||||||
|
type AVALON_ST_16_ARRAY_TYPE is array (natural range <>) of AVALON_ST_16;
|
||||||
|
type AVALON_ST_32_ARRAY_TYPE is array (natural range <>) of AVALON_ST_32;
|
||||||
|
type AVALON_ST_64_ARRAY_TYPE is array (natural range <>) of AVALON_ST_64;
|
||||||
|
type AVALON_ST_128_ARRAY_TYPE is array (natural range <>) of AVALON_ST_128;
|
||||||
|
type AVALON_ST_256_ARRAY_TYPE is array (natural range <>) of AVALON_ST_256;
|
||||||
|
type AVALON_ST_512_ARRAY_TYPE is array (natural range <>) of AVALON_ST_512;
|
||||||
|
|
||||||
|
function ZERO_AVALON_ST_8 return AVALON_ST_8;
|
||||||
|
function ZERO_AVALON_ST_16 return AVALON_ST_16;
|
||||||
|
function ZERO_AVALON_ST_32 return AVALON_ST_32;
|
||||||
|
function ZERO_AVALON_ST_64 return AVALON_ST_64;
|
||||||
|
function ZERO_AVALON_ST_128 return AVALON_ST_128;
|
||||||
|
function ZERO_AVALON_ST_256 return AVALON_ST_256;
|
||||||
|
function ZERO_AVALON_ST_512 return AVALON_ST_512;
|
||||||
|
|
||||||
|
end package avalon_st_pkg;
|
||||||
|
|
||||||
|
package body avalon_st_pkg is
|
||||||
|
|
||||||
|
function ZERO_AVALON_ST_8 return AVALON_ST_8 is
|
||||||
|
variable returned_record : AVALON_ST_8;
|
||||||
|
begin
|
||||||
|
returned_record.data := (others => '0');
|
||||||
|
returned_record.valid := '0';
|
||||||
|
returned_record.startofpacket := '0';
|
||||||
|
returned_record.endofpacket := '0';
|
||||||
|
returned_record.error := '0';
|
||||||
|
return returned_record;
|
||||||
|
end function ZERO_AVALON_ST_8;
|
||||||
|
|
||||||
|
function ZERO_AVALON_ST_16 return AVALON_ST_16 is
|
||||||
|
variable returned_record : AVALON_ST_16;
|
||||||
|
begin
|
||||||
|
returned_record.data := (others => '0');
|
||||||
|
returned_record.valid := '0';
|
||||||
|
returned_record.startofpacket := '0';
|
||||||
|
returned_record.endofpacket := '0';
|
||||||
|
returned_record.empty := (others => '0');
|
||||||
|
returned_record.error := '0';
|
||||||
|
return returned_record;
|
||||||
|
end function ZERO_AVALON_ST_16;
|
||||||
|
|
||||||
|
function ZERO_AVALON_ST_32 return AVALON_ST_32 is
|
||||||
|
variable returned_record : AVALON_ST_32;
|
||||||
|
begin
|
||||||
|
returned_record.data := (others => '0');
|
||||||
|
returned_record.valid := '0';
|
||||||
|
returned_record.startofpacket := '0';
|
||||||
|
returned_record.endofpacket := '0';
|
||||||
|
returned_record.empty := (others => '0');
|
||||||
|
returned_record.error := '0';
|
||||||
|
return returned_record;
|
||||||
|
end function ZERO_AVALON_ST_32;
|
||||||
|
|
||||||
|
function ZERO_AVALON_ST_64 return AVALON_ST_64 is
|
||||||
|
variable returned_record : AVALON_ST_64;
|
||||||
|
begin
|
||||||
|
returned_record.data := (others => '0');
|
||||||
|
returned_record.valid := '0';
|
||||||
|
returned_record.startofpacket := '0';
|
||||||
|
returned_record.endofpacket := '0';
|
||||||
|
returned_record.empty := (others => '0');
|
||||||
|
returned_record.error := '0';
|
||||||
|
return returned_record;
|
||||||
|
end function ZERO_AVALON_ST_64;
|
||||||
|
|
||||||
|
function ZERO_AVALON_ST_128 return AVALON_ST_128 is
|
||||||
|
variable returned_record : AVALON_ST_128;
|
||||||
|
begin
|
||||||
|
returned_record.data := (others => '0');
|
||||||
|
returned_record.valid := '0';
|
||||||
|
returned_record.startofpacket := '0';
|
||||||
|
returned_record.endofpacket := '0';
|
||||||
|
returned_record.empty := (others => '0');
|
||||||
|
returned_record.error := '0';
|
||||||
|
return returned_record;
|
||||||
|
end function ZERO_AVALON_ST_128;
|
||||||
|
|
||||||
|
function ZERO_AVALON_ST_256 return AVALON_ST_256 is
|
||||||
|
variable returned_record : AVALON_ST_256;
|
||||||
|
begin
|
||||||
|
returned_record.data := (others => '0');
|
||||||
|
returned_record.valid := '0';
|
||||||
|
returned_record.startofpacket := '0';
|
||||||
|
returned_record.endofpacket := '0';
|
||||||
|
returned_record.empty := (others => '0');
|
||||||
|
returned_record.error := '0';
|
||||||
|
return returned_record;
|
||||||
|
end function ZERO_AVALON_ST_256;
|
||||||
|
|
||||||
|
function ZERO_AVALON_ST_512 return AVALON_ST_512 is
|
||||||
|
variable returned_record : AVALON_ST_512;
|
||||||
|
begin
|
||||||
|
returned_record.data := (others => '0');
|
||||||
|
returned_record.valid := '0';
|
||||||
|
returned_record.startofpacket := '0';
|
||||||
|
returned_record.endofpacket := '0';
|
||||||
|
returned_record.empty := (others => '0');
|
||||||
|
returned_record.error := '0';
|
||||||
|
return returned_record;
|
||||||
|
end function ZERO_AVALON_ST_512;
|
|
@ -0,0 +1,143 @@
|
||||||
|
###
|
||||||
|
# Project configuration file
|
||||||
|
##
|
||||||
|
|
||||||
|
TOPLEVEL ?= $(PROJECT)
|
||||||
|
ABOVE_PROJECT_DIR = `readlink -e $(PROJECT_DIR)/../`
|
||||||
|
|
||||||
|
# Main
|
||||||
|
all: $(PROJECT).asm.rpt $(PROJECT).sta.rpt
|
||||||
|
ifeq ($(DEVICE_TYPE),FPGA)
|
||||||
|
$(MAKE) convert
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Map
|
||||||
|
$(PROJECT).syn.rpt: $(ASSIGNMENT_FILES)
|
||||||
|
quartus_syn --read_settings_file=on --write_settings_file-on $(PROJECT) -c $(PROJECT)
|
||||||
|
quartus_sh --script $(PINOUT_SH) $(PROJECT)
|
||||||
|
|
||||||
|
# Fit
|
||||||
|
$(PROJECT).fit.rpt: $(PROJECT.syn.rpt)
|
||||||
|
quartus_fit $(FIT_ARGS) $(PROJECT)
|
||||||
|
|
||||||
|
# Assemble
|
||||||
|
$(PROJECT).asm.rpt: $(PROJECT).fit.rpt
|
||||||
|
quartus_asm $(ASM_ARGS) $(PROJECT)
|
||||||
|
|
||||||
|
# Timing analysis
|
||||||
|
$(PROJECT).sta.rpt: $(PROJECT).fit.rpt path_analysis.tcl
|
||||||
|
quartus_sta $(TAN_ARGS) $(PROJECT)
|
||||||
|
|
||||||
|
ifeq ($(ENABLE_PATH_ANALYSIS), TRUE)
|
||||||
|
quartus_sta -t path_analysis.tcl
|
||||||
|
endif
|
||||||
|
|
||||||
|
path_analysis.tcl:
|
||||||
|
echo -e project_open -force $(PROJECT) - revision $(PROJECT) > $@
|
||||||
|
echo -e create_timing_netlist -model slow >> $@
|
||||||
|
echo -e read_sdc >> $@
|
||||||
|
echo -e update_timing_netlist >> $@
|
||||||
|
echo -e report_path -fomr [get_keepers $(LAUNCH_REGISTER)] -to [get_keepers $(LATCH_REGISTER)] -npaths 1024 -file \"$PATH_ANALYSIS_REPORT_FILE)\" >> $@
|
||||||
|
|
||||||
|
# Convert
|
||||||
|
convert:
|
||||||
|
$(COF_SH) $(PROJECT) $(PART) $(PROMDEVICE)
|
||||||
|
quartus_cpf -c $(PROJECT).cof
|
||||||
|
quartus_cpf -c -d $(PROMDEVICE) $(PROJECT).sof $(PROJECT).pof
|
||||||
|
|
||||||
|
ifeq ($HPS_INCLUDED),TRUE)
|
||||||
|
quartus_cpf -c --hps -o bitstream_compression=on $(PROJECT).sof $(PROJECT).rbf
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Archiving
|
||||||
|
$(PROJECT).qar: gen_qar.tcl
|
||||||
|
quartus_sh -t gen_qar.tcl
|
||||||
|
|
||||||
|
gen_qar.tcl:
|
||||||
|
echo -e project_open -revision $(PROJECT) $(PROJECT) > $@
|
||||||
|
echo -e project_archive $(PROJECT).qar -include_outputs -include_libraries -overwrite >> $@
|
||||||
|
echo -e project_close >> $@
|
||||||
|
|
||||||
|
# Project Initialisation
|
||||||
|
$(ASSIGNMENT_FILES): ip_generate temp.tcl
|
||||||
|
quartus_sh --script temp.tcl
|
||||||
|
|
||||||
|
ifeq ($(ENABLE_SIGNALTAP),TRUE)
|
||||||
|
quartus_stp $(PROJECT) -c $(PROJECT) -e std_file=$(SIGNALTAP_FILE)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ipgenerate: first.tcl
|
||||||
|
quartus_sh --prepare -f $(FAMILY) -d $(PART) -t $(TOP_LEVEL) $(PROJECT)
|
||||||
|
|
||||||
|
ifneq ($(SRC_IP),)
|
||||||
|
quartus_sh --script first.tcl
|
||||||
|
quartus_ipgenerate $(PROJECT) -c $(PROJECT) --run_default_mode_op
|
||||||
|
endif
|
||||||
|
|
||||||
|
first.tcl:
|
||||||
|
ifneq ($SRC_IP),)
|
||||||
|
echo -e 'set ipfiles $(SRC_IP)' > @
|
||||||
|
echo -e 'set replaced_ipfiles [regsub -all -- "--ip_files=" $$ipfiles ","]' >> @
|
||||||
|
echo -e 'if {[string equal -length [string length ","] "," $$replaced_ipfiles]} {' >> $@
|
||||||
|
echo -e 'regsub ***=, $$replaced_ipfiles "" replaced_ipfiles }' >> $@
|
||||||
|
echo -e 'if {[regexp {,} $$replaced_ipfiles]} {set ipfilelist [split $$replaced_ipfiles ,]}' >> $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($SRC_QSYS),)
|
||||||
|
echo -e 'set qsysfiles $(SRC_IP)' > @
|
||||||
|
echo -e 'set replaced_qsysfiles [regsub -all -- "--source=" $$qsysfiles ","]' >> @
|
||||||
|
echo -e 'if {[string equal -length [string length ","] "," $$replaced_qsysfiles]} {' >> $@
|
||||||
|
echo -e 'regsub ***=, $$replaced_qsysfiles "" replaced_qsysfiles }' >> $@
|
||||||
|
echo -e 'if {[regexp {,} $$replaced_qsysfiles]} {set qsysfilelist [split $$replaced_qsysfiles ,]}' >> $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
echo -e 'project open -revision $(PROJECT) $(PROJECT)
|
||||||
|
|
||||||
|
ifneq ($SRC_IP),)
|
||||||
|
echo -e 'foreach ipfile $$ipfilelist {set_global_assignment -name IP_FILE $$ipfile }' >> $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($SRC_QSYS),)
|
||||||
|
echo -e 'foreach qsysfile $$qsysfilelist {set_global_assignment -name QSYS_FILE $$qsysfile }' >> $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(VHDL_2008),TRUE)
|
||||||
|
echo -e 'set_global_assignment -name VHDL_INPUT_VERSION VHDL_2008' >> $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
echo -e 'project_close' >> $@
|
||||||
|
|
||||||
|
temp.tcl:
|
||||||
|
echo -e 'set hdlfiles $(SRC_HDL)' > @
|
||||||
|
echo -e 'set replaced_hdlfiles [regsub -all -- "--ip_files=" $$hdlfiles ","]' >> @
|
||||||
|
echo -e 'if {[string equal -length [string length ","] "," $$replaced_hdlfiles]} {' >> $@
|
||||||
|
echo -e 'regsub ***=, $$replaced_hdlfiles "" replaced_hdlfiles }' >> $@
|
||||||
|
echo -e 'if {[regexp {,} $$replaced_hdlfiles]} {set hdlfilelist [split $$replaced_hdlfiles ,]}' >> $@
|
||||||
|
|
||||||
|
echo -e 'project_open -revision $(PROJECT) $(PROJECT)' >> $@
|
||||||
|
echo -e 'set_global_assignment -name SEED $(SEED)' $@
|
||||||
|
echo -e 'setuniquehdlfilelist [lsort -unique $$hdlfilelist] >> $@
|
||||||
|
echo -e 'foreach hdlfile $$uniquehdlfilelist {' >> $@
|
||||||
|
|
||||||
|
echo -e 'if [regexp {.vhd$$} $$hdlfile] {' >> $@
|
||||||
|
echo -e 'set_global_assignment -name VHDL_FILE $$hdlfile' >> $@
|
||||||
|
|
||||||
|
echo -e '} elseif [regexp {.sv$$} $$hdlfile] {' >> $@
|
||||||
|
echo -e 'set_global_assignment -name SYSTEMVERILOG_FILE $$hdlfile' >> $@
|
||||||
|
|
||||||
|
echo -e '} elseif [regexp {.sdc$$} $$hdlfile] {' >> $@
|
||||||
|
echo -e 'set_global_assignment -name SDC_FILE $$hdlfile' >> $@
|
||||||
|
|
||||||
|
echo -e '} else {' >> $@
|
||||||
|
echo -e 'set_global_assignment -name VERILOG_FILE $$hdlfile' >> $@
|
||||||
|
echo -e '}}' >>@
|
||||||
|
|
||||||
|
echo -e 'set_global_assignment -name SDC_FILE $(CONSTRAINTS)' >> $@
|
||||||
|
echo -e 'set_global_assignment -name STRATIXIII_CONFIGURATION_SCHEME "ACTIVE_SERIAL"' >> $@
|
||||||
|
echo -e 'set_global_assignment -name SAFE_STATE_MACHINE ON' >> $@
|
||||||
|
|
||||||
|
ifeq ($(ENABLE_ADDITIONAL_QSF_SETTINGS),TRUE)
|
||||||
|
cat $(ADDITIONAL_QSF_SETTINGS) >> temp.tcl
|
||||||
|
endif
|
||||||
|
|
||||||
|
echo -e 'project_close' >> $@
|
|
@ -0,0 +1 @@
|
||||||
|
include $(PROJECT_DIR)/../fpga/prng/lfsr/lfsr.mk
|
|
@ -0,0 +1,137 @@
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
entity synchronous_fifo is
|
||||||
|
generic
|
||||||
|
(
|
||||||
|
WIDTH : natural := 32;
|
||||||
|
DEPTH : natural := 8
|
||||||
|
);
|
||||||
|
port
|
||||||
|
(
|
||||||
|
clk : in std_logic;
|
||||||
|
rst : in std_logic;
|
||||||
|
|
||||||
|
write_enable : in std_logic;
|
||||||
|
write_data : in std_logic_vector(WIDTH - 1 downto 0);
|
||||||
|
|
||||||
|
read_enable : in std_logic;
|
||||||
|
read_data : out std_logic_vector(WIDTH - 1 downto 0);
|
||||||
|
|
||||||
|
empty : out std_logic;
|
||||||
|
almost_empty : out std_logic;
|
||||||
|
almost_full : out std_logic;
|
||||||
|
full : out std_logic;
|
||||||
|
|
||||||
|
count : out std_logic_vector(31 downto 0)
|
||||||
|
);
|
||||||
|
end entity;
|
||||||
|
|
||||||
|
architecture rtl of synchrnous_fifo is
|
||||||
|
|
||||||
|
signal bram_type is array (0 to DEPTH - 1) of std_logic_vector(WIDTH - 1 downto 0);
|
||||||
|
signal bram : bram_type;
|
||||||
|
|
||||||
|
signal write_address : integer;
|
||||||
|
signal read_address : integer;
|
||||||
|
|
||||||
|
signal empty_i : std_logic;
|
||||||
|
signal full_i : std_logic;
|
||||||
|
|
||||||
|
signal count_unsigned : unsigned(count'range);
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
-- Assign internal signals to outputs
|
||||||
|
empty <= empty_i;
|
||||||
|
full <= full_i;
|
||||||
|
count <= std_logic_vector(count_unsigned);
|
||||||
|
|
||||||
|
-- Define almost signals
|
||||||
|
almost_empty <= '1' when count_unsigned >= 2 else '0';
|
||||||
|
almost_full <= '1' when count_unsigned >= (DEPTH -2) else '0';
|
||||||
|
|
||||||
|
determine_empty_or_full : process (write_address, read_address)
|
||||||
|
begin
|
||||||
|
if read=_address = write_address then
|
||||||
|
empty_i <= '1';
|
||||||
|
else
|
||||||
|
empty_i <= '0';
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if (read_address = 0 and write_address = (DEPTH - 1)) or (read_address = write_address + 1) then
|
||||||
|
full_i <= '1';
|
||||||
|
else
|
||||||
|
full_i <= '0';
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
fifo_proc : process (clk)
|
||||||
|
variable operation : std_logic_vector(1 downto 0);
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
operation := write_enable & read_enable;
|
||||||
|
|
||||||
|
case operation is
|
||||||
|
when "01" =>
|
||||||
|
if empty_i = '0' then
|
||||||
|
read_data <= bram(read_address);
|
||||||
|
|
||||||
|
if read_address = (DEPTH - 1) then
|
||||||
|
read_address <= 0;
|
||||||
|
else
|
||||||
|
read_address <= read_address + 1;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
count_unsigned <= count_unsigned + 1;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
when "10" =>
|
||||||
|
if full_i = '0' then
|
||||||
|
bram(write_address) <= write_data;
|
||||||
|
|
||||||
|
if write_address = (DEPTH - 1) then
|
||||||
|
write_address <= 0;
|
||||||
|
else
|
||||||
|
write_address <= write_address + 1;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
count_unsigned = count_unsigned + 1;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
when "11" =>
|
||||||
|
if empty_i = '0' then
|
||||||
|
read_data <= bram(read_address);
|
||||||
|
|
||||||
|
if read_address = (DEPTH - 1) then
|
||||||
|
read_address <= 0;
|
||||||
|
else
|
||||||
|
read_address <= raed_address + 1;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
bram(write_address) <= write_data;
|
||||||
|
|
||||||
|
if write_address = (DEPTH - 1) then
|
||||||
|
write_address <= 0;
|
||||||
|
else
|
||||||
|
write_address <= write_address + 1;
|
||||||
|
end if;
|
||||||
|
else
|
||||||
|
raed_data <= write_data;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
when others =>
|
||||||
|
read_data <= (others => '0');
|
||||||
|
|
||||||
|
end case;
|
||||||
|
|
||||||
|
if rst = '1' then
|
||||||
|
write_address <= 0;
|
||||||
|
read_address <= 0;
|
||||||
|
read_data <= (others => '0');
|
||||||
|
count_unsigned <= (others => '0');
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
end architecture;
|
|
@ -0,0 +1,57 @@
|
||||||
|
-- This package should cover general useful functions that
|
||||||
|
-- will see a lot of use in my code but do not fit under
|
||||||
|
-- any specific umbrella.
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
package useful_functions_pkg is
|
||||||
|
|
||||||
|
function extend(input : unsigned; length : natural) return unsigned;
|
||||||
|
function extend(input : std_logic_vector; length : natural) return std_logic_vector;
|
||||||
|
function extend(input : std_logic; length : natural) return std_logic_vector;
|
||||||
|
|
||||||
|
end package;
|
||||||
|
|
||||||
|
package body useful_functions_pkg is
|
||||||
|
|
||||||
|
function extend(input : unsigned; length : natural) return unsigned is
|
||||||
|
variable returned_vector : unsigned(length - 1 downto 0);
|
||||||
|
begin
|
||||||
|
if length >= input'length then
|
||||||
|
returned_vector(returned_vector'high downto input'length) := (others => '0');
|
||||||
|
returned_vector(input'length - 1 downto 0) := input;
|
||||||
|
else
|
||||||
|
returned_vector := input(returned_vector'length - 1 downto 0);
|
||||||
|
end if;
|
||||||
|
|
||||||
|
return returned_vector;
|
||||||
|
end function extend;
|
||||||
|
|
||||||
|
function extend(input : std_logic_vector; length : natural) return std_logic_vector is
|
||||||
|
variable returned_vector : std_logic_vector(length - 1 downto 0);
|
||||||
|
begin
|
||||||
|
if length >= input'length then
|
||||||
|
returned_vector(returned_vector'high downto input'length) := (others => '0');
|
||||||
|
returned_vector(input'length - 1 downto 0) := input;
|
||||||
|
else
|
||||||
|
returned_vector := input(returned_vector'length - 1 downto 0);
|
||||||
|
end if;
|
||||||
|
|
||||||
|
return returned_vector;
|
||||||
|
end function extend;
|
||||||
|
|
||||||
|
function extend(input : std_logic; length : natural) return std_logic_vector is
|
||||||
|
variable returned_vector : std_logic_vector(length - 1 downto 0);
|
||||||
|
begin
|
||||||
|
if length >= 1 then
|
||||||
|
returned_vector(length - 1 downto 1) := (others => '0');
|
||||||
|
returned_vector(0) := input;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
return returned_vector;
|
||||||
|
|
||||||
|
end function extend;
|
||||||
|
|
||||||
|
end package body;
|
|
@ -0,0 +1,94 @@
|
||||||
|
-- This component is an interactable set of registers, which can listen to signals or set them in firmware
|
||||||
|
-- Intended to be used for debug in a HPS enabled system
|
||||||
|
-- It operates on a single clock
|
||||||
|
-- It should only listen to requests within it's address range
|
||||||
|
-- At the moment it can only operate with a burst count of 1
|
||||||
|
-- There must be at least 1 input register in this incarnation
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
library work;
|
||||||
|
use work.math_pkg.all;
|
||||||
|
use work.avalon_mm_pkg.all;
|
||||||
|
|
||||||
|
entity interactable_basic_register is
|
||||||
|
generic
|
||||||
|
(
|
||||||
|
BASE_ADDRESS : std_logic_vector(31 downto 0) := (others => '0');
|
||||||
|
BYTE_INDEXED : boolean := false;
|
||||||
|
INPUT_REGISTERS : natural := 2;
|
||||||
|
OUTPUT_REGISTERS : natural := 2
|
||||||
|
);
|
||||||
|
port
|
||||||
|
(
|
||||||
|
clk : in std_logic;
|
||||||
|
rst : in std_logic;
|
||||||
|
|
||||||
|
address : in std_logic_vector(BASIC_REGISTER_ADDRESS_WIDTH - 1 downto 0);
|
||||||
|
burst_count : in std_logic_vector(BASIC_REGISTER_BURST_COUNT_WIDTH - 1 downto 0);
|
||||||
|
read : in std_logic;
|
||||||
|
write : in std_logic;
|
||||||
|
write_data : in std_logic_vector(BASIC_REGISTER_DATA_WIDTH - 1 downto 0);
|
||||||
|
read_data : out std_logic_vector(BASIC_REGISTER_DATA_WIDTH - 1 downto 0);
|
||||||
|
read_data_valid : out std_logic;
|
||||||
|
wait_request : out std_logic;
|
||||||
|
|
||||||
|
register_array_input : in BASIC_REGISTER_DATA_ARRAY((INPUT_REGISTERS + OUTPUT_REGISTERS) - 1 downto 0);
|
||||||
|
register_array_output : out BASIC_REGISTER_DATA_ARRAY((INPUT_REGISTERS + OUTPUT_REGISTERS) - 1 downto 0)
|
||||||
|
);
|
||||||
|
end entity;
|
||||||
|
|
||||||
|
architecture rtl of interactable_basic_register is
|
||||||
|
|
||||||
|
constant BYTES : integer := 2 ** (log_ceil(BASIC_REGISTER_DATA_WIDTH) - 3);
|
||||||
|
constant OUTPUT_START : integer := INPUT_REGISTERS;
|
||||||
|
|
||||||
|
signal register_array_output_i : BASIC_REGISTER_DATA_ARRAY((INPUT_REGISTERS + OUTPUT_REGISTERS) - 1 downto 0)
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
wait_request <= not (read or write);
|
||||||
|
|
||||||
|
registers_interaction_proc : process(clk)
|
||||||
|
variable shifted_address : integer;
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
-- Applying the base address, then byte index if selected
|
||||||
|
if BYTE_INDEXED = true then
|
||||||
|
shifted_address := to_integer(unsigned(address)) / BYTES - to_integer(unsigned(BASE_ADDRESS)) / BYTES;
|
||||||
|
else
|
||||||
|
shifted_address := to_integer(unsigned(address)) - to_integer(unsigned(BASE_ADDRESS));
|
||||||
|
end if;
|
||||||
|
|
||||||
|
read_data_valid <= '0';
|
||||||
|
|
||||||
|
-- Writes
|
||||||
|
if write = '1' then
|
||||||
|
if shifted_address >= OUTPUT_START and shifted_address < OUTPUT_START + OUTPUT_REGISTERS then
|
||||||
|
register_array_output_i(shifted_address - OUTPUT_START) <= write_data;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- Reads
|
||||||
|
if read = '1' then
|
||||||
|
if shifted_address >= OUTPUT_START and shifted_address < OUTPUT_START + OUTPUT_REGISTERS then
|
||||||
|
read_data <= register_array_output_i(shifted_address - OUTPUT_START);
|
||||||
|
read_data_valid <= '1';
|
||||||
|
elsif shifted_address >= 0 and shifted_address < INPUT_REGISTERS then
|
||||||
|
read_data <= register_array_input(shifted_address);
|
||||||
|
read_data_valid <= '1';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if rst = '1' then
|
||||||
|
read_data <= (others => '0');
|
||||||
|
read_data_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
register_array_output <= register_array_output_i;
|
||||||
|
|
||||||
|
end architecture;
|
|
@ -0,0 +1,60 @@
|
||||||
|
-- This block is a very basic implementation of a dual port ram
|
||||||
|
-- It operates on a single clock domain
|
||||||
|
-- This design was made for testing purposes
|
||||||
|
-- Currently no reset or cleaning functionality
|
||||||
|
-- Will always report back a read of the address specified
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
entity single_clock_dp_ram is
|
||||||
|
generic
|
||||||
|
(
|
||||||
|
ADDRESS_WIDTH : natural := 16;
|
||||||
|
DATA_WIDTH : natural := 32
|
||||||
|
);
|
||||||
|
port
|
||||||
|
(
|
||||||
|
clk : in std_logic;
|
||||||
|
|
||||||
|
-- A side
|
||||||
|
a_address : in std_logic_vector(ADDRESS_WIDTH - 1 downto 0);
|
||||||
|
a_write : in std_logic;
|
||||||
|
a_write_data : in std_logic_vector(DATA_WIDTH - 1 downto 0);
|
||||||
|
a_read_data : out std_logic_vector(DATA_WIDTH - 1 downto 0);
|
||||||
|
|
||||||
|
-- B side
|
||||||
|
b_address : in std_logic_vector(ADDRESS_WIDTH - 1 downto 0);
|
||||||
|
b_write : in std_logic;
|
||||||
|
b_write_data : in std_logic_vector(DATA_WIDTH - 1 downto 0);
|
||||||
|
b_read_data : out std_logic_vector(DATA_WIDTH - 1 downto 0)
|
||||||
|
);
|
||||||
|
end entity;
|
||||||
|
|
||||||
|
architecture rtl of single_clock_dp_ram is
|
||||||
|
|
||||||
|
type memory_type is array (2 ** ADDRESS_WIDTH - 1 downto 0) of std_logic_vector(DATA_WIDTH - 1 downto 0);
|
||||||
|
signal internal_registers : memory_type := (others => (others => '0'));
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
dp_ram_proc : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if a_write = '1' then
|
||||||
|
internal_registers(to_integer(unsigned(a_address))) <= a_write_data;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
a_read_data <= internal_registers(to_integer(unsigned(a_address)));
|
||||||
|
|
||||||
|
if b_write = '1' then
|
||||||
|
internal_registers(to_integer(unsigned(b_address))) <= b_write_data;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
b_read_data <= internal_registers(to_integer(unsigned(b_address)));
|
||||||
|
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
end architecture;
|
|
@ -0,0 +1,23 @@
|
||||||
|
-- This package should cover all non-project specific maths functions that can be called
|
||||||
|
-- Some of these are only suitable for use pre-synthesis, as they will not function properly
|
||||||
|
-- during normal operation. These will be marked appropriately during creation
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
use ieee.math_real.all;
|
||||||
|
|
||||||
|
package maths_pkg is
|
||||||
|
|
||||||
|
function log_ceil(input : natural) return natural;
|
||||||
|
|
||||||
|
end package;
|
||||||
|
|
||||||
|
package body maths_pkg is
|
||||||
|
|
||||||
|
function log_ceil(input : natural) return natural is
|
||||||
|
begin
|
||||||
|
return natural(ceil(log2(real(input))));
|
||||||
|
end function;
|
||||||
|
|
||||||
|
end package body;
|
|
@ -0,0 +1,18 @@
|
||||||
|
ifndef $(LFSR_INCLUDED)
|
||||||
|
LFSR_INCLUDED = "yes"
|
||||||
|
LFSR_DIR = $(PROJECT_DIR)../fpga/prng/lfsr
|
||||||
|
LFSR_SRC_DIR = $(LFSR_DIR)/vhdl
|
||||||
|
|
||||||
|
LFSR_SIM_SRC = \
|
||||||
|
$(LFSR_SRC_DIR)/lfsr_package.vhd \
|
||||||
|
$(LFSR_SRC_DIR)/lfsr.vhd
|
||||||
|
|
||||||
|
LFSR_SYN_SRC = \
|
||||||
|
--source=$(LFSR_SRC_DIR)/lfsr_package.vhd \
|
||||||
|
--source=$(LFSR_SRC_DIR)/lfsr.vhd
|
||||||
|
|
||||||
|
LFSR_TB_SRC = \
|
||||||
|
$(LFSR_SIM_SRC) \
|
||||||
|
$(LFSR_DIR)/tests/lfsr_test_wrapper.vhd
|
||||||
|
|
||||||
|
endif
|
|
@ -0,0 +1,23 @@
|
||||||
|
# Default the chosen language to VHDL
|
||||||
|
TOPLEVEL_LANG ?= vhdl
|
||||||
|
|
||||||
|
# Default the sim tool to GHDL
|
||||||
|
SIM ?= ghdl
|
||||||
|
|
||||||
|
# Find the common_make_lists list that points to all the artifacts
|
||||||
|
PROJECT_DIR = ../../../
|
||||||
|
include $(PROJECT_DIR)../fpga/common_make_lists.mk
|
||||||
|
|
||||||
|
PWD=$(shell pwd)
|
||||||
|
|
||||||
|
# The location of the VHDL files that will be used in the sim
|
||||||
|
SOURCE_FILES = $(abspath $(LFSR_TB_SRC))
|
||||||
|
|
||||||
|
# Formatting all the source files correctly to input into the simulation
|
||||||
|
VHDL_SOURCES = $(shell echo '$(SOURCE_FILES)' | tr " " "\n" | awk '!x[$$0]++' | tr "\n" " ")
|
||||||
|
|
||||||
|
TOPLEVEL = lfsr_test_wrapper
|
||||||
|
MODULE := lfsr_test_suite
|
||||||
|
|
||||||
|
include $(shell cocotb-config --makefiles)/Makefile.inc
|
||||||
|
include $(shell cocotb-config --makefiles)/Makefile.sim
|
|
@ -0,0 +1,785 @@
|
||||||
|
2, 1, 0, 0
|
||||||
|
3, 2, 0, 0
|
||||||
|
4, 3, 0, 0
|
||||||
|
5, 3, 0, 0
|
||||||
|
6, 5, 0, 0
|
||||||
|
7, 6, 0, 0
|
||||||
|
8, 6, 5, 4
|
||||||
|
9, 5, 0, 0
|
||||||
|
10, 7, 0, 0
|
||||||
|
11, 9, 0, 0
|
||||||
|
12, 11, 8, 6
|
||||||
|
13, 12, 10, 9
|
||||||
|
14, 13, 11, 9
|
||||||
|
15, 14, 0, 0
|
||||||
|
16, 14, 13, 11
|
||||||
|
17, 14, 0, 0
|
||||||
|
18, 11, 0, 0
|
||||||
|
19, 18, 17, 14
|
||||||
|
20, 17, 0, 0
|
||||||
|
21, 19, 0, 0
|
||||||
|
22, 21, 0, 0
|
||||||
|
23, 18, 0, 0
|
||||||
|
24, 23, 21, 20
|
||||||
|
25, 22, 0, 0
|
||||||
|
26, 25, 24, 20
|
||||||
|
27, 26, 25, 22
|
||||||
|
28, 25, 0, 0
|
||||||
|
29, 27, 0, 0
|
||||||
|
30, 29, 26, 24
|
||||||
|
31, 28, 0, 0
|
||||||
|
32, 30, 26, 25
|
||||||
|
33, 20, 0, 0
|
||||||
|
34, 31, 30, 26
|
||||||
|
35, 33, 0, 0
|
||||||
|
36, 25, 0, 0
|
||||||
|
37, 36, 33, 31
|
||||||
|
38, 37, 33, 32
|
||||||
|
39, 35, 0, 0
|
||||||
|
40, 37, 36, 35
|
||||||
|
41, 38, 0, 0
|
||||||
|
42, 40, 37, 35
|
||||||
|
43, 42, 38, 37
|
||||||
|
44, 42, 39, 38
|
||||||
|
45, 44, 42, 41
|
||||||
|
46, 40, 39, 38
|
||||||
|
47, 42, 0, 0
|
||||||
|
48, 44, 41, 39
|
||||||
|
49, 40, 0, 0
|
||||||
|
50, 48, 47, 46
|
||||||
|
51, 50, 48, 45
|
||||||
|
52, 49, 0, 0
|
||||||
|
53, 52, 51, 47
|
||||||
|
54, 51, 48, 46
|
||||||
|
55, 31, 0, 0
|
||||||
|
56, 54, 52, 49
|
||||||
|
57, 50, 0, 0
|
||||||
|
58, 39, 0, 0
|
||||||
|
59, 57, 55, 52
|
||||||
|
60, 59, 0, 0
|
||||||
|
61, 60, 59, 56
|
||||||
|
62, 59, 57, 56
|
||||||
|
63, 62, 0, 0
|
||||||
|
64, 63, 61, 60
|
||||||
|
65, 47, 0, 0
|
||||||
|
66, 60, 58, 57
|
||||||
|
67, 66, 65, 62
|
||||||
|
68, 59, 0, 0
|
||||||
|
69, 67, 64, 63
|
||||||
|
70, 69, 67, 65
|
||||||
|
71, 65, 0, 0
|
||||||
|
72, 69, 63, 62
|
||||||
|
73, 48, 0, 0
|
||||||
|
74, 71, 70, 67
|
||||||
|
75, 74, 72, 69
|
||||||
|
76, 74, 72, 71
|
||||||
|
77, 75, 72, 71
|
||||||
|
78, 77, 76, 71
|
||||||
|
79, 70, 0, 0
|
||||||
|
80, 78, 76, 71
|
||||||
|
81, 77, 0, 0
|
||||||
|
82, 78, 76, 73
|
||||||
|
83, 81, 79, 76
|
||||||
|
84, 71, 0, 0
|
||||||
|
85, 84, 83, 77
|
||||||
|
86, 84, 81, 80
|
||||||
|
87, 74, 0, 0
|
||||||
|
88, 80, 79, 77
|
||||||
|
89, 51, 0, 0
|
||||||
|
90, 88, 87, 85
|
||||||
|
91, 90, 86, 83
|
||||||
|
92, 90, 87, 86
|
||||||
|
93, 91, 0, 0
|
||||||
|
94, 73, 0, 0
|
||||||
|
95, 84, 0, 0
|
||||||
|
96, 90, 87, 86
|
||||||
|
97, 91, 0, 0
|
||||||
|
98, 87, 0, 0
|
||||||
|
99, 95, 94, 92
|
||||||
|
100, 63, 0, 0
|
||||||
|
101, 100, 95, 94
|
||||||
|
102, 99, 97, 96
|
||||||
|
103, 94, 0, 0
|
||||||
|
104, 103, 94, 93
|
||||||
|
105, 89, 0, 0
|
||||||
|
106, 91, 0, 0
|
||||||
|
107, 105, 99, 98
|
||||||
|
108, 77, 0, 0
|
||||||
|
109, 107, 105, 104
|
||||||
|
110, 109, 106, 104
|
||||||
|
111, 101, 0, 0
|
||||||
|
112, 108, 106, 101
|
||||||
|
113, 104, 0, 0
|
||||||
|
114, 113, 112, 103
|
||||||
|
115, 110, 108, 107
|
||||||
|
116, 114, 111, 110
|
||||||
|
117, 116, 115, 112
|
||||||
|
118, 85, 0, 0
|
||||||
|
119, 111, 0, 0
|
||||||
|
120, 118, 114, 111
|
||||||
|
121, 103, 0, 0
|
||||||
|
122, 121, 120, 116
|
||||||
|
123, 121, 0, 0
|
||||||
|
124, 87, 0, 0
|
||||||
|
125, 120, 119, 118
|
||||||
|
126, 124, 122, 119
|
||||||
|
127, 126, 0, 0
|
||||||
|
128, 127, 126, 121
|
||||||
|
129, 124, 0, 0
|
||||||
|
130, 127, 0, 0
|
||||||
|
131, 129, 128, 123
|
||||||
|
132, 103, 0, 0
|
||||||
|
133, 131, 125, 124
|
||||||
|
134, 77, 0, 0
|
||||||
|
135, 124, 0, 0
|
||||||
|
136, 134, 133, 128
|
||||||
|
137, 116, 0, 0
|
||||||
|
138, 137, 131, 130
|
||||||
|
139, 136, 134, 131
|
||||||
|
140, 111, 0, 0
|
||||||
|
141, 140, 135, 128
|
||||||
|
142, 121, 0, 0
|
||||||
|
143, 141, 140, 138
|
||||||
|
144, 142, 140, 137
|
||||||
|
145, 93, 0, 0
|
||||||
|
146, 144, 143, 141
|
||||||
|
147, 145, 143, 136
|
||||||
|
148, 121, 0, 0
|
||||||
|
149, 142, 140, 139
|
||||||
|
150, 97, 0, 0
|
||||||
|
151, 148, 0, 0
|
||||||
|
152, 150, 149, 146
|
||||||
|
153, 152, 0, 0
|
||||||
|
154, 153, 149, 145
|
||||||
|
155, 151, 150, 148
|
||||||
|
156, 153, 151, 147
|
||||||
|
157, 155, 152, 151
|
||||||
|
158, 153, 152, 150
|
||||||
|
159, 128, 0, 0
|
||||||
|
160, 158, 157, 155
|
||||||
|
161, 143, 0, 0
|
||||||
|
162, 158, 155, 154
|
||||||
|
163, 160, 157, 156
|
||||||
|
164, 159, 158, 152
|
||||||
|
165, 162, 157, 156
|
||||||
|
166, 164, 163, 156
|
||||||
|
167, 161, 0, 0
|
||||||
|
168, 162, 159, 152
|
||||||
|
169, 135, 0, 0
|
||||||
|
170, 147, 0, 0
|
||||||
|
171, 169, 166, 165
|
||||||
|
172, 165, 0, 0
|
||||||
|
173, 171, 168, 165
|
||||||
|
174, 161, 0, 0
|
||||||
|
175, 169, 0, 0
|
||||||
|
176, 167, 165, 164
|
||||||
|
177, 169, 0, 0
|
||||||
|
178, 91, 0, 0
|
||||||
|
179, 178, 177, 175
|
||||||
|
180, 173, 170, 168
|
||||||
|
181, 180, 175, 174
|
||||||
|
182, 181, 176, 174
|
||||||
|
183, 127, 0, 0
|
||||||
|
184, 177, 176, 175
|
||||||
|
185, 161, 0, 0
|
||||||
|
186, 180, 178, 177
|
||||||
|
187, 182, 181, 180
|
||||||
|
188, 186, 183, 182
|
||||||
|
189, 187, 184, 183
|
||||||
|
190, 188, 184, 177
|
||||||
|
191, 182, 0, 0
|
||||||
|
192, 190, 178, 177
|
||||||
|
193, 178, 0, 0
|
||||||
|
194, 107, 0, 0
|
||||||
|
195, 193, 192, 187
|
||||||
|
196, 194, 187, 185
|
||||||
|
197, 195, 193, 188
|
||||||
|
198, 133, 0, 0
|
||||||
|
199, 165, 0, 0
|
||||||
|
200, 198, 197, 195
|
||||||
|
201, 187, 0, 0
|
||||||
|
202, 147, 0, 0
|
||||||
|
203, 202, 196, 195
|
||||||
|
204, 201, 200, 194
|
||||||
|
205, 203, 200, 196
|
||||||
|
206, 201, 197, 196
|
||||||
|
207, 164, 0, 0
|
||||||
|
208, 207, 205, 199
|
||||||
|
209, 203, 0, 0
|
||||||
|
210, 207, 206, 198
|
||||||
|
211, 203, 201, 200
|
||||||
|
212, 107, 0, 0
|
||||||
|
213, 211, 208, 207
|
||||||
|
214, 213, 211, 209
|
||||||
|
215, 192, 0, 0
|
||||||
|
216, 215, 213, 209
|
||||||
|
217, 172, 0, 0
|
||||||
|
218, 207, 0, 0
|
||||||
|
219, 218, 215, 211
|
||||||
|
220, 211, 210, 208
|
||||||
|
221, 219, 215, 213
|
||||||
|
222, 220, 217, 214
|
||||||
|
223, 190, 0, 0
|
||||||
|
224, 222, 217, 212
|
||||||
|
225, 193, 0, 0
|
||||||
|
226, 223, 219, 216
|
||||||
|
227, 223, 218, 217
|
||||||
|
228, 226, 217, 216
|
||||||
|
229, 228, 225, 219
|
||||||
|
230, 224, 223, 222
|
||||||
|
231, 205, 0, 0
|
||||||
|
232, 228, 223, 221
|
||||||
|
233, 159, 0, 0
|
||||||
|
234, 203, 0, 0
|
||||||
|
235, 234, 229, 226
|
||||||
|
236, 231, 0, 0
|
||||||
|
237, 236, 233, 230
|
||||||
|
238, 237, 236, 233
|
||||||
|
239, 203, 0, 0
|
||||||
|
240, 237, 235, 232
|
||||||
|
241, 171, 0, 0
|
||||||
|
242, 241, 236, 231
|
||||||
|
243, 242, 238, 235
|
||||||
|
244, 243, 240, 235
|
||||||
|
245, 244, 241, 239
|
||||||
|
246, 245, 244, 235
|
||||||
|
247, 165, 0, 0
|
||||||
|
248, 238, 234, 233
|
||||||
|
249, 163, 0, 0
|
||||||
|
250, 147, 0, 0
|
||||||
|
251, 249, 247, 244
|
||||||
|
252, 185, 0, 0
|
||||||
|
253, 252, 247, 246
|
||||||
|
254, 253, 252, 247
|
||||||
|
255, 203, 0, 0
|
||||||
|
256, 254, 251, 246
|
||||||
|
257, 245, 0, 0
|
||||||
|
258, 175, 0, 0
|
||||||
|
259, 257, 253, 249
|
||||||
|
260, 253, 252, 250
|
||||||
|
261, 257, 255, 254
|
||||||
|
262, 258, 254, 253
|
||||||
|
263, 170, 0, 0
|
||||||
|
264, 263, 255, 254
|
||||||
|
265, 223, 0, 0
|
||||||
|
266, 219, 0, 0
|
||||||
|
267, 264, 261, 259
|
||||||
|
268, 243, 0, 0
|
||||||
|
269, 268, 263, 262
|
||||||
|
270, 217, 0, 0
|
||||||
|
271, 213, 0, 0
|
||||||
|
272, 270, 266, 263
|
||||||
|
273, 250, 0, 0
|
||||||
|
274, 207, 0, 0
|
||||||
|
275, 266, 265, 264
|
||||||
|
276, 275, 273, 270
|
||||||
|
277, 274, 271, 265
|
||||||
|
278, 273, 0, 0
|
||||||
|
279, 274, 0, 0
|
||||||
|
280, 278, 275, 271
|
||||||
|
281, 188, 0, 0
|
||||||
|
282, 247, 0, 0
|
||||||
|
283, 278, 276, 271
|
||||||
|
284, 165, 0, 0
|
||||||
|
285, 280, 278, 275
|
||||||
|
286, 217, 0, 0
|
||||||
|
287, 216, 0, 0
|
||||||
|
288, 287, 278, 277
|
||||||
|
289, 268, 0, 0
|
||||||
|
290, 288, 287, 285
|
||||||
|
291, 286, 280, 279
|
||||||
|
292, 195, 0, 0
|
||||||
|
293, 292, 287, 282
|
||||||
|
294, 233, 0, 0
|
||||||
|
295, 247, 0, 0
|
||||||
|
296, 292, 287, 285
|
||||||
|
297, 292, 0, 0
|
||||||
|
298, 294, 290, 287
|
||||||
|
299, 295, 293, 288
|
||||||
|
300, 293, 0, 0
|
||||||
|
301, 299, 296, 292
|
||||||
|
302, 261, 0, 0
|
||||||
|
303, 297, 291, 290
|
||||||
|
304, 303, 302, 293
|
||||||
|
305, 203, 0, 0
|
||||||
|
306, 305, 303, 299
|
||||||
|
307, 305, 303, 299
|
||||||
|
308, 306, 299, 293
|
||||||
|
309, 307, 302, 299
|
||||||
|
310, 309, 305, 302
|
||||||
|
311, 308, 306, 304
|
||||||
|
312, 307, 302, 301
|
||||||
|
313, 234, 0, 0
|
||||||
|
314, 299, 0, 0
|
||||||
|
315, 314, 306, 305
|
||||||
|
316, 181, 0, 0
|
||||||
|
317, 315, 313, 310
|
||||||
|
318, 313, 312, 310
|
||||||
|
319, 283, 0, 0
|
||||||
|
320, 319, 317, 316
|
||||||
|
321, 290, 0, 0
|
||||||
|
322, 255, 0, 0
|
||||||
|
323, 322, 320, 313
|
||||||
|
324, 321, 320, 318
|
||||||
|
325, 323, 320, 315
|
||||||
|
326, 325, 323, 316
|
||||||
|
327, 293, 0, 0
|
||||||
|
328, 323, 321, 319
|
||||||
|
329, 279, 0, 0
|
||||||
|
330, 328, 323, 322
|
||||||
|
331, 329, 325, 321
|
||||||
|
332, 209, 0, 0
|
||||||
|
333, 331, 0, 0
|
||||||
|
334, 333, 330, 327
|
||||||
|
335, 333, 328, 325
|
||||||
|
336, 335, 332, 329
|
||||||
|
337, 282, 0, 0
|
||||||
|
338, 336, 335, 332
|
||||||
|
339, 332, 329, 323
|
||||||
|
340, 337, 336, 329
|
||||||
|
341, 336, 330, 327
|
||||||
|
342, 217, 0, 0
|
||||||
|
343, 268, 0, 0
|
||||||
|
344, 338, 334, 333
|
||||||
|
345, 323, 0, 0
|
||||||
|
346, 344, 339, 335
|
||||||
|
347, 344, 337, 336
|
||||||
|
348, 344, 341, 340
|
||||||
|
349, 347, 344, 343
|
||||||
|
350, 297, 0, 0
|
||||||
|
351, 317, 0, 0
|
||||||
|
352, 346, 341, 339
|
||||||
|
353, 284, 0, 0
|
||||||
|
354, 349, 341, 340
|
||||||
|
355, 354, 350, 349
|
||||||
|
356, 349, 347, 346
|
||||||
|
357, 355, 347, 346
|
||||||
|
358, 351, 350, 344
|
||||||
|
359, 291, 0, 0
|
||||||
|
360, 359, 335, 334
|
||||||
|
361, 360, 357, 354
|
||||||
|
362, 299, 0, 0
|
||||||
|
363, 362, 356, 355
|
||||||
|
364, 297, 0, 0
|
||||||
|
365, 360, 359, 356
|
||||||
|
366, 337, 0, 0
|
||||||
|
367, 346, 0, 0
|
||||||
|
368, 361, 359, 351
|
||||||
|
369, 278, 0, 0
|
||||||
|
370, 231, 0, 0
|
||||||
|
371, 369, 368, 363
|
||||||
|
372, 369, 365, 357
|
||||||
|
373, 371, 366, 365
|
||||||
|
374, 369, 368, 366
|
||||||
|
375, 359, 0, 0
|
||||||
|
376, 371, 369, 368
|
||||||
|
377, 336, 0, 0
|
||||||
|
378, 335, 0, 0
|
||||||
|
379, 375, 370, 369
|
||||||
|
380, 333, 0, 0
|
||||||
|
381, 380, 379, 376
|
||||||
|
382, 301, 0, 0
|
||||||
|
383, 293, 0, 0
|
||||||
|
384, 378, 369, 368
|
||||||
|
385, 379, 0, 0
|
||||||
|
386, 303, 0, 0
|
||||||
|
387, 385, 379, 378
|
||||||
|
388, 387, 385, 374
|
||||||
|
389, 384, 380, 379
|
||||||
|
390, 301, 0, 0
|
||||||
|
391, 363, 0, 0
|
||||||
|
392, 386, 382, 379
|
||||||
|
393, 386, 0, 0
|
||||||
|
394, 259, 0, 0
|
||||||
|
395, 390, 389, 384
|
||||||
|
396, 371, 0, 0
|
||||||
|
397, 392, 387, 385
|
||||||
|
398, 393, 392, 384
|
||||||
|
399, 313, 0, 0
|
||||||
|
400, 398, 397, 395
|
||||||
|
401, 249, 0, 0
|
||||||
|
402, 399, 398, 393
|
||||||
|
403, 398, 395, 394
|
||||||
|
404, 215, 0, 0
|
||||||
|
405, 398, 397, 388
|
||||||
|
406, 249, 0, 0
|
||||||
|
407, 336, 0, 0
|
||||||
|
408, 407, 403, 401
|
||||||
|
409, 322, 0, 0
|
||||||
|
410, 407, 406, 400
|
||||||
|
411, 408, 401, 399
|
||||||
|
412, 265, 0, 0
|
||||||
|
413, 407, 406, 403
|
||||||
|
414, 405, 401, 398
|
||||||
|
415, 313, 0, 0
|
||||||
|
416, 414, 411, 407
|
||||||
|
417, 310, 0, 0
|
||||||
|
418, 417, 415, 403
|
||||||
|
419, 415, 414, 404
|
||||||
|
420, 412, 410, 407
|
||||||
|
421, 419, 417, 416
|
||||||
|
422, 273, 0, 0
|
||||||
|
423, 398, 0, 0
|
||||||
|
424, 422, 417, 415
|
||||||
|
425, 413, 0, 0
|
||||||
|
426, 415, 414, 412
|
||||||
|
427, 422, 421, 416
|
||||||
|
428, 323, 0, 0
|
||||||
|
429, 422, 421, 419
|
||||||
|
430, 419, 417, 415
|
||||||
|
431, 311, 0, 0
|
||||||
|
432, 429, 428, 419
|
||||||
|
433, 400, 0, 0
|
||||||
|
434, 429, 423, 422
|
||||||
|
435, 430, 426, 423
|
||||||
|
436, 271, 0, 0
|
||||||
|
437, 436, 435, 431
|
||||||
|
438, 373, 0, 0
|
||||||
|
439, 390, 0, 0
|
||||||
|
440, 439, 437, 436
|
||||||
|
441, 410, 0, 0
|
||||||
|
442, 440, 437, 435
|
||||||
|
443, 442, 437, 433
|
||||||
|
444, 435, 432, 431
|
||||||
|
445, 441, 439, 438
|
||||||
|
446, 341, 0, 0
|
||||||
|
447, 374, 0, 0
|
||||||
|
448, 444, 442, 437
|
||||||
|
449, 315, 0, 0
|
||||||
|
450, 371, 0, 0
|
||||||
|
451, 450, 441, 435
|
||||||
|
452, 448, 447, 446
|
||||||
|
453, 449, 447, 438
|
||||||
|
454, 449, 445, 444
|
||||||
|
455, 417, 0, 0
|
||||||
|
456, 454, 445, 433
|
||||||
|
457, 441, 0, 0
|
||||||
|
458, 255, 0, 0
|
||||||
|
459, 457, 454, 447
|
||||||
|
460, 399, 0, 0
|
||||||
|
461, 460, 455, 454
|
||||||
|
462, 389, 0, 0
|
||||||
|
463, 370, 0, 0
|
||||||
|
464, 460, 455, 441
|
||||||
|
465, 406, 0, 0
|
||||||
|
466, 460, 455, 452
|
||||||
|
467, 466, 461, 456
|
||||||
|
468, 464, 459, 453
|
||||||
|
469, 467, 464, 460
|
||||||
|
470, 321, 0, 0
|
||||||
|
471, 470, 0, 0
|
||||||
|
472, 470, 469, 461
|
||||||
|
473, 470, 467, 465
|
||||||
|
474, 283, 0, 0
|
||||||
|
475, 471, 467, 466
|
||||||
|
476, 461, 0, 0
|
||||||
|
477, 470, 462, 461
|
||||||
|
478, 357, 0, 0
|
||||||
|
479, 375, 0, 0
|
||||||
|
480, 473, 467, 464
|
||||||
|
481, 343, 0, 0
|
||||||
|
482, 477, 476, 473
|
||||||
|
483, 479, 477, 474
|
||||||
|
484, 379, 0, 0
|
||||||
|
485, 479, 469, 468
|
||||||
|
486, 481, 478, 472
|
||||||
|
487, 393, 0, 0
|
||||||
|
488, 487, 485, 484
|
||||||
|
489, 406, 0, 0
|
||||||
|
490, 271, 0, 0
|
||||||
|
491, 488, 485, 480
|
||||||
|
492, 491, 485, 484
|
||||||
|
493, 490, 488, 483
|
||||||
|
494, 357, 0, 0
|
||||||
|
495, 419, 0, 0
|
||||||
|
496, 494, 491, 480
|
||||||
|
497, 419, 0, 0
|
||||||
|
498, 495, 489, 487
|
||||||
|
499, 494, 493, 488
|
||||||
|
500, 499, 494, 490
|
||||||
|
501, 499, 497, 496
|
||||||
|
502, 498, 497, 494
|
||||||
|
503, 500, 0, 0
|
||||||
|
504, 502, 490, 483
|
||||||
|
505, 349, 0, 0
|
||||||
|
506, 411, 0, 0
|
||||||
|
507, 504, 501, 494
|
||||||
|
508, 399, 0, 0
|
||||||
|
509, 506, 502, 501
|
||||||
|
510, 501, 500, 498
|
||||||
|
511, 501, 0, 0
|
||||||
|
512, 510, 507, 504
|
||||||
|
513, 428, 0, 0
|
||||||
|
514, 511, 509, 507
|
||||||
|
515, 511, 508, 501
|
||||||
|
516, 514, 511, 509
|
||||||
|
517, 515, 507, 505
|
||||||
|
518, 485, 0, 0
|
||||||
|
519, 440, 0, 0
|
||||||
|
520, 509, 507, 503
|
||||||
|
521, 489, 0, 0
|
||||||
|
522, 518, 509, 507
|
||||||
|
523, 521, 517, 510
|
||||||
|
524, 357, 0, 0
|
||||||
|
525, 524, 521, 519
|
||||||
|
526, 525, 521, 517
|
||||||
|
527, 480, 0, 0
|
||||||
|
528, 526, 522, 517
|
||||||
|
529, 487, 0, 0
|
||||||
|
530, 527, 523, 520
|
||||||
|
531, 529, 525, 519
|
||||||
|
532, 531, 0, 0
|
||||||
|
533, 531, 530, 529
|
||||||
|
534, 533, 529, 527
|
||||||
|
535, 533, 529, 527
|
||||||
|
536, 533, 531, 529
|
||||||
|
537, 443, 0, 0
|
||||||
|
538, 537, 536, 533
|
||||||
|
539, 535, 534, 529
|
||||||
|
540, 361, 0, 0
|
||||||
|
541, 537, 531, 528
|
||||||
|
542, 540, 539, 533
|
||||||
|
543, 527, 0, 0
|
||||||
|
544, 538, 535, 531
|
||||||
|
545, 423, 0, 0
|
||||||
|
546, 545, 544, 538
|
||||||
|
547, 543, 540, 534
|
||||||
|
548, 545, 543, 538
|
||||||
|
549, 546, 545, 533
|
||||||
|
550, 357, 0, 0
|
||||||
|
551, 416, 0, 0
|
||||||
|
552, 550, 547, 532
|
||||||
|
553, 514, 0, 0
|
||||||
|
554, 551, 546, 543
|
||||||
|
555, 551, 546, 545
|
||||||
|
556, 403, 0, 0
|
||||||
|
557, 552, 551, 550
|
||||||
|
558, 553, 549, 544
|
||||||
|
559, 525, 0, 0
|
||||||
|
560, 554, 551, 549
|
||||||
|
561, 490, 0, 0
|
||||||
|
562, 560, 558, 551
|
||||||
|
563, 561, 554, 549
|
||||||
|
564, 401, 0, 0
|
||||||
|
565, 564, 559, 554
|
||||||
|
566, 413, 0, 0
|
||||||
|
567, 424, 0, 0
|
||||||
|
568, 558, 557, 551
|
||||||
|
569, 492, 0, 0
|
||||||
|
570, 503, 0, 0
|
||||||
|
571, 569, 566, 561
|
||||||
|
572, 571, 564, 560
|
||||||
|
573, 569, 567, 563
|
||||||
|
574, 561, 0, 0
|
||||||
|
575, 429, 0, 0
|
||||||
|
576, 573, 572, 563
|
||||||
|
577, 552, 0, 0
|
||||||
|
578, 562, 556, 555
|
||||||
|
579, 572, 570, 567
|
||||||
|
580, 579, 576, 574
|
||||||
|
581, 575, 574, 568
|
||||||
|
582, 497, 0, 0
|
||||||
|
583, 453, 0, 0
|
||||||
|
584, 581, 571, 570
|
||||||
|
585, 464, 0, 0
|
||||||
|
586, 584, 581, 579
|
||||||
|
587, 586, 581, 576
|
||||||
|
588, 437, 0, 0
|
||||||
|
589, 586, 585, 579
|
||||||
|
590, 497, 0, 0
|
||||||
|
591, 587, 585, 582
|
||||||
|
592, 591, 573, 568
|
||||||
|
593, 507, 0, 0
|
||||||
|
594, 575, 0, 0
|
||||||
|
595, 594, 593, 586
|
||||||
|
596, 592, 591, 590
|
||||||
|
597, 588, 585, 583
|
||||||
|
598, 597, 592, 591
|
||||||
|
599, 569, 0, 0
|
||||||
|
600, 599, 590, 589
|
||||||
|
601, 400, 0, 0
|
||||||
|
602, 596, 594, 591
|
||||||
|
603, 600, 599, 597
|
||||||
|
604, 600, 598, 589
|
||||||
|
605, 600, 598, 595
|
||||||
|
606, 602, 599, 591
|
||||||
|
607, 502, 0, 0
|
||||||
|
608, 606, 602, 585
|
||||||
|
609, 578, 0, 0
|
||||||
|
610, 483, 0, 0
|
||||||
|
611, 609, 607, 601
|
||||||
|
612, 607, 602, 598
|
||||||
|
613, 609, 603, 594
|
||||||
|
614, 613, 612, 607
|
||||||
|
615, 404, 0, 0
|
||||||
|
616, 614, 602, 597
|
||||||
|
617, 417, 0, 0
|
||||||
|
618, 615, 604, 598
|
||||||
|
619, 614, 611, 610
|
||||||
|
620, 619, 618, 611
|
||||||
|
621, 616, 615, 609
|
||||||
|
622, 325, 0, 0
|
||||||
|
623, 555, 0, 0
|
||||||
|
624, 617, 615, 612
|
||||||
|
625, 492, 0, 0
|
||||||
|
626, 623, 621, 613
|
||||||
|
627, 622, 617, 613
|
||||||
|
628, 405, 0, 0
|
||||||
|
629, 627, 624, 623
|
||||||
|
630, 628, 626, 623
|
||||||
|
631, 324, 0, 0
|
||||||
|
632, 629, 619, 613
|
||||||
|
633, 532, 0, 0
|
||||||
|
634, 319, 0, 0
|
||||||
|
635, 631, 625, 621
|
||||||
|
636, 632, 628, 623
|
||||||
|
637, 636, 628, 623
|
||||||
|
638, 637, 633, 632
|
||||||
|
639, 623, 0, 0
|
||||||
|
640, 638, 637, 626
|
||||||
|
641, 630, 0, 0
|
||||||
|
642, 523, 0, 0
|
||||||
|
643, 641, 640, 632
|
||||||
|
644, 634, 633, 632
|
||||||
|
645, 641, 637, 634
|
||||||
|
646, 397, 0, 0
|
||||||
|
647, 642, 0, 0
|
||||||
|
648, 647, 626, 625
|
||||||
|
649, 612, 0, 0
|
||||||
|
650, 647, 0, 0
|
||||||
|
651, 646, 638, 637
|
||||||
|
652, 559, 0, 0
|
||||||
|
653, 646, 645, 643
|
||||||
|
654, 649, 643, 640
|
||||||
|
655, 567, 0, 0
|
||||||
|
656, 646, 638, 637
|
||||||
|
657, 619, 0, 0
|
||||||
|
658, 603, 0, 0
|
||||||
|
659, 657, 655, 644
|
||||||
|
660, 657, 656, 648
|
||||||
|
661, 657, 650, 649
|
||||||
|
662, 365, 0, 0
|
||||||
|
663, 406, 0, 0
|
||||||
|
664, 662, 660, 649
|
||||||
|
665, 632, 0, 0
|
||||||
|
666, 664, 659, 656
|
||||||
|
667, 664, 660, 649
|
||||||
|
668, 658, 656, 651
|
||||||
|
669, 667, 665, 664
|
||||||
|
670, 517, 0, 0
|
||||||
|
671, 656, 0, 0
|
||||||
|
672, 667, 666, 661
|
||||||
|
673, 645, 0, 0
|
||||||
|
674, 671, 665, 660
|
||||||
|
675, 674, 672, 669
|
||||||
|
676, 435, 0, 0
|
||||||
|
677, 674, 673, 669
|
||||||
|
678, 675, 673, 663
|
||||||
|
679, 613, 0, 0
|
||||||
|
680, 679, 650, 645
|
||||||
|
681, 678, 672, 670
|
||||||
|
682, 681, 679, 675
|
||||||
|
683, 682, 677, 672
|
||||||
|
684, 681, 671, 666
|
||||||
|
685, 684, 682, 681
|
||||||
|
686, 489, 0, 0
|
||||||
|
687, 674, 0, 0
|
||||||
|
688, 682, 674, 669
|
||||||
|
689, 675, 0, 0
|
||||||
|
690, 687, 683, 680
|
||||||
|
691, 689, 685, 678
|
||||||
|
692, 393, 0, 0
|
||||||
|
693, 691, 685, 678
|
||||||
|
694, 691, 681, 677
|
||||||
|
695, 483, 0, 0
|
||||||
|
696, 694, 686, 673
|
||||||
|
697, 430, 0, 0
|
||||||
|
698, 483, 0, 0
|
||||||
|
699, 698, 689, 684
|
||||||
|
700, 698, 695, 694
|
||||||
|
701, 699, 697, 685
|
||||||
|
702, 665, 0, 0
|
||||||
|
703, 702, 696, 691
|
||||||
|
704, 701, 699, 692
|
||||||
|
705, 686, 0, 0
|
||||||
|
706, 697, 695, 692
|
||||||
|
707, 702, 699, 692
|
||||||
|
708, 421, 0, 0
|
||||||
|
709, 708, 706, 705
|
||||||
|
710, 709, 696, 695
|
||||||
|
711, 619, 0, 0
|
||||||
|
712, 709, 708, 707
|
||||||
|
713, 672, 0, 0
|
||||||
|
714, 691, 0, 0
|
||||||
|
715, 714, 711, 708
|
||||||
|
716, 533, 0, 0
|
||||||
|
717, 716, 710, 701
|
||||||
|
718, 717, 716, 713
|
||||||
|
719, 569, 0, 0
|
||||||
|
720, 718, 712, 709
|
||||||
|
721, 712, 0, 0
|
||||||
|
722, 491, 0, 0
|
||||||
|
723, 717, 710, 707
|
||||||
|
724, 719, 716, 711
|
||||||
|
725, 720, 719, 716
|
||||||
|
726, 721, 0, 0
|
||||||
|
727, 547, 0, 0
|
||||||
|
728, 726, 725, 724
|
||||||
|
729, 671, 0, 0
|
||||||
|
730, 583, 0, 0
|
||||||
|
731, 729, 725, 723
|
||||||
|
732, 729, 728, 725
|
||||||
|
733, 731, 726, 725
|
||||||
|
734, 724, 721, 720
|
||||||
|
735, 691, 0, 0
|
||||||
|
736, 730, 728, 723
|
||||||
|
737, 732, 0, 0
|
||||||
|
738, 391, 0, 0
|
||||||
|
739, 731, 723, 721
|
||||||
|
740, 587, 0, 0
|
||||||
|
741, 738, 733, 732
|
||||||
|
742, 741, 738, 730
|
||||||
|
743, 653, 0, 0
|
||||||
|
744, 743, 733, 731
|
||||||
|
745, 487, 0, 0
|
||||||
|
746, 395, 0, 0
|
||||||
|
747, 743, 741, 737
|
||||||
|
748, 744, 743, 733
|
||||||
|
749, 748, 743, 742
|
||||||
|
750, 746, 741, 734
|
||||||
|
751, 733, 0, 0
|
||||||
|
752, 749, 732, 731
|
||||||
|
753, 595, 0, 0
|
||||||
|
754, 735, 0, 0
|
||||||
|
755, 754, 745, 743
|
||||||
|
756, 407, 0, 0
|
||||||
|
757, 756, 751, 750
|
||||||
|
758, 757, 746, 741
|
||||||
|
759, 661, 0, 0
|
||||||
|
760, 757, 747, 734
|
||||||
|
761, 758, 0, 0
|
||||||
|
762, 679, 0, 0
|
||||||
|
763, 754, 749, 747
|
||||||
|
764, 761, 759, 758
|
||||||
|
765, 760, 755, 754
|
||||||
|
766, 757, 747, 744
|
||||||
|
767, 599, 0, 0
|
||||||
|
768, 764, 751, 749
|
||||||
|
769, 649, 0, 0
|
||||||
|
770, 768, 765, 756
|
||||||
|
771, 765, 756, 754
|
||||||
|
772, 765, 0, 0
|
||||||
|
773, 767, 765, 763
|
||||||
|
774, 589, 0, 0
|
||||||
|
775, 408, 0, 0
|
||||||
|
776, 773, 764, 759
|
||||||
|
777, 748, 0, 0
|
||||||
|
778, 403, 0, 0
|
||||||
|
779, 776, 771, 769
|
||||||
|
780, 775, 772, 764
|
||||||
|
781, 779, 765, 764
|
||||||
|
782, 453, 0, 0
|
||||||
|
783, 715, 0, 0
|
||||||
|
784, 778, 775, 771
|
||||||
|
785, 693, 0, 0
|
||||||
|
786, 782, 780, 771
|
|
@ -0,0 +1,67 @@
|
||||||
|
import sys
|
||||||
|
import cocotb
|
||||||
|
|
||||||
|
from cocotb.clock import Clock
|
||||||
|
from cocotb.triggers import Timer, RisingEdge, ReadOnly
|
||||||
|
from cocotb.drivers import BitDriver
|
||||||
|
from cocotb.binary import BinaryValue
|
||||||
|
from cocotb.result import TestFailure, TestSuccess, ReturnValue
|
||||||
|
|
||||||
|
class tests:
|
||||||
|
def __init__(self, dut):
|
||||||
|
self.dut = dut
|
||||||
|
|
||||||
|
@cocotb.coroutine
|
||||||
|
def does_it_run_test(self):
|
||||||
|
# This test will let the lfsr run for a bit.
|
||||||
|
# We will verify the every time a valid goes high the value outputted is different from the previous value
|
||||||
|
# This is testing that some operation is happening
|
||||||
|
|
||||||
|
print("INFO: Performing does_it_run_test test")
|
||||||
|
yield RisingEdge(self.dut.clk)
|
||||||
|
|
||||||
|
print("INFO: Setting our test passing conditon to true")
|
||||||
|
test_passing = True
|
||||||
|
|
||||||
|
print("INFO: Making the seed 0xDEADBEEF")
|
||||||
|
self.dut.seed <= BinaryValue(0xDEADBEEF, 32, False)
|
||||||
|
yield RisingEdge(self.dut.clk)
|
||||||
|
|
||||||
|
print("INFO: Pushing rst high to lock in the seed")
|
||||||
|
self.dut.rst <= BinaryValue(1, 1, False)
|
||||||
|
yield RisingEdge(self.dut.clk)
|
||||||
|
|
||||||
|
print("INFO: Pushing rst low for operation")
|
||||||
|
self.dut.rst <= BinaryValue(0, 1, False)
|
||||||
|
yield RisingEdge(self.dut.clk)
|
||||||
|
|
||||||
|
print("INFO: Pushing lfsr_enable high")
|
||||||
|
self.dut.lfsr_enable <= BinaryValue(1, 1, False)
|
||||||
|
yield RisingEdge(self.dut.clk)
|
||||||
|
|
||||||
|
print("INFO: Establishing value to check against's initial value to 0xDEADBEEF")
|
||||||
|
lfsr_data = BinaryValue(0xDEADBEEF, 32, False)
|
||||||
|
|
||||||
|
print("INFO: Running for 100 cycles")
|
||||||
|
for i in range(100):
|
||||||
|
yield RisingEdge(self.dut.clk)
|
||||||
|
|
||||||
|
# Checking that the lfsr output has changed after a clock cycle
|
||||||
|
if self.dut.lfsr_output == lfsr_data:
|
||||||
|
# Mark the first time that this did not work
|
||||||
|
if test_passing == True:
|
||||||
|
print("ERROR: Test failed at lfsr loop %d", i)
|
||||||
|
print("ERROR: Old lfsr value was %d", lfsr_data)
|
||||||
|
print("ERROR: Dut lfsr value was %d", self.dut.lfsr_output)
|
||||||
|
|
||||||
|
# Now we change the "passing" bool to false
|
||||||
|
test_passing = False
|
||||||
|
|
||||||
|
# Making value to check the current value of the lfsr's output
|
||||||
|
lfsr_data = self.dut.lfsr_output.value
|
||||||
|
|
||||||
|
print("INFO: Evaluating result")
|
||||||
|
if test_passing == True:
|
||||||
|
raise TestSuccess("INFO: Each cycle of LFSR was distinct")
|
||||||
|
else:
|
||||||
|
raise TestFailure("INFO: Each cycle of LFSR was not distinct")
|
|
@ -0,0 +1,79 @@
|
||||||
|
import sys
|
||||||
|
import cocotb
|
||||||
|
|
||||||
|
from cocotb.clock import Clock
|
||||||
|
from cocotb.triggers import Timer, RisingEdge, ReadOnly
|
||||||
|
from cocotb.utils import get_sim_time
|
||||||
|
from cocotb.drivers import BitDriver
|
||||||
|
from cocotb.drivers.avalon import AvalonMaster
|
||||||
|
from cocotb.drivers.avalon import AvalonSTPkts as AvalonDriver
|
||||||
|
from cocotb.monitors.avalon import AvalonSTPkts as AvalonMonitor
|
||||||
|
from cocotb.binary import BinaryValue
|
||||||
|
from cocotb.regression import TestFactory
|
||||||
|
from cocotb.scoreboard import Scoreboard
|
||||||
|
from cocotb.result import TestFailure, TestSuccess, ReturnValue
|
||||||
|
|
||||||
|
from cocotb.generators.byte import random_data, get_bytes
|
||||||
|
from cocotb.generators.bit import wave, intermittent_single_cycles, random_50_percent
|
||||||
|
|
||||||
|
import lfsr_test
|
||||||
|
|
||||||
|
class TestModelTB(object):
|
||||||
|
# For each test initialise...
|
||||||
|
def __init__(self, dut):
|
||||||
|
# define the dut
|
||||||
|
self.dut = dut
|
||||||
|
|
||||||
|
# Define the testing modules
|
||||||
|
self.lfsr_tests = lfsr_test.tests(self.dut)
|
||||||
|
|
||||||
|
# This is a coroutine that will be used to reset the test bench at the start of each test
|
||||||
|
@cocotb.coroutine
|
||||||
|
def try_system_reset(self, duration=10):
|
||||||
|
print("INFO: Sending reset to components under test")
|
||||||
|
yield RisingEdge(self.dut.clk)
|
||||||
|
self.dut.rst <= BinaryValue(1, 1, False)
|
||||||
|
yield RisingEdge(self.dut.clk)
|
||||||
|
|
||||||
|
self.dut.lfsr_enable <= BinaryValue(0, 1, False)
|
||||||
|
self.dut.seed <= BinaryValue(0, 128, False)
|
||||||
|
|
||||||
|
yield Timer(duration)
|
||||||
|
yield RisingEdge(self.dut.clk)
|
||||||
|
self.dut.rst <= BinaryValue(0, 1, False)
|
||||||
|
print("INFO: Reset complete")
|
||||||
|
|
||||||
|
@cocotb.coroutine
|
||||||
|
def run_test(dut, test_selection):
|
||||||
|
# Fork the clock process
|
||||||
|
print("INFO: Forking clock for sim")
|
||||||
|
cocotb.fork(Clock(dut.clk, 10000).start()) # 10000 has been chosen arbirtarily
|
||||||
|
|
||||||
|
# Give the class a shorthand and set it up
|
||||||
|
print("INFO: Importing test class")
|
||||||
|
tb = TestModelTB(dut)
|
||||||
|
|
||||||
|
# Reset component to bring to known state
|
||||||
|
yield RisingEdge(dut.clk)
|
||||||
|
yield tb.try_system_reset()
|
||||||
|
|
||||||
|
print("INFO: Determining whch test to run")
|
||||||
|
# Determine which test to perform
|
||||||
|
test_suite = test_selection.split()[0]
|
||||||
|
test_chosen = test_selection.split()[1]
|
||||||
|
|
||||||
|
print("INFO: Selecting test suite: " + test_suite)
|
||||||
|
print("INFO: Selecting test to run: " + test_chosen)
|
||||||
|
if test_suite == "lfsr_test":
|
||||||
|
if test_chosen == "does_it_run_test":
|
||||||
|
yield tb.lfsr_tests.does_it_run_test()
|
||||||
|
else:
|
||||||
|
raise Exception("Invalid test selected")
|
||||||
|
else:
|
||||||
|
raise Exception("Invalid test suite selected")
|
||||||
|
|
||||||
|
# Define the regression tests
|
||||||
|
factory = TestFactory(run_test)
|
||||||
|
factory.add_option("test_selection", ["lfsr_test does_it_run_test"])
|
||||||
|
|
||||||
|
factory.generate_tests()
|
|
@ -0,0 +1,52 @@
|
||||||
|
-- This file is a wrapper for the LSFR variants so that they can be tested properly using the testbenching methods
|
||||||
|
-- This wrapper is not meant to see use outside of simulation
|
||||||
|
|
||||||
|
-- The ports are as follows:
|
||||||
|
-- clk - Input port for a clocking signal
|
||||||
|
-- rst - Input port for a reset signal. Synchronous
|
||||||
|
-- en - Enables the specific entity being tested. Follows the size port
|
||||||
|
-- mode - This will determine the architecture being tested. 0 for fibonacci, 1 for galois
|
||||||
|
-- size - This determines which lfsr we are looking at in terms of taps
|
||||||
|
-- seed - This is used to set the seed in the entityies
|
||||||
|
-- output - This outputs the PRBS values generated by the LFSR under test
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
entity lfsr_test_wrapper is
|
||||||
|
generic
|
||||||
|
(
|
||||||
|
SIZE : natural := 32
|
||||||
|
);
|
||||||
|
port
|
||||||
|
(
|
||||||
|
clk : in std_logic;
|
||||||
|
rst : in std_logic;
|
||||||
|
seed : in std_logic_vector(SIZE - 1 downto 0);
|
||||||
|
|
||||||
|
lfsr_enable : in std_logic;
|
||||||
|
lfsr_output : out std_logic_vector(SIZE - 1 downto 0)
|
||||||
|
);
|
||||||
|
end entity;
|
||||||
|
|
||||||
|
architecture tb of lfsr_test_wrapper is
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
lfsr_i : entity work.lfsr
|
||||||
|
generic map
|
||||||
|
(
|
||||||
|
SIZE => SIZE
|
||||||
|
)
|
||||||
|
port map
|
||||||
|
(
|
||||||
|
clk => clk,
|
||||||
|
rst => rst,
|
||||||
|
en => lfsr_enable,
|
||||||
|
|
||||||
|
seed => seed,
|
||||||
|
output => lfsr_output
|
||||||
|
);
|
||||||
|
|
||||||
|
end tb;
|
|
@ -0,0 +1,98 @@
|
||||||
|
-- This component is designed to have it's output stream size set at compilation and provide PRBS values appropriate for
|
||||||
|
-- the size defined.
|
||||||
|
-- You can seed this PRBS generator by changing the value of the seed port while in reset
|
||||||
|
-- This design follows that of a fibonacci linear feedback shift register
|
||||||
|
|
||||||
|
-- The generics are as follows:
|
||||||
|
-- SIZE - This denotes the size of the output vector. This also effects the size of the seed, and the placement of taps in
|
||||||
|
-- the component
|
||||||
|
|
||||||
|
-- The ports are as follows:
|
||||||
|
-- clk - Input port for the clocking signal
|
||||||
|
-- rst - Input port for the reset signal. Should be synchronous.
|
||||||
|
-- en - The enable port. The compoent will only output new data when this is high
|
||||||
|
-- seed - This input is the starting value of the PRBS generator when reset is enabled. It will affect subsequent outputs
|
||||||
|
-- output - This output is PBRS value generated by the componet. It will change every cycle if enable is high
|
||||||
|
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
library work;
|
||||||
|
use work.lfsr_package.all;
|
||||||
|
|
||||||
|
entity lfsr is
|
||||||
|
generic
|
||||||
|
(
|
||||||
|
SIZE : natural := 128
|
||||||
|
);
|
||||||
|
port
|
||||||
|
(
|
||||||
|
clk : in std_logic;
|
||||||
|
rst : in std_logic;
|
||||||
|
en : in std_logic;
|
||||||
|
|
||||||
|
seed : in std_logic_vector(SIZE - 1 downto 0);
|
||||||
|
output : out std_logic_vector(SIZE - 1 downto 0)
|
||||||
|
);
|
||||||
|
end entity;
|
||||||
|
|
||||||
|
architecture rtl of lfsr is
|
||||||
|
-- signals
|
||||||
|
signal shift_register : std_logic_vector(SIZE - 1 downto 0);
|
||||||
|
signal feedback_in : std_logic;
|
||||||
|
signal feedback_out : std_logic_vector(0 to (number_of_taps(SIZE) - 1));
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
shift_register_proc : process (clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if en = '1' then
|
||||||
|
shift_register(SIZE - 1 downto 1) <= shift_register(SIZE - 2 downto 0);
|
||||||
|
shift_register(0) <= feedback_in;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if rst = '1' then
|
||||||
|
shift_register <= seed;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
feedback_calc_gen : for i in 1 to (number_of_taps(SIZE) - 1) generate
|
||||||
|
feedback_out(i) <= shift_register(tap_position(SIZE, i + 1) - 1) xor feedback_out(i - 1);
|
||||||
|
end generate;
|
||||||
|
|
||||||
|
feedback_out(0) <= shift_register(SIZE - 1);
|
||||||
|
feedback_in <= feedback_out(number_of_taps(SIZE) - 1);
|
||||||
|
|
||||||
|
output <= shift_register;
|
||||||
|
|
||||||
|
end rtl;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,958 @@
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
package lfsr_package is
|
||||||
|
type number_of_taps_type is array(2 to 786) of natural;
|
||||||
|
type tap_position_type is array(2 to 786, 1 to 4) of natural;
|
||||||
|
|
||||||
|
constant number_of_taps : number_of_taps_type :=
|
||||||
|
(
|
||||||
|
2, 2, 2, 2, 2,
|
||||||
|
2, 4, 2, 2, 2,
|
||||||
|
4, 4, 4, 2, 4,
|
||||||
|
2, 2, 4, 2, 2,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
4, 2, 4, 2, 2,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
4, 4, 4, 4, 4,
|
||||||
|
2, 4, 2, 4, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
4, 2, 4, 2, 4,
|
||||||
|
4, 2, 4, 4, 2,
|
||||||
|
4, 2, 4, 4, 4,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
4, 4, 2, 4, 4,
|
||||||
|
2, 4, 2, 4, 4,
|
||||||
|
4, 2, 2, 2, 4,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
4, 2, 4, 2, 2,
|
||||||
|
4, 2, 4, 4, 2,
|
||||||
|
4, 2, 4, 4, 4,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
4, 2, 2, 4, 4,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
4, 2, 4, 2, 2,
|
||||||
|
4, 2, 4, 4, 4,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
4, 4, 4, 4, 4,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
2, 2, 4, 4, 4,
|
||||||
|
4, 2, 4, 2, 4,
|
||||||
|
4, 4, 4, 4, 2,
|
||||||
|
4, 2, 2, 4, 4,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
2, 4, 4, 4, 4,
|
||||||
|
2, 4, 2, 4, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
2, 2, 4, 4, 4,
|
||||||
|
4, 2, 4, 2, 4,
|
||||||
|
4, 4, 4, 4, 2,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
4, 4, 4, 4, 4,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
2, 2, 4, 4, 4,
|
||||||
|
4, 2, 4, 2, 2,
|
||||||
|
4, 2, 4, 2, 2,
|
||||||
|
4, 2, 2, 4, 4,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
2, 4, 2, 4, 2,
|
||||||
|
2, 4, 2, 4, 4,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
4, 4, 4, 4, 4,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
2, 4, 4, 4, 4,
|
||||||
|
2, 4, 2, 4, 4,
|
||||||
|
2, 2, 4, 4, 4,
|
||||||
|
2, 4, 4, 4, 4,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
4, 4, 4, 2, 2,
|
||||||
|
4, 2, 4, 4, 4,
|
||||||
|
4, 4, 2, 4, 4,
|
||||||
|
2, 4, 2, 4, 2,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
4, 4, 4, 2, 4,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
2, 2, 4, 2, 2,
|
||||||
|
4, 4, 4, 2, 2,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
2, 4, 2, 4, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
2, 4, 4, 4, 4,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
4, 2, 4, 4, 2,
|
||||||
|
4, 2, 4, 4, 2,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
4, 4, 4, 4, 2,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
4, 4, 4, 2, 4,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
4, 4, 4, 2, 2,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
4, 4, 2, 4, 4,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
4, 4, 2, 2, 4,
|
||||||
|
2, 4, 4, 4, 4,
|
||||||
|
4, 2, 4, 2, 2,
|
||||||
|
4, 2, 4, 4, 2,
|
||||||
|
4, 2, 4, 4, 4,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
4, 4, 2, 4, 4,
|
||||||
|
2, 4, 2, 4, 4,
|
||||||
|
2, 4, 4, 4, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
4, 2, 4, 2, 4,
|
||||||
|
4, 4, 4, 2, 2,
|
||||||
|
4, 2, 4, 4, 2,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
4, 4, 2, 2, 4,
|
||||||
|
2, 4, 4, 4, 4,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
4, 2, 4, 2, 4,
|
||||||
|
4, 2, 2, 4, 4,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
4, 4, 4, 4, 4,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
4, 4, 4, 2, 4,
|
||||||
|
2, 4, 4, 4, 4,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
4, 2, 4, 4, 2,
|
||||||
|
4, 2, 2, 4, 4,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
2, 4, 4, 4, 2,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
2, 2, 4, 4, 4,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
4, 4, 4, 2, 2,
|
||||||
|
4, 2, 4, 4, 2,
|
||||||
|
4, 4, 2, 4, 4,
|
||||||
|
4, 4, 4, 4, 2,
|
||||||
|
2, 4, 2, 4, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
2, 2, 4, 4, 4,
|
||||||
|
2, 4, 4, 2, 4,
|
||||||
|
4, 2, 4, 4, 2,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
2, 4, 4, 4, 2,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
4, 4, 4, 2, 4,
|
||||||
|
2, 2, 4, 2, 4,
|
||||||
|
4, 2, 4, 2, 2,
|
||||||
|
4, 4, 4, 4, 2,
|
||||||
|
4, 2, 2, 4, 2,
|
||||||
|
4, 4, 2, 4, 2,
|
||||||
|
2, 4, 4, 4, 4,
|
||||||
|
2, 4, 2, 4, 4,
|
||||||
|
2, 4, 2, 2, 4,
|
||||||
|
2, 2, 4, 4, 4,
|
||||||
|
2, 2, 4, 2, 4
|
||||||
|
);
|
||||||
|
|
||||||
|
constant tap_position : tap_position_type :=
|
||||||
|
(
|
||||||
|
( 2, 1, 0, 0),
|
||||||
|
( 3, 2, 0, 0),
|
||||||
|
( 4, 3, 0, 0),
|
||||||
|
( 5, 3, 0, 0),
|
||||||
|
( 6, 5, 0, 0),
|
||||||
|
( 7, 6, 0, 0),
|
||||||
|
( 8, 6, 5, 4),
|
||||||
|
( 9, 5, 0, 0),
|
||||||
|
( 10, 7, 0, 0),
|
||||||
|
( 11, 9, 0, 0),
|
||||||
|
( 12, 11, 8, 6),
|
||||||
|
( 13, 12, 10, 9),
|
||||||
|
( 14, 13, 11, 9),
|
||||||
|
( 15, 14, 0, 0),
|
||||||
|
( 16, 14, 13, 11),
|
||||||
|
( 17, 14, 0, 0),
|
||||||
|
( 18, 11, 0, 0),
|
||||||
|
( 19, 18, 17, 14),
|
||||||
|
( 20, 17, 0, 0),
|
||||||
|
( 21, 19, 0, 0),
|
||||||
|
( 22, 21, 0, 0),
|
||||||
|
( 23, 18, 0, 0),
|
||||||
|
( 24, 23, 21, 20),
|
||||||
|
( 25, 22, 0, 0),
|
||||||
|
( 26, 25, 24, 20),
|
||||||
|
( 27, 26, 25, 22),
|
||||||
|
( 28, 25, 0, 0),
|
||||||
|
( 29, 27, 0, 0),
|
||||||
|
( 30, 29, 26, 24),
|
||||||
|
( 31, 28, 0, 0),
|
||||||
|
( 32, 30, 26, 25),
|
||||||
|
( 33, 20, 0, 0),
|
||||||
|
( 34, 31, 30, 26),
|
||||||
|
( 35, 33, 0, 0),
|
||||||
|
( 36, 25, 0, 0),
|
||||||
|
( 37, 36, 33, 31),
|
||||||
|
( 38, 37, 33, 32),
|
||||||
|
( 39, 35, 0, 0),
|
||||||
|
( 40, 37, 36, 35),
|
||||||
|
( 41, 38, 0, 0),
|
||||||
|
( 42, 40, 37, 35),
|
||||||
|
( 43, 42, 38, 37),
|
||||||
|
( 44, 42, 39, 38),
|
||||||
|
( 45, 44, 42, 41),
|
||||||
|
( 46, 40, 39, 38),
|
||||||
|
( 47, 42, 0, 0),
|
||||||
|
( 48, 44, 41, 39),
|
||||||
|
( 49, 40, 0, 0),
|
||||||
|
( 50, 48, 47, 46),
|
||||||
|
( 51, 50, 48, 45),
|
||||||
|
( 52, 49, 0, 0),
|
||||||
|
( 53, 52, 51, 47),
|
||||||
|
( 54, 51, 48, 46),
|
||||||
|
( 55, 31, 0, 0),
|
||||||
|
( 56, 54, 52, 49),
|
||||||
|
( 57, 50, 0, 0),
|
||||||
|
( 58, 39, 0, 0),
|
||||||
|
( 59, 57, 55, 52),
|
||||||
|
( 60, 59, 0, 0),
|
||||||
|
( 61, 60, 59, 56),
|
||||||
|
( 62, 59, 57, 56),
|
||||||
|
( 63, 62, 0, 0),
|
||||||
|
( 64, 63, 61, 60),
|
||||||
|
( 65, 47, 0, 0),
|
||||||
|
( 66, 60, 58, 57),
|
||||||
|
( 67, 66, 65, 62),
|
||||||
|
( 68, 59, 0, 0),
|
||||||
|
( 69, 67, 64, 63),
|
||||||
|
( 70, 69, 67, 65),
|
||||||
|
( 71, 65, 0, 0),
|
||||||
|
( 72, 69, 63, 62),
|
||||||
|
( 73, 48, 0, 0),
|
||||||
|
( 74, 71, 70, 67),
|
||||||
|
( 75, 74, 72, 69),
|
||||||
|
( 76, 74, 72, 71),
|
||||||
|
( 77, 75, 72, 71),
|
||||||
|
( 78, 77, 76, 71),
|
||||||
|
( 79, 70, 0, 0),
|
||||||
|
( 80, 78, 76, 71),
|
||||||
|
( 81, 77, 0, 0),
|
||||||
|
( 82, 78, 76, 73),
|
||||||
|
( 83, 81, 79, 76),
|
||||||
|
( 84, 71, 0, 0),
|
||||||
|
( 85, 84, 83, 77),
|
||||||
|
( 86, 84, 81, 80),
|
||||||
|
( 87, 74, 0, 0),
|
||||||
|
( 88, 80, 79, 77),
|
||||||
|
( 89, 51, 0, 0),
|
||||||
|
( 90, 88, 87, 85),
|
||||||
|
( 91, 90, 86, 83),
|
||||||
|
( 92, 90, 87, 86),
|
||||||
|
( 93, 91, 0, 0),
|
||||||
|
( 94, 73, 0, 0),
|
||||||
|
( 95, 84, 0, 0),
|
||||||
|
( 96, 90, 87, 86),
|
||||||
|
( 97, 91, 0, 0),
|
||||||
|
( 98, 87, 0, 0),
|
||||||
|
( 99, 95, 94, 92),
|
||||||
|
(100, 63, 0, 0),
|
||||||
|
(101, 100, 95, 94),
|
||||||
|
(102, 99, 97, 96),
|
||||||
|
(103, 94, 0, 0),
|
||||||
|
(104, 103, 94, 93),
|
||||||
|
(105, 89, 0, 0),
|
||||||
|
(106, 91, 0, 0),
|
||||||
|
(107, 105, 99, 98),
|
||||||
|
(108, 77, 0, 0),
|
||||||
|
(109, 107, 105, 104),
|
||||||
|
(110, 109, 106, 104),
|
||||||
|
(111, 101, 0, 0),
|
||||||
|
(112, 108, 106, 101),
|
||||||
|
(113, 104, 0, 0),
|
||||||
|
(114, 113, 112, 103),
|
||||||
|
(115, 110, 108, 107),
|
||||||
|
(116, 114, 111, 110),
|
||||||
|
(117, 116, 115, 112),
|
||||||
|
(118, 85, 0, 0),
|
||||||
|
(119, 111, 0, 0),
|
||||||
|
(120, 118, 114, 111),
|
||||||
|
(121, 103, 0, 0),
|
||||||
|
(122, 121, 120, 116),
|
||||||
|
(123, 121, 0, 0),
|
||||||
|
(124, 87, 0, 0),
|
||||||
|
(125, 120, 119, 118),
|
||||||
|
(126, 124, 122, 119),
|
||||||
|
(127, 126, 0, 0),
|
||||||
|
(128, 127, 126, 121),
|
||||||
|
(129, 124, 0, 0),
|
||||||
|
(130, 127, 0, 0),
|
||||||
|
(131, 129, 128, 123),
|
||||||
|
(132, 103, 0, 0),
|
||||||
|
(133, 131, 125, 124),
|
||||||
|
(134, 77, 0, 0),
|
||||||
|
(135, 124, 0, 0),
|
||||||
|
(136, 134, 133, 128),
|
||||||
|
(137, 116, 0, 0),
|
||||||
|
(138, 137, 131, 130),
|
||||||
|
(139, 136, 134, 131),
|
||||||
|
(140, 111, 0, 0),
|
||||||
|
(141, 140, 135, 128),
|
||||||
|
(142, 121, 0, 0),
|
||||||
|
(143, 141, 140, 138),
|
||||||
|
(144, 142, 140, 137),
|
||||||
|
(145, 93, 0, 0),
|
||||||
|
(146, 144, 143, 141),
|
||||||
|
(147, 145, 143, 136),
|
||||||
|
(148, 121, 0, 0),
|
||||||
|
(149, 142, 140, 139),
|
||||||
|
(150, 97, 0, 0),
|
||||||
|
(151, 148, 0, 0),
|
||||||
|
(152, 150, 149, 146),
|
||||||
|
(153, 152, 0, 0),
|
||||||
|
(154, 153, 149, 145),
|
||||||
|
(155, 151, 150, 148),
|
||||||
|
(156, 153, 151, 147),
|
||||||
|
(157, 155, 152, 151),
|
||||||
|
(158, 153, 152, 150),
|
||||||
|
(159, 128, 0, 0),
|
||||||
|
(160, 158, 157, 155),
|
||||||
|
(161, 143, 0, 0),
|
||||||
|
(162, 158, 155, 154),
|
||||||
|
(163, 160, 157, 156),
|
||||||
|
(164, 159, 158, 152),
|
||||||
|
(165, 162, 157, 156),
|
||||||
|
(166, 164, 163, 156),
|
||||||
|
(167, 161, 0, 0),
|
||||||
|
(168, 162, 159, 152),
|
||||||
|
(169, 135, 0, 0),
|
||||||
|
(170, 147, 0, 0),
|
||||||
|
(171, 169, 166, 165),
|
||||||
|
(172, 165, 0, 0),
|
||||||
|
(173, 171, 168, 165),
|
||||||
|
(174, 161, 0, 0),
|
||||||
|
(175, 169, 0, 0),
|
||||||
|
(176, 167, 165, 164),
|
||||||
|
(177, 169, 0, 0),
|
||||||
|
(178, 91, 0, 0),
|
||||||
|
(179, 178, 177, 175),
|
||||||
|
(180, 173, 170, 168),
|
||||||
|
(181, 180, 175, 174),
|
||||||
|
(182, 181, 176, 174),
|
||||||
|
(183, 127, 0, 0),
|
||||||
|
(184, 177, 176, 175),
|
||||||
|
(185, 161, 0, 0),
|
||||||
|
(186, 180, 178, 177),
|
||||||
|
(187, 182, 181, 180),
|
||||||
|
(188, 186, 183, 182),
|
||||||
|
(189, 187, 184, 183),
|
||||||
|
(190, 188, 184, 177),
|
||||||
|
(191, 182, 0, 0),
|
||||||
|
(192, 190, 178, 177),
|
||||||
|
(193, 178, 0, 0),
|
||||||
|
(194, 107, 0, 0),
|
||||||
|
(195, 193, 192, 187),
|
||||||
|
(196, 194, 187, 185),
|
||||||
|
(197, 195, 193, 188),
|
||||||
|
(198, 133, 0, 0),
|
||||||
|
(199, 165, 0, 0),
|
||||||
|
(200, 198, 197, 195),
|
||||||
|
(201, 187, 0, 0),
|
||||||
|
(202, 147, 0, 0),
|
||||||
|
(203, 202, 196, 195),
|
||||||
|
(204, 201, 200, 194),
|
||||||
|
(205, 203, 200, 196),
|
||||||
|
(206, 201, 197, 196),
|
||||||
|
(207, 164, 0, 0),
|
||||||
|
(208, 207, 205, 199),
|
||||||
|
(209, 203, 0, 0),
|
||||||
|
(210, 207, 206, 198),
|
||||||
|
(211, 203, 201, 200),
|
||||||
|
(212, 107, 0, 0),
|
||||||
|
(213, 211, 208, 207),
|
||||||
|
(214, 213, 211, 209),
|
||||||
|
(215, 192, 0, 0),
|
||||||
|
(216, 215, 213, 209),
|
||||||
|
(217, 172, 0, 0),
|
||||||
|
(218, 207, 0, 0),
|
||||||
|
(219, 218, 215, 211),
|
||||||
|
(220, 211, 210, 208),
|
||||||
|
(221, 219, 215, 213),
|
||||||
|
(222, 220, 217, 214),
|
||||||
|
(223, 190, 0, 0),
|
||||||
|
(224, 222, 217, 212),
|
||||||
|
(225, 193, 0, 0),
|
||||||
|
(226, 223, 219, 216),
|
||||||
|
(227, 223, 218, 217),
|
||||||
|
(228, 226, 217, 216),
|
||||||
|
(229, 228, 225, 219),
|
||||||
|
(230, 224, 223, 222),
|
||||||
|
(231, 205, 0, 0),
|
||||||
|
(232, 228, 223, 221),
|
||||||
|
(233, 159, 0, 0),
|
||||||
|
(234, 203, 0, 0),
|
||||||
|
(235, 234, 229, 226),
|
||||||
|
(236, 231, 0, 0),
|
||||||
|
(237, 236, 233, 230),
|
||||||
|
(238, 237, 236, 233),
|
||||||
|
(239, 203, 0, 0),
|
||||||
|
(240, 237, 235, 232),
|
||||||
|
(241, 171, 0, 0),
|
||||||
|
(242, 241, 236, 231),
|
||||||
|
(243, 242, 238, 235),
|
||||||
|
(244, 243, 240, 235),
|
||||||
|
(245, 244, 241, 239),
|
||||||
|
(246, 245, 244, 235),
|
||||||
|
(247, 165, 0, 0),
|
||||||
|
(248, 238, 234, 233),
|
||||||
|
(249, 163, 0, 0),
|
||||||
|
(250, 147, 0, 0),
|
||||||
|
(251, 249, 247, 244),
|
||||||
|
(252, 185, 0, 0),
|
||||||
|
(253, 252, 247, 246),
|
||||||
|
(254, 253, 252, 247),
|
||||||
|
(255, 203, 0, 0),
|
||||||
|
(256, 254, 251, 246),
|
||||||
|
(257, 245, 0, 0),
|
||||||
|
(258, 175, 0, 0),
|
||||||
|
(259, 257, 253, 249),
|
||||||
|
(260, 253, 252, 250),
|
||||||
|
(261, 257, 255, 254),
|
||||||
|
(262, 258, 254, 253),
|
||||||
|
(263, 170, 0, 0),
|
||||||
|
(264, 263, 255, 254),
|
||||||
|
(265, 223, 0, 0),
|
||||||
|
(266, 219, 0, 0),
|
||||||
|
(267, 264, 261, 259),
|
||||||
|
(268, 243, 0, 0),
|
||||||
|
(269, 268, 263, 262),
|
||||||
|
(270, 217, 0, 0),
|
||||||
|
(271, 213, 0, 0),
|
||||||
|
(272, 270, 266, 263),
|
||||||
|
(273, 250, 0, 0),
|
||||||
|
(274, 207, 0, 0),
|
||||||
|
(275, 266, 265, 264),
|
||||||
|
(276, 275, 273, 270),
|
||||||
|
(277, 274, 271, 265),
|
||||||
|
(278, 273, 0, 0),
|
||||||
|
(279, 274, 0, 0),
|
||||||
|
(280, 278, 275, 271),
|
||||||
|
(281, 188, 0, 0),
|
||||||
|
(282, 247, 0, 0),
|
||||||
|
(283, 278, 276, 271),
|
||||||
|
(284, 165, 0, 0),
|
||||||
|
(285, 280, 278, 275),
|
||||||
|
(286, 217, 0, 0),
|
||||||
|
(287, 216, 0, 0),
|
||||||
|
(288, 287, 278, 277),
|
||||||
|
(289, 268, 0, 0),
|
||||||
|
(290, 288, 287, 285),
|
||||||
|
(291, 286, 280, 279),
|
||||||
|
(292, 195, 0, 0),
|
||||||
|
(293, 292, 287, 282),
|
||||||
|
(294, 233, 0, 0),
|
||||||
|
(295, 247, 0, 0),
|
||||||
|
(296, 292, 287, 285),
|
||||||
|
(297, 292, 0, 0),
|
||||||
|
(298, 294, 290, 287),
|
||||||
|
(299, 295, 293, 288),
|
||||||
|
(300, 293, 0, 0),
|
||||||
|
(301, 299, 296, 292),
|
||||||
|
(302, 261, 0, 0),
|
||||||
|
(303, 297, 291, 290),
|
||||||
|
(304, 303, 302, 293),
|
||||||
|
(305, 203, 0, 0),
|
||||||
|
(306, 305, 303, 299),
|
||||||
|
(307, 305, 303, 299),
|
||||||
|
(308, 306, 299, 293),
|
||||||
|
(309, 307, 302, 299),
|
||||||
|
(310, 309, 305, 302),
|
||||||
|
(311, 308, 306, 304),
|
||||||
|
(312, 307, 302, 301),
|
||||||
|
(313, 234, 0, 0),
|
||||||
|
(314, 299, 0, 0),
|
||||||
|
(315, 314, 306, 305),
|
||||||
|
(316, 181, 0, 0),
|
||||||
|
(317, 315, 313, 310),
|
||||||
|
(318, 313, 312, 310),
|
||||||
|
(319, 283, 0, 0),
|
||||||
|
(320, 319, 317, 316),
|
||||||
|
(321, 290, 0, 0),
|
||||||
|
(322, 255, 0, 0),
|
||||||
|
(323, 322, 320, 313),
|
||||||
|
(324, 321, 320, 318),
|
||||||
|
(325, 323, 320, 315),
|
||||||
|
(326, 325, 323, 316),
|
||||||
|
(327, 293, 0, 0),
|
||||||
|
(328, 323, 321, 319),
|
||||||
|
(329, 279, 0, 0),
|
||||||
|
(330, 328, 323, 322),
|
||||||
|
(331, 329, 325, 321),
|
||||||
|
(332, 209, 0, 0),
|
||||||
|
(333, 331, 0, 0),
|
||||||
|
(334, 333, 330, 327),
|
||||||
|
(335, 333, 328, 325),
|
||||||
|
(336, 335, 332, 329),
|
||||||
|
(337, 282, 0, 0),
|
||||||
|
(338, 336, 335, 332),
|
||||||
|
(339, 332, 329, 323),
|
||||||
|
(340, 337, 336, 329),
|
||||||
|
(341, 336, 330, 327),
|
||||||
|
(342, 217, 0, 0),
|
||||||
|
(343, 268, 0, 0),
|
||||||
|
(344, 338, 334, 333),
|
||||||
|
(345, 323, 0, 0),
|
||||||
|
(346, 344, 339, 335),
|
||||||
|
(347, 344, 337, 336),
|
||||||
|
(348, 344, 341, 340),
|
||||||
|
(349, 347, 344, 343),
|
||||||
|
(350, 297, 0, 0),
|
||||||
|
(351, 317, 0, 0),
|
||||||
|
(352, 346, 341, 339),
|
||||||
|
(353, 284, 0, 0),
|
||||||
|
(354, 349, 341, 340),
|
||||||
|
(355, 354, 350, 349),
|
||||||
|
(356, 349, 347, 346),
|
||||||
|
(357, 355, 347, 346),
|
||||||
|
(358, 351, 350, 344),
|
||||||
|
(359, 291, 0, 0),
|
||||||
|
(360, 359, 335, 334),
|
||||||
|
(361, 360, 357, 354),
|
||||||
|
(362, 299, 0, 0),
|
||||||
|
(363, 362, 356, 355),
|
||||||
|
(364, 297, 0, 0),
|
||||||
|
(365, 360, 359, 356),
|
||||||
|
(366, 337, 0, 0),
|
||||||
|
(367, 346, 0, 0),
|
||||||
|
(368, 361, 359, 351),
|
||||||
|
(369, 278, 0, 0),
|
||||||
|
(370, 231, 0, 0),
|
||||||
|
(371, 369, 368, 363),
|
||||||
|
(372, 369, 365, 357),
|
||||||
|
(373, 371, 366, 365),
|
||||||
|
(374, 369, 368, 366),
|
||||||
|
(375, 359, 0, 0),
|
||||||
|
(376, 371, 369, 368),
|
||||||
|
(377, 336, 0, 0),
|
||||||
|
(378, 335, 0, 0),
|
||||||
|
(379, 375, 370, 369),
|
||||||
|
(380, 333, 0, 0),
|
||||||
|
(381, 380, 379, 376),
|
||||||
|
(382, 301, 0, 0),
|
||||||
|
(383, 293, 0, 0),
|
||||||
|
(384, 378, 369, 368),
|
||||||
|
(385, 379, 0, 0),
|
||||||
|
(386, 303, 0, 0),
|
||||||
|
(387, 385, 379, 378),
|
||||||
|
(388, 387, 385, 374),
|
||||||
|
(389, 384, 380, 379),
|
||||||
|
(390, 301, 0, 0),
|
||||||
|
(391, 363, 0, 0),
|
||||||
|
(392, 386, 382, 379),
|
||||||
|
(393, 386, 0, 0),
|
||||||
|
(394, 259, 0, 0),
|
||||||
|
(395, 390, 389, 384),
|
||||||
|
(396, 371, 0, 0),
|
||||||
|
(397, 392, 387, 385),
|
||||||
|
(398, 393, 392, 384),
|
||||||
|
(399, 313, 0, 0),
|
||||||
|
(400, 398, 397, 395),
|
||||||
|
(401, 249, 0, 0),
|
||||||
|
(402, 399, 398, 393),
|
||||||
|
(403, 398, 395, 394),
|
||||||
|
(404, 215, 0, 0),
|
||||||
|
(405, 398, 397, 388),
|
||||||
|
(406, 249, 0, 0),
|
||||||
|
(407, 336, 0, 0),
|
||||||
|
(408, 407, 403, 401),
|
||||||
|
(409, 322, 0, 0),
|
||||||
|
(410, 407, 406, 400),
|
||||||
|
(411, 408, 401, 399),
|
||||||
|
(412, 265, 0, 0),
|
||||||
|
(413, 407, 406, 403),
|
||||||
|
(414, 405, 401, 398),
|
||||||
|
(415, 313, 0, 0),
|
||||||
|
(416, 414, 411, 407),
|
||||||
|
(417, 310, 0, 0),
|
||||||
|
(418, 417, 415, 403),
|
||||||
|
(419, 415, 414, 404),
|
||||||
|
(420, 412, 410, 407),
|
||||||
|
(421, 419, 417, 416),
|
||||||
|
(422, 273, 0, 0),
|
||||||
|
(423, 398, 0, 0),
|
||||||
|
(424, 422, 417, 415),
|
||||||
|
(425, 413, 0, 0),
|
||||||
|
(426, 415, 414, 412),
|
||||||
|
(427, 422, 421, 416),
|
||||||
|
(428, 323, 0, 0),
|
||||||
|
(429, 422, 421, 419),
|
||||||
|
(430, 419, 417, 415),
|
||||||
|
(431, 311, 0, 0),
|
||||||
|
(432, 429, 428, 419),
|
||||||
|
(433, 400, 0, 0),
|
||||||
|
(434, 429, 423, 422),
|
||||||
|
(435, 430, 426, 423),
|
||||||
|
(436, 271, 0, 0),
|
||||||
|
(437, 436, 435, 431),
|
||||||
|
(438, 373, 0, 0),
|
||||||
|
(439, 390, 0, 0),
|
||||||
|
(440, 439, 437, 436),
|
||||||
|
(441, 410, 0, 0),
|
||||||
|
(442, 440, 437, 435),
|
||||||
|
(443, 442, 437, 433),
|
||||||
|
(444, 435, 432, 431),
|
||||||
|
(445, 441, 439, 438),
|
||||||
|
(446, 341, 0, 0),
|
||||||
|
(447, 374, 0, 0),
|
||||||
|
(448, 444, 442, 437),
|
||||||
|
(449, 315, 0, 0),
|
||||||
|
(450, 371, 0, 0),
|
||||||
|
(451, 450, 441, 435),
|
||||||
|
(452, 448, 447, 446),
|
||||||
|
(453, 449, 447, 438),
|
||||||
|
(454, 449, 445, 444),
|
||||||
|
(455, 417, 0, 0),
|
||||||
|
(456, 454, 445, 433),
|
||||||
|
(457, 441, 0, 0),
|
||||||
|
(458, 255, 0, 0),
|
||||||
|
(459, 457, 454, 447),
|
||||||
|
(460, 399, 0, 0),
|
||||||
|
(461, 460, 455, 454),
|
||||||
|
(462, 389, 0, 0),
|
||||||
|
(463, 370, 0, 0),
|
||||||
|
(464, 460, 455, 441),
|
||||||
|
(465, 406, 0, 0),
|
||||||
|
(466, 460, 455, 452),
|
||||||
|
(467, 466, 461, 456),
|
||||||
|
(468, 464, 459, 453),
|
||||||
|
(469, 467, 464, 460),
|
||||||
|
(470, 321, 0, 0),
|
||||||
|
(471, 470, 0, 0),
|
||||||
|
(472, 470, 469, 461),
|
||||||
|
(473, 470, 467, 465),
|
||||||
|
(474, 283, 0, 0),
|
||||||
|
(475, 471, 467, 466),
|
||||||
|
(476, 461, 0, 0),
|
||||||
|
(477, 470, 462, 461),
|
||||||
|
(478, 357, 0, 0),
|
||||||
|
(479, 375, 0, 0),
|
||||||
|
(480, 473, 467, 464),
|
||||||
|
(481, 343, 0, 0),
|
||||||
|
(482, 477, 476, 473),
|
||||||
|
(483, 479, 477, 474),
|
||||||
|
(484, 379, 0, 0),
|
||||||
|
(485, 479, 469, 468),
|
||||||
|
(486, 481, 478, 472),
|
||||||
|
(487, 393, 0, 0),
|
||||||
|
(488, 487, 485, 484),
|
||||||
|
(489, 406, 0, 0),
|
||||||
|
(490, 271, 0, 0),
|
||||||
|
(491, 488, 485, 480),
|
||||||
|
(492, 491, 485, 484),
|
||||||
|
(493, 490, 488, 483),
|
||||||
|
(494, 357, 0, 0),
|
||||||
|
(495, 419, 0, 0),
|
||||||
|
(496, 494, 491, 480),
|
||||||
|
(497, 419, 0, 0),
|
||||||
|
(498, 495, 489, 487),
|
||||||
|
(499, 494, 493, 488),
|
||||||
|
(500, 499, 494, 490),
|
||||||
|
(501, 499, 497, 496),
|
||||||
|
(502, 498, 497, 494),
|
||||||
|
(503, 500, 0, 0),
|
||||||
|
(504, 502, 490, 483),
|
||||||
|
(505, 349, 0, 0),
|
||||||
|
(506, 411, 0, 0),
|
||||||
|
(507, 504, 501, 494),
|
||||||
|
(508, 399, 0, 0),
|
||||||
|
(509, 506, 502, 501),
|
||||||
|
(510, 501, 500, 498),
|
||||||
|
(511, 501, 0, 0),
|
||||||
|
(512, 510, 507, 504),
|
||||||
|
(513, 428, 0, 0),
|
||||||
|
(514, 511, 509, 507),
|
||||||
|
(515, 511, 508, 501),
|
||||||
|
(516, 514, 511, 509),
|
||||||
|
(517, 515, 507, 505),
|
||||||
|
(518, 485, 0, 0),
|
||||||
|
(519, 440, 0, 0),
|
||||||
|
(520, 509, 507, 503),
|
||||||
|
(521, 489, 0, 0),
|
||||||
|
(522, 518, 509, 507),
|
||||||
|
(523, 521, 517, 510),
|
||||||
|
(524, 357, 0, 0),
|
||||||
|
(525, 524, 521, 519),
|
||||||
|
(526, 525, 521, 517),
|
||||||
|
(527, 480, 0, 0),
|
||||||
|
(528, 526, 522, 517),
|
||||||
|
(529, 487, 0, 0),
|
||||||
|
(530, 527, 523, 520),
|
||||||
|
(531, 529, 525, 519),
|
||||||
|
(532, 531, 0, 0),
|
||||||
|
(533, 531, 530, 529),
|
||||||
|
(534, 533, 529, 527),
|
||||||
|
(535, 533, 529, 527),
|
||||||
|
(536, 533, 531, 529),
|
||||||
|
(537, 443, 0, 0),
|
||||||
|
(538, 537, 536, 533),
|
||||||
|
(539, 535, 534, 529),
|
||||||
|
(540, 361, 0, 0),
|
||||||
|
(541, 537, 531, 528),
|
||||||
|
(542, 540, 539, 533),
|
||||||
|
(543, 527, 0, 0),
|
||||||
|
(544, 538, 535, 531),
|
||||||
|
(545, 423, 0, 0),
|
||||||
|
(546, 545, 544, 538),
|
||||||
|
(547, 543, 540, 534),
|
||||||
|
(548, 545, 543, 538),
|
||||||
|
(549, 546, 545, 533),
|
||||||
|
(550, 357, 0, 0),
|
||||||
|
(551, 416, 0, 0),
|
||||||
|
(552, 550, 547, 532),
|
||||||
|
(553, 514, 0, 0),
|
||||||
|
(554, 551, 546, 543),
|
||||||
|
(555, 551, 546, 545),
|
||||||
|
(556, 403, 0, 0),
|
||||||
|
(557, 552, 551, 550),
|
||||||
|
(558, 553, 549, 544),
|
||||||
|
(559, 525, 0, 0),
|
||||||
|
(560, 554, 551, 549),
|
||||||
|
(561, 490, 0, 0),
|
||||||
|
(562, 560, 558, 551),
|
||||||
|
(563, 561, 554, 549),
|
||||||
|
(564, 401, 0, 0),
|
||||||
|
(565, 564, 559, 554),
|
||||||
|
(566, 413, 0, 0),
|
||||||
|
(567, 424, 0, 0),
|
||||||
|
(568, 558, 557, 551),
|
||||||
|
(569, 492, 0, 0),
|
||||||
|
(570, 503, 0, 0),
|
||||||
|
(571, 569, 566, 561),
|
||||||
|
(572, 571, 564, 560),
|
||||||
|
(573, 569, 567, 563),
|
||||||
|
(574, 561, 0, 0),
|
||||||
|
(575, 429, 0, 0),
|
||||||
|
(576, 573, 572, 563),
|
||||||
|
(577, 552, 0, 0),
|
||||||
|
(578, 562, 556, 555),
|
||||||
|
(579, 572, 570, 567),
|
||||||
|
(580, 579, 576, 574),
|
||||||
|
(581, 575, 574, 568),
|
||||||
|
(582, 497, 0, 0),
|
||||||
|
(583, 453, 0, 0),
|
||||||
|
(584, 581, 571, 570),
|
||||||
|
(585, 464, 0, 0),
|
||||||
|
(586, 584, 581, 579),
|
||||||
|
(587, 586, 581, 576),
|
||||||
|
(588, 437, 0, 0),
|
||||||
|
(589, 586, 585, 579),
|
||||||
|
(590, 497, 0, 0),
|
||||||
|
(591, 587, 585, 582),
|
||||||
|
(592, 591, 573, 568),
|
||||||
|
(593, 507, 0, 0),
|
||||||
|
(594, 575, 0, 0),
|
||||||
|
(595, 594, 593, 586),
|
||||||
|
(596, 592, 591, 590),
|
||||||
|
(597, 588, 585, 583),
|
||||||
|
(598, 597, 592, 591),
|
||||||
|
(599, 569, 0, 0),
|
||||||
|
(600, 599, 590, 589),
|
||||||
|
(601, 400, 0, 0),
|
||||||
|
(602, 596, 594, 591),
|
||||||
|
(603, 600, 599, 597),
|
||||||
|
(604, 600, 598, 589),
|
||||||
|
(605, 600, 598, 595),
|
||||||
|
(606, 602, 599, 591),
|
||||||
|
(607, 502, 0, 0),
|
||||||
|
(608, 606, 602, 585),
|
||||||
|
(609, 578, 0, 0),
|
||||||
|
(610, 483, 0, 0),
|
||||||
|
(611, 609, 607, 601),
|
||||||
|
(612, 607, 602, 598),
|
||||||
|
(613, 609, 603, 594),
|
||||||
|
(614, 613, 612, 607),
|
||||||
|
(615, 404, 0, 0),
|
||||||
|
(616, 614, 602, 597),
|
||||||
|
(617, 417, 0, 0),
|
||||||
|
(618, 615, 604, 598),
|
||||||
|
(619, 614, 611, 610),
|
||||||
|
(620, 619, 618, 611),
|
||||||
|
(621, 616, 615, 609),
|
||||||
|
(622, 325, 0, 0),
|
||||||
|
(623, 555, 0, 0),
|
||||||
|
(624, 617, 615, 612),
|
||||||
|
(625, 492, 0, 0),
|
||||||
|
(626, 623, 621, 613),
|
||||||
|
(627, 622, 617, 613),
|
||||||
|
(628, 405, 0, 0),
|
||||||
|
(629, 627, 624, 623),
|
||||||
|
(630, 628, 626, 623),
|
||||||
|
(631, 324, 0, 0),
|
||||||
|
(632, 629, 619, 613),
|
||||||
|
(633, 532, 0, 0),
|
||||||
|
(634, 319, 0, 0),
|
||||||
|
(635, 631, 625, 621),
|
||||||
|
(636, 632, 628, 623),
|
||||||
|
(637, 636, 628, 623),
|
||||||
|
(638, 637, 633, 632),
|
||||||
|
(639, 623, 0, 0),
|
||||||
|
(640, 638, 637, 626),
|
||||||
|
(641, 630, 0, 0),
|
||||||
|
(642, 523, 0, 0),
|
||||||
|
(643, 641, 640, 632),
|
||||||
|
(644, 634, 633, 632),
|
||||||
|
(645, 641, 637, 634),
|
||||||
|
(646, 397, 0, 0),
|
||||||
|
(647, 642, 0, 0),
|
||||||
|
(648, 647, 626, 625),
|
||||||
|
(649, 612, 0, 0),
|
||||||
|
(650, 647, 0, 0),
|
||||||
|
(651, 646, 638, 637),
|
||||||
|
(652, 559, 0, 0),
|
||||||
|
(653, 646, 645, 643),
|
||||||
|
(654, 649, 643, 640),
|
||||||
|
(655, 567, 0, 0),
|
||||||
|
(656, 646, 638, 637),
|
||||||
|
(657, 619, 0, 0),
|
||||||
|
(658, 603, 0, 0),
|
||||||
|
(659, 657, 655, 644),
|
||||||
|
(660, 657, 656, 648),
|
||||||
|
(661, 657, 650, 649),
|
||||||
|
(662, 365, 0, 0),
|
||||||
|
(663, 406, 0, 0),
|
||||||
|
(664, 662, 660, 649),
|
||||||
|
(665, 632, 0, 0),
|
||||||
|
(666, 664, 659, 656),
|
||||||
|
(667, 664, 660, 649),
|
||||||
|
(668, 658, 656, 651),
|
||||||
|
(669, 667, 665, 664),
|
||||||
|
(670, 517, 0, 0),
|
||||||
|
(671, 656, 0, 0),
|
||||||
|
(672, 667, 666, 661),
|
||||||
|
(673, 645, 0, 0),
|
||||||
|
(674, 671, 665, 660),
|
||||||
|
(675, 674, 672, 669),
|
||||||
|
(676, 435, 0, 0),
|
||||||
|
(677, 674, 673, 669),
|
||||||
|
(678, 675, 673, 663),
|
||||||
|
(679, 613, 0, 0),
|
||||||
|
(680, 679, 650, 645),
|
||||||
|
(681, 678, 672, 670),
|
||||||
|
(682, 681, 679, 675),
|
||||||
|
(683, 682, 677, 672),
|
||||||
|
(684, 681, 671, 666),
|
||||||
|
(685, 684, 682, 681),
|
||||||
|
(686, 489, 0, 0),
|
||||||
|
(687, 674, 0, 0),
|
||||||
|
(688, 682, 674, 669),
|
||||||
|
(689, 675, 0, 0),
|
||||||
|
(690, 687, 683, 680),
|
||||||
|
(691, 689, 685, 678),
|
||||||
|
(692, 393, 0, 0),
|
||||||
|
(693, 691, 685, 678),
|
||||||
|
(694, 691, 681, 677),
|
||||||
|
(695, 483, 0, 0),
|
||||||
|
(696, 694, 686, 673),
|
||||||
|
(697, 430, 0, 0),
|
||||||
|
(698, 483, 0, 0),
|
||||||
|
(699, 698, 689, 684),
|
||||||
|
(700, 698, 695, 694),
|
||||||
|
(701, 699, 697, 685),
|
||||||
|
(702, 665, 0, 0),
|
||||||
|
(703, 702, 696, 691),
|
||||||
|
(704, 701, 699, 692),
|
||||||
|
(705, 686, 0, 0),
|
||||||
|
(706, 697, 695, 692),
|
||||||
|
(707, 702, 699, 692),
|
||||||
|
(708, 421, 0, 0),
|
||||||
|
(709, 708, 706, 705),
|
||||||
|
(710, 709, 696, 695),
|
||||||
|
(711, 619, 0, 0),
|
||||||
|
(712, 709, 708, 707),
|
||||||
|
(713, 672, 0, 0),
|
||||||
|
(714, 691, 0, 0),
|
||||||
|
(715, 714, 711, 708),
|
||||||
|
(716, 533, 0, 0),
|
||||||
|
(717, 716, 710, 701),
|
||||||
|
(718, 717, 716, 713),
|
||||||
|
(719, 569, 0, 0),
|
||||||
|
(720, 718, 712, 709),
|
||||||
|
(721, 712, 0, 0),
|
||||||
|
(722, 491, 0, 0),
|
||||||
|
(723, 717, 710, 707),
|
||||||
|
(724, 719, 716, 711),
|
||||||
|
(725, 720, 719, 716),
|
||||||
|
(726, 721, 0, 0),
|
||||||
|
(727, 547, 0, 0),
|
||||||
|
(728, 726, 725, 724),
|
||||||
|
(729, 671, 0, 0),
|
||||||
|
(730, 583, 0, 0),
|
||||||
|
(731, 729, 725, 723),
|
||||||
|
(732, 729, 728, 725),
|
||||||
|
(733, 731, 726, 725),
|
||||||
|
(734, 724, 721, 720),
|
||||||
|
(735, 691, 0, 0),
|
||||||
|
(736, 730, 728, 723),
|
||||||
|
(737, 732, 0, 0),
|
||||||
|
(738, 391, 0, 0),
|
||||||
|
(739, 731, 723, 721),
|
||||||
|
(740, 587, 0, 0),
|
||||||
|
(741, 738, 733, 732),
|
||||||
|
(742, 741, 738, 730),
|
||||||
|
(743, 653, 0, 0),
|
||||||
|
(744, 743, 733, 731),
|
||||||
|
(745, 487, 0, 0),
|
||||||
|
(746, 395, 0, 0),
|
||||||
|
(747, 743, 741, 737),
|
||||||
|
(748, 744, 743, 733),
|
||||||
|
(749, 748, 743, 742),
|
||||||
|
(750, 746, 741, 734),
|
||||||
|
(751, 733, 0, 0),
|
||||||
|
(752, 749, 732, 731),
|
||||||
|
(753, 595, 0, 0),
|
||||||
|
(754, 735, 0, 0),
|
||||||
|
(755, 754, 745, 743),
|
||||||
|
(756, 407, 0, 0),
|
||||||
|
(757, 756, 751, 750),
|
||||||
|
(758, 757, 746, 741),
|
||||||
|
(759, 661, 0, 0),
|
||||||
|
(760, 757, 747, 734),
|
||||||
|
(761, 758, 0, 0),
|
||||||
|
(762, 679, 0, 0),
|
||||||
|
(763, 754, 749, 747),
|
||||||
|
(764, 761, 759, 758),
|
||||||
|
(765, 760, 755, 754),
|
||||||
|
(766, 757, 747, 744),
|
||||||
|
(767, 599, 0, 0),
|
||||||
|
(768, 764, 751, 749),
|
||||||
|
(769, 649, 0, 0),
|
||||||
|
(770, 768, 765, 756),
|
||||||
|
(771, 765, 756, 754),
|
||||||
|
(772, 765, 0, 0),
|
||||||
|
(773, 767, 765, 763),
|
||||||
|
(774, 589, 0, 0),
|
||||||
|
(775, 408, 0, 0),
|
||||||
|
(776, 773, 764, 759),
|
||||||
|
(777, 748, 0, 0),
|
||||||
|
(778, 403, 0, 0),
|
||||||
|
(779, 776, 771, 769),
|
||||||
|
(780, 775, 772, 764),
|
||||||
|
(781, 779, 765, 764),
|
||||||
|
(782, 453, 0, 0),
|
||||||
|
(783, 715, 0, 0),
|
||||||
|
(784, 778, 775, 771),
|
||||||
|
(785, 693, 0, 0),
|
||||||
|
(786, 782, 780, 771)
|
||||||
|
);
|
||||||
|
end package;
|
Loading…
Reference in New Issue