├── vitis
└── src
│ ├── helloworld.c
│ ├── platform_config.h
│ ├── platform.h
│ ├── platform.c
│ └── lscript.ld
├── verilog
├── sources_1
│ ├── new
│ │ ├── binary_QKV.v
│ │ ├── layer_norm_1.v
│ │ ├── layer_norm_3.v
│ │ ├── layer_norm_2.v
│ │ ├── binary_intermediate_1.v
│ │ ├── encoder_hidden_state_1.v
│ │ ├── binary_intermediate_2.v
│ │ ├── binary_score.v
│ │ ├── binary_query.v
│ │ ├── output_2.v
│ │ ├── encoder_hidden_state_2.v
│ │ ├── attention.v
│ │ ├── encoder.v
│ │ ├── output_1.v
│ │ └── transformer.v
│ └── bd
│ │ └── design_1
│ │ ├── ui
│ │ └── bd_1f5defd0.ui
│ │ ├── design_1.bda
│ │ └── ip
│ │ └── design_1_transformer_0_0
│ │ └── design_1_transformer_0_0.xci
├── param_1
│ ├── output_2_rom.coe
│ ├── alpha_rom_1.coe
│ ├── alpha_rom_2.coe
│ ├── alpha_rom_3.coe
│ ├── beta_rom_1.coe
│ ├── beta_rom_2.coe
│ ├── beta_rom_3.coe
│ ├── qkv_w_rom.coe
│ ├── attention_intermediate_1.coe
│ ├── attention_intermediate_2.coe
│ ├── encoder_hidden_state_1.coe
│ └── encoder_hidden_state_2.coe
├── ip_repo
│ └── PS_PL_1.0
│ │ ├── drivers
│ │ └── PS_PL_v1_0
│ │ │ ├── data
│ │ │ ├── PS_PL.tcl
│ │ │ └── PS_PL.mdd
│ │ │ └── src
│ │ │ ├── PS_PL.c
│ │ │ ├── Makefile
│ │ │ ├── PS_PL_selftest.c
│ │ │ └── PS_PL.h
│ │ ├── example_designs
│ │ ├── debug_hw_design
│ │ │ ├── PS_PL_v1_0_hw_test.tcl
│ │ │ └── design.tcl
│ │ └── bfm_design
│ │ │ ├── design.tcl
│ │ │ └── PS_PL_v1_0_tb.sv
│ │ ├── xgui
│ │ └── PS_PL_v1_0.tcl
│ │ ├── hdl
│ │ ├── PS_PL_v1_0.v
│ │ └── PS_PL_v1_0_S00_AXI.v
│ │ └── bd
│ │ └── bd.tcl
└── sim_1
│ └── new
│ ├── tb_QKV.v
│ ├── tb_attention.v
│ ├── tb_transformer.v
│ └── tb_encoder.v
└── README.md
/vitis/src/helloworld.c:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShixiangLi/Transformer_FPGA/HEAD/vitis/src/helloworld.c
--------------------------------------------------------------------------------
/verilog/sources_1/new/binary_QKV.v:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShixiangLi/Transformer_FPGA/HEAD/verilog/sources_1/new/binary_QKV.v
--------------------------------------------------------------------------------
/verilog/param_1/output_2_rom.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
4 |
--------------------------------------------------------------------------------
/vitis/src/platform_config.h:
--------------------------------------------------------------------------------
1 | #ifndef __PLATFORM_CONFIG_H_
2 | #define __PLATFORM_CONFIG_H_
3 |
4 | #define STDOUT_IS_PSU_UART
5 | #define UART_DEVICE_ID 0
6 | #endif
7 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/drivers/PS_PL_v1_0/data/PS_PL.tcl:
--------------------------------------------------------------------------------
1 |
2 |
3 | proc generate {drv_handle} {
4 | xdefine_include_file $drv_handle "xparameters.h" "PS_PL" "NUM_INSTANCES" "DEVICE_ID" "C_S00_AXI_BASEADDR" "C_S00_AXI_HIGHADDR"
5 | }
6 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/drivers/PS_PL_v1_0/src/PS_PL.c:
--------------------------------------------------------------------------------
1 |
2 |
3 | /***************************** Include Files *******************************/
4 | #include "PS_PL.h"
5 |
6 | /************************** Function Definitions ***************************/
7 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/drivers/PS_PL_v1_0/data/PS_PL.mdd:
--------------------------------------------------------------------------------
1 |
2 |
3 | OPTION psf_version = 2.1;
4 |
5 | BEGIN DRIVER PS_PL
6 | OPTION supported_peripherals = (PS_PL);
7 | OPTION copyfiles = all;
8 | OPTION VERSION = 1.0;
9 | OPTION NAME = PS_PL;
10 | END DRIVER
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Transformer_FPGA
2 | Transformer FPGA Accelerator
3 |
4 | ## Introduction
5 | 基于Xilinx Vivado实现一个二值化Transformer加速器
6 | 目前只是纯实现,卷积操作实现位宽并行化,整体网络计算未实现
7 |
8 | ## Network Architecture
9 | 普通的Transformer去掉Decoder,小BERT
10 |
11 | ## Document Structure
12 |
13 | |---verilog
14 |
15 | |-ip_repo(AXI-LITE)
16 |
17 | |-param_1(coe权重文件)
18 |
19 | |-sim_1
20 |
21 | |-new(仿真文件)
22 |
23 | |-source_1
24 |
25 | |-new(各模块实现文件)
26 |
--------------------------------------------------------------------------------
/verilog/param_1/alpha_rom_1.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
4 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
5 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
6 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
7 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
8 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
9 |
--------------------------------------------------------------------------------
/verilog/param_1/alpha_rom_2.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
4 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
5 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
6 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
7 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
8 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
9 |
--------------------------------------------------------------------------------
/verilog/param_1/alpha_rom_3.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
4 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
5 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
6 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
7 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
8 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
9 |
--------------------------------------------------------------------------------
/verilog/param_1/beta_rom_1.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | 000000000000000000000000000000000000000000000000000000000000,
4 | 000000000000000000000000000000000000000000000000000000000000,
5 | 000000000000000000000000000000000000000000000000000000000000,
6 | 000000000000000000000000000000000000000000000000000000000000,
7 | 000000000000000000000000000000000000000000000000000000000000,
8 | 000000000000000000000000000000000000000000000000000000000000;
9 |
--------------------------------------------------------------------------------
/verilog/param_1/beta_rom_2.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | 000000000000000000000000000000000000000000000000000000000000,
4 | 000000000000000000000000000000000000000000000000000000000000,
5 | 000000000000000000000000000000000000000000000000000000000000,
6 | 000000000000000000000000000000000000000000000000000000000000,
7 | 000000000000000000000000000000000000000000000000000000000000,
8 | 000000000000000000000000000000000000000000000000000000000000;
9 |
--------------------------------------------------------------------------------
/verilog/param_1/beta_rom_3.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | 000000000000000000000000000000000000000000000000000000000000,
4 | 000000000000000000000000000000000000000000000000000000000000,
5 | 000000000000000000000000000000000000000000000000000000000000,
6 | 000000000000000000000000000000000000000000000000000000000000,
7 | 000000000000000000000000000000000000000000000000000000000000,
8 | 000000000000000000000000000000000000000000000000000000000000;
9 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/drivers/PS_PL_v1_0/src/Makefile:
--------------------------------------------------------------------------------
1 | COMPILER=
2 | ARCHIVER=
3 | CP=cp
4 | COMPILER_FLAGS=
5 | EXTRA_COMPILER_FLAGS=
6 | LIB=libxil.a
7 |
8 | RELEASEDIR=../../../lib
9 | INCLUDEDIR=../../../include
10 | INCLUDES=-I./. -I${INCLUDEDIR}
11 |
12 | INCLUDEFILES=$(wildcard *.h)
13 | LIBSOURCES=$(wildcard *.c)
14 | OUTS = $(wildcard *.o)
15 |
16 | libs:
17 | echo "Compiling PS_PL..."
18 | $(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES)
19 | $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OUTS}
20 | make clean
21 |
22 | include:
23 | ${CP} $(INCLUDEFILES) $(INCLUDEDIR)
24 |
25 | clean:
26 | rm -rf ${OUTS}
27 |
--------------------------------------------------------------------------------
/verilog/param_1/qkv_w_rom.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
4 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
5 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
6 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
7 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
8 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
9 |
--------------------------------------------------------------------------------
/verilog/sources_1/bd/design_1/ui/bd_1f5defd0.ui:
--------------------------------------------------------------------------------
1 | {
2 | "ActiveEmotionalView":"Default View",
3 | "Default View_ScaleFactor":"0.927273",
4 | "Default View_TopLeft":"0,-33",
5 | "ExpandedHierarchyInLayout":"",
6 | "guistr":"# # String gsaved with Nlview 7.0r6 2020-01-29 bk=1.5227 VDI=41 GEI=36 GUI=JA:10.0 non-TLS
7 | # -string -flagsOSRD
8 | preplace inst zynq_ultra_ps_e_0 -pg 1 -lvl 1 -x 330 -y 300 -defaultsOSRD
9 | preplace inst transformer_0 -pg 1 -lvl 2 -x 820 -y 90 -defaultsOSRD
10 | preplace inst ps8_0_axi_periph -pg 1 -lvl 2 -x 820 -y 340 -defaultsOSRD
11 | preplace inst rst_ps8_0_96M -pg 1 -lvl 1 -x 330 -y 100 -defaultsOSRD
12 | preplace inst PS_PL_0 -pg 1 -lvl 3 -x 1150 -y 180 -defaultsOSRD
13 | preplace netloc zynq_ultra_ps_e_0_pl_clk0 1 0 3 20 200 640 200 N
14 | preplace netloc zynq_ultra_ps_e_0_pl_resetn0 1 0 2 30 210 630
15 | preplace netloc rst_ps8_0_96M_peripheral_aresetn 1 1 2 650 220 N
16 | preplace netloc PS_PL_0_raw_data 1 1 3 660 180 980J 280 1300
17 | preplace netloc PS_PL_0_raw_data_valid 1 1 3 670 190 970J 290 1290
18 | preplace netloc transformer_0_data_out 1 2 1 1010 80n
19 | preplace netloc transformer_0_data_out_valid 1 2 1 1000 100n
20 | preplace netloc zynq_ultra_ps_e_0_M_AXI_HPM0_LPD 1 1 1 N 280
21 | preplace netloc ps8_0_axi_periph_M00_AXI 1 2 1 990 140n
22 | levelinfo -pg 1 0 330 820 1150 1320
23 | pagesize -pg 1 -db -bbox -sgen 0 0 1320 460
24 | "
25 | }
26 | {
27 | "da_axi4_cnt":"1",
28 | "da_clkrst_cnt":"1"
29 | }
30 |
--------------------------------------------------------------------------------
/verilog/sim_1/new/tb_QKV.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/09 11:25:03
7 | // Design Name:
8 | // Module Name: tb_QKV
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module tb_QKV;
24 |
25 | reg clk;
26 | reg rst_n;
27 |
28 | reg [16-1:0] data_in;
29 | reg data_in_valid;
30 | integer file,i;
31 |
32 | wire [2-1:0] block_sel;
33 | assign block_sel = 0;
34 |
35 | initial begin
36 | clk = 1'b0;
37 | forever begin
38 | #5 clk = ~clk;
39 | end
40 | end
41 |
42 | initial begin
43 | rst_n = 0;
44 | data_in_valid = 0;
45 | #100;
46 | rst_n = 1;
47 | #100;
48 | file = $fopen("test_data.txt", "rb");
49 | if (file==0) begin
50 | $display("[-]error");
51 | $stop;
52 | end
53 | for (i=0;i<30;i=i+1) begin
54 | @(posedge clk);
55 | $fscanf(file, "%b", data_in);
56 | data_in_valid <= 1;
57 | end
58 |
59 | data_in_valid <= 0;
60 | $fclose(file);
61 | end
62 |
63 | binary_QKV binary_QKV(
64 | .clk(clk),
65 | .rst_n(rst_n),
66 | .block_sel(block_sel),
67 |
68 | .data_in(data_in),
69 | .data_in_valid(data_in_valid)
70 | );
71 |
72 | endmodule
73 |
--------------------------------------------------------------------------------
/verilog/sim_1/new/tb_attention.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/10 17:01:30
7 | // Design Name:
8 | // Module Name: tb_attention
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module tb_attention;
24 |
25 | reg clk;
26 | reg rst_n;
27 |
28 | reg [16-1:0] data_in;
29 | reg data_in_valid;
30 | integer file,i;
31 |
32 | wire [3-1:0] block_sel;
33 | assign block_sel = 'd0;
34 |
35 | initial begin
36 | clk = 1'b0;
37 | forever begin
38 | #5 clk = ~clk;
39 | end
40 | end
41 |
42 | initial begin
43 | rst_n = 0;
44 | data_in_valid = 0;
45 | #100;
46 | rst_n = 1;
47 | #100;
48 | file = $fopen("test_data.txt", "rb");
49 | if (file==0) begin
50 | $display("[-]error");
51 | $stop;
52 | end
53 | for (i=0;i<30;i=i+1) begin
54 | @(posedge clk);
55 | $fscanf(file, "%b", data_in);
56 | data_in_valid <= 1;
57 | end
58 |
59 | data_in_valid <= 0;
60 | $fclose(file);
61 | end
62 |
63 | attention attention(
64 | .clk (clk),
65 | .rst_n (rst_n),
66 |
67 | .data_in (data_in),
68 | .data_in_valid (data_in_valid),
69 | .block_sel (block_sel)
70 | );
71 |
72 | endmodule
73 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/example_designs/debug_hw_design/PS_PL_v1_0_hw_test.tcl:
--------------------------------------------------------------------------------
1 | # Runtime Tcl commands to interact with - PS_PL_v1_0
2 |
3 | # Sourcing design address info tcl
4 | set bd_path [get_property DIRECTORY [current_project]]/[current_project].srcs/[current_fileset]/bd
5 | source ${bd_path}/PS_PL_v1_0_include.tcl
6 |
7 | # jtag axi master interface hardware name, change as per your design.
8 | set jtag_axi_master hw_axi_1
9 | set ec 0
10 |
11 | # hw test script
12 | # Delete all previous axis transactions
13 | if { [llength [get_hw_axi_txns -quiet]] } {
14 | delete_hw_axi_txn [get_hw_axi_txns -quiet]
15 | }
16 |
17 |
18 | # Test all lite slaves.
19 | set wdata_1 abcd1234
20 |
21 | # Test: S00_AXI
22 | # Create a write transaction at s00_axi_addr address
23 | create_hw_axi_txn w_s00_axi_addr [get_hw_axis $jtag_axi_master] -type write -address $s00_axi_addr -data $wdata_1
24 | # Create a read transaction at s00_axi_addr address
25 | create_hw_axi_txn r_s00_axi_addr [get_hw_axis $jtag_axi_master] -type read -address $s00_axi_addr
26 | # Initiate transactions
27 | run_hw_axi r_s00_axi_addr
28 | run_hw_axi w_s00_axi_addr
29 | run_hw_axi r_s00_axi_addr
30 | set rdata_tmp [get_property DATA [get_hw_axi_txn r_s00_axi_addr]]
31 | # Compare read data
32 | if { $rdata_tmp == $wdata_1 } {
33 | puts "Data comparison test pass for - S00_AXI"
34 | } else {
35 | puts "Data comparison test fail for - S00_AXI, expected-$wdata_1 actual-$rdata_tmp"
36 | inc ec
37 | }
38 |
39 | # Check error flag
40 | if { $ec == 0 } {
41 | puts "PTGEN_TEST: PASSED!"
42 | } else {
43 | puts "PTGEN_TEST: FAILED!"
44 | }
45 |
46 |
--------------------------------------------------------------------------------
/verilog/param_1/attention_intermediate_1.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
4 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
5 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
6 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
7 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
8 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
9 |
--------------------------------------------------------------------------------
/verilog/param_1/attention_intermediate_2.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
4 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
5 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
6 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
7 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
8 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
9 |
--------------------------------------------------------------------------------
/verilog/sim_1/new/tb_transformer.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/13 15:23:43
7 | // Design Name:
8 | // Module Name: tb_transformer
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module tb_transformer;
24 |
25 | reg clk;
26 | reg rst_n;
27 |
28 | reg [16-1:0] data_in;
29 | reg data_in_valid;
30 | integer file,i;
31 |
32 | wire [3-1:0] block_sel;
33 | assign block_sel = 'd0;
34 |
35 | initial begin
36 | clk = 1'b0;
37 | forever begin
38 | #5 clk = ~clk;
39 | end
40 | end
41 |
42 | initial begin
43 | rst_n = 0;
44 | data_in_valid = 0;
45 | #100;
46 | rst_n = 1;
47 | #100;
48 | file = $fopen("test_data.txt", "rb");
49 | if (file==0) begin
50 | $display("[-]error");
51 | $stop;
52 | end
53 | for (i=0;i<30;i=i+1) begin
54 | @(posedge clk);
55 | $fscanf(file, "%b", data_in);
56 | data_in_valid <= 1;
57 | end
58 |
59 | data_in_valid <= 0;
60 | $fclose(file);
61 | end
62 |
63 | wire [16-1:0] data_out;
64 | wire data_out_valid;
65 | wire done;
66 |
67 | transformer transformer(
68 | .clk (clk),
69 | .rst_n (rst_n),
70 |
71 | .data_in (data_in),
72 | .data_in_valid (data_in_valid),
73 |
74 | .data_out (data_out),
75 | .data_out_valid (data_out_valid)
76 | );
77 | endmodule
78 |
--------------------------------------------------------------------------------
/verilog/sim_1/new/tb_encoder.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/12 22:31:35
7 | // Design Name:
8 | // Module Name: tb_encoder
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module tb_encoder;
24 |
25 | reg clk;
26 | reg rst_n;
27 |
28 | reg [16-1:0] data_in;
29 | reg data_in_valid;
30 | integer file,i;
31 |
32 | wire [3-1:0] block_sel;
33 | assign block_sel = 'd0;
34 |
35 | initial begin
36 | clk = 1'b0;
37 | forever begin
38 | #5 clk = ~clk;
39 | end
40 | end
41 |
42 | initial begin
43 | rst_n = 0;
44 | data_in_valid = 0;
45 | #100;
46 | rst_n = 1;
47 | #100;
48 | file = $fopen("test_data.txt", "rb");
49 | if (file==0) begin
50 | $display("[-]error");
51 | $stop;
52 | end
53 | for (i=0;i<30;i=i+1) begin
54 | @(posedge clk);
55 | $fscanf(file, "%b", data_in);
56 | data_in_valid <= 1;
57 | end
58 |
59 | data_in_valid <= 0;
60 | $fclose(file);
61 | end
62 |
63 | wire [16-1:0] data_out;
64 | wire data_out_valid;
65 | wire done;
66 |
67 | encoder encoder(
68 | .clk (clk),
69 | .rst_n (rst_n),
70 |
71 | .data_in (data_in),
72 | .data_in_valid (data_in_valid),
73 | .block_sel (block_sel),
74 |
75 | .data_out (data_out),
76 | .data_out_valid (data_out_valid)
77 | );
78 |
79 | endmodule
80 |
--------------------------------------------------------------------------------
/vitis/src/platform.h:
--------------------------------------------------------------------------------
1 | /******************************************************************************
2 | *
3 | * Copyright (C) 2008 - 2014 Xilinx, Inc. All rights reserved.
4 | *
5 | * Permission is hereby granted, free of charge, to any person obtaining a copy
6 | * of this software and associated documentation files (the "Software"), to deal
7 | * in the Software without restriction, including without limitation the rights
8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | * copies of the Software, and to permit persons to whom the Software is
10 | * furnished to do so, subject to the following conditions:
11 | *
12 | * The above copyright notice and this permission notice shall be included in
13 | * all copies or substantial portions of the Software.
14 | *
15 | * Use of the Software is limited solely to applications:
16 | * (a) running on a Xilinx device, or
17 | * (b) that interact with a Xilinx device through a bus or interconnect.
18 | *
19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 | * XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
24 | * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 | * SOFTWARE.
26 | *
27 | * Except as contained in this notice, the name of the Xilinx shall not be used
28 | * in advertising or otherwise to promote the sale, use or other dealings in
29 | * this Software without prior written authorization from Xilinx.
30 | *
31 | ******************************************************************************/
32 |
33 | #ifndef __PLATFORM_H_
34 | #define __PLATFORM_H_
35 |
36 | #include "platform_config.h"
37 |
38 | void init_platform();
39 | void cleanup_platform();
40 |
41 | #endif
42 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/drivers/PS_PL_v1_0/src/PS_PL_selftest.c:
--------------------------------------------------------------------------------
1 |
2 | /***************************** Include Files *******************************/
3 | #include "PS_PL.h"
4 | #include "xparameters.h"
5 | #include "stdio.h"
6 | #include "xil_io.h"
7 |
8 | /************************** Constant Definitions ***************************/
9 | #define READ_WRITE_MUL_FACTOR 0x10
10 |
11 | /************************** Function Definitions ***************************/
12 | /**
13 | *
14 | * Run a self-test on the driver/device. Note this may be a destructive test if
15 | * resets of the device are performed.
16 | *
17 | * If the hardware system is not built correctly, this function may never
18 | * return to the caller.
19 | *
20 | * @param baseaddr_p is the base address of the PS_PLinstance to be worked on.
21 | *
22 | * @return
23 | *
24 | * - XST_SUCCESS if all self-test code passed
25 | * - XST_FAILURE if any self-test code failed
26 | *
27 | * @note Caching must be turned off for this function to work.
28 | * @note Self test may fail if data memory and device are not on the same bus.
29 | *
30 | */
31 | XStatus PS_PL_Reg_SelfTest(void * baseaddr_p)
32 | {
33 | u32 baseaddr;
34 | int write_loop_index;
35 | int read_loop_index;
36 | int Index;
37 |
38 | baseaddr = (u32) baseaddr_p;
39 |
40 | xil_printf("******************************\n\r");
41 | xil_printf("* User Peripheral Self Test\n\r");
42 | xil_printf("******************************\n\n\r");
43 |
44 | /*
45 | * Write to user logic slave module register(s) and read back
46 | */
47 | xil_printf("User logic slave module test...\n\r");
48 |
49 | for (write_loop_index = 0 ; write_loop_index < 4; write_loop_index++)
50 | PS_PL_mWriteReg (baseaddr, write_loop_index*4, (write_loop_index+1)*READ_WRITE_MUL_FACTOR);
51 | for (read_loop_index = 0 ; read_loop_index < 4; read_loop_index++)
52 | if ( PS_PL_mReadReg (baseaddr, read_loop_index*4) != (read_loop_index+1)*READ_WRITE_MUL_FACTOR){
53 | xil_printf ("Error reading register value at address %x\n", (int)baseaddr + read_loop_index*4);
54 | return XST_FAILURE;
55 | }
56 |
57 | xil_printf(" - slave register write/read passed\n\n\r");
58 |
59 | return XST_SUCCESS;
60 | }
61 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/drivers/PS_PL_v1_0/src/PS_PL.h:
--------------------------------------------------------------------------------
1 |
2 | #ifndef PS_PL_H
3 | #define PS_PL_H
4 |
5 |
6 | /****************** Include Files ********************/
7 | #include "xil_types.h"
8 | #include "xstatus.h"
9 |
10 | #define PS_PL_S00_AXI_SLV_REG0_OFFSET 0
11 | #define PS_PL_S00_AXI_SLV_REG1_OFFSET 4
12 | #define PS_PL_S00_AXI_SLV_REG2_OFFSET 8
13 | #define PS_PL_S00_AXI_SLV_REG3_OFFSET 12
14 |
15 |
16 | /**************************** Type Definitions *****************************/
17 | /**
18 | *
19 | * Write a value to a PS_PL register. A 32 bit write is performed.
20 | * If the component is implemented in a smaller width, only the least
21 | * significant data is written.
22 | *
23 | * @param BaseAddress is the base address of the PS_PLdevice.
24 | * @param RegOffset is the register offset from the base to write to.
25 | * @param Data is the data written to the register.
26 | *
27 | * @return None.
28 | *
29 | * @note
30 | * C-style signature:
31 | * void PS_PL_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data)
32 | *
33 | */
34 | #define PS_PL_mWriteReg(BaseAddress, RegOffset, Data) \
35 | Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data))
36 |
37 | /**
38 | *
39 | * Read a value from a PS_PL register. A 32 bit read is performed.
40 | * If the component is implemented in a smaller width, only the least
41 | * significant data is read from the register. The most significant data
42 | * will be read as 0.
43 | *
44 | * @param BaseAddress is the base address of the PS_PL device.
45 | * @param RegOffset is the register offset from the base to write to.
46 | *
47 | * @return Data is the data from the register.
48 | *
49 | * @note
50 | * C-style signature:
51 | * u32 PS_PL_mReadReg(u32 BaseAddress, unsigned RegOffset)
52 | *
53 | */
54 | #define PS_PL_mReadReg(BaseAddress, RegOffset) \
55 | Xil_In32((BaseAddress) + (RegOffset))
56 |
57 | /************************** Function Prototypes ****************************/
58 | /**
59 | *
60 | * Run a self-test on the driver/device. Note this may be a destructive test if
61 | * resets of the device are performed.
62 | *
63 | * If the hardware system is not built correctly, this function may never
64 | * return to the caller.
65 | *
66 | * @param baseaddr_p is the base address of the PS_PL instance to be worked on.
67 | *
68 | * @return
69 | *
70 | * - XST_SUCCESS if all self-test code passed
71 | * - XST_FAILURE if any self-test code failed
72 | *
73 | * @note Caching must be turned off for this function to work.
74 | * @note Self test may fail if data memory and device are not on the same bus.
75 | *
76 | */
77 | XStatus PS_PL_Reg_SelfTest(void * baseaddr_p);
78 |
79 | #endif // PS_PL_H
80 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/xgui/PS_PL_v1_0.tcl:
--------------------------------------------------------------------------------
1 | # Definitional proc to organize widgets for parameters.
2 | proc init_gui { IPINST } {
3 | ipgui::add_param $IPINST -name "Component_Name"
4 | #Adding Page
5 | set Page_0 [ipgui::add_page $IPINST -name "Page 0"]
6 | ipgui::add_param $IPINST -name "C_S00_AXI_DATA_WIDTH" -parent ${Page_0} -widget comboBox
7 | ipgui::add_param $IPINST -name "C_S00_AXI_ADDR_WIDTH" -parent ${Page_0}
8 | ipgui::add_param $IPINST -name "C_S00_AXI_BASEADDR" -parent ${Page_0}
9 | ipgui::add_param $IPINST -name "C_S00_AXI_HIGHADDR" -parent ${Page_0}
10 |
11 |
12 | }
13 |
14 | proc update_PARAM_VALUE.C_S00_AXI_DATA_WIDTH { PARAM_VALUE.C_S00_AXI_DATA_WIDTH } {
15 | # Procedure called to update C_S00_AXI_DATA_WIDTH when any of the dependent parameters in the arguments change
16 | }
17 |
18 | proc validate_PARAM_VALUE.C_S00_AXI_DATA_WIDTH { PARAM_VALUE.C_S00_AXI_DATA_WIDTH } {
19 | # Procedure called to validate C_S00_AXI_DATA_WIDTH
20 | return true
21 | }
22 |
23 | proc update_PARAM_VALUE.C_S00_AXI_ADDR_WIDTH { PARAM_VALUE.C_S00_AXI_ADDR_WIDTH } {
24 | # Procedure called to update C_S00_AXI_ADDR_WIDTH when any of the dependent parameters in the arguments change
25 | }
26 |
27 | proc validate_PARAM_VALUE.C_S00_AXI_ADDR_WIDTH { PARAM_VALUE.C_S00_AXI_ADDR_WIDTH } {
28 | # Procedure called to validate C_S00_AXI_ADDR_WIDTH
29 | return true
30 | }
31 |
32 | proc update_PARAM_VALUE.C_S00_AXI_BASEADDR { PARAM_VALUE.C_S00_AXI_BASEADDR } {
33 | # Procedure called to update C_S00_AXI_BASEADDR when any of the dependent parameters in the arguments change
34 | }
35 |
36 | proc validate_PARAM_VALUE.C_S00_AXI_BASEADDR { PARAM_VALUE.C_S00_AXI_BASEADDR } {
37 | # Procedure called to validate C_S00_AXI_BASEADDR
38 | return true
39 | }
40 |
41 | proc update_PARAM_VALUE.C_S00_AXI_HIGHADDR { PARAM_VALUE.C_S00_AXI_HIGHADDR } {
42 | # Procedure called to update C_S00_AXI_HIGHADDR when any of the dependent parameters in the arguments change
43 | }
44 |
45 | proc validate_PARAM_VALUE.C_S00_AXI_HIGHADDR { PARAM_VALUE.C_S00_AXI_HIGHADDR } {
46 | # Procedure called to validate C_S00_AXI_HIGHADDR
47 | return true
48 | }
49 |
50 |
51 | proc update_MODELPARAM_VALUE.C_S00_AXI_DATA_WIDTH { MODELPARAM_VALUE.C_S00_AXI_DATA_WIDTH PARAM_VALUE.C_S00_AXI_DATA_WIDTH } {
52 | # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value
53 | set_property value [get_property value ${PARAM_VALUE.C_S00_AXI_DATA_WIDTH}] ${MODELPARAM_VALUE.C_S00_AXI_DATA_WIDTH}
54 | }
55 |
56 | proc update_MODELPARAM_VALUE.C_S00_AXI_ADDR_WIDTH { MODELPARAM_VALUE.C_S00_AXI_ADDR_WIDTH PARAM_VALUE.C_S00_AXI_ADDR_WIDTH } {
57 | # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value
58 | set_property value [get_property value ${PARAM_VALUE.C_S00_AXI_ADDR_WIDTH}] ${MODELPARAM_VALUE.C_S00_AXI_ADDR_WIDTH}
59 | }
60 |
61 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/hdl/PS_PL_v1_0.v:
--------------------------------------------------------------------------------
1 |
2 | `timescale 1 ns / 1 ps
3 |
4 | module PS_PL_v1_0 #
5 | (
6 | // Users to add parameters here
7 |
8 | // User parameters ends
9 | // Do not modify the parameters beyond this line
10 |
11 |
12 | // Parameters of Axi Slave Bus Interface S00_AXI
13 | parameter integer C_S00_AXI_DATA_WIDTH = 32,
14 | parameter integer C_S00_AXI_ADDR_WIDTH = 4
15 | )
16 | (
17 | // Users to add ports here
18 | input [9-1:0] pre_result,
19 | input pre_result_valid,
20 | output [16-1:0] raw_data,
21 | output raw_data_valid,
22 | // User ports ends
23 | // Do not modify the ports beyond this line
24 |
25 |
26 | // Ports of Axi Slave Bus Interface S00_AXI
27 | input wire s00_axi_aclk,
28 | input wire s00_axi_aresetn,
29 | input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_awaddr,
30 | input wire [2 : 0] s00_axi_awprot,
31 | input wire s00_axi_awvalid,
32 | output wire s00_axi_awready,
33 | input wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_wdata,
34 | input wire [(C_S00_AXI_DATA_WIDTH/8)-1 : 0] s00_axi_wstrb,
35 | input wire s00_axi_wvalid,
36 | output wire s00_axi_wready,
37 | output wire [1 : 0] s00_axi_bresp,
38 | output wire s00_axi_bvalid,
39 | input wire s00_axi_bready,
40 | input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_araddr,
41 | input wire [2 : 0] s00_axi_arprot,
42 | input wire s00_axi_arvalid,
43 | output wire s00_axi_arready,
44 | output wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_rdata,
45 | output wire [1 : 0] s00_axi_rresp,
46 | output wire s00_axi_rvalid,
47 | input wire s00_axi_rready
48 | );
49 | // Instantiation of Axi Bus Interface S00_AXI
50 | PS_PL_v1_0_S00_AXI # (
51 | .C_S_AXI_DATA_WIDTH(C_S00_AXI_DATA_WIDTH),
52 | .C_S_AXI_ADDR_WIDTH(C_S00_AXI_ADDR_WIDTH)
53 | ) PS_PL_v1_0_S00_AXI_inst (
54 | .pre_result(pre_result),
55 | .pre_result_valid(pre_result_valid),
56 | .raw_data(raw_data),
57 | .raw_data_valid(raw_data_valid),
58 | .S_AXI_ACLK(s00_axi_aclk),
59 | .S_AXI_ARESETN(s00_axi_aresetn),
60 | .S_AXI_AWADDR(s00_axi_awaddr),
61 | .S_AXI_AWPROT(s00_axi_awprot),
62 | .S_AXI_AWVALID(s00_axi_awvalid),
63 | .S_AXI_AWREADY(s00_axi_awready),
64 | .S_AXI_WDATA(s00_axi_wdata),
65 | .S_AXI_WSTRB(s00_axi_wstrb),
66 | .S_AXI_WVALID(s00_axi_wvalid),
67 | .S_AXI_WREADY(s00_axi_wready),
68 | .S_AXI_BRESP(s00_axi_bresp),
69 | .S_AXI_BVALID(s00_axi_bvalid),
70 | .S_AXI_BREADY(s00_axi_bready),
71 | .S_AXI_ARADDR(s00_axi_araddr),
72 | .S_AXI_ARPROT(s00_axi_arprot),
73 | .S_AXI_ARVALID(s00_axi_arvalid),
74 | .S_AXI_ARREADY(s00_axi_arready),
75 | .S_AXI_RDATA(s00_axi_rdata),
76 | .S_AXI_RRESP(s00_axi_rresp),
77 | .S_AXI_RVALID(s00_axi_rvalid),
78 | .S_AXI_RREADY(s00_axi_rready)
79 | );
80 |
81 | // Add user logic here
82 |
83 | // User logic ends
84 |
85 | endmodule
86 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/layer_norm_1.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/12 17:17:16
7 | // Design Name:
8 | // Module Name: layer_norm
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module layer_norm_1(
24 | input clk,
25 | input rst_n,
26 |
27 | input [16-1:0] data_in,
28 | input data_in_valid,
29 | input [2:0] block_sel,
30 |
31 | output [16-1:0] data_out,
32 | output reg data_out_valid,
33 | output reg done
34 | );
35 |
36 | reg [4:0] time_step_pre;
37 | reg [4:0] time_step; // 添加一个寄存器用于延迟
38 |
39 | always @(posedge clk or negedge rst_n) begin
40 | if (~rst_n) begin
41 | time_step_pre <= 0;
42 | end
43 | else if (time_step_pre == 'd29)
44 | time_step_pre <= 'd29;
45 | else if (data_in_valid) begin
46 | time_step_pre <= time_step_pre + 1'b1;
47 | end
48 | end
49 |
50 | always @(posedge clk or negedge rst_n) begin
51 | if (~rst_n) begin
52 | time_step <= 0;
53 | end
54 | else if (time_step_pre <= 'd29) begin
55 | time_step <= time_step_pre;
56 | end
57 | end
58 |
59 | wire [30*8-1:0] alpha;
60 | wire [30*8-1:0] beta;
61 | wire [2:0] sel = block_sel;
62 |
63 | alpha_rom_1 alpha_rom_1 (
64 | .clka(clk), // input wire clka
65 | .ena(data_in_valid), // input wire ena
66 | .addra(sel), // input wire [2 : 0] addra
67 | .douta(alpha) // output wire [719 : 0] douta
68 | );
69 |
70 | beta_rom_1 beta_rom_1 (
71 | .clka(clk), // input wire clka
72 | .ena(data_in_valid), // input wire ena
73 | .addra(sel), // input wire [2 : 0] addra
74 | .douta(beta) // output wire [719 : 0] douta
75 | );
76 |
77 | genvar i;
78 | generate
79 | for (i = 0; i < 16; i = i + 1) begin
80 | wire signed [8-1:0] alpha_i = alpha[time_step*8 +: 8];
81 | wire signed [8-1:0] beta_i = beta[time_step*8 +: 8];
82 |
83 | // always@(posedge clk or negedge rst_n) begin
84 | // if (~rst_n) begin
85 | // data_out[i] <= 0;
86 | // end
87 | // else if (data_in_valid) begin
88 | // data_out[i] <= (data_in[i] * alpha_i + beta_i) > 0 ? 1 : 0;
89 | // end
90 | // end
91 | assign data_out[i] = (data_in[i] * alpha_i + beta_i) > 0 ? 1 : 0;
92 | end
93 | endgenerate
94 |
95 | always@(posedge clk,negedge rst_n)begin
96 | if(~rst_n)
97 | done <= 0;
98 | else if (time_step == 5'd29)
99 | done <= 1;
100 | end
101 |
102 | always@(posedge clk,negedge rst_n)begin
103 | if(~rst_n)
104 | data_out_valid <= 0;
105 | else if (data_in_valid)
106 | data_out_valid <= 1;
107 | else
108 | data_out_valid <= 0;
109 | end
110 |
111 | endmodule
112 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/layer_norm_3.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/13 14:59:41
7 | // Design Name:
8 | // Module Name: layer_norm_3
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module layer_norm_3(
24 | input clk,
25 | input rst_n,
26 |
27 | input [16-1:0] data_in,
28 | input data_in_valid,
29 | input [2:0] block_sel,
30 |
31 | output [16-1:0] data_out,
32 | output reg data_out_valid,
33 | output reg done
34 | );
35 |
36 | reg [4:0] time_step_pre;
37 | reg [4:0] time_step; // 添加一个寄存器用于延迟
38 |
39 | always @(posedge clk or negedge rst_n) begin
40 | if (~rst_n) begin
41 | time_step_pre <= 0;
42 | end
43 | else if (time_step_pre == 'd29)
44 | time_step_pre <= 'd29;
45 | else if (data_in_valid) begin
46 | time_step_pre <= time_step_pre + 1'b1;
47 | end
48 | end
49 |
50 | always @(posedge clk or negedge rst_n) begin
51 | if (~rst_n) begin
52 | time_step <= 0;
53 | end
54 | else if (time_step_pre <= 'd29) begin
55 | time_step <= time_step_pre;
56 | end
57 | end
58 |
59 | wire [30*8-1:0] alpha;
60 | wire [30*8-1:0] beta;
61 | wire [2:0] sel = block_sel;
62 |
63 | alpha_rom_3 alpha_rom_3 (
64 | .clka(clk), // input wire clka
65 | .ena(data_in_valid), // input wire ena
66 | .addra(sel), // input wire [2 : 0] addra
67 | .douta(alpha) // output wire [719 : 0] douta
68 | );
69 |
70 | beta_rom_3 beta_rom_3 (
71 | .clka(clk), // input wire clka
72 | .ena(data_in_valid), // input wire ena
73 | .addra(sel), // input wire [2 : 0] addra
74 | .douta(beta) // output wire [719 : 0] douta
75 | );
76 |
77 | genvar i;
78 | generate
79 | for (i = 0; i < 16; i = i + 1) begin
80 | wire signed [8-1:0] alpha_i = alpha[time_step*8 +: 8];
81 | wire signed [8-1:0] beta_i = beta[time_step*8 +: 8];
82 |
83 | // always@(posedge clk or negedge rst_n) begin
84 | // if (~rst_n) begin
85 | // data_out[i] <= 0;
86 | // end
87 | // else if (data_in_valid) begin
88 | // data_out[i] <= (data_in[i] * alpha_i + beta_i) > 0 ? 1 : 0;
89 | // end
90 | // end
91 | assign data_out[i] = (data_in[i] * alpha_i + beta_i) > 0 ? 1 : 0;
92 | end
93 | endgenerate
94 |
95 | always@(posedge clk,negedge rst_n)begin
96 | if(~rst_n)
97 | done <= 0;
98 | else if (time_step == 5'd29)
99 | done <= 1;
100 | end
101 |
102 | always@(posedge clk,negedge rst_n)begin
103 | if(~rst_n)
104 | data_out_valid <= 0;
105 | else if (data_in_valid)
106 | data_out_valid <= 1;
107 | else
108 | data_out_valid <= 0;
109 | end
110 |
111 | endmodule
112 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/layer_norm_2.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/12 23:44:24
7 | // Design Name:
8 | // Module Name: layer_norm_2
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module layer_norm_2(
24 | input clk,
25 | input rst_n,
26 |
27 | input [16-1:0] data_in,
28 | input data_in_valid,
29 | input [2:0] block_sel,
30 |
31 | output [16-1:0] data_out,
32 | output reg data_out_valid,
33 | output reg done
34 | );
35 |
36 | reg [4:0] time_step_pre;
37 | reg [4:0] time_step; // 添加一个寄存器用于延迟
38 |
39 | always @(posedge clk or negedge rst_n) begin
40 | if (~rst_n) begin
41 | time_step_pre <= 0;
42 | end
43 | else if (time_step_pre == 'd29)
44 | time_step_pre <= 'd29;
45 | else if (data_in_valid) begin
46 | time_step_pre <= time_step_pre + 1'b1;
47 | end
48 | end
49 |
50 | always @(posedge clk or negedge rst_n) begin
51 | if (~rst_n) begin
52 | time_step <= 0;
53 | end
54 | else if (time_step_pre <= 'd29) begin
55 | time_step <= time_step_pre;
56 | end
57 | end
58 |
59 | wire [30*8-1:0] alpha;
60 | wire [30*8-1:0] beta;
61 | wire [2:0] sel = block_sel;
62 |
63 | alpha_rom_2 alpha_rom_2 (
64 | .clka(clk), // input wire clka
65 | .ena(data_in_valid), // input wire ena
66 | .addra(sel), // input wire [2 : 0] addra
67 | .douta(alpha) // output wire [719 : 0] douta
68 | );
69 |
70 | beta_rom_2 beta_rom_2 (
71 | .clka(clk), // input wire clka
72 | .ena(data_in_valid), // input wire ena
73 | .addra(sel), // input wire [2 : 0] addra
74 | .douta(beta) // output wire [719 : 0] douta
75 | );
76 |
77 | genvar i;
78 | generate
79 | for (i = 0; i < 16; i = i + 1) begin
80 | wire signed [8-1:0] alpha_i = alpha[time_step*8 +: 8];
81 | wire signed [8-1:0] beta_i = beta[time_step*8 +: 8];
82 |
83 | // always@(posedge clk or negedge rst_n) begin
84 | // if (~rst_n) begin
85 | // data_out[i] <= 0;
86 | // end
87 | // else if (data_in_valid) begin
88 | // data_out[i] <= (data_in[i] * alpha_i + beta_i) > 0 ? 1 : 0;
89 | // end
90 | // end
91 | assign data_out[i] = (data_in[i] * alpha_i + beta_i) > 0 ? 1 : 0;
92 | end
93 | endgenerate
94 |
95 | always@(posedge clk,negedge rst_n)begin
96 | if(~rst_n)
97 | done <= 0;
98 | else if (time_step == 5'd29)
99 | done <= 1;
100 | end
101 |
102 | always@(posedge clk,negedge rst_n)begin
103 | if(~rst_n)
104 | data_out_valid <= 0;
105 | else if (data_in_valid)
106 | data_out_valid <= 1;
107 | else
108 | data_out_valid <= 0;
109 | end
110 |
111 | endmodule
112 |
113 |
--------------------------------------------------------------------------------
/verilog/sources_1/bd/design_1/design_1.bda:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | 0x0080000000
25 | C_S00_AXI_BASEADDR
26 | 0x008000FFFF
27 | C_S00_AXI_HIGHADDR
28 | Data
29 | /zynq_ultra_ps_e_0
30 | M_AXI_HPM0_LPD
31 | SEG_PS_PL_0_S00_AXI_reg
32 | xilinx.com:ip:zynq_ultra_ps_e:3.4
33 | both
34 | /PS_PL_0
35 | S00_AXI
36 | S00_AXI_reg
37 | xilinx.com:user:PS_PL:1.0
38 | register
39 | AC
40 |
41 |
42 | active
43 | 2
44 | PM
45 |
46 |
47 | design_1
48 | BC
49 |
50 |
51 | 2
52 | design_1
53 | VR
54 |
55 |
56 |
57 |
58 | 2
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/binary_intermediate_1.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/12 10:17:56
7 | // Design Name:
8 | // Module Name: binary_intermediate_1
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module binary_intermediate_1(
24 | input clk,
25 | input rst_n,
26 |
27 | input [16-1:0] data_in,
28 | input data_in_valid,
29 | input wire [2-1:0] block_sel,
30 |
31 | output reg [64-1:0] data_out,
32 | output reg data_out_valid,
33 | output reg done
34 | );
35 |
36 | reg [4:0] time_step_pre;
37 | reg [4:0] time_step; // 添加一个寄存器用于延迟
38 |
39 | always @(posedge clk or negedge rst_n) begin
40 | if (~rst_n) begin
41 | time_step_pre <= 0;
42 | end
43 | else if (time_step_pre == 'd29) begin
44 | time_step_pre <= 'd29;
45 | end
46 | else if (data_in_valid) begin
47 | time_step_pre <= time_step_pre + 1'b1;
48 | end
49 | end
50 |
51 | always @(posedge clk or negedge rst_n) begin
52 | if (~rst_n) begin
53 | time_step <= 0;
54 | end
55 | else if (time_step_pre <= 'd29) begin
56 | time_step <= time_step_pre;
57 | end
58 | end
59 |
60 | wire [16*64-1:0] inter_w_data;
61 | wire [2:0] sel = block_sel;
62 | attention_intermediate_1 attention_intermediate_1 (
63 | .clka(clk), // input wire clka
64 | .ena(data_in_valid), // input wire ena
65 | .addra(sel), // input wire [2 : 0] addra
66 | .douta(inter_w_data) // output wire [1023 : 0] douta
67 | );
68 |
69 | genvar i;
70 | integer j;
71 |
72 | generate
73 | for (i = 0; i < 64; i = i + 1) begin
74 | wire [15:0] inter_xor_result = ~(inter_w_data[i*16 +: 16] ^ data_in);
75 |
76 | wire [4:0] inter_popcount_out = inter_xor_result[0] + inter_xor_result[1] + inter_xor_result[2] + inter_xor_result[3] + inter_xor_result[4] + inter_xor_result[5] + inter_xor_result[6] + inter_xor_result[7] + inter_xor_result[8] + inter_xor_result[9] + inter_xor_result[10] + inter_xor_result[11] + inter_xor_result[12] + inter_xor_result[13] + inter_xor_result[14] + inter_xor_result[15];
77 |
78 | // always@(posedge clk or negedge rst_n) begin
79 | // if (~rst_n) begin
80 | // inter_popcount_out <= 0;
81 | // end
82 | // else if (data_in_valid) begin
83 | // for (j = 0; j < 16; j = j + 1) begin
84 | // inter_popcount_out <= inter_popcount_out + inter_xor_result[j];
85 | // end
86 | // end
87 | // end
88 |
89 | always@(posedge clk or negedge rst_n) begin
90 | if (~rst_n) begin
91 | data_out[i] <= 0;
92 | end
93 | else if (data_in_valid) begin
94 | data_out[i] <= (2*inter_popcount_out-16) > 0 ? 1 : 0;
95 | end
96 | end
97 | end
98 | endgenerate
99 |
100 |
101 |
102 | always@(posedge clk,negedge rst_n)begin
103 | if(~rst_n)
104 | done <= 0;
105 | else if (time_step == 5'd29)
106 | done <= 1;
107 | end
108 |
109 | always@(posedge clk,negedge rst_n)begin
110 | if(~rst_n)
111 | data_out_valid <= 0;
112 | else if (data_in_valid)
113 | data_out_valid <= 1;
114 | else
115 | data_out_valid <= 0;
116 | end
117 |
118 |
119 | endmodule
120 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/encoder_hidden_state_1.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/13 09:43:10
7 | // Design Name:
8 | // Module Name: encoder_hidden_state_1
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module encoder_hidden_state_1(
24 | input clk,
25 | input rst_n,
26 |
27 | input [16-1:0] data_in,
28 | input data_in_valid,
29 | input wire [2-1:0] block_sel,
30 |
31 | output reg [256-1:0] data_out,
32 | output reg data_out_valid,
33 | output reg done
34 | );
35 |
36 | reg [4:0] time_step_pre;
37 | reg [4:0] time_step; // 添加一个寄存器用于延迟
38 |
39 | always @(posedge clk or negedge rst_n) begin
40 | if (~rst_n) begin
41 | time_step_pre <= 0;
42 | end
43 | else if (time_step_pre == 'd29) begin
44 | time_step_pre <= 'd29;
45 | end
46 | else if (data_in_valid) begin
47 | time_step_pre <= time_step_pre + 1'b1;
48 | end
49 | end
50 |
51 | always @(posedge clk or negedge rst_n) begin
52 | if (~rst_n) begin
53 | time_step <= 0;
54 | end
55 | else if (time_step_pre <= 'd29) begin
56 | time_step <= time_step_pre;
57 | end
58 | end
59 |
60 |
61 | wire [16*256-1:0] inter_w_data;
62 | wire [2:0] sel = block_sel;
63 | encoder_hidden_state_1_rom encoder_hidden_state_1_rom (
64 | .clka(clk), // input wire clka
65 | .ena(data_in_valid), // input wire ena
66 | .addra(sel), // input wire [2 : 0] addra
67 | .douta(inter_w_data) // output wire [4095 : 0] douta
68 | );
69 |
70 | genvar i;
71 | integer j;
72 |
73 | generate
74 | for (i = 0; i < 256; i = i + 1) begin
75 | wire [15:0] inter_xor_result = ~(inter_w_data[i*16 +: 16] ^ data_in);
76 |
77 | wire [4:0] inter_popcount_out = inter_xor_result[0] + inter_xor_result[1] + inter_xor_result[2] + inter_xor_result[3] + inter_xor_result[4] + inter_xor_result[5] + inter_xor_result[6] + inter_xor_result[7] + inter_xor_result[8] + inter_xor_result[9] + inter_xor_result[10] + inter_xor_result[11] + inter_xor_result[12] + inter_xor_result[13] + inter_xor_result[14] + inter_xor_result[15];
78 |
79 | // reg [4:0] inter_popcount_out;
80 | //
81 | // always@(posedge clk or negedge rst_n) begin
82 | // if (~rst_n) begin
83 | // inter_popcount_out <= 0;
84 | // end
85 | // else if (data_in_valid) begin
86 | // for (j = 0; j < 16; j = j + 1) begin
87 | // inter_popcount_out <= inter_popcount_out + inter_xor_result[j];
88 | // end
89 | // end
90 | // end
91 |
92 | always@(posedge clk or negedge rst_n) begin
93 | if (~rst_n) begin
94 | data_out[i] <= 0;
95 | end
96 | else if (data_in_valid) begin
97 | data_out[i] <= (2*inter_popcount_out-16) > 0 ? 1 : 0;
98 | end
99 | end
100 | end
101 | endgenerate
102 |
103 |
104 |
105 | always@(posedge clk,negedge rst_n)begin
106 | if(~rst_n)
107 | done <= 0;
108 | else if (time_step == 5'd29)
109 | done <= 1;
110 | end
111 |
112 | always@(posedge clk,negedge rst_n)begin
113 | if(~rst_n)
114 | data_out_valid <= 0;
115 | else if (data_in_valid)
116 | data_out_valid <= 1;
117 | else
118 | data_out_valid <= 0;
119 | end
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 | endmodule
134 |
--------------------------------------------------------------------------------
/vitis/src/platform.c:
--------------------------------------------------------------------------------
1 | /******************************************************************************
2 | *
3 | * Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
4 | *
5 | * Permission is hereby granted, free of charge, to any person obtaining a copy
6 | * of this software and associated documentation files (the "Software"), to deal
7 | * in the Software without restriction, including without limitation the rights
8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | * copies of the Software, and to permit persons to whom the Software is
10 | * furnished to do so, subject to the following conditions:
11 | *
12 | * The above copyright notice and this permission notice shall be included in
13 | * all copies or substantial portions of the Software.
14 | *
15 | * Use of the Software is limited solely to applications:
16 | * (a) running on a Xilinx device, or
17 | * (b) that interact with a Xilinx device through a bus or interconnect.
18 | *
19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 | * XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
24 | * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 | * SOFTWARE.
26 | *
27 | * Except as contained in this notice, the name of the Xilinx shall not be used
28 | * in advertising or otherwise to promote the sale, use or other dealings in
29 | * this Software without prior written authorization from Xilinx.
30 | *
31 | ******************************************************************************/
32 |
33 | #include "xparameters.h"
34 | #include "xil_cache.h"
35 |
36 | #include "platform_config.h"
37 |
38 | /*
39 | * Uncomment one of the following two lines, depending on the target,
40 | * if ps7/psu init source files are added in the source directory for
41 | * compiling example outside of SDK.
42 | */
43 | /*#include "ps7_init.h"*/
44 | /*#include "psu_init.h"*/
45 |
46 | #ifdef STDOUT_IS_16550
47 | #include "xuartns550_l.h"
48 |
49 | #define UART_BAUD 9600
50 | #endif
51 |
52 | void
53 | enable_caches()
54 | {
55 | #ifdef __PPC__
56 | Xil_ICacheEnableRegion(CACHEABLE_REGION_MASK);
57 | Xil_DCacheEnableRegion(CACHEABLE_REGION_MASK);
58 | #elif __MICROBLAZE__
59 | #ifdef XPAR_MICROBLAZE_USE_ICACHE
60 | Xil_ICacheEnable();
61 | #endif
62 | #ifdef XPAR_MICROBLAZE_USE_DCACHE
63 | Xil_DCacheEnable();
64 | #endif
65 | #endif
66 | }
67 |
68 | void
69 | disable_caches()
70 | {
71 | #ifdef __MICROBLAZE__
72 | #ifdef XPAR_MICROBLAZE_USE_DCACHE
73 | Xil_DCacheDisable();
74 | #endif
75 | #ifdef XPAR_MICROBLAZE_USE_ICACHE
76 | Xil_ICacheDisable();
77 | #endif
78 | #endif
79 | }
80 |
81 | void
82 | init_uart()
83 | {
84 | #ifdef STDOUT_IS_16550
85 | XUartNs550_SetBaud(STDOUT_BASEADDR, XPAR_XUARTNS550_CLOCK_HZ, UART_BAUD);
86 | XUartNs550_SetLineControlReg(STDOUT_BASEADDR, XUN_LCR_8_DATA_BITS);
87 | #endif
88 | /* Bootrom/BSP configures PS7/PSU UART to 115200 bps */
89 | }
90 |
91 | void
92 | init_platform()
93 | {
94 | /*
95 | * If you want to run this example outside of SDK,
96 | * uncomment one of the following two lines and also #include "ps7_init.h"
97 | * or #include "ps7_init.h" at the top, depending on the target.
98 | * Make sure that the ps7/psu_init.c and ps7/psu_init.h files are included
99 | * along with this example source files for compilation.
100 | */
101 | /* ps7_init();*/
102 | /* psu_init();*/
103 | enable_caches();
104 | init_uart();
105 | }
106 |
107 | void
108 | cleanup_platform()
109 | {
110 | disable_caches();
111 | }
112 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/example_designs/bfm_design/design.tcl:
--------------------------------------------------------------------------------
1 | proc create_ipi_design { offsetfile design_name } {
2 | create_bd_design $design_name
3 | open_bd_design $design_name
4 |
5 | # Create Clock and Reset Ports
6 | set ACLK [ create_bd_port -dir I -type clk ACLK ]
7 | set_property -dict [ list CONFIG.FREQ_HZ {100000000} CONFIG.PHASE {0.000} CONFIG.CLK_DOMAIN "${design_name}_ACLK" ] $ACLK
8 | set ARESETN [ create_bd_port -dir I -type rst ARESETN ]
9 | set_property -dict [ list CONFIG.POLARITY {ACTIVE_LOW} ] $ARESETN
10 | set_property CONFIG.ASSOCIATED_RESET ARESETN $ACLK
11 |
12 | # Create instance: PS_PL_0, and set properties
13 | set PS_PL_0 [ create_bd_cell -type ip -vlnv xilinx.com:user:PS_PL:1.0 PS_PL_0]
14 |
15 | # Create instance: master_0, and set properties
16 | set master_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_vip master_0]
17 | set_property -dict [ list CONFIG.PROTOCOL {AXI4LITE} CONFIG.INTERFACE_MODE {MASTER} ] $master_0
18 |
19 | # Create interface connections
20 | connect_bd_intf_net [get_bd_intf_pins master_0/M_AXI ] [get_bd_intf_pins PS_PL_0/S00_AXI]
21 |
22 | # Create port connections
23 | connect_bd_net -net aclk_net [get_bd_ports ACLK] [get_bd_pins master_0/ACLK] [get_bd_pins PS_PL_0/S00_AXI_ACLK]
24 | connect_bd_net -net aresetn_net [get_bd_ports ARESETN] [get_bd_pins master_0/ARESETN] [get_bd_pins PS_PL_0/S00_AXI_ARESETN]
25 | set_property target_simulator XSim [current_project]
26 | set_property -name {xsim.simulate.runtime} -value {100ms} -objects [get_filesets sim_1]
27 |
28 | # Auto assign address
29 | assign_bd_address
30 |
31 | # Copy all address to interface_address.vh file
32 | set bd_path [file dirname [get_property NAME [get_files ${design_name}.bd]]]
33 | upvar 1 $offsetfile offset_file
34 | set offset_file "${bd_path}/PS_PL_v1_0_tb_include.svh"
35 | set fp [open $offset_file "w"]
36 | puts $fp "`ifndef PS_PL_v1_0_tb_include_vh_"
37 | puts $fp "`define PS_PL_v1_0_tb_include_vh_\n"
38 | puts $fp "//Configuration current bd names"
39 | puts $fp "`define BD_NAME ${design_name}"
40 | puts $fp "`define BD_INST_NAME ${design_name}_i"
41 | puts $fp "`define BD_WRAPPER ${design_name}_wrapper\n"
42 | puts $fp "//Configuration address parameters"
43 |
44 | puts $fp "`endif"
45 | close $fp
46 | }
47 |
48 | set ip_path [file dirname [file normalize [get_property XML_FILE_NAME [ipx::get_cores xilinx.com:user:PS_PL:1.0]]]]
49 | set test_bench_file ${ip_path}/example_designs/bfm_design/PS_PL_v1_0_tb.sv
50 | set interface_address_vh_file ""
51 |
52 | # Set IP Repository and Update IP Catalogue
53 | set repo_paths [get_property ip_repo_paths [current_fileset]]
54 | if { [lsearch -exact -nocase $repo_paths $ip_path ] == -1 } {
55 | set_property ip_repo_paths "$ip_path [get_property ip_repo_paths [current_fileset]]" [current_fileset]
56 | update_ip_catalog
57 | }
58 |
59 | set design_name ""
60 | set all_bd {}
61 | set all_bd_files [get_files *.bd -quiet]
62 | foreach file $all_bd_files {
63 | set file_name [string range $file [expr {[string last "/" $file] + 1}] end]
64 | set bd_name [string range $file_name 0 [expr {[string last "." $file_name] -1}]]
65 | lappend all_bd $bd_name
66 | }
67 |
68 | for { set i 1 } { 1 } { incr i } {
69 | set design_name "PS_PL_v1_0_bfm_${i}"
70 | if { [lsearch -exact -nocase $all_bd $design_name ] == -1 } {
71 | break
72 | }
73 | }
74 |
75 | create_ipi_design interface_address_vh_file ${design_name}
76 | validate_bd_design
77 |
78 | set wrapper_file [make_wrapper -files [get_files ${design_name}.bd] -top -force]
79 | import_files -force -norecurse $wrapper_file
80 |
81 | set_property SOURCE_SET sources_1 [get_filesets sim_1]
82 | import_files -fileset sim_1 -norecurse -force $test_bench_file
83 | remove_files -quiet -fileset sim_1 PS_PL_v1_0_tb_include.vh
84 | import_files -fileset sim_1 -norecurse -force $interface_address_vh_file
85 | set_property top PS_PL_v1_0_tb [get_filesets sim_1]
86 | set_property top_lib {} [get_filesets sim_1]
87 | set_property top_file {} [get_filesets sim_1]
88 | launch_simulation -simset sim_1 -mode behavioral
89 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/binary_intermediate_2.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/12 11:42:35
7 | // Design Name:
8 | // Module Name: binary_intermediate_2
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module binary_intermediate_2(
24 | input clk,
25 | input rst_n,
26 |
27 | input [64-1:0] data_in,
28 | input data_in_valid,
29 | input wire [2-1:0] block_sel,
30 |
31 | output reg [16-1:0] data_out,
32 | output reg data_out_valid,
33 | output reg done
34 | );
35 |
36 | reg [4:0] time_step_pre;
37 | reg [4:0] time_step; // 添加一个寄存器用于延迟
38 |
39 | always @(posedge clk or negedge rst_n) begin
40 | if (~rst_n) begin
41 | time_step_pre <= 0;
42 | end
43 | else if (time_step_pre == 'd29)
44 | time_step_pre <= 'd29;
45 | else if (data_in_valid) begin
46 | time_step_pre <= time_step_pre + 1'b1;
47 | end
48 | end
49 |
50 | always @(posedge clk or negedge rst_n) begin
51 | if (~rst_n) begin
52 | time_step <= 0;
53 | end
54 | else if (time_step_pre <= 'd29) begin
55 | time_step <= time_step_pre;
56 | end
57 | end
58 |
59 | wire [16*64-1:0] inter_w_data;
60 | wire [2:0] sel = block_sel;
61 | attention_intermediate_2 attention_intermediate_2 (
62 | .clka(clk), // input wire clka
63 | .ena(data_in_valid), // input wire ena
64 | .addra(sel), // input wire [2 : 0] addra
65 | .douta(inter_w_data) // output wire [1023 : 0] douta
66 | );
67 |
68 | genvar i;
69 | integer j;
70 |
71 | generate
72 | for (i = 0; i < 16; i = i + 1) begin
73 | wire [63:0] inter_xor_result = ~(inter_w_data[i*64 +: 64] ^ data_in);
74 |
75 | wire [6:0] inter_popcount_out = inter_xor_result[0] + inter_xor_result[1] + inter_xor_result[2] + inter_xor_result[3] + inter_xor_result[4] + inter_xor_result[5] + inter_xor_result[6] + inter_xor_result[7] + inter_xor_result[8] + inter_xor_result[9] + inter_xor_result[10] + inter_xor_result[11] + inter_xor_result[12] + inter_xor_result[13] + inter_xor_result[14] + inter_xor_result[15] + inter_xor_result[16] + inter_xor_result[17] + inter_xor_result[18] + inter_xor_result[19] + inter_xor_result[20] + inter_xor_result[21] + inter_xor_result[22] + inter_xor_result[23] + inter_xor_result[24] + inter_xor_result[25] + inter_xor_result[26] + inter_xor_result[27] + inter_xor_result[28] + inter_xor_result[29] + inter_xor_result[30] + inter_xor_result[31] + inter_xor_result[32] + inter_xor_result[33] + inter_xor_result[34] + inter_xor_result[35] + inter_xor_result[36] + inter_xor_result[37] + inter_xor_result[38] + inter_xor_result[39] + inter_xor_result[40] + inter_xor_result[41] + inter_xor_result[42] + inter_xor_result[43] + inter_xor_result[44] + inter_xor_result[45] + inter_xor_result[46] + inter_xor_result[47] + inter_xor_result[48] + inter_xor_result[49] + inter_xor_result[50] + inter_xor_result[51] + inter_xor_result[52] + inter_xor_result[53] + inter_xor_result[54] + inter_xor_result[55] + inter_xor_result[56] + inter_xor_result[57] + inter_xor_result[58] + inter_xor_result[59] + inter_xor_result[60] + inter_xor_result[61] + inter_xor_result[62] + inter_xor_result[63];
76 |
77 | // reg [6:0] inter_popcount_out;
78 | //
79 | // always@(posedge clk or negedge rst_n) begin
80 | // if (~rst_n) begin
81 | // inter_popcount_out <= 0;
82 | // end
83 | // else if (data_in_valid) begin
84 | // for (j = 0; j < 64; j = j + 1) begin
85 | // inter_popcount_out <= inter_popcount_out + inter_xor_result[j];
86 | // end
87 | // end
88 | // end
89 |
90 | always@(posedge clk or negedge rst_n) begin
91 | if (~rst_n) begin
92 | data_out[i] <= 0;
93 | end
94 | else if (data_in_valid) begin
95 | data_out[i] <= (2*inter_popcount_out-64) > 0 ? 1 : 0;
96 | end
97 | end
98 | end
99 | endgenerate
100 |
101 |
102 |
103 | always@(posedge clk,negedge rst_n)begin
104 | if(~rst_n)
105 | done <= 0;
106 | else if (time_step == 5'd29)
107 | done <= 1;
108 | end
109 |
110 | always@(posedge clk,negedge rst_n)begin
111 | if(~rst_n)
112 | data_out_valid <= 0;
113 | else if (data_in_valid)
114 | data_out_valid <= 1;
115 | else
116 | data_out_valid <= 0;
117 | end
118 |
119 |
120 | endmodule
121 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/binary_score.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/10 21:56:19
7 | // Design Name:
8 | // Module Name: binary_score
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module binary_score(
24 | input clk,
25 | input rst_n,
26 |
27 | input [16-1:0] query_in,
28 | input [30*16-1:0] key_in,
29 | input data_in_valid,
30 |
31 | output [30-1:0] data_out_1,
32 | output [30-1:0] data_out_2,
33 | output [30-1:0] data_out_3,
34 | output [30-1:0] data_out_4,
35 | output reg data_out_valid,
36 | output reg done
37 | );
38 |
39 | wire [3-1:0] threshold = 'd4; // Bool Function
40 |
41 | reg [4:0] time_step;
42 |
43 | always@(posedge clk,negedge rst_n)begin
44 | if(~rst_n)
45 | time_step <= 0;
46 | else if(data_in_valid==1'b1)
47 | time_step <= time_step +1'b1;
48 | end
49 |
50 | /*
51 | * Head 1
52 | */
53 | genvar i_1;
54 | integer j_1;
55 | generate
56 | for (i_1 = 0; i_1 < 30; i_1 = i_1 + 1) begin
57 | wire [3:0] score_xor_result_1 = ~(key_in[i_1*16 +: 4] ^ query_in[3:0]);
58 |
59 | wire [2:0] score_popcount_out_1 = score_xor_result_1[0] + score_xor_result_1[1] + score_xor_result_1[2] + score_xor_result_1[3];
60 |
61 | // 计算POPCOUNT
62 | // reg [2:0] score_popcount_out_1;
63 | //
64 | // always@(posedge clk or negedge rst_n) begin
65 | // if (~rst_n) begin
66 | // score_popcount_out_1 <= 0;
67 | // end
68 | // else if (data_in_valid) begin
69 | // for (j_1 = 0; j_1 < 4; j_1 = j_1 + 1) begin
70 | // score_popcount_out_1 = score_popcount_out_1 + score_xor_result_1[j_1];
71 | // end
72 | // end
73 | // end
74 |
75 | assign data_out_1[i_1] = ((2*score_popcount_out_1-threshold) > 0 && data_in_valid) ? 1 : 0;
76 | end
77 | endgenerate
78 |
79 |
80 | /*
81 | * Head 2
82 | */
83 | genvar i_2;
84 | integer j_2;
85 | generate
86 | for (i_2 = 0; i_2 < 30; i_2 = i_2 + 1) begin
87 | wire [3:0] score_xor_result_2 = key_in[i_2*16+4 +: 4] ^ query_in[7:4];
88 |
89 | // 计算POPCOUNT
90 | reg [2:0] score_popcount_out_2;
91 |
92 | always@(posedge clk or negedge rst_n) begin
93 | if (~rst_n) begin
94 | score_popcount_out_2 <= 0;
95 | end
96 | else if (data_in_valid) begin
97 | for (j_2 = 0; j_2 < 4; j_2 = j_2 + 1) begin
98 | score_popcount_out_2 = score_popcount_out_2 + score_xor_result_2[j_2];
99 | end
100 | end
101 | end
102 |
103 | assign data_out_2[i_2] = ((2*score_popcount_out_2-threshold) > 0 && data_in_valid) ? 1 : 0;
104 | end
105 | endgenerate
106 |
107 | /*
108 | * Head 3
109 | */
110 | genvar i_3;
111 | integer j_3;
112 | generate
113 | for (i_3 = 0; i_3 < 30; i_3 = i_3 + 1) begin
114 | wire [3:0] score_xor_result_3 = key_in[i_3*16+8 +: 4] ^ query_in[11:8];
115 |
116 | // 计算POPCOUNT
117 | reg [2:0] score_popcount_out_3;
118 |
119 | always@(posedge clk or negedge rst_n) begin
120 | if (~rst_n) begin
121 | score_popcount_out_3 <= 0;
122 | end
123 | else if (data_in_valid) begin
124 | for (j_3 = 0; j_3 < 4; j_3 = j_3 + 1) begin
125 | score_popcount_out_3 = score_popcount_out_3 + score_xor_result_3[j_3];
126 | end
127 | end
128 | end
129 |
130 | assign data_out_3[i_3] = ((2*score_popcount_out_3-threshold) > 0 && data_in_valid) ? 1 : 0;
131 | end
132 | endgenerate
133 |
134 | /*
135 | * Head 4
136 | */
137 | genvar i_4;
138 | integer j_4;
139 | generate
140 | for (i_4 = 0; i_4 < 30; i_4 = i_4 + 1) begin
141 | wire [3:0] score_xor_result_4 = key_in[i_4*16+12 +: 4] ^ query_in[15:12];
142 |
143 | // 计算POPCOUNT
144 | reg [2:0] score_popcount_out_4;
145 |
146 | always@(posedge clk or negedge rst_n) begin
147 | if (~rst_n) begin
148 | score_popcount_out_4 <= 0;
149 | end
150 | else if (data_in_valid) begin
151 | for (j_4 = 0; j_4 < 4; j_4 = j_4 + 1) begin
152 | score_popcount_out_4 = score_popcount_out_4 + score_xor_result_4[j_4];
153 | end
154 | end
155 | end
156 |
157 | assign data_out_4[i_4] = ((2*score_popcount_out_4-threshold) > 0 && data_in_valid) ? 1 : 0;
158 | end
159 | endgenerate
160 |
161 | always@(posedge clk,negedge rst_n)begin
162 | if(~rst_n)
163 | done <= 0;
164 | else if (time_step == 5'd29)
165 | done <= 1;
166 | end
167 |
168 | always@(posedge clk,negedge rst_n)begin
169 | if(~rst_n)
170 | data_out_valid <= 0;
171 | else if (time_step == 5'd29)
172 | data_out_valid <= 1;
173 | end
174 |
175 | endmodule
176 |
--------------------------------------------------------------------------------
/verilog/param_1/encoder_hidden_state_1.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
4 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
5 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
6 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
7 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
8 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
9 |
--------------------------------------------------------------------------------
/verilog/param_1/encoder_hidden_state_2.coe:
--------------------------------------------------------------------------------
1 | memory_initialization_radix=16;
2 | memory_initialization_vector=
3 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
4 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
5 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
6 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
7 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
8 | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
9 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/example_designs/debug_hw_design/design.tcl:
--------------------------------------------------------------------------------
1 |
2 | proc create_ipi_design { offsetfile design_name } {
3 |
4 | create_bd_design $design_name
5 | open_bd_design $design_name
6 |
7 | # Create and configure Clock/Reset
8 | create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz sys_clk_0
9 | create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset sys_reset_0
10 |
11 | #Constraints will be provided manually while pin planning.
12 | create_bd_port -dir I -type rst reset_rtl
13 | set_property CONFIG.POLARITY [get_property CONFIG.POLARITY [get_bd_pins sys_clk_0/reset]] [get_bd_ports reset_rtl]
14 | connect_bd_net [get_bd_pins sys_reset_0/ext_reset_in] [get_bd_ports reset_rtl]
15 | connect_bd_net [get_bd_ports reset_rtl] [get_bd_pins sys_clk_0/reset]
16 | set external_reset_port reset_rtl
17 | create_bd_port -dir I -type clk clock_rtl
18 | connect_bd_net [get_bd_pins sys_clk_0/clk_in1] [get_bd_ports clock_rtl]
19 | set external_clock_port clock_rtl
20 |
21 | #Avoid IPI DRC, make clock port synchronous to reset
22 | if { $external_clock_port ne "" && $external_reset_port ne "" } {
23 | set_property CONFIG.ASSOCIATED_RESET $external_reset_port [get_bd_ports $external_clock_port]
24 | }
25 |
26 | # Connect other sys_reset pins
27 | connect_bd_net [get_bd_pins sys_reset_0/slowest_sync_clk] [get_bd_pins sys_clk_0/clk_out1]
28 | connect_bd_net [get_bd_pins sys_clk_0/locked] [get_bd_pins sys_reset_0/dcm_locked]
29 |
30 | # Create instance: PS_PL_0, and set properties
31 | set PS_PL_0 [ create_bd_cell -type ip -vlnv xilinx.com:user:PS_PL:1.0 PS_PL_0 ]
32 |
33 | # Create instance: jtag_axi_0, and set properties
34 | set jtag_axi_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:jtag_axi jtag_axi_0 ]
35 | set_property -dict [list CONFIG.PROTOCOL {0}] [get_bd_cells jtag_axi_0]
36 | connect_bd_net [get_bd_pins jtag_axi_0/aclk] [get_bd_pins sys_clk_0/clk_out1]
37 | connect_bd_net [get_bd_pins jtag_axi_0/aresetn] [get_bd_pins sys_reset_0/peripheral_aresetn]
38 |
39 | # Create instance: axi_peri_interconnect, and set properties
40 | set axi_peri_interconnect [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect axi_peri_interconnect ]
41 | connect_bd_net [get_bd_pins axi_peri_interconnect/ACLK] [get_bd_pins sys_clk_0/clk_out1]
42 | connect_bd_net [get_bd_pins axi_peri_interconnect/ARESETN] [get_bd_pins sys_reset_0/interconnect_aresetn]
43 | set_property -dict [ list CONFIG.NUM_SI {1} ] $axi_peri_interconnect
44 | connect_bd_net [get_bd_pins axi_peri_interconnect/S00_ACLK] [get_bd_pins sys_clk_0/clk_out1]
45 | connect_bd_net [get_bd_pins axi_peri_interconnect/S00_ARESETN] [get_bd_pins sys_reset_0/peripheral_aresetn]
46 | connect_bd_intf_net [get_bd_intf_pins jtag_axi_0/M_AXI] [get_bd_intf_pins axi_peri_interconnect/S00_AXI]
47 |
48 | set_property -dict [ list CONFIG.NUM_MI {1} ] $axi_peri_interconnect
49 | connect_bd_net [get_bd_pins axi_peri_interconnect/M00_ACLK] [get_bd_pins sys_clk_0/clk_out1]
50 | connect_bd_net [get_bd_pins axi_peri_interconnect/M00_ARESETN] [get_bd_pins sys_reset_0/peripheral_aresetn]
51 |
52 | # Connect all clock & reset of PS_PL_0 slave interfaces..
53 | connect_bd_intf_net [get_bd_intf_pins axi_peri_interconnect/M00_AXI] [get_bd_intf_pins PS_PL_0/S00_AXI]
54 | connect_bd_net [get_bd_pins PS_PL_0/s00_axi_aclk] [get_bd_pins sys_clk_0/clk_out1]
55 | connect_bd_net [get_bd_pins PS_PL_0/s00_axi_aresetn] [get_bd_pins sys_reset_0/peripheral_aresetn]
56 |
57 |
58 | # Auto assign address
59 | assign_bd_address
60 |
61 | # Copy all address to PS_PL_v1_0_include.tcl file
62 | set bd_path [get_property DIRECTORY [current_project]]/[current_project].srcs/[current_fileset]/bd
63 | upvar 1 $offsetfile offset_file
64 | set offset_file "${bd_path}/PS_PL_v1_0_include.tcl"
65 | set fp [open $offset_file "w"]
66 | puts $fp "# Configuration address parameters"
67 |
68 | set offset [get_property OFFSET [get_bd_addr_segs /jtag_axi_0/Data/SEG_PS_PL_0_S00_AXI_* ]]
69 | puts $fp "set s00_axi_addr ${offset}"
70 |
71 | close $fp
72 | }
73 |
74 | # Set IP Repository and Update IP Catalogue
75 | set ip_path [file dirname [file normalize [get_property XML_FILE_NAME [ipx::get_cores xilinx.com:user:PS_PL:1.0]]]]
76 | set hw_test_file ${ip_path}/example_designs/debug_hw_design/PS_PL_v1_0_hw_test.tcl
77 |
78 | set repo_paths [get_property ip_repo_paths [current_fileset]]
79 | if { [lsearch -exact -nocase $repo_paths $ip_path ] == -1 } {
80 | set_property ip_repo_paths "$ip_path [get_property ip_repo_paths [current_fileset]]" [current_fileset]
81 | update_ip_catalog
82 | }
83 |
84 | set design_name ""
85 | set all_bd {}
86 | set all_bd_files [get_files *.bd -quiet]
87 | foreach file $all_bd_files {
88 | set file_name [string range $file [expr {[string last "/" $file] + 1}] end]
89 | set bd_name [string range $file_name 0 [expr {[string last "." $file_name] -1}]]
90 | lappend all_bd $bd_name
91 | }
92 |
93 | for { set i 1 } { 1 } { incr i } {
94 | set design_name "PS_PL_v1_0_hw_${i}"
95 | if { [lsearch -exact -nocase $all_bd $design_name ] == -1 } {
96 | break
97 | }
98 | }
99 |
100 | set intf_address_include_file ""
101 | create_ipi_design intf_address_include_file ${design_name}
102 | save_bd_design
103 | validate_bd_design
104 |
105 | set wrapper_file [make_wrapper -files [get_files ${design_name}.bd] -top -force]
106 | import_files -force -norecurse $wrapper_file
107 |
108 | puts "-------------------------------------------------------------------------------------------------"
109 | puts "INFO NEXT STEPS : Until this stage, debug hardware design has been created, "
110 | puts " please perform following steps to test design in targeted board."
111 | puts "1. Generate bitstream"
112 | puts "2. Setup your targeted board, open hardware manager and open new(or existing) hardware target"
113 | puts "3. Download generated bitstream"
114 | puts "4. Run generated hardware test using below command, this invokes basic read/write operation"
115 | puts " to every interface present in the peripheral : xilinx.com:user:myip:1.0"
116 | puts " : source -notrace ${hw_test_file}"
117 | puts "-------------------------------------------------------------------------------------------------"
118 |
119 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/binary_query.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/11 22:33:54
7 | // Design Name:
8 | // Module Name: binary_query
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module binary_query(
24 | input clk,
25 | input rst_n,
26 |
27 | input [16*30-1:0] value_in,
28 | input [30-1:0] score_in_1,
29 | input [30-1:0] score_in_2,
30 | input [30-1:0] score_in_3,
31 | input [30-1:0] score_in_4,
32 | input data_in_valid,
33 |
34 | output reg [16-1:0] data_out,
35 | output reg data_out_valid,
36 | output reg done
37 | );
38 |
39 | reg [4:0] time_step;
40 |
41 | always@(posedge clk,negedge rst_n)begin
42 | if(~rst_n)
43 | time_step <= 0;
44 | else if(data_in_valid==1'b1)
45 | time_step <= time_step +1'b1;
46 | end
47 |
48 | integer j;
49 | wire [29:0] value_xor_result_1_1 = value_in[0*30 +: 30] ^ score_in_1;
50 | wire [29:0] value_xor_result_1_2 = value_in[1*30 +: 30] ^ score_in_1;
51 | wire [29:0] value_xor_result_1_3 = value_in[2*30 +: 30] ^ score_in_1;
52 | wire [29:0] value_xor_result_1_4 = value_in[3*30 +: 30] ^ score_in_1;
53 | wire [29:0] value_xor_result_2_1 = value_in[4*30 +: 30] ^ score_in_2;
54 | wire [29:0] value_xor_result_2_2 = value_in[5*30 +: 30] ^ score_in_2;
55 | wire [29:0] value_xor_result_2_3 = value_in[6*30 +: 30] ^ score_in_2;
56 | wire [29:0] value_xor_result_2_4 = value_in[7*30 +: 30] ^ score_in_2;
57 | wire [29:0] value_xor_result_3_1 = value_in[8*30 +: 30] ^ score_in_3;
58 | wire [29:0] value_xor_result_3_2 = value_in[9*30 +: 30] ^ score_in_3;
59 | wire [29:0] value_xor_result_3_3 = value_in[10*30 +: 30] ^ score_in_3;
60 | wire [29:0] value_xor_result_3_4 = value_in[11*30 +: 30] ^ score_in_3;
61 | wire [29:0] value_xor_result_4_1 = value_in[12*30 +: 30] ^ score_in_4;
62 | wire [29:0] value_xor_result_4_2 = value_in[13*30 +: 30] ^ score_in_4;
63 | wire [29:0] value_xor_result_4_3 = value_in[14*30 +: 30] ^ score_in_4;
64 | wire [29:0] value_xor_result_4_4 = value_in[15*30 +: 30] ^ score_in_4;
65 |
66 | reg [8:0] value_popcount_out_1_1;
67 | reg [8:0] value_popcount_out_1_2;
68 | reg [8:0] value_popcount_out_1_3;
69 | reg [8:0] value_popcount_out_1_4;
70 | reg [8:0] value_popcount_out_2_1;
71 | reg [8:0] value_popcount_out_2_2;
72 | reg [8:0] value_popcount_out_2_3;
73 | reg [8:0] value_popcount_out_2_4;
74 | reg [8:0] value_popcount_out_3_1;
75 | reg [8:0] value_popcount_out_3_2;
76 | reg [8:0] value_popcount_out_3_3;
77 | reg [8:0] value_popcount_out_3_4;
78 | reg [8:0] value_popcount_out_4_1;
79 | reg [8:0] value_popcount_out_4_2;
80 | reg [8:0] value_popcount_out_4_3;
81 | reg [8:0] value_popcount_out_4_4;
82 |
83 | always@(posedge clk or negedge rst_n) begin
84 | if (~rst_n) begin
85 | value_popcount_out_1_1 <= 0;
86 | value_popcount_out_1_2 <= 0;
87 | value_popcount_out_1_3 <= 0;
88 | value_popcount_out_1_4 <= 0;
89 | value_popcount_out_2_1 <= 0;
90 | value_popcount_out_2_2 <= 0;
91 | value_popcount_out_2_3 <= 0;
92 | value_popcount_out_2_4 <= 0;
93 | value_popcount_out_3_1 <= 0;
94 | value_popcount_out_3_2 <= 0;
95 | value_popcount_out_3_3 <= 0;
96 | value_popcount_out_3_4 <= 0;
97 | value_popcount_out_4_1 <= 0;
98 | value_popcount_out_4_2 <= 0;
99 | value_popcount_out_4_3 <= 0;
100 | value_popcount_out_4_4 <= 0;
101 | end
102 | else if (data_in_valid) begin
103 | for (j = 0; j < 30; j = j + 1) begin
104 | value_popcount_out_1_1 <= value_popcount_out_1_1 + value_xor_result_1_1[j];
105 | value_popcount_out_1_2 <= value_popcount_out_1_2 + value_xor_result_1_2[j];
106 | value_popcount_out_1_3 <= value_popcount_out_1_3 + value_xor_result_1_3[j];
107 | value_popcount_out_1_4 <= value_popcount_out_1_4 + value_xor_result_1_4[j];
108 | value_popcount_out_2_1 <= value_popcount_out_2_1 + value_xor_result_2_1[j];
109 | value_popcount_out_2_2 <= value_popcount_out_2_2 + value_xor_result_2_2[j];
110 | value_popcount_out_2_3 <= value_popcount_out_2_3 + value_xor_result_2_3[j];
111 | value_popcount_out_2_4 <= value_popcount_out_2_4 + value_xor_result_2_4[j];
112 | value_popcount_out_3_1 <= value_popcount_out_3_1 + value_xor_result_3_1[j];
113 | value_popcount_out_3_2 <= value_popcount_out_3_2 + value_xor_result_3_2[j];
114 | value_popcount_out_3_3 <= value_popcount_out_3_3 + value_xor_result_3_3[j];
115 | value_popcount_out_3_4 <= value_popcount_out_3_4 + value_xor_result_3_4[j];
116 | value_popcount_out_4_1 <= value_popcount_out_4_1 + value_xor_result_4_1[j];
117 | value_popcount_out_4_2 <= value_popcount_out_4_2 + value_xor_result_4_2[j];
118 | value_popcount_out_4_3 <= value_popcount_out_4_3 + value_xor_result_4_3[j];
119 | value_popcount_out_4_4 <= value_popcount_out_4_4 + value_xor_result_4_4[j];
120 | end
121 | end
122 | end
123 |
124 | always@(posedge clk or negedge rst_n) begin
125 | if (~rst_n) begin
126 | data_out <= 0;
127 | end
128 | else if (data_in_valid) begin
129 | data_out[0] <= (2*value_popcount_out_1_1-30) > 0 ? 1 : 0;
130 | data_out[1] <= (2*value_popcount_out_1_2-30) > 0 ? 1 : 0;
131 | data_out[2] <= (2*value_popcount_out_1_3-30) > 0 ? 1 : 0;
132 | data_out[3] <= (2*value_popcount_out_1_4-30) > 0 ? 1 : 0;
133 | data_out[4] <= (2*value_popcount_out_2_1-30) > 0 ? 1 : 0;
134 | data_out[5] <= (2*value_popcount_out_2_2-30) > 0 ? 1 : 0;
135 | data_out[6] <= (2*value_popcount_out_2_3-30) > 0 ? 1 : 0;
136 | data_out[7] <= (2*value_popcount_out_2_4-30) > 0 ? 1 : 0;
137 | data_out[8] <= (2*value_popcount_out_3_1-30) > 0 ? 1 : 0;
138 | data_out[9] <= (2*value_popcount_out_3_2-30) > 0 ? 1 : 0;
139 | data_out[10] <= (2*value_popcount_out_3_3-30) > 0 ? 1 : 0;
140 | data_out[11] <= (2*value_popcount_out_3_4-30) > 0 ? 1 : 0;
141 | data_out[12] <= (2*value_popcount_out_4_1-30) > 0 ? 1 : 0;
142 | data_out[13] <= (2*value_popcount_out_4_2-30) > 0 ? 1 : 0;
143 | data_out[14] <= (2*value_popcount_out_4_3-30) > 0 ? 1 : 0;
144 | data_out[15] <= (2*value_popcount_out_4_4-30) > 0 ? 1 : 0;
145 | end
146 | end
147 |
148 | always@(posedge clk,negedge rst_n)begin
149 | if(~rst_n)
150 | data_out_valid <= 0;
151 | else if (data_in_valid)
152 | data_out_valid <= 1;
153 | else
154 | data_out_valid <= 0;
155 | end
156 |
157 | always@(posedge clk,negedge rst_n)begin
158 | if(~rst_n)
159 | done <= 0;
160 | else if (time_step == 5'd29)
161 | done <= 1;
162 | end
163 |
164 | endmodule
165 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/output_2.v:
--------------------------------------------------------------------------------
1 | module output_2(
2 | input clk,
3 | input rst_n,
4 |
5 | input [256-1:0] data_in,
6 | input data_in_valid,
7 |
8 | output reg [9-1:0] data_out,
9 | output reg data_out_valid
10 | );
11 |
12 | wire [256-1:0] inter_w_data;
13 | wire sel = 0;
14 | output_2_rom output_2_rom (
15 | .clka(clk), // input wire clka
16 | .ena(data_in_valid), // input wire ena
17 | .addra(sel), // input wire [4 : 0] addra
18 | .douta(inter_w_data) // output wire [3839 : 0] douta
19 | );
20 |
21 | wire [256-1:0] inter_xor_result = ~(inter_w_data ^ data_in);
22 |
23 | wire [8:0] inter_popcount_out = inter_xor_result[0] + inter_xor_result[1] + inter_xor_result[2] + inter_xor_result[3] + inter_xor_result[4] + inter_xor_result[5] + inter_xor_result[6] + inter_xor_result[7] + inter_xor_result[8] + inter_xor_result[9] + inter_xor_result[10] + inter_xor_result[11] + inter_xor_result[12] + inter_xor_result[13] + inter_xor_result[14] + inter_xor_result[15] + inter_xor_result[16] + inter_xor_result[17] + inter_xor_result[18] + inter_xor_result[19] + inter_xor_result[20] + inter_xor_result[21] + inter_xor_result[22] + inter_xor_result[23] + inter_xor_result[24] + inter_xor_result[25] + inter_xor_result[26] + inter_xor_result[27] + inter_xor_result[28] + inter_xor_result[29] + inter_xor_result[30] + inter_xor_result[31] + inter_xor_result[32] + inter_xor_result[33] + inter_xor_result[34] + inter_xor_result[35] + inter_xor_result[36] + inter_xor_result[37] + inter_xor_result[38] + inter_xor_result[39] + inter_xor_result[40] + inter_xor_result[41] + inter_xor_result[42] + inter_xor_result[43] + inter_xor_result[44] + inter_xor_result[45] + inter_xor_result[46] + inter_xor_result[47] + inter_xor_result[48] + inter_xor_result[49] + inter_xor_result[50] + inter_xor_result[51] + inter_xor_result[52] + inter_xor_result[53] + inter_xor_result[54] + inter_xor_result[55] + inter_xor_result[56] + inter_xor_result[57] + inter_xor_result[58] + inter_xor_result[59] + inter_xor_result[60] + inter_xor_result[61] + inter_xor_result[62] + inter_xor_result[63] + inter_xor_result[64] + inter_xor_result[65] + inter_xor_result[66] + inter_xor_result[67] + inter_xor_result[68] + inter_xor_result[69] + inter_xor_result[70] + inter_xor_result[71] + inter_xor_result[72] + inter_xor_result[73] + inter_xor_result[74] + inter_xor_result[75] + inter_xor_result[76] + inter_xor_result[77] + inter_xor_result[78] + inter_xor_result[79] + inter_xor_result[80] + inter_xor_result[81] + inter_xor_result[82] + inter_xor_result[83] + inter_xor_result[84] + inter_xor_result[85] + inter_xor_result[86] + inter_xor_result[87] + inter_xor_result[88] + inter_xor_result[89] + inter_xor_result[90] + inter_xor_result[91] + inter_xor_result[92] + inter_xor_result[93] + inter_xor_result[94] + inter_xor_result[95] + inter_xor_result[96] + inter_xor_result[97] + inter_xor_result[98] + inter_xor_result[99] + inter_xor_result[100] + inter_xor_result[101] + inter_xor_result[102] + inter_xor_result[103] + inter_xor_result[104] + inter_xor_result[105] + inter_xor_result[106] + inter_xor_result[107] + inter_xor_result[108] + inter_xor_result[109] + inter_xor_result[110] + inter_xor_result[111] + inter_xor_result[112] + inter_xor_result[113] + inter_xor_result[114] + inter_xor_result[115] + inter_xor_result[116] + inter_xor_result[117] + inter_xor_result[118] + inter_xor_result[119] + inter_xor_result[120] + inter_xor_result[121] + inter_xor_result[122] + inter_xor_result[123] + inter_xor_result[124] + inter_xor_result[125] + inter_xor_result[126] + inter_xor_result[127] + inter_xor_result[128] + inter_xor_result[129] + inter_xor_result[130] + inter_xor_result[131] + inter_xor_result[132] + inter_xor_result[133] + inter_xor_result[134] + inter_xor_result[135] + inter_xor_result[136] + inter_xor_result[137] + inter_xor_result[138] + inter_xor_result[139] + inter_xor_result[140] + inter_xor_result[141] + inter_xor_result[142] + inter_xor_result[143] + inter_xor_result[144] + inter_xor_result[145] + inter_xor_result[146] + inter_xor_result[147] + inter_xor_result[148] + inter_xor_result[149] + inter_xor_result[150] + inter_xor_result[151] + inter_xor_result[152] + inter_xor_result[153] + inter_xor_result[154] + inter_xor_result[155] + inter_xor_result[156] + inter_xor_result[157] + inter_xor_result[158] + inter_xor_result[159] + inter_xor_result[160] + inter_xor_result[161] + inter_xor_result[162] + inter_xor_result[163] + inter_xor_result[164] + inter_xor_result[165] + inter_xor_result[166] + inter_xor_result[167] + inter_xor_result[168] + inter_xor_result[169] + inter_xor_result[170] + inter_xor_result[171] + inter_xor_result[172] + inter_xor_result[173] + inter_xor_result[174] + inter_xor_result[175] + inter_xor_result[176] + inter_xor_result[177] + inter_xor_result[178] + inter_xor_result[179] + inter_xor_result[180] + inter_xor_result[181] + inter_xor_result[182] + inter_xor_result[183] + inter_xor_result[184] + inter_xor_result[185] + inter_xor_result[186] + inter_xor_result[187] + inter_xor_result[188] + inter_xor_result[189] + inter_xor_result[190] + inter_xor_result[191] + inter_xor_result[192] + inter_xor_result[193] + inter_xor_result[194] + inter_xor_result[195] + inter_xor_result[196] + inter_xor_result[197] + inter_xor_result[198] + inter_xor_result[199] + inter_xor_result[200] + inter_xor_result[201] + inter_xor_result[202] + inter_xor_result[203] + inter_xor_result[204] + inter_xor_result[205] + inter_xor_result[206] + inter_xor_result[207] + inter_xor_result[208] + inter_xor_result[209] + inter_xor_result[210] + inter_xor_result[211] + inter_xor_result[212] + inter_xor_result[213] + inter_xor_result[214] + inter_xor_result[215] + inter_xor_result[216] + inter_xor_result[217] + inter_xor_result[218] + inter_xor_result[219] + inter_xor_result[220] + inter_xor_result[221] + inter_xor_result[222] + inter_xor_result[223] + inter_xor_result[224] + inter_xor_result[225] + inter_xor_result[226] + inter_xor_result[227] + inter_xor_result[228] + inter_xor_result[229] + inter_xor_result[230] + inter_xor_result[231] + inter_xor_result[232] + inter_xor_result[233] + inter_xor_result[234] + inter_xor_result[235] + inter_xor_result[236] + inter_xor_result[237] + inter_xor_result[238] + inter_xor_result[239] + inter_xor_result[240] + inter_xor_result[241] + inter_xor_result[242] + inter_xor_result[243] + inter_xor_result[244] + inter_xor_result[245] + inter_xor_result[246] + inter_xor_result[247] + inter_xor_result[248] + inter_xor_result[249] + inter_xor_result[250] + inter_xor_result[251] + inter_xor_result[252] + inter_xor_result[253] + inter_xor_result[254] + inter_xor_result[255];
24 |
25 | // reg [9-1:0] inter_popcount_out;
26 | //
27 | // always @(posedge clk or negedge rst_n) begin
28 | // if (~rst_n) begin
29 | // inter_popcount_out <= 0;
30 | // end
31 | // else if (data_in_valid) begin
32 | // inter_popcount_out <= 0;
33 | // for (integer j = 0; j < 256; j = j + 1) begin
34 | // inter_popcount_out <= inter_popcount_out + inter_xor_result[j];
35 | // end
36 | // end
37 | // end
38 |
39 | reg data_out_valid_pre;
40 | always @(posedge clk or negedge rst_n) begin
41 | if (~rst_n) begin
42 | data_out <= 0;
43 | data_out_valid_pre <= 0;
44 | end
45 | else if (data_in_valid) begin
46 | data_out <= inter_popcount_out; //(2*inter_popcount_out-256) > 0 ? 1 : 0;
47 | data_out_valid_pre <= 1;
48 | end
49 | end
50 |
51 | always @(posedge clk or negedge rst_n) begin
52 | if (~rst_n) begin
53 | data_out_valid <= 0;
54 | end
55 | else if (data_in_valid) begin
56 | data_out_valid <= 1;
57 | end
58 | end
59 | endmodule
60 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/bd/bd.tcl:
--------------------------------------------------------------------------------
1 |
2 | proc init { cellpath otherInfo } {
3 |
4 | set cell_handle [get_bd_cells $cellpath]
5 | set all_busif [get_bd_intf_pins $cellpath/*]
6 | set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH]
7 | set full_sbusif_list [list ]
8 |
9 | foreach busif $all_busif {
10 | if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } {
11 | set busif_param_list [list]
12 | set busif_name [get_property NAME $busif]
13 | if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } {
14 | continue
15 | }
16 | foreach tparam $axi_standard_param_list {
17 | lappend busif_param_list "C_${busif_name}_${tparam}"
18 | }
19 | bd::mark_propagate_only $cell_handle $busif_param_list
20 | }
21 | }
22 | }
23 |
24 |
25 | proc pre_propagate {cellpath otherInfo } {
26 |
27 | set cell_handle [get_bd_cells $cellpath]
28 | set all_busif [get_bd_intf_pins $cellpath/*]
29 | set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH]
30 |
31 | foreach busif $all_busif {
32 | if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } {
33 | continue
34 | }
35 | if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } {
36 | continue
37 | }
38 |
39 | set busif_name [get_property NAME $busif]
40 | foreach tparam $axi_standard_param_list {
41 | set busif_param_name "C_${busif_name}_${tparam}"
42 |
43 | set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif]
44 | set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle]
45 |
46 | if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } {
47 | if { $val_on_cell != "" } {
48 | set_property CONFIG.${tparam} $val_on_cell $busif
49 | }
50 | }
51 | }
52 | }
53 | }
54 |
55 |
56 | proc propagate {cellpath otherInfo } {
57 |
58 | set cell_handle [get_bd_cells $cellpath]
59 | set all_busif [get_bd_intf_pins $cellpath/*]
60 | set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH]
61 |
62 | foreach busif $all_busif {
63 | if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } {
64 | continue
65 | }
66 | if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } {
67 | continue
68 | }
69 |
70 | set busif_name [get_property NAME $busif]
71 | foreach tparam $axi_standard_param_list {
72 | set busif_param_name "C_${busif_name}_${tparam}"
73 |
74 | set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif]
75 | set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle]
76 |
77 | if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } {
78 | #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values..
79 | if { $val_on_cell_intf_pin != "" } {
80 | set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle
81 | }
82 | }
83 | }
84 | }
85 | }
86 |
87 |
--------------------------------------------------------------------------------
/vitis/src/lscript.ld:
--------------------------------------------------------------------------------
1 | /*******************************************************************/
2 | /* */
3 | /* This file is automatically generated by linker script generator.*/
4 | /* */
5 | /* Version: 2018.3 */
6 | /* */
7 | /* Copyright (c) 2010-2019 Xilinx, Inc. All rights reserved. */
8 | /* */
9 | /* Description : ARM v8 Linker Script */
10 | /* */
11 | /*******************************************************************/
12 |
13 | _STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x2000;
14 | _HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x2000;
15 |
16 | _EL0_STACK_SIZE = DEFINED(_EL0_STACK_SIZE) ? _EL0_STACK_SIZE : 1024;
17 | _EL1_STACK_SIZE = DEFINED(_EL1_STACK_SIZE) ? _EL1_STACK_SIZE : 2048;
18 | _EL2_STACK_SIZE = DEFINED(_EL2_STACK_SIZE) ? _EL2_STACK_SIZE : 1024;
19 |
20 | /* Define Memories in the system */
21 |
22 | MEMORY
23 | {
24 | psu_ddr_0_MEM_0 : ORIGIN = 0x0, LENGTH = 0x7FF00000
25 | psu_ddr_1_MEM_0 : ORIGIN = 0x800000000, LENGTH = 0x80000000
26 | psu_ocm_ram_0_MEM_0 : ORIGIN = 0xFFFC0000, LENGTH = 0x40000
27 | psu_qspi_linear_0_MEM_0 : ORIGIN = 0xC0000000, LENGTH = 0x20000000
28 | }
29 |
30 | /* Specify the default entry point to the program */
31 |
32 | ENTRY(_vector_table)
33 |
34 | /* Define the sections, and where they are mapped in memory */
35 |
36 | SECTIONS
37 | {
38 | .text : {
39 | KEEP (*(.vectors))
40 | *(.boot)
41 | *(.text)
42 | *(.text.*)
43 | *(.gnu.linkonce.t.*)
44 | *(.plt)
45 | *(.gnu_warning)
46 | *(.gcc_execpt_table)
47 | *(.glue_7)
48 | *(.glue_7t)
49 | *(.ARM.extab)
50 | *(.gnu.linkonce.armextab.*)
51 | } > psu_ddr_0_MEM_0
52 |
53 | .init (ALIGN(64)) : {
54 | KEEP (*(.init))
55 | } > psu_ddr_0_MEM_0
56 |
57 | .fini (ALIGN(64)) : {
58 | KEEP (*(.fini))
59 | } > psu_ddr_0_MEM_0
60 |
61 | .interp : {
62 | KEEP (*(.interp))
63 | } > psu_ddr_0_MEM_0
64 |
65 | .note-ABI-tag : {
66 | KEEP (*(.note-ABI-tag))
67 | } > psu_ddr_0_MEM_0
68 |
69 | .rodata : {
70 | . = ALIGN(64);
71 | __rodata_start = .;
72 | *(.rodata)
73 | *(.rodata.*)
74 | *(.gnu.linkonce.r.*)
75 | __rodata_end = .;
76 | } > psu_ddr_0_MEM_0
77 |
78 | .rodata1 : {
79 | . = ALIGN(64);
80 | __rodata1_start = .;
81 | *(.rodata1)
82 | *(.rodata1.*)
83 | __rodata1_end = .;
84 | } > psu_ddr_0_MEM_0
85 |
86 | .sdata2 : {
87 | . = ALIGN(64);
88 | __sdata2_start = .;
89 | *(.sdata2)
90 | *(.sdata2.*)
91 | *(.gnu.linkonce.s2.*)
92 | __sdata2_end = .;
93 | } > psu_ddr_0_MEM_0
94 |
95 | .sbss2 : {
96 | . = ALIGN(64);
97 | __sbss2_start = .;
98 | *(.sbss2)
99 | *(.sbss2.*)
100 | *(.gnu.linkonce.sb2.*)
101 | __sbss2_end = .;
102 | } > psu_ddr_0_MEM_0
103 |
104 | .data : {
105 | . = ALIGN(64);
106 | __data_start = .;
107 | *(.data)
108 | *(.data.*)
109 | *(.gnu.linkonce.d.*)
110 | *(.jcr)
111 | *(.got)
112 | *(.got.plt)
113 | __data_end = .;
114 | } > psu_ddr_0_MEM_0
115 |
116 | .data1 : {
117 | . = ALIGN(64);
118 | __data1_start = .;
119 | *(.data1)
120 | *(.data1.*)
121 | __data1_end = .;
122 | } > psu_ddr_0_MEM_0
123 |
124 | .got : {
125 | *(.got)
126 | } > psu_ddr_0_MEM_0
127 |
128 | .got1 : {
129 | *(.got1)
130 | } > psu_ddr_0_MEM_0
131 |
132 | .got2 : {
133 | *(.got2)
134 | } > psu_ddr_0_MEM_0
135 |
136 | .note.gnu.build-id : {
137 | KEEP (*(.note.gnu.build-id))
138 | } > psu_ddr_0_MEM_0
139 |
140 | .ctors : {
141 | . = ALIGN(64);
142 | __CTOR_LIST__ = .;
143 | ___CTORS_LIST___ = .;
144 | KEEP (*crtbegin.o(.ctors))
145 | KEEP (*(EXCLUDE_FILE(*crtend.o) .ctors))
146 | KEEP (*(SORT(.ctors.*)))
147 | KEEP (*(.ctors))
148 | __CTOR_END__ = .;
149 | ___CTORS_END___ = .;
150 | } > psu_ddr_0_MEM_0
151 |
152 | .dtors : {
153 | . = ALIGN(64);
154 | __DTOR_LIST__ = .;
155 | ___DTORS_LIST___ = .;
156 | KEEP (*crtbegin.o(.dtors))
157 | KEEP (*(EXCLUDE_FILE(*crtend.o) .dtors))
158 | KEEP (*(SORT(.dtors.*)))
159 | KEEP (*(.dtors))
160 | __DTOR_END__ = .;
161 | ___DTORS_END___ = .;
162 | } > psu_ddr_0_MEM_0
163 |
164 | .fixup : {
165 | __fixup_start = .;
166 | *(.fixup)
167 | __fixup_end = .;
168 | } > psu_ddr_0_MEM_0
169 |
170 | .eh_frame : {
171 | *(.eh_frame)
172 | } > psu_ddr_0_MEM_0
173 |
174 | .eh_framehdr : {
175 | __eh_framehdr_start = .;
176 | *(.eh_framehdr)
177 | __eh_framehdr_end = .;
178 | } > psu_ddr_0_MEM_0
179 |
180 | .gcc_except_table : {
181 | *(.gcc_except_table)
182 | } > psu_ddr_0_MEM_0
183 |
184 | .mmu_tbl0 (ALIGN(4096)) : {
185 | __mmu_tbl0_start = .;
186 | *(.mmu_tbl0)
187 | __mmu_tbl0_end = .;
188 | } > psu_ddr_0_MEM_0
189 |
190 | .mmu_tbl1 (ALIGN(4096)) : {
191 | __mmu_tbl1_start = .;
192 | *(.mmu_tbl1)
193 | __mmu_tbl1_end = .;
194 | } > psu_ddr_0_MEM_0
195 |
196 | .mmu_tbl2 (ALIGN(4096)) : {
197 | __mmu_tbl2_start = .;
198 | *(.mmu_tbl2)
199 | __mmu_tbl2_end = .;
200 | } > psu_ddr_0_MEM_0
201 |
202 | .ARM.exidx : {
203 | __exidx_start = .;
204 | *(.ARM.exidx*)
205 | *(.gnu.linkonce.armexidix.*.*)
206 | __exidx_end = .;
207 | } > psu_ddr_0_MEM_0
208 |
209 | .preinit_array : {
210 | . = ALIGN(64);
211 | __preinit_array_start = .;
212 | KEEP (*(SORT(.preinit_array.*)))
213 | KEEP (*(.preinit_array))
214 | __preinit_array_end = .;
215 | } > psu_ddr_0_MEM_0
216 |
217 | .init_array : {
218 | . = ALIGN(64);
219 | __init_array_start = .;
220 | KEEP (*(SORT(.init_array.*)))
221 | KEEP (*(.init_array))
222 | __init_array_end = .;
223 | } > psu_ddr_0_MEM_0
224 |
225 | .fini_array : {
226 | . = ALIGN(64);
227 | __fini_array_start = .;
228 | KEEP (*(SORT(.fini_array.*)))
229 | KEEP (*(.fini_array))
230 | __fini_array_end = .;
231 | } > psu_ddr_0_MEM_0
232 |
233 | .ARM.attributes : {
234 | __ARM.attributes_start = .;
235 | *(.ARM.attributes)
236 | __ARM.attributes_end = .;
237 | } > psu_ddr_0_MEM_0
238 |
239 | .sdata : {
240 | . = ALIGN(64);
241 | __sdata_start = .;
242 | *(.sdata)
243 | *(.sdata.*)
244 | *(.gnu.linkonce.s.*)
245 | __sdata_end = .;
246 | } > psu_ddr_0_MEM_0
247 |
248 | .sbss (NOLOAD) : {
249 | . = ALIGN(64);
250 | __sbss_start = .;
251 | *(.sbss)
252 | *(.sbss.*)
253 | *(.gnu.linkonce.sb.*)
254 | . = ALIGN(64);
255 | __sbss_end = .;
256 | } > psu_ddr_0_MEM_0
257 |
258 | .tdata : {
259 | . = ALIGN(64);
260 | __tdata_start = .;
261 | *(.tdata)
262 | *(.tdata.*)
263 | *(.gnu.linkonce.td.*)
264 | __tdata_end = .;
265 | } > psu_ddr_0_MEM_0
266 |
267 | .tbss : {
268 | . = ALIGN(64);
269 | __tbss_start = .;
270 | *(.tbss)
271 | *(.tbss.*)
272 | *(.gnu.linkonce.tb.*)
273 | __tbss_end = .;
274 | } > psu_ddr_0_MEM_0
275 |
276 | .bss (NOLOAD) : {
277 | . = ALIGN(64);
278 | __bss_start__ = .;
279 | *(.bss)
280 | *(.bss.*)
281 | *(.gnu.linkonce.b.*)
282 | *(COMMON)
283 | . = ALIGN(64);
284 | __bss_end__ = .;
285 | } > psu_ddr_0_MEM_0
286 |
287 | _SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 );
288 |
289 | _SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 );
290 |
291 | /* Generate Stack and Heap definitions */
292 |
293 | .heap (NOLOAD) : {
294 | . = ALIGN(64);
295 | _heap = .;
296 | HeapBase = .;
297 | _heap_start = .;
298 | . += _HEAP_SIZE;
299 | _heap_end = .;
300 | HeapLimit = .;
301 | } > psu_ddr_0_MEM_0
302 |
303 | .stack (NOLOAD) : {
304 | . = ALIGN(64);
305 | _el3_stack_end = .;
306 | . += _STACK_SIZE;
307 | __el3_stack = .;
308 | _el2_stack_end = .;
309 | . += _EL2_STACK_SIZE;
310 | . = ALIGN(64);
311 | __el2_stack = .;
312 | _el1_stack_end = .;
313 | . += _EL1_STACK_SIZE;
314 | . = ALIGN(64);
315 | __el1_stack = .;
316 | _el0_stack_end = .;
317 | . += _EL0_STACK_SIZE;
318 | . = ALIGN(64);
319 | __el0_stack = .;
320 | } > psu_ddr_0_MEM_0
321 |
322 | _end = .;
323 | }
324 |
325 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/encoder_hidden_state_2.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/13 14:46:50
7 | // Design Name:
8 | // Module Name: encoder_hidden_state_2
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module encoder_hidden_state_2(
24 | input clk,
25 | input rst_n,
26 |
27 | input [256-1:0] data_in,
28 | input data_in_valid,
29 | input wire [2-1:0] block_sel,
30 |
31 | output reg [16-1:0] data_out,
32 | output reg data_out_valid,
33 | output reg done
34 | );
35 |
36 | reg [4:0] time_step_pre;
37 | reg [4:0] time_step; // 添加一个寄存器用于延迟
38 |
39 | always @(posedge clk or negedge rst_n) begin
40 | if (~rst_n) begin
41 | time_step_pre <= 0;
42 | end
43 | else if (time_step_pre == 'd29) begin
44 | time_step_pre <= 'd29;
45 | end
46 | else if (data_in_valid) begin
47 | time_step_pre <= time_step_pre + 1'b1;
48 | end
49 | end
50 |
51 | always @(posedge clk or negedge rst_n) begin
52 | if (~rst_n) begin
53 | time_step <= 0;
54 | end
55 | else if (time_step_pre <= 'd29) begin
56 | time_step <= time_step_pre;
57 | end
58 | end
59 |
60 |
61 | wire [16*256-1:0] inter_w_data;
62 | wire [2:0] sel = block_sel;
63 | encoder_hidden_state_2_rom encoder_hidden_state_2_rom (
64 | .clka(clk), // input wire clka
65 | .ena(data_in_valid), // input wire ena
66 | .addra(sel), // input wire [2 : 0] addra
67 | .douta(inter_w_data) // output wire [4095 : 0] douta
68 | );
69 |
70 | genvar i;
71 | integer j;
72 |
73 | generate
74 | for (i = 0; i < 16; i = i + 1) begin
75 | wire [255:0] inter_xor_result = ~(inter_w_data[i*256 +: 256] ^ data_in);
76 |
77 | wire [8:0] inter_popcount_out = inter_xor_result[0] + inter_xor_result[1] + inter_xor_result[2] + inter_xor_result[3] + inter_xor_result[4] + inter_xor_result[5] + inter_xor_result[6] + inter_xor_result[7] + inter_xor_result[8] + inter_xor_result[9] + inter_xor_result[10] + inter_xor_result[11] + inter_xor_result[12] + inter_xor_result[13] + inter_xor_result[14] + inter_xor_result[15] + inter_xor_result[16] + inter_xor_result[17] + inter_xor_result[18] + inter_xor_result[19] + inter_xor_result[20] + inter_xor_result[21] + inter_xor_result[22] + inter_xor_result[23] + inter_xor_result[24] + inter_xor_result[25] + inter_xor_result[26] + inter_xor_result[27] + inter_xor_result[28] + inter_xor_result[29] + inter_xor_result[30] + inter_xor_result[31] + inter_xor_result[32] + inter_xor_result[33] + inter_xor_result[34] + inter_xor_result[35] + inter_xor_result[36] + inter_xor_result[37] + inter_xor_result[38] + inter_xor_result[39] + inter_xor_result[40] + inter_xor_result[41] + inter_xor_result[42] + inter_xor_result[43] + inter_xor_result[44] + inter_xor_result[45] + inter_xor_result[46] + inter_xor_result[47] + inter_xor_result[48] + inter_xor_result[49] + inter_xor_result[50] + inter_xor_result[51] + inter_xor_result[52] + inter_xor_result[53] + inter_xor_result[54] + inter_xor_result[55] + inter_xor_result[56] + inter_xor_result[57] + inter_xor_result[58] + inter_xor_result[59] + inter_xor_result[60] + inter_xor_result[61] + inter_xor_result[62] + inter_xor_result[63] + inter_xor_result[64] + inter_xor_result[65] + inter_xor_result[66] + inter_xor_result[67] + inter_xor_result[68] + inter_xor_result[69] + inter_xor_result[70] + inter_xor_result[71] + inter_xor_result[72] + inter_xor_result[73] + inter_xor_result[74] + inter_xor_result[75] + inter_xor_result[76] + inter_xor_result[77] + inter_xor_result[78] + inter_xor_result[79] + inter_xor_result[80] + inter_xor_result[81] + inter_xor_result[82] + inter_xor_result[83] + inter_xor_result[84] + inter_xor_result[85] + inter_xor_result[86] + inter_xor_result[87] + inter_xor_result[88] + inter_xor_result[89] + inter_xor_result[90] + inter_xor_result[91] + inter_xor_result[92] + inter_xor_result[93] + inter_xor_result[94] + inter_xor_result[95] + inter_xor_result[96] + inter_xor_result[97] + inter_xor_result[98] + inter_xor_result[99] + inter_xor_result[100] + inter_xor_result[101] + inter_xor_result[102] + inter_xor_result[103] + inter_xor_result[104] + inter_xor_result[105] + inter_xor_result[106] + inter_xor_result[107] + inter_xor_result[108] + inter_xor_result[109] + inter_xor_result[110] + inter_xor_result[111] + inter_xor_result[112] + inter_xor_result[113] + inter_xor_result[114] + inter_xor_result[115] + inter_xor_result[116] + inter_xor_result[117] + inter_xor_result[118] + inter_xor_result[119] + inter_xor_result[120] + inter_xor_result[121] + inter_xor_result[122] + inter_xor_result[123] + inter_xor_result[124] + inter_xor_result[125] + inter_xor_result[126] + inter_xor_result[127] + inter_xor_result[128] + inter_xor_result[129] + inter_xor_result[130] + inter_xor_result[131] + inter_xor_result[132] + inter_xor_result[133] + inter_xor_result[134] + inter_xor_result[135] + inter_xor_result[136] + inter_xor_result[137] + inter_xor_result[138] + inter_xor_result[139] + inter_xor_result[140] + inter_xor_result[141] + inter_xor_result[142] + inter_xor_result[143] + inter_xor_result[144] + inter_xor_result[145] + inter_xor_result[146] + inter_xor_result[147] + inter_xor_result[148] + inter_xor_result[149] + inter_xor_result[150] + inter_xor_result[151] + inter_xor_result[152] + inter_xor_result[153] + inter_xor_result[154] + inter_xor_result[155] + inter_xor_result[156] + inter_xor_result[157] + inter_xor_result[158] + inter_xor_result[159] + inter_xor_result[160] + inter_xor_result[161] + inter_xor_result[162] + inter_xor_result[163] + inter_xor_result[164] + inter_xor_result[165] + inter_xor_result[166] + inter_xor_result[167] + inter_xor_result[168] + inter_xor_result[169] + inter_xor_result[170] + inter_xor_result[171] + inter_xor_result[172] + inter_xor_result[173] + inter_xor_result[174] + inter_xor_result[175] + inter_xor_result[176] + inter_xor_result[177] + inter_xor_result[178] + inter_xor_result[179] + inter_xor_result[180] + inter_xor_result[181] + inter_xor_result[182] + inter_xor_result[183] + inter_xor_result[184] + inter_xor_result[185] + inter_xor_result[186] + inter_xor_result[187] + inter_xor_result[188] + inter_xor_result[189] + inter_xor_result[190] + inter_xor_result[191] + inter_xor_result[192] + inter_xor_result[193] + inter_xor_result[194] + inter_xor_result[195] + inter_xor_result[196] + inter_xor_result[197] + inter_xor_result[198] + inter_xor_result[199] + inter_xor_result[200] + inter_xor_result[201] + inter_xor_result[202] + inter_xor_result[203] + inter_xor_result[204] + inter_xor_result[205] + inter_xor_result[206] + inter_xor_result[207] + inter_xor_result[208] + inter_xor_result[209] + inter_xor_result[210] + inter_xor_result[211] + inter_xor_result[212] + inter_xor_result[213] + inter_xor_result[214] + inter_xor_result[215] + inter_xor_result[216] + inter_xor_result[217] + inter_xor_result[218] + inter_xor_result[219] + inter_xor_result[220] + inter_xor_result[221] + inter_xor_result[222] + inter_xor_result[223] + inter_xor_result[224] + inter_xor_result[225] + inter_xor_result[226] + inter_xor_result[227] + inter_xor_result[228] + inter_xor_result[229] + inter_xor_result[230] + inter_xor_result[231] + inter_xor_result[232] + inter_xor_result[233] + inter_xor_result[234] + inter_xor_result[235] + inter_xor_result[236] + inter_xor_result[237] + inter_xor_result[238] + inter_xor_result[239] + inter_xor_result[240] + inter_xor_result[241] + inter_xor_result[242] + inter_xor_result[243] + inter_xor_result[244] + inter_xor_result[245] + inter_xor_result[246] + inter_xor_result[247] + inter_xor_result[248] + inter_xor_result[249] + inter_xor_result[250] + inter_xor_result[251] + inter_xor_result[252] + inter_xor_result[253] + inter_xor_result[254] + inter_xor_result[255];
78 |
79 | // reg [8:0] inter_popcount_out;
80 | //
81 | // always@(posedge clk or negedge rst_n) begin
82 | // if (~rst_n) begin
83 | // inter_popcount_out <= 0;
84 | // end
85 | // else if (data_in_valid) begin
86 | // for (j = 0; j < 256; j = j + 1) begin
87 | // inter_popcount_out <= inter_popcount_out + inter_xor_result[j];
88 | // end
89 | // end
90 | // end
91 |
92 | always@(posedge clk or negedge rst_n) begin
93 | if (~rst_n) begin
94 | data_out[i] <= 0;
95 | end
96 | else if (data_in_valid) begin
97 | data_out[i] <= (2*inter_popcount_out-256) > 0 ? 1 : 0;
98 | end
99 | end
100 | end
101 | endgenerate
102 |
103 |
104 |
105 | always@(posedge clk,negedge rst_n)begin
106 | if(~rst_n)
107 | done <= 0;
108 | else if (time_step == 5'd29)
109 | done <= 1;
110 | end
111 |
112 | always@(posedge clk,negedge rst_n)begin
113 | if(~rst_n)
114 | data_out_valid <= 0;
115 | else if (data_in_valid)
116 | data_out_valid <= 1;
117 | else
118 | data_out_valid <= 0;
119 | end
120 |
121 | endmodule
122 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/example_designs/bfm_design/PS_PL_v1_0_tb.sv:
--------------------------------------------------------------------------------
1 |
2 | `timescale 1ns / 1ps
3 | `include "PS_PL_v1_0_tb_include.svh"
4 |
5 | import axi_vip_pkg::*;
6 | import PS_PL_v1_0_bfm_1_master_0_0_pkg::*;
7 |
8 | module PS_PL_v1_0_tb();
9 |
10 |
11 | xil_axi_uint error_cnt = 0;
12 | xil_axi_uint comparison_cnt = 0;
13 | axi_transaction wr_transaction;
14 | axi_transaction rd_transaction;
15 | axi_monitor_transaction mst_monitor_transaction;
16 | axi_monitor_transaction master_moniter_transaction_queue[$];
17 | xil_axi_uint master_moniter_transaction_queue_size =0;
18 | axi_monitor_transaction mst_scb_transaction;
19 | axi_monitor_transaction passthrough_monitor_transaction;
20 | axi_monitor_transaction passthrough_master_moniter_transaction_queue[$];
21 | xil_axi_uint passthrough_master_moniter_transaction_queue_size =0;
22 | axi_monitor_transaction passthrough_mst_scb_transaction;
23 | axi_monitor_transaction passthrough_slave_moniter_transaction_queue[$];
24 | xil_axi_uint passthrough_slave_moniter_transaction_queue_size =0;
25 | axi_monitor_transaction passthrough_slv_scb_transaction;
26 | axi_monitor_transaction slv_monitor_transaction;
27 | axi_monitor_transaction slave_moniter_transaction_queue[$];
28 | xil_axi_uint slave_moniter_transaction_queue_size =0;
29 | axi_monitor_transaction slv_scb_transaction;
30 | xil_axi_uint mst_agent_verbosity = 0;
31 | xil_axi_uint slv_agent_verbosity = 0;
32 | xil_axi_uint passthrough_agent_verbosity = 0;
33 | bit clock;
34 | bit reset;
35 | integer result_slave;
36 | bit [31:0] S00_AXI_test_data[3:0];
37 | localparam LC_AXI_BURST_LENGTH = 8;
38 | localparam LC_AXI_DATA_WIDTH = 32;
39 | task automatic COMPARE_DATA;
40 | input [(LC_AXI_BURST_LENGTH * LC_AXI_DATA_WIDTH)-1:0]expected;
41 | input [(LC_AXI_BURST_LENGTH * LC_AXI_DATA_WIDTH)-1:0]actual;
42 | begin
43 | if (expected === 'hx || actual === 'hx) begin
44 | $display("TESTBENCH ERROR! COMPARE_DATA cannot be performed with an expected or actual vector that is all 'x'!");
45 | result_slave = 0; $stop;
46 | end
47 | if (actual != expected) begin
48 | $display("TESTBENCH ERROR! Data expected is not equal to actual.", " expected = 0x%h",expected, " actual = 0x%h",actual);
49 | result_slave = 0;
50 | $stop;
51 | end
52 | else
53 | begin
54 | $display("TESTBENCH Passed! Data expected is equal to actual.",
55 | " expected = 0x%h",expected, " actual = 0x%h",actual);
56 | end
57 | end
58 | endtask
59 | integer i;
60 | integer j;
61 | xil_axi_uint trans_cnt_before_switch = 48;
62 | xil_axi_uint passthrough_cmd_switch_cnt = 0;
63 | event passthrough_mastermode_start_event;
64 | event passthrough_mastermode_end_event;
65 | event passthrough_slavemode_end_event;
66 | xil_axi_uint mtestID;
67 | xil_axi_ulong mtestADDR;
68 | xil_axi_len_t mtestBurstLength;
69 | xil_axi_size_t mtestDataSize;
70 | xil_axi_burst_t mtestBurstType;
71 | xil_axi_lock_t mtestLOCK;
72 | xil_axi_cache_t mtestCacheType = 0;
73 | xil_axi_prot_t mtestProtectionType = 3'b000;
74 | xil_axi_region_t mtestRegion = 4'b000;
75 | xil_axi_qos_t mtestQOS = 4'b000;
76 | xil_axi_data_beat dbeat;
77 | xil_axi_data_beat [255:0] mtestWUSER;
78 | xil_axi_data_beat mtestAWUSER = 'h0;
79 | xil_axi_data_beat mtestARUSER = 0;
80 | xil_axi_data_beat [255:0] mtestRUSER;
81 | xil_axi_uint mtestBUSER = 0;
82 | xil_axi_resp_t mtestBresp;
83 | xil_axi_resp_t[255:0] mtestRresp;
84 | bit [63:0] mtestWDataL;
85 | bit [63:0] mtestRDataL;
86 | axi_transaction pss_wr_transaction;
87 | axi_transaction pss_rd_transaction;
88 | axi_transaction reactive_transaction;
89 | axi_transaction rd_payload_transaction;
90 | axi_transaction wr_rand;
91 | axi_transaction rd_rand;
92 | axi_transaction wr_reactive;
93 | axi_transaction rd_reactive;
94 | axi_transaction wr_reactive2;
95 | axi_transaction rd_reactive2;
96 | axi_ready_gen bready_gen;
97 | axi_ready_gen rready_gen;
98 | axi_ready_gen awready_gen;
99 | axi_ready_gen wready_gen;
100 | axi_ready_gen arready_gen;
101 | axi_ready_gen bready_gen2;
102 | axi_ready_gen rready_gen2;
103 | axi_ready_gen awready_gen2;
104 | axi_ready_gen wready_gen2;
105 | axi_ready_gen arready_gen2;
106 | xil_axi_payload_byte data_mem[xil_axi_ulong];
107 | PS_PL_v1_0_bfm_1_master_0_0_mst_t mst_agent_0;
108 |
109 | `BD_WRAPPER DUT(
110 | .ARESETN(reset),
111 | .ACLK(clock)
112 | );
113 |
114 | initial begin
115 | mst_agent_0 = new("master vip agent",DUT.`BD_INST_NAME.master_0.inst.IF);//ms
116 | mst_agent_0.vif_proxy.set_dummy_drive_type(XIL_AXI_VIF_DRIVE_NONE);
117 | mst_agent_0.set_agent_tag("Master VIP");
118 | mst_agent_0.set_verbosity(mst_agent_verbosity);
119 | mst_agent_0.start_master();
120 | $timeformat (-12, 1, " ps", 1);
121 | end
122 | initial begin
123 | reset <= 1'b0;
124 | #200ns;
125 | reset <= 1'b1;
126 | repeat (5) @(negedge clock);
127 | end
128 | always #5 clock <= ~clock;
129 | initial begin
130 | S_AXI_TEST ( );
131 |
132 | #1ns;
133 | $finish;
134 | end
135 | task automatic S_AXI_TEST;
136 | begin
137 | #1;
138 | $display("Sequential write transfers example similar to AXI BFM WRITE_BURST method starts");
139 | mtestID = 0;
140 | mtestADDR = 64'h00000000;
141 | mtestBurstLength = 0;
142 | mtestDataSize = xil_axi_size_t'(xil_clog2(32/8));
143 | mtestBurstType = XIL_AXI_BURST_TYPE_INCR;
144 | mtestLOCK = XIL_AXI_ALOCK_NOLOCK;
145 | mtestCacheType = 0;
146 | mtestProtectionType = 0;
147 | mtestRegion = 0;
148 | mtestQOS = 0;
149 | result_slave = 1;
150 | mtestWDataL[31:0] = 32'h00000001;
151 | for(int i = 0; i < 4;i++) begin
152 | S00_AXI_test_data[i] <= mtestWDataL[31:0];
153 | mst_agent_0.AXI4LITE_WRITE_BURST(
154 | mtestADDR,
155 | mtestProtectionType,
156 | mtestWDataL,
157 | mtestBresp
158 | );
159 | mtestWDataL[31:0] = mtestWDataL[31:0] + 1;
160 | mtestADDR = mtestADDR + 64'h4;
161 | end
162 | $display("Sequential write transfers example similar to AXI BFM WRITE_BURST method completes");
163 | $display("Sequential read transfers example similar to AXI BFM READ_BURST method starts");
164 | mtestID = 0;
165 | mtestADDR = 64'h00000000;
166 | mtestBurstLength = 0;
167 | mtestDataSize = xil_axi_size_t'(xil_clog2(32/8));
168 | mtestBurstType = XIL_AXI_BURST_TYPE_INCR;
169 | mtestLOCK = XIL_AXI_ALOCK_NOLOCK;
170 | mtestCacheType = 0;
171 | mtestProtectionType = 0;
172 | mtestRegion = 0;
173 | mtestQOS = 0;
174 | for(int i = 0; i < 4;i++) begin
175 | mst_agent_0.AXI4LITE_READ_BURST(
176 | mtestADDR,
177 | mtestProtectionType,
178 | mtestRDataL,
179 | mtestRresp
180 | );
181 | mtestADDR = mtestADDR + 64'h4;
182 | COMPARE_DATA(S00_AXI_test_data[i],mtestRDataL);
183 | end
184 | $display("Sequential read transfers example similar to AXI BFM READ_BURST method completes");
185 | $display("Sequential read transfers example similar to AXI VIP READ_BURST method completes");
186 | $display("---------------------------------------------------------");
187 | $display("EXAMPLE TEST S00_AXI: PTGEN_TEST_FINISHED!");
188 | if ( result_slave ) begin
189 | $display("PTGEN_TEST: PASSED!");
190 | end else begin
191 | $display("PTGEN_TEST: FAILED!");
192 | end
193 | $display("---------------------------------------------------------");
194 | end
195 | endtask
196 |
197 | endmodule
198 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/attention.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/10 16:23:40
7 | // Design Name:
8 | // Module Name: attention
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module attention(
24 | input clk,
25 | input rst_n,
26 |
27 | input [16-1:0] data_in,
28 | input data_in_valid,
29 | input [2:0] block_sel,
30 |
31 | output [16-1:0] data_out,
32 | output data_out_valid
33 | );
34 | // =========================================================================================================
35 | // =====================================Get Query Key Value=================================================
36 | // =========================================================================================================
37 |
38 | /*
39 | * time_step计数,也是qkv的时间步坐标
40 | */
41 |
42 | reg [4:0] qkv_time_step_pre;
43 | reg [4:0] qkv_time_step; // 添加一个寄存器用于延迟
44 |
45 | always @(posedge clk or negedge rst_n) begin
46 | if (~rst_n) begin
47 | qkv_time_step_pre <= 0;
48 | end
49 | else if (qkv_time_step_pre == 'd29)
50 | qkv_time_step_pre <= 'd29;
51 | else if (data_in_valid) begin
52 | qkv_time_step_pre <= qkv_time_step_pre + 1'b1;
53 | end
54 | end
55 |
56 | always @(posedge clk or negedge rst_n) begin
57 | if (~rst_n) begin
58 | qkv_time_step <= 0;
59 | end
60 | else if (qkv_time_step_pre <= 'd29) begin
61 | qkv_time_step <= qkv_time_step_pre;
62 | end
63 | end
64 |
65 | /*
66 | * QKV数组赋值:30x16
67 | */
68 | reg [16-1:0] query[30-1:0];
69 | reg [16-1:0] key[30-1:0];
70 | reg [16-1:0] value[30-1:0];
71 | wire [16-1:0] query_out;
72 | wire [16-1:0] key_out;
73 | wire [16-1:0] value_out;
74 | wire qkv_data_valid;
75 | wire qkv_done;
76 |
77 | integer i,j;
78 | always@(posedge clk,negedge rst_n) begin
79 | if (~rst_n) begin
80 | for (i = 0; i < 30; i = i + 1) begin
81 | for (j = 0; j < 16; j = j + 1) begin
82 | query[i][j] <= 0;
83 | key[i][j] <= 0;
84 | value[i][j] <= 0;
85 | end
86 | end
87 | end
88 | else if (~qkv_done) begin
89 | query[qkv_time_step] <= query_out;
90 | key[qkv_time_step] <= key_out;
91 | value[qkv_time_step] <= value_out;
92 | end
93 | end
94 |
95 | /*
96 | * QKV实例化,得到QKV的结果
97 | */
98 | binary_QKV binary_QKV(
99 | .clk (clk),
100 | .rst_n (rst_n),
101 |
102 | .data_in (data_in),
103 | .data_in_valid (data_in_valid),
104 | .block_sel (block_sel),
105 |
106 | .query_out (query_out),
107 | .key_out (key_out),
108 | .value_out (value_out),
109 | .data_out_valid (qkv_data_valid),
110 | .done (qkv_done)
111 | );
112 |
113 | // =========================================================================================================
114 | // =====================================Get Attention Scores================================================
115 | // =========================================================================================================
116 | reg [4:0] score_time_step;
117 | always@(posedge clk,negedge rst_n)begin
118 | if(~rst_n)
119 | score_time_step <= 0;
120 | else if (score_time_step == 'd29)
121 | score_time_step <= 'd29;
122 | else if (qkv_done==1'b1)
123 | score_time_step <= score_time_step +1'b1;
124 | end
125 |
126 | wire [30*16-1:0] key_flatten;
127 | genvar k;
128 | generate
129 | for (k=0;k<30;k=k+1)begin
130 | assign key_flatten[k*16 +: 16] = key[k];
131 | end
132 | endgenerate
133 |
134 | reg [30-1:0] score_out_1[30-1:0];
135 | reg [30-1:0] score_out_2[30-1:0];
136 | reg [30-1:0] score_out_3[30-1:0];
137 | reg [30-1:0] score_out_4[30-1:0];
138 | wire [30-1:0] score_1;
139 | wire [30-1:0] score_2;
140 | wire [30-1:0] score_3;
141 | wire [30-1:0] score_4;
142 | wire score_out_valid;
143 | wire score_done;
144 |
145 | always@(posedge clk,negedge rst_n) begin
146 | if (~rst_n) begin
147 | score_out_1[score_time_step] <= 0;
148 | score_out_2[score_time_step] <= 0;
149 | score_out_3[score_time_step] <= 0;
150 | score_out_4[score_time_step] <= 0;
151 | end
152 | else if (qkv_done) begin
153 | score_out_1[score_time_step] <= score_1;
154 | score_out_2[score_time_step] <= score_2;
155 | score_out_3[score_time_step] <= score_3;
156 | score_out_4[score_time_step] <= score_4;
157 | end
158 | end
159 |
160 | binary_score binary_score(
161 | .clk (clk),
162 | .rst_n (rst_n),
163 |
164 | .query_in (query[score_time_step]),
165 | .key_in (key_flatten),
166 | .data_in_valid (qkv_done),
167 |
168 | .data_out_1 (score_1),
169 | .data_out_2 (score_2),
170 | .data_out_3 (score_3),
171 | .data_out_4 (score_4),
172 | .data_out_valid (score_out_valid),
173 | .done (score_done)
174 | );
175 |
176 | // =========================================================================================================
177 | // =====================================Get Weighted Value==================================================
178 | // =========================================================================================================
179 | wire [30*16-1:0] value_flatten;
180 | genvar l;
181 | generate
182 | for (k=0;k<16;k=k+1)begin
183 | for (l=0;l<30;l=l+1)begin
184 | assign value_flatten[k*30+l] = value[l][k];
185 | end
186 | end
187 | endgenerate
188 |
189 | reg [4:0] value_time_step;
190 | always@(posedge clk,negedge rst_n)begin
191 | if(~rst_n)
192 | value_time_step <= 0;
193 | else if (value_time_step == 'd29)
194 | value_time_step <= 'd29;
195 | else if (score_done==1'b1)
196 | value_time_step <= value_time_step +1'b1;
197 | end
198 |
199 | reg [16-1:0] value_weighted[30-1:0];
200 | wire [16-1:0] value_weighted_out;
201 | wire value_weighted_valid;
202 | wire value_weighted_done;
203 |
204 | always@(posedge clk,negedge rst_n) begin
205 | if (~rst_n) begin
206 | value_weighted[value_time_step] <= 0;
207 | end
208 | else if (score_done) begin
209 | value_weighted[value_time_step] <= value_weighted_out;
210 | end
211 | end
212 |
213 | binary_query binary_query(
214 | .clk (clk),
215 | .rst_n (rst_n),
216 |
217 | .value_in (value_flatten),
218 | .score_in_1 (score_out_1[value_time_step]),
219 | .score_in_2 (score_out_2[value_time_step]),
220 | .score_in_3 (score_out_3[value_time_step]),
221 | .score_in_4 (score_out_4[value_time_step]),
222 | .data_in_valid (score_done),
223 |
224 | .data_out (value_weighted_out),
225 | .data_out_valid (value_weighted_valid),
226 | .done (value_weighted_done)
227 | );
228 |
229 | // =========================================================================================================
230 | // =====================================Get Intermediate 1==================================================
231 | // =========================================================================================================
232 |
233 |
234 | reg [4:0] inter_1_time_step_pre;
235 | reg [4:0] inter_1_time_step; // 添加一个寄存器用于延迟
236 |
237 | always @(posedge clk or negedge rst_n) begin
238 | if (~rst_n) begin
239 | inter_1_time_step_pre <= 0;
240 | end
241 | else if (inter_1_time_step_pre == 'd29)
242 | inter_1_time_step_pre <= 'd29;
243 | else if (value_weighted_done) begin
244 | inter_1_time_step_pre <= inter_1_time_step_pre + 1'b1;
245 | end
246 | end
247 |
248 | always @(posedge clk or negedge rst_n) begin
249 | if (~rst_n) begin
250 | inter_1_time_step <= 0;
251 | end
252 | else if (inter_1_time_step_pre <= 'd29) begin
253 | inter_1_time_step <= inter_1_time_step_pre;
254 | end
255 | end
256 |
257 | reg [64-1:0] attention_inter_1[30-1:0];
258 | wire [64-1:0] attention_inter_1_out;
259 | wire attention_inter_1_valid;
260 | wire attention_inter_1_done;
261 |
262 | always@(posedge clk,negedge rst_n) begin
263 | if (~rst_n) begin
264 | for (i = 0; i < 30; i = i + 1) begin
265 | for (j = 0; j < 64; j = j + 1) begin
266 | attention_inter_1[i][j] <= 0;
267 | end
268 | end
269 | end
270 | else if (~attention_inter_1_done) begin
271 | attention_inter_1[inter_1_time_step] <= attention_inter_1_out;
272 | end
273 | end
274 |
275 | binary_intermediate_1 binary_intermediate_1(
276 | .clk (clk),
277 | .rst_n (rst_n),
278 |
279 | .data_in (value_weighted[inter_1_time_step]),
280 | .data_in_valid (value_weighted_done),
281 | .block_sel (block_sel),
282 |
283 | .data_out (attention_inter_1_out),
284 | .data_out_valid (attention_inter_1_valid),
285 | .done (attention_inter_1_done)
286 | );
287 |
288 | // =========================================================================================================
289 | // =====================================Get Intermediate 2==================================================
290 | // =========================================================================================================
291 |
292 |
293 | reg [4:0] inter_2_time_step_pre;
294 | reg [4:0] inter_2_time_step; // 添加一个寄存器用于延迟
295 |
296 | always @(posedge clk or negedge rst_n) begin
297 | if (~rst_n) begin
298 | inter_2_time_step_pre <= 0;
299 | end
300 | else if (inter_2_time_step_pre == 'd29)
301 | inter_2_time_step_pre <= 'd29;
302 | else if (attention_inter_1_done) begin
303 | inter_2_time_step_pre <= inter_2_time_step_pre + 1'b1;
304 | end
305 | end
306 |
307 | always @(posedge clk or negedge rst_n) begin
308 | if (~rst_n) begin
309 | inter_2_time_step <= 0;
310 | end
311 | else if (inter_2_time_step_pre <= 'd29) begin
312 | inter_2_time_step <= inter_2_time_step_pre;
313 | end
314 | end
315 |
316 | reg [16-1:0] attention_inter_2[30-1:0];
317 | wire [16-1:0] attention_inter_2_out;
318 | wire attention_inter_2_valid;
319 | wire attention_inter_2_done;
320 |
321 | always@(posedge clk,negedge rst_n) begin
322 | if (~rst_n) begin
323 | for (i = 0; i < 30; i = i + 1) begin
324 | for (j = 0; j < 16; j = j + 1) begin
325 | attention_inter_2[i][j] <= 0;
326 | end
327 | end
328 | end
329 | else if (~attention_inter_2_done) begin
330 | attention_inter_2[inter_2_time_step] <= attention_inter_2_out;
331 | end
332 | end
333 |
334 | binary_intermediate_2 binary_intermediate_2(
335 | .clk (clk),
336 | .rst_n (rst_n),
337 |
338 | .data_in (attention_inter_1[inter_2_time_step]),
339 | .data_in_valid (attention_inter_1_done),
340 | .block_sel (block_sel),
341 |
342 | .data_out (data_out), // attention_inter_2_out
343 | .data_out_valid (attention_inter_2_valid), //
344 | .done (data_out_valid) // attention_inter_2_done
345 | );
346 |
347 |
348 | endmodule
349 |
--------------------------------------------------------------------------------
/verilog/sources_1/bd/design_1/ip/design_1_transformer_0_0/design_1_transformer_0_0.xci:
--------------------------------------------------------------------------------
1 |
2 |
3 | xilinx.com
4 | xci
5 | unknown
6 | 1.0
7 |
8 |
9 | design_1_transformer_0_0
10 |
11 |
12 |
13 |
14 |
15 | design_1_zynq_ultra_ps_e_0_0_pl_clk0
16 | 96968727
17 | 0
18 | 0
19 | 0.0
20 | 0
21 | design_1_transformer_0_0
22 | zynquplus
23 |
24 |
25 | xczu15eg
26 | ffvb1156
27 | VERILOG
28 |
29 | MIXED
30 | -2
31 |
32 | I
33 | TRUE
34 | TRUE
35 | IP_Integrator
36 | 1
37 | TRUE
38 | ../../../../../../project_3.gen/sources_1/bd/design_1/ip/design_1_transformer_0_0
39 |
40 | ../../ipshared
41 | 2022.1
42 | OOC_HIERARCHICAL
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/encoder.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/12 16:18:24
7 | // Design Name:
8 | // Module Name: encoder
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module encoder(
24 | input clk,
25 | input rst_n,
26 |
27 | input [16-1:0] data_in,
28 | input data_in_valid,
29 | input [2:0] block_sel,
30 |
31 | output [16-1:0] data_out,
32 | output data_out_valid,
33 | output done
34 | );
35 |
36 | // =========================================================================================================
37 | // ============================================Layer Norm===================================================
38 | // =========================================================================================================
39 | reg [4:0] ln_time_step_1_pre;
40 | reg [4:0] ln_time_step_1;
41 |
42 | always @(posedge clk or negedge rst_n) begin
43 | if (~rst_n) begin
44 | ln_time_step_1_pre <= 0;
45 | end
46 | else if (data_in_valid) begin
47 | ln_time_step_1_pre <= ln_time_step_1_pre + 1'b1;
48 | end
49 | end
50 |
51 | always @(posedge clk or negedge rst_n) begin
52 | if (~rst_n) begin
53 | ln_time_step_1 <= 0;
54 | end
55 | else if (ln_time_step_1_pre <= 'd29) begin
56 | ln_time_step_1 <= ln_time_step_1_pre;
57 | end
58 | end
59 |
60 | reg [16-1:0] ln_1[30-1:0];
61 | wire [16-1:0] ln_1_out;
62 | wire ln_1_valid;
63 | wire ln_1_done;
64 |
65 | integer i,j;
66 | always@(posedge clk,negedge rst_n) begin
67 | if (~rst_n) begin
68 | for (i = 0; i < 30; i = i + 1) begin
69 | for (j = 0; j < 16; j = j + 1) begin
70 | ln_1[i][j] <= 0;
71 | end
72 | end
73 | end
74 | else if (~ln_1_done) begin
75 | ln_1[ln_time_step_1] <= ln_1_out;
76 | end
77 | end
78 |
79 | layer_norm_1 layer_norm_1(
80 | .clk (clk),
81 | .rst_n (rst_n),
82 |
83 | .data_in (data_in),
84 | .data_in_valid (data_in_valid),
85 | .block_sel (block_sel),
86 |
87 | .data_out (ln_1_out),
88 | .data_out_valid (ln_1_valid),
89 | .done (ln_1_done)
90 | );
91 |
92 |
93 | // =========================================================================================================
94 | // ==========================================Self Attention + Shortcut======================================
95 | // =========================================================================================================
96 | reg [4:0] attention_time_step_pre;
97 | reg [4:0] attention_time_step;
98 | reg [4:0] attention_time_step_out;
99 |
100 | always @(posedge clk or negedge rst_n) begin
101 | if (~rst_n) begin
102 | attention_time_step_pre <= 0;
103 | end
104 | else if (attention_time_step_pre == 'd29)
105 | attention_time_step_pre <= 'd29;
106 | else if (ln_1_done) begin
107 | attention_time_step_pre <= attention_time_step_pre + 1'b1;
108 | end
109 | end
110 |
111 | always @(posedge clk or negedge rst_n) begin
112 | if (~rst_n) begin
113 | attention_time_step <= 0;
114 | end
115 | else if (attention_time_step_pre <= 'd29) begin
116 | attention_time_step <= attention_time_step_pre;
117 | end
118 | end
119 |
120 | always @(posedge clk or negedge rst_n) begin
121 | if (~rst_n) begin
122 | attention_time_step_out <= 0;
123 | end
124 | else if (attention_time_step_out == 'd29)
125 | attention_time_step_out <= 'd29;
126 | else if (attention_valid) begin
127 | attention_time_step_out <= attention_time_step_out + 'd1;
128 | end
129 | end
130 |
131 | reg [16-1:0] attention[30-1:0];
132 | wire [16-1:0] attention_out;
133 | wire attention_valid;
134 | reg attention_done;
135 |
136 | always@(posedge clk,negedge rst_n) begin
137 | if (~rst_n) begin
138 | for (i = 0; i < 30; i = i + 1) begin
139 | for (j = 0; j < 16; j = j + 1) begin
140 | attention[i][j] <= 0;
141 | end
142 | end
143 | end
144 | else if (attention_valid) begin
145 | attention[attention_time_step_out] <= attention_out + ln_1[attention_time_step_out]; // shortcut
146 | end
147 | end
148 |
149 | always@(posedge clk,negedge rst_n) begin
150 | if (~rst_n) begin
151 | attention_done <= 0;
152 | end
153 | else if (attention_time_step_out == 'd29) begin
154 | attention_done <= 1;
155 | end
156 | end
157 |
158 | attention attention_U(
159 | .clk (clk),
160 | .rst_n (rst_n),
161 |
162 | .data_in (ln_1[attention_time_step]),
163 | .data_in_valid (ln_1_done),
164 | .block_sel (block_sel),
165 |
166 | .data_out (attention_out),
167 | .data_out_valid (attention_valid)
168 | );
169 |
170 |
171 | // =========================================================================================================
172 | // ============================================Layer Norm===================================================
173 | // =========================================================================================================
174 | reg [4:0] ln_time_step_2_pre;
175 | reg [4:0] ln_time_step_2;
176 |
177 | always @(posedge clk or negedge rst_n) begin
178 | if (~rst_n) begin
179 | ln_time_step_2_pre <= 0;
180 | end
181 | else if (ln_time_step_2_pre == 'd29)
182 | ln_time_step_2_pre <= 'd29;
183 | else if (attention_done) begin
184 | ln_time_step_2_pre <= ln_time_step_2_pre + 1'b1;
185 | end
186 | end
187 |
188 | always @(posedge clk or negedge rst_n) begin
189 | if (~rst_n) begin
190 | ln_time_step_2 <= 0;
191 | end
192 | else if (ln_time_step_2_pre <= 'd29) begin
193 | ln_time_step_2 <= ln_time_step_2_pre;
194 | end
195 | end
196 |
197 | reg [16-1:0] ln_2[30-1:0];
198 | wire [16-1:0] ln_2_out;
199 | wire ln_2_valid;
200 | wire ln_2_done;
201 |
202 | always@(posedge clk,negedge rst_n) begin
203 | if (~rst_n) begin
204 | for (i = 0; i < 30; i = i + 1) begin
205 | for (j = 0; j < 16; j = j + 1) begin
206 | ln_2[i][j] <= 0;
207 | end
208 | end
209 | end
210 | else if (~ln_2_done) begin
211 | ln_2[ln_time_step_2] <= ln_2_out;
212 | end
213 | end
214 |
215 | layer_norm_2 layer_norm_2(
216 | .clk (clk),
217 | .rst_n (rst_n),
218 |
219 | .data_in (attention[ln_time_step_2]),
220 | .data_in_valid (attention_done),
221 | .block_sel (block_sel),
222 |
223 | .data_out (ln_2_out),
224 | .data_out_valid (ln_2_valid),
225 | .done (ln_2_done)
226 | );
227 |
228 |
229 |
230 | // =========================================================================================================
231 | // ============================================Hidden State 1===============================================
232 | // =========================================================================================================
233 | reg [4:0] hidden_state_1_time_step_pre;
234 | reg [4:0] hidden_state_1_time_step;
235 |
236 | always @(posedge clk or negedge rst_n) begin
237 | if (~rst_n) begin
238 | hidden_state_1_time_step_pre <= 0;
239 | end
240 | else if (hidden_state_1_time_step_pre == 'd29)
241 | hidden_state_1_time_step_pre <= 'd29;
242 | else if (ln_2_done) begin
243 | hidden_state_1_time_step_pre <= hidden_state_1_time_step_pre + 1'b1;
244 | end
245 | end
246 |
247 | always @(posedge clk or negedge rst_n) begin
248 | if (~rst_n) begin
249 | hidden_state_1_time_step <= 0;
250 | end
251 | else if (hidden_state_1_time_step_pre <= 'd29) begin
252 | hidden_state_1_time_step <= hidden_state_1_time_step_pre;
253 | end
254 | end
255 |
256 | reg [256-1:0] hd_1[30-1:0];
257 | wire [256-1:0] hd_1_out;
258 | wire hd_1_valid;
259 | wire hd_1_done;
260 |
261 | always@(posedge clk,negedge rst_n) begin
262 | if (~rst_n) begin
263 | for (i = 0; i < 30; i = i + 1) begin
264 | for (j = 0; j < 256; j = j + 1) begin
265 | hd_1[i][j] <= 0;
266 | end
267 | end
268 | end
269 | else if (~hd_1_done) begin
270 | hd_1[hidden_state_1_time_step] <= hd_1_out;
271 | end
272 | end
273 |
274 | encoder_hidden_state_1 encoder_hidden_state_1(
275 | .clk (clk),
276 | .rst_n (rst_n),
277 |
278 | .data_in (ln_2[hidden_state_1_time_step]),
279 | .data_in_valid (ln_2_done),
280 | .block_sel (block_sel),
281 |
282 | .data_out (hd_1_out),
283 | .data_out_valid (hd_1_valid),
284 | .done (hd_1_done)
285 | );
286 |
287 | // =========================================================================================================
288 | // ============================================Hidden State 2===============================================
289 | // =========================================================================================================
290 | reg [4:0] hidden_state_2_time_step_pre;
291 | reg [4:0] hidden_state_2_time_step;
292 |
293 | always @(posedge clk or negedge rst_n) begin
294 | if (~rst_n) begin
295 | hidden_state_2_time_step_pre <= 0;
296 | end
297 | else if (hidden_state_2_time_step_pre == 'd29)
298 | hidden_state_2_time_step_pre <= 'd29;
299 | else if (hd_1_done) begin
300 | hidden_state_2_time_step_pre <= hidden_state_2_time_step_pre + 1'b1;
301 | end
302 | end
303 |
304 | always @(posedge clk or negedge rst_n) begin
305 | if (~rst_n) begin
306 | hidden_state_2_time_step <= 0;
307 | end
308 | else if (hidden_state_2_time_step_pre <= 'd29) begin
309 | hidden_state_2_time_step <= hidden_state_2_time_step_pre;
310 | end
311 | end
312 |
313 | reg [16-1:0] hd_2[30-1:0];
314 | wire [16-1:0] hd_2_out;
315 | wire hd_2_valid;
316 | wire hd_2_done;
317 |
318 | always@(posedge clk,negedge rst_n) begin
319 | if (~rst_n) begin
320 | for (i = 0; i < 30; i = i + 1) begin
321 | for (j = 0; j < 16; j = j + 1) begin
322 | hd_2[i][j] <= 0;
323 | end
324 | end
325 | end
326 | else if (~hd_2_done) begin
327 | hd_2[hidden_state_2_time_step] <= hd_2_out + ln_2[hidden_state_2_time_step]; // shortcut
328 | end
329 | end
330 |
331 | encoder_hidden_state_2 encoder_hidden_state_2(
332 | .clk (clk),
333 | .rst_n (rst_n),
334 |
335 | .data_in (hd_1[hidden_state_2_time_step]),
336 | .data_in_valid (hd_1_done),
337 | .block_sel (block_sel),
338 |
339 | .data_out (hd_2_out),
340 | .data_out_valid (hd_2_valid),
341 | .done (hd_2_done)
342 | );
343 |
344 | // =========================================================================================================
345 | // ============================================Layer Norm===================================================
346 | // =========================================================================================================
347 | reg [4:0] ln_time_step_3_pre;
348 | reg [4:0] ln_time_step_3;
349 |
350 | always @(posedge clk or negedge rst_n) begin
351 | if (~rst_n) begin
352 | ln_time_step_3_pre <= 0;
353 | end
354 | else if (ln_time_step_3_pre == 'd29)
355 | ln_time_step_3_pre <= 'd29;
356 | else if (hd_2_done) begin
357 | ln_time_step_3_pre <= ln_time_step_3_pre + 1'b1;
358 | end
359 | end
360 |
361 | always @(posedge clk or negedge rst_n) begin
362 | if (~rst_n) begin
363 | ln_time_step_3 <= 0;
364 | end
365 | else if (ln_time_step_3_pre <= 'd29) begin
366 | ln_time_step_3 <= ln_time_step_3_pre;
367 | end
368 | end
369 |
370 | // reg [16-1:0] ln_3[30-1:0];
371 | // wire [16-1:0] ln_3_out;
372 | wire ln_3_valid;
373 | wire ln_3_done;
374 |
375 | // integer i,j;
376 | // always@(posedge clk,negedge rst_n) begin
377 | // if (~rst_n) begin
378 | // for (i = 0; i < 30; i = i + 1) begin
379 | // for (j = 0; j < 16; j = j + 1) begin
380 | // ln_3[i][j] <= 0;
381 | // end
382 | // end
383 | // end
384 | // else if (~ln_3_done) begin
385 | // ln_3[ln_time_step_3] <= ln_3_out;
386 | // end
387 | // end
388 |
389 | layer_norm_3 layer_norm_3(
390 | .clk (clk),
391 | .rst_n (rst_n),
392 |
393 | .data_in (hd_2[ln_time_step_3]),
394 | .data_in_valid (hd_2_done),
395 | .block_sel (block_sel),
396 |
397 | .data_out (data_out),
398 | .data_out_valid (data_out_valid),
399 | .done (done)
400 | );
401 |
402 |
403 |
404 |
405 |
406 |
407 | endmodule
408 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/output_1.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/13 16:03:54
7 | // Design Name:
8 | // Module Name: output_1
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module output_1(
24 | input clk,
25 | input rst_n,
26 |
27 | input [480-1:0] data_in,
28 | input data_in_valid,
29 |
30 | output reg [8-1:0] data_out,
31 | output reg data_out_valid,
32 | output reg [6-1:0] time_step,
33 | output reg done
34 | );
35 |
36 | reg [6-1:0] time_step_pre;
37 | reg [6-1:0] time_step; // 添加一个寄存器用于延迟
38 |
39 | always @(posedge clk or negedge rst_n) begin
40 | if (~rst_n) begin
41 | time_step_pre <= 0;
42 | end
43 | else if (time_step_pre == 'd31) begin
44 | time_step_pre <= 'd31;
45 | end
46 | else if (data_in_valid) begin
47 | time_step_pre <= time_step_pre + 1'b1;
48 | end
49 | end
50 |
51 | always @(posedge clk or negedge rst_n) begin
52 | if (~rst_n) begin
53 | time_step <= 0;
54 | end
55 | else if (time_step_pre <= 'd31) begin
56 | time_step <= time_step_pre;
57 | end
58 | end
59 |
60 |
61 | wire [8*480-1:0] inter_w_data;
62 | output_1_rom output_1_rom (
63 | .clka(clk), // input wire clka
64 | .ena(data_in_valid), // input wire ena
65 | .addra(time_step), // input wire [4 : 0] addra
66 | .douta(inter_w_data) // output wire [3839 : 0] douta
67 | );
68 |
69 | genvar i;
70 | integer j;
71 |
72 | generate
73 | for (i = 0; i < 8; i = i + 1) begin
74 | wire [480-1:0] inter_xor_result = ~(inter_w_data[i*480 +: 480] ^ data_in);
75 |
76 | wire [8:0] inter_popcount_out = inter_xor_result[0] + inter_xor_result[1] + inter_xor_result[2] + inter_xor_result[3] + inter_xor_result[4] + inter_xor_result[5] + inter_xor_result[6] + inter_xor_result[7] + inter_xor_result[8] + inter_xor_result[9] + inter_xor_result[10] + inter_xor_result[11] + inter_xor_result[12] + inter_xor_result[13] + inter_xor_result[14] + inter_xor_result[15] + inter_xor_result[16] + inter_xor_result[17] + inter_xor_result[18] + inter_xor_result[19] + inter_xor_result[20] + inter_xor_result[21] + inter_xor_result[22] + inter_xor_result[23] + inter_xor_result[24] + inter_xor_result[25] + inter_xor_result[26] + inter_xor_result[27] + inter_xor_result[28] + inter_xor_result[29] + inter_xor_result[30] + inter_xor_result[31] + inter_xor_result[32] + inter_xor_result[33] + inter_xor_result[34] + inter_xor_result[35] + inter_xor_result[36] + inter_xor_result[37] + inter_xor_result[38] + inter_xor_result[39] + inter_xor_result[40] + inter_xor_result[41] + inter_xor_result[42] + inter_xor_result[43] + inter_xor_result[44] + inter_xor_result[45] + inter_xor_result[46] + inter_xor_result[47] + inter_xor_result[48] + inter_xor_result[49] + inter_xor_result[50] + inter_xor_result[51] + inter_xor_result[52] + inter_xor_result[53] + inter_xor_result[54] + inter_xor_result[55] + inter_xor_result[56] + inter_xor_result[57] + inter_xor_result[58] + inter_xor_result[59] + inter_xor_result[60] + inter_xor_result[61] + inter_xor_result[62] + inter_xor_result[63] + inter_xor_result[64] + inter_xor_result[65] + inter_xor_result[66] + inter_xor_result[67] + inter_xor_result[68] + inter_xor_result[69] + inter_xor_result[70] + inter_xor_result[71] + inter_xor_result[72] + inter_xor_result[73] + inter_xor_result[74] + inter_xor_result[75] + inter_xor_result[76] + inter_xor_result[77] + inter_xor_result[78] + inter_xor_result[79] + inter_xor_result[80] + inter_xor_result[81] + inter_xor_result[82] + inter_xor_result[83] + inter_xor_result[84] + inter_xor_result[85] + inter_xor_result[86] + inter_xor_result[87] + inter_xor_result[88] + inter_xor_result[89] + inter_xor_result[90] + inter_xor_result[91] + inter_xor_result[92] + inter_xor_result[93] + inter_xor_result[94] + inter_xor_result[95] + inter_xor_result[96] + inter_xor_result[97] + inter_xor_result[98] + inter_xor_result[99] + inter_xor_result[100] + inter_xor_result[101] + inter_xor_result[102] + inter_xor_result[103] + inter_xor_result[104] + inter_xor_result[105] + inter_xor_result[106] + inter_xor_result[107] + inter_xor_result[108] + inter_xor_result[109] + inter_xor_result[110] + inter_xor_result[111] + inter_xor_result[112] + inter_xor_result[113] + inter_xor_result[114] + inter_xor_result[115] + inter_xor_result[116] + inter_xor_result[117] + inter_xor_result[118] + inter_xor_result[119] + inter_xor_result[120] + inter_xor_result[121] + inter_xor_result[122] + inter_xor_result[123] + inter_xor_result[124] + inter_xor_result[125] + inter_xor_result[126] + inter_xor_result[127] + inter_xor_result[128] + inter_xor_result[129] + inter_xor_result[130] + inter_xor_result[131] + inter_xor_result[132] + inter_xor_result[133] + inter_xor_result[134] + inter_xor_result[135] + inter_xor_result[136] + inter_xor_result[137] + inter_xor_result[138] + inter_xor_result[139] + inter_xor_result[140] + inter_xor_result[141] + inter_xor_result[142] + inter_xor_result[143] + inter_xor_result[144] + inter_xor_result[145] + inter_xor_result[146] + inter_xor_result[147] + inter_xor_result[148] + inter_xor_result[149] + inter_xor_result[150] + inter_xor_result[151] + inter_xor_result[152] + inter_xor_result[153] + inter_xor_result[154] + inter_xor_result[155] + inter_xor_result[156] + inter_xor_result[157] + inter_xor_result[158] + inter_xor_result[159] + inter_xor_result[160] + inter_xor_result[161] + inter_xor_result[162] + inter_xor_result[163] + inter_xor_result[164] + inter_xor_result[165] + inter_xor_result[166] + inter_xor_result[167] + inter_xor_result[168] + inter_xor_result[169] + inter_xor_result[170] + inter_xor_result[171] + inter_xor_result[172] + inter_xor_result[173] + inter_xor_result[174] + inter_xor_result[175] + inter_xor_result[176] + inter_xor_result[177] + inter_xor_result[178] + inter_xor_result[179] + inter_xor_result[180] + inter_xor_result[181] + inter_xor_result[182] + inter_xor_result[183] + inter_xor_result[184] + inter_xor_result[185] + inter_xor_result[186] + inter_xor_result[187] + inter_xor_result[188] + inter_xor_result[189] + inter_xor_result[190] + inter_xor_result[191] + inter_xor_result[192] + inter_xor_result[193] + inter_xor_result[194] + inter_xor_result[195] + inter_xor_result[196] + inter_xor_result[197] + inter_xor_result[198] + inter_xor_result[199] + inter_xor_result[200] + inter_xor_result[201] + inter_xor_result[202] + inter_xor_result[203] + inter_xor_result[204] + inter_xor_result[205] + inter_xor_result[206] + inter_xor_result[207] + inter_xor_result[208] + inter_xor_result[209] + inter_xor_result[210] + inter_xor_result[211] + inter_xor_result[212] + inter_xor_result[213] + inter_xor_result[214] + inter_xor_result[215] + inter_xor_result[216] + inter_xor_result[217] + inter_xor_result[218] + inter_xor_result[219] + inter_xor_result[220] + inter_xor_result[221] + inter_xor_result[222] + inter_xor_result[223] + inter_xor_result[224] + inter_xor_result[225] + inter_xor_result[226] + inter_xor_result[227] + inter_xor_result[228] + inter_xor_result[229] + inter_xor_result[230] + inter_xor_result[231] + inter_xor_result[232] + inter_xor_result[233] + inter_xor_result[234] + inter_xor_result[235] + inter_xor_result[236] + inter_xor_result[237] + inter_xor_result[238] + inter_xor_result[239] + inter_xor_result[240] + inter_xor_result[241] + inter_xor_result[242] + inter_xor_result[243] + inter_xor_result[244] + inter_xor_result[245] + inter_xor_result[246] + inter_xor_result[247] + inter_xor_result[248] + inter_xor_result[249] + inter_xor_result[250] + inter_xor_result[251] + inter_xor_result[252] + inter_xor_result[253] + inter_xor_result[254] + inter_xor_result[255] + inter_xor_result[256] + inter_xor_result[257] + inter_xor_result[258] + inter_xor_result[259] + inter_xor_result[260] + inter_xor_result[261] + inter_xor_result[262] + inter_xor_result[263] + inter_xor_result[264] + inter_xor_result[265] + inter_xor_result[266] + inter_xor_result[267] + inter_xor_result[268] + inter_xor_result[269] + inter_xor_result[270] + inter_xor_result[271] + inter_xor_result[272] + inter_xor_result[273] + inter_xor_result[274] + inter_xor_result[275] + inter_xor_result[276] + inter_xor_result[277] + inter_xor_result[278] + inter_xor_result[279] + inter_xor_result[280] + inter_xor_result[281] + inter_xor_result[282] + inter_xor_result[283] + inter_xor_result[284] + inter_xor_result[285] + inter_xor_result[286] + inter_xor_result[287] + inter_xor_result[288] + inter_xor_result[289] + inter_xor_result[290] + inter_xor_result[291] + inter_xor_result[292] + inter_xor_result[293] + inter_xor_result[294] + inter_xor_result[295] + inter_xor_result[296] + inter_xor_result[297] + inter_xor_result[298] + inter_xor_result[299] + inter_xor_result[300] + inter_xor_result[301] + inter_xor_result[302] + inter_xor_result[303] + inter_xor_result[304] + inter_xor_result[305] + inter_xor_result[306] + inter_xor_result[307] + inter_xor_result[308] + inter_xor_result[309] + inter_xor_result[310] + inter_xor_result[311] + inter_xor_result[312] + inter_xor_result[313] + inter_xor_result[314] + inter_xor_result[315] + inter_xor_result[316] + inter_xor_result[317] + inter_xor_result[318] + inter_xor_result[319] + inter_xor_result[320] + inter_xor_result[321] + inter_xor_result[322] + inter_xor_result[323] + inter_xor_result[324] + inter_xor_result[325] + inter_xor_result[326] + inter_xor_result[327] + inter_xor_result[328] + inter_xor_result[329] + inter_xor_result[330] + inter_xor_result[331] + inter_xor_result[332] + inter_xor_result[333] + inter_xor_result[334] + inter_xor_result[335] + inter_xor_result[336] + inter_xor_result[337] + inter_xor_result[338] + inter_xor_result[339] + inter_xor_result[340] + inter_xor_result[341] + inter_xor_result[342] + inter_xor_result[343] + inter_xor_result[344] + inter_xor_result[345] + inter_xor_result[346] + inter_xor_result[347] + inter_xor_result[348] + inter_xor_result[349] + inter_xor_result[350] + inter_xor_result[351] + inter_xor_result[352] + inter_xor_result[353] + inter_xor_result[354] + inter_xor_result[355] + inter_xor_result[356] + inter_xor_result[357] + inter_xor_result[358] + inter_xor_result[359] + inter_xor_result[360] + inter_xor_result[361] + inter_xor_result[362] + inter_xor_result[363] + inter_xor_result[364] + inter_xor_result[365] + inter_xor_result[366] + inter_xor_result[367] + inter_xor_result[368] + inter_xor_result[369] + inter_xor_result[370] + inter_xor_result[371] + inter_xor_result[372] + inter_xor_result[373] + inter_xor_result[374] + inter_xor_result[375] + inter_xor_result[376] + inter_xor_result[377] + inter_xor_result[378] + inter_xor_result[379] + inter_xor_result[380] + inter_xor_result[381] + inter_xor_result[382] + inter_xor_result[383] + inter_xor_result[384] + inter_xor_result[385] + inter_xor_result[386] + inter_xor_result[387] + inter_xor_result[388] + inter_xor_result[389] + inter_xor_result[390] + inter_xor_result[391] + inter_xor_result[392] + inter_xor_result[393] + inter_xor_result[394] + inter_xor_result[395] + inter_xor_result[396] + inter_xor_result[397] + inter_xor_result[398] + inter_xor_result[399] + inter_xor_result[400] + inter_xor_result[401] + inter_xor_result[402] + inter_xor_result[403] + inter_xor_result[404] + inter_xor_result[405] + inter_xor_result[406] + inter_xor_result[407] + inter_xor_result[408] + inter_xor_result[409] + inter_xor_result[410] + inter_xor_result[411] + inter_xor_result[412] + inter_xor_result[413] + inter_xor_result[414] + inter_xor_result[415] + inter_xor_result[416] + inter_xor_result[417] + inter_xor_result[418] + inter_xor_result[419] + inter_xor_result[420] + inter_xor_result[421] + inter_xor_result[422] + inter_xor_result[423] + inter_xor_result[424] + inter_xor_result[425] + inter_xor_result[426] + inter_xor_result[427] + inter_xor_result[428] + inter_xor_result[429] + inter_xor_result[430] + inter_xor_result[431] + inter_xor_result[432] + inter_xor_result[433] + inter_xor_result[434] + inter_xor_result[435] + inter_xor_result[436] + inter_xor_result[437] + inter_xor_result[438] + inter_xor_result[439] + inter_xor_result[440] + inter_xor_result[441] + inter_xor_result[442] + inter_xor_result[443] + inter_xor_result[444] + inter_xor_result[445] + inter_xor_result[446] + inter_xor_result[447] + inter_xor_result[448] + inter_xor_result[449] + inter_xor_result[450] + inter_xor_result[451] + inter_xor_result[452] + inter_xor_result[453] + inter_xor_result[454] + inter_xor_result[455] + inter_xor_result[456] + inter_xor_result[457] + inter_xor_result[458] + inter_xor_result[459] + inter_xor_result[460] + inter_xor_result[461] + inter_xor_result[462] + inter_xor_result[463] + inter_xor_result[464] + inter_xor_result[465] + inter_xor_result[466] + inter_xor_result[467] + inter_xor_result[468] + inter_xor_result[469] + inter_xor_result[470] + inter_xor_result[471] + inter_xor_result[472] + inter_xor_result[473] + inter_xor_result[474] + inter_xor_result[475] + inter_xor_result[476] + inter_xor_result[477] + inter_xor_result[478] + inter_xor_result[479];
77 |
78 | // reg [9-1:0] inter_popcount_out;
79 | //
80 | // always@(posedge clk or negedge rst_n) begin
81 | // if (~rst_n) begin
82 | // inter_popcount_out <= 0;
83 | // end
84 | // else if (data_in_valid) begin
85 | // for (j = 0; j < 480; j = j + 1) begin
86 | // inter_popcount_out <= inter_popcount_out + inter_xor_result[j];
87 | // end
88 | // end
89 | // end
90 |
91 | always@(posedge clk or negedge rst_n) begin
92 | if (~rst_n) begin
93 | data_out[i] <= 0;
94 | end
95 | else if (data_in_valid) begin
96 | data_out[i] <= (2*inter_popcount_out-480) > 0 ? 1 : 0;
97 | end
98 | end
99 | end
100 | endgenerate
101 |
102 |
103 |
104 | always@(posedge clk,negedge rst_n)begin
105 | if(~rst_n)
106 | done <= 0;
107 | else if (time_step == 'd31)
108 | done <= 1;
109 | end
110 |
111 | always@(posedge clk,negedge rst_n)begin
112 | if(~rst_n)
113 | data_out_valid <= 0;
114 | else if (data_in_valid)
115 | data_out_valid <= 1;
116 | else
117 | data_out_valid <= 0;
118 | end
119 | endmodule
120 |
--------------------------------------------------------------------------------
/verilog/ip_repo/PS_PL_1.0/hdl/PS_PL_v1_0_S00_AXI.v:
--------------------------------------------------------------------------------
1 |
2 | `timescale 1 ns / 1 ps
3 |
4 | module PS_PL_v1_0_S00_AXI #
5 | (
6 | // Users to add parameters here
7 |
8 | // User parameters ends
9 | // Do not modify the parameters beyond this line
10 |
11 | // Width of S_AXI data bus
12 | parameter integer C_S_AXI_DATA_WIDTH = 32,
13 | // Width of S_AXI address bus
14 | parameter integer C_S_AXI_ADDR_WIDTH = 4
15 | )
16 | (
17 | // Users to add ports here
18 | input [9-1:0] pre_result,
19 | input pre_result_valid,
20 | output [16-1:0] raw_data,
21 | output raw_data_valid,
22 | // User ports ends
23 | // Do not modify the ports beyond this line
24 |
25 | // Global Clock Signal
26 | input wire S_AXI_ACLK,
27 | // Global Reset Signal. This Signal is Active LOW
28 | input wire S_AXI_ARESETN,
29 | // Write address (issued by master, acceped by Slave)
30 | input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR,
31 | // Write channel Protection type. This signal indicates the
32 | // privilege and security level of the transaction, and whether
33 | // the transaction is a data access or an instruction access.
34 | input wire [2 : 0] S_AXI_AWPROT,
35 | // Write address valid. This signal indicates that the master signaling
36 | // valid write address and control information.
37 | input wire S_AXI_AWVALID,
38 | // Write address ready. This signal indicates that the slave is ready
39 | // to accept an address and associated control signals.
40 | output wire S_AXI_AWREADY,
41 | // Write data (issued by master, acceped by Slave)
42 | input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA,
43 | // Write strobes. This signal indicates which byte lanes hold
44 | // valid data. There is one write strobe bit for each eight
45 | // bits of the write data bus.
46 | input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB,
47 | // Write valid. This signal indicates that valid write
48 | // data and strobes are available.
49 | input wire S_AXI_WVALID,
50 | // Write ready. This signal indicates that the slave
51 | // can accept the write data.
52 | output wire S_AXI_WREADY,
53 | // Write response. This signal indicates the status
54 | // of the write transaction.
55 | output wire [1 : 0] S_AXI_BRESP,
56 | // Write response valid. This signal indicates that the channel
57 | // is signaling a valid write response.
58 | output wire S_AXI_BVALID,
59 | // Response ready. This signal indicates that the master
60 | // can accept a write response.
61 | input wire S_AXI_BREADY,
62 | // Read address (issued by master, acceped by Slave)
63 | input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR,
64 | // Protection type. This signal indicates the privilege
65 | // and security level of the transaction, and whether the
66 | // transaction is a data access or an instruction access.
67 | input wire [2 : 0] S_AXI_ARPROT,
68 | // Read address valid. This signal indicates that the channel
69 | // is signaling valid read address and control information.
70 | input wire S_AXI_ARVALID,
71 | // Read address ready. This signal indicates that the slave is
72 | // ready to accept an address and associated control signals.
73 | output wire S_AXI_ARREADY,
74 | // Read data (issued by slave)
75 | output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA,
76 | // Read response. This signal indicates the status of the
77 | // read transfer.
78 | output wire [1 : 0] S_AXI_RRESP,
79 | // Read valid. This signal indicates that the channel is
80 | // signaling the required read data.
81 | output wire S_AXI_RVALID,
82 | // Read ready. This signal indicates that the master can
83 | // accept the read data and response information.
84 | input wire S_AXI_RREADY
85 | );
86 |
87 | // AXI4LITE signals
88 | reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr;
89 | reg axi_awready;
90 | reg axi_wready;
91 | reg [1 : 0] axi_bresp;
92 | reg axi_bvalid;
93 | reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr;
94 | reg axi_arready;
95 | reg [C_S_AXI_DATA_WIDTH-1 : 0] axi_rdata;
96 | reg [1 : 0] axi_rresp;
97 | reg axi_rvalid;
98 |
99 | // Example-specific design signals
100 | // local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH
101 | // ADDR_LSB is used for addressing 32/64 bit registers/memories
102 | // ADDR_LSB = 2 for 32 bits (n downto 2)
103 | // ADDR_LSB = 3 for 64 bits (n downto 3)
104 | localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1;
105 | localparam integer OPT_MEM_ADDR_BITS = 1;
106 | //----------------------------------------------
107 | //-- Signals for user logic register space example
108 | //------------------------------------------------
109 | //-- Number of Slave Registers 4
110 | reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg0;
111 | reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg1;
112 | reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg2;
113 | reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg3;
114 | wire slv_reg_rden;
115 | wire slv_reg_wren;
116 | reg [C_S_AXI_DATA_WIDTH-1:0] reg_data_out;
117 | integer byte_index;
118 | reg aw_en;
119 |
120 | // I/O Connections assignments
121 |
122 | assign S_AXI_AWREADY = axi_awready;
123 | assign S_AXI_WREADY = axi_wready;
124 | assign S_AXI_BRESP = axi_bresp;
125 | assign S_AXI_BVALID = axi_bvalid;
126 | assign S_AXI_ARREADY = axi_arready;
127 | assign S_AXI_RDATA = axi_rdata;
128 | assign S_AXI_RRESP = axi_rresp;
129 | assign S_AXI_RVALID = axi_rvalid;
130 | // Implement axi_awready generation
131 | // axi_awready is asserted for one S_AXI_ACLK clock cycle when both
132 | // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is
133 | // de-asserted when reset is low.
134 |
135 | always @( posedge S_AXI_ACLK )
136 | begin
137 | if ( S_AXI_ARESETN == 1'b0 )
138 | begin
139 | axi_awready <= 1'b0;
140 | aw_en <= 1'b1;
141 | end
142 | else
143 | begin
144 | if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)
145 | begin
146 | // slave is ready to accept write address when
147 | // there is a valid write address and write data
148 | // on the write address and data bus. This design
149 | // expects no outstanding transactions.
150 | axi_awready <= 1'b1;
151 | aw_en <= 1'b0;
152 | end
153 | else if (S_AXI_BREADY && axi_bvalid)
154 | begin
155 | aw_en <= 1'b1;
156 | axi_awready <= 1'b0;
157 | end
158 | else
159 | begin
160 | axi_awready <= 1'b0;
161 | end
162 | end
163 | end
164 |
165 | // Implement axi_awaddr latching
166 | // This process is used to latch the address when both
167 | // S_AXI_AWVALID and S_AXI_WVALID are valid.
168 |
169 | always @( posedge S_AXI_ACLK )
170 | begin
171 | if ( S_AXI_ARESETN == 1'b0 )
172 | begin
173 | axi_awaddr <= 0;
174 | end
175 | else
176 | begin
177 | if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)
178 | begin
179 | // Write Address latching
180 | axi_awaddr <= S_AXI_AWADDR;
181 | end
182 | end
183 | end
184 |
185 | // Implement axi_wready generation
186 | // axi_wready is asserted for one S_AXI_ACLK clock cycle when both
187 | // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is
188 | // de-asserted when reset is low.
189 |
190 | always @( posedge S_AXI_ACLK )
191 | begin
192 | if ( S_AXI_ARESETN == 1'b0 )
193 | begin
194 | axi_wready <= 1'b0;
195 | end
196 | else
197 | begin
198 | if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en )
199 | begin
200 | // slave is ready to accept write data when
201 | // there is a valid write address and write data
202 | // on the write address and data bus. This design
203 | // expects no outstanding transactions.
204 | axi_wready <= 1'b1;
205 | end
206 | else
207 | begin
208 | axi_wready <= 1'b0;
209 | end
210 | end
211 | end
212 |
213 | // Implement memory mapped register select and write logic generation
214 | // The write data is accepted and written to memory mapped registers when
215 | // axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to
216 | // select byte enables of slave registers while writing.
217 | // These registers are cleared when reset (active low) is applied.
218 | // Slave register write enable is asserted when valid address and data are available
219 | // and the slave is ready to accept the write address and write data.
220 | assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;
221 |
222 | always @( posedge S_AXI_ACLK )
223 | begin
224 | if ( S_AXI_ARESETN == 1'b0 )
225 | begin
226 | slv_reg0 <= 0;
227 | slv_reg1 <= 0;
228 | // slv_reg2 <= 0;
229 | // slv_reg3 <= 0;
230 | end
231 | else begin
232 | if (slv_reg_wren)
233 | begin
234 | case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
235 | 2'h0:
236 | for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
237 | if ( S_AXI_WSTRB[byte_index] == 1 ) begin
238 | // Respective byte enables are asserted as per write strobes
239 | // Slave register 0
240 | slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
241 | end
242 | 2'h1:
243 | for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
244 | if ( S_AXI_WSTRB[byte_index] == 1 ) begin
245 | // Respective byte enables are asserted as per write strobes
246 | // Slave register 1
247 | slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
248 | end
249 | // 2'h2:
250 | // for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
251 | // if ( S_AXI_WSTRB[byte_index] == 1 ) begin
252 | // // Respective byte enables are asserted as per write strobes
253 | // // Slave register 2
254 | // slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
255 | // end
256 | // 2'h3:
257 | // for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
258 | // if ( S_AXI_WSTRB[byte_index] == 1 ) begin
259 | // // Respective byte enables are asserted as per write strobes
260 | // // Slave register 3
261 | // slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
262 | // end
263 | default : begin
264 | slv_reg0 <= slv_reg0;
265 | slv_reg1 <= slv_reg1;
266 | // slv_reg2 <= slv_reg2;
267 | // slv_reg3 <= slv_reg3;
268 | end
269 | endcase
270 | end
271 | end
272 | end
273 |
274 | // Implement write response logic generation
275 | // The write response and response valid signals are asserted by the slave
276 | // when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted.
277 | // This marks the acceptance of address and indicates the status of
278 | // write transaction.
279 |
280 | always @( posedge S_AXI_ACLK )
281 | begin
282 | if ( S_AXI_ARESETN == 1'b0 )
283 | begin
284 | axi_bvalid <= 0;
285 | axi_bresp <= 2'b0;
286 | end
287 | else
288 | begin
289 | if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID)
290 | begin
291 | // indicates a valid write response is available
292 | axi_bvalid <= 1'b1;
293 | axi_bresp <= 2'b0; // 'OKAY' response
294 | end // work error responses in future
295 | else
296 | begin
297 | if (S_AXI_BREADY && axi_bvalid)
298 | //check if bready is asserted while bvalid is high)
299 | //(there is a possibility that bready is always asserted high)
300 | begin
301 | axi_bvalid <= 1'b0;
302 | end
303 | end
304 | end
305 | end
306 |
307 | // Implement axi_arready generation
308 | // axi_arready is asserted for one S_AXI_ACLK clock cycle when
309 | // S_AXI_ARVALID is asserted. axi_awready is
310 | // de-asserted when reset (active low) is asserted.
311 | // The read address is also latched when S_AXI_ARVALID is
312 | // asserted. axi_araddr is reset to zero on reset assertion.
313 |
314 | always @( posedge S_AXI_ACLK )
315 | begin
316 | if ( S_AXI_ARESETN == 1'b0 )
317 | begin
318 | axi_arready <= 1'b0;
319 | axi_araddr <= 32'b0;
320 | end
321 | else
322 | begin
323 | if (~axi_arready && S_AXI_ARVALID)
324 | begin
325 | // indicates that the slave has acceped the valid read address
326 | axi_arready <= 1'b1;
327 | // Read address latching
328 | axi_araddr <= S_AXI_ARADDR;
329 | end
330 | else
331 | begin
332 | axi_arready <= 1'b0;
333 | end
334 | end
335 | end
336 |
337 | // Implement axi_arvalid generation
338 | // axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both
339 | // S_AXI_ARVALID and axi_arready are asserted. The slave registers
340 | // data are available on the axi_rdata bus at this instance. The
341 | // assertion of axi_rvalid marks the validity of read data on the
342 | // bus and axi_rresp indicates the status of read transaction.axi_rvalid
343 | // is deasserted on reset (active low). axi_rresp and axi_rdata are
344 | // cleared to zero on reset (active low).
345 | always @( posedge S_AXI_ACLK )
346 | begin
347 | if ( S_AXI_ARESETN == 1'b0 )
348 | begin
349 | axi_rvalid <= 0;
350 | axi_rresp <= 0;
351 | end
352 | else
353 | begin
354 | if (axi_arready && S_AXI_ARVALID && ~axi_rvalid)
355 | begin
356 | // Valid read data is available at the read data bus
357 | axi_rvalid <= 1'b1;
358 | axi_rresp <= 2'b0; // 'OKAY' response
359 | end
360 | else if (axi_rvalid && S_AXI_RREADY)
361 | begin
362 | // Read data is accepted by the master
363 | axi_rvalid <= 1'b0;
364 | end
365 | end
366 | end
367 |
368 | // Implement memory mapped register select and read logic generation
369 | // Slave register read enable is asserted when valid address is available
370 | // and the slave is ready to accept the read address.
371 | assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;
372 | always @(*)
373 | begin
374 | // Address decoding for reading registers
375 | case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
376 | // 2'h0 : reg_data_out <= slv_reg0;
377 | // 2'h1 : reg_data_out <= slv_reg1;
378 | 2'h2 : reg_data_out <= slv_reg2;
379 | 2'h3 : reg_data_out <= slv_reg3;
380 | default : reg_data_out <= 0;
381 | endcase
382 | end
383 |
384 | // Output register or memory read data
385 | always @( posedge S_AXI_ACLK )
386 | begin
387 | if ( S_AXI_ARESETN == 1'b0 )
388 | begin
389 | axi_rdata <= 0;
390 | end
391 | else
392 | begin
393 | // When there is a valid read address (S_AXI_ARVALID) with
394 | // acceptance of read address by the slave (axi_arready),
395 | // output the read dada
396 | if (slv_reg_rden)
397 | begin
398 | axi_rdata <= reg_data_out; // register read data
399 | end
400 | end
401 | end
402 |
403 | // Add user logic here
404 | assign raw_data = slv_reg0[16-1:0];
405 | assign raw_data_valid = slv_reg1[0];
406 |
407 | always@(posedge S_AXI_ACLK) begin
408 | if (~S_AXI_ARESETN) begin
409 | slv_reg2 <= 0;
410 | slv_reg3 <= 0;
411 | end
412 | else if (pre_result_valid) begin
413 | slv_reg2 <= {23'b0, pre_result};
414 | slv_reg3 <= {31'b0, pre_result_valid};
415 | end
416 | end
417 | // User logic ends
418 |
419 | endmodule
420 |
--------------------------------------------------------------------------------
/verilog/sources_1/new/transformer.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 2023/11/13 15:12:34
7 | // Design Name:
8 | // Module Name: transformer
9 | // Project Name:
10 | // Target Devices:
11 | // Tool Versions:
12 | // Description:
13 | //
14 | // Dependencies:
15 | //
16 | // Revision:
17 | // Revision 0.01 - File Created
18 | // Additional Comments:
19 | //
20 | //////////////////////////////////////////////////////////////////////////////////
21 |
22 |
23 | module transformer(
24 | input clk,
25 | input rst_n,
26 |
27 | input [16-1:0] data_in,
28 | input data_in_valid,
29 |
30 | output [9-1:0] data_out,
31 | output data_out_valid
32 | );
33 |
34 | // =========================================================================================================
35 | // ============================================Block 1======================================================
36 | // =========================================================================================================
37 | reg [4:0] block_1_time_step_pre;
38 | reg [4:0] block_1_time_step;
39 | reg [4:0] block_1_time_step_out;
40 |
41 | always @(posedge clk or negedge rst_n) begin
42 | if (~rst_n) begin
43 | block_1_time_step_pre <= 0;
44 | end
45 | else if (data_in_valid) begin
46 | block_1_time_step_pre <= block_1_time_step_pre + 1'b1;
47 | end
48 | end
49 |
50 | always @(posedge clk or negedge rst_n) begin
51 | if (~rst_n) begin
52 | block_1_time_step <= 0;
53 | end
54 | else if (block_1_time_step_pre <= 'd29) begin
55 | block_1_time_step <= block_1_time_step_pre;
56 | end
57 | end
58 |
59 | always @(posedge clk or negedge rst_n) begin
60 | if (~rst_n) begin
61 | block_1_time_step_out <= 0;
62 | end
63 | else if (block_1_time_step_out == 'd29)
64 | block_1_time_step_out <= 'd29;
65 | else if (block_1_valid) begin
66 | block_1_time_step_out <= block_1_time_step_out + 'd1;
67 | end
68 | end
69 |
70 | reg [16-1:0] block_1[30-1:0];
71 | wire [16-1:0] block_1_out;
72 | wire block_1_valid;
73 | wire block_1_done;
74 |
75 | integer i,j;
76 | always@(posedge clk,negedge rst_n) begin
77 | if (~rst_n) begin
78 | for (i = 0; i < 30; i = i + 1) begin
79 | for (j = 0; j < 16; j = j + 1) begin
80 | block_1[i][j] <= 0;
81 | end
82 | end
83 | end
84 | else if (~block_1_done) begin
85 | block_1[block_1_time_step_out] <= block_1_out;
86 | end
87 | end
88 |
89 | // always@(posedge clk,negedge rst_n) begin
90 | // if (~rst_n) begin
91 | // block_1_done <= 0;
92 | // end
93 | // else if (block_1_time_step_out == 'd29) begin
94 | // block_1_done <= 1;
95 | // end
96 | // end
97 |
98 | encoder encoder_block_1(
99 | .clk (clk),
100 | .rst_n (rst_n),
101 |
102 | .data_in (data_in),
103 | .data_in_valid (data_in_valid),
104 | .block_sel (0),
105 |
106 | .data_out (block_1_out),
107 | .data_out_valid (block_1_valid),
108 | .done (block_1_done)
109 | );
110 |
111 | // // =========================================================================================================
112 | // // ============================================Block 2======================================================
113 | // // =========================================================================================================
114 | // reg [4:0] block_2_time_step_pre;
115 | // reg [4:0] block_2_time_step;
116 | // reg [4:0] block_2_time_step_out;
117 |
118 | // always @(posedge clk or negedge rst_n) begin
119 | // if (~rst_n) begin
120 | // block_2_time_step_pre <= 0;
121 | // end
122 | // else if (block_2_time_step_pre == 'd29)
123 | // block_2_time_step_pre <= 'd29;
124 | // else if (block_1_done) begin
125 | // block_2_time_step_pre <= block_2_time_step_pre + 1'b1;
126 | // end
127 | // end
128 |
129 | // always @(posedge clk or negedge rst_n) begin
130 | // if (~rst_n) begin
131 | // block_2_time_step <= 0;
132 | // end
133 | // else if (block_2_time_step_pre <= 'd29) begin
134 | // block_2_time_step <= block_2_time_step_pre;
135 | // end
136 | // end
137 |
138 | // always @(posedge clk or negedge rst_n) begin
139 | // if (~rst_n) begin
140 | // block_2_time_step_out <= 0;
141 | // end
142 | // else if (block_2_time_step_out == 'd29)
143 | // block_2_time_step_out <= 'd29;
144 | // else if (block_2_valid) begin
145 | // block_2_time_step_out <= block_2_time_step_out + 'd1;
146 | // end
147 | // end
148 |
149 | // reg [16-1:0] block_2[30-1:0];
150 | // wire [16-1:0] block_2_out;
151 | // wire block_2_valid;
152 | // wire block_2_done;
153 |
154 | // always@(posedge clk,negedge rst_n) begin
155 | // if (~rst_n) begin
156 | // for (i = 0; i < 30; i = i + 1) begin
157 | // for (j = 0; j < 16; j = j + 1) begin
158 | // block_2[i][j] <= 0;
159 | // end
160 | // end
161 | // end
162 | // else if (~block_2_done) begin
163 | // block_2[block_2_time_step_out] <= block_2_out;
164 | // end
165 | // end
166 |
167 | //// always@(posedge clk,negedge rst_n) begin
168 | //// if (~rst_n) begin
169 | //// block_1_done <= 0;
170 | //// end
171 | //// else if (block_1_time_step_out == 'd29) begin
172 | //// block_1_done <= 1;
173 | //// end
174 | //// end
175 |
176 | // encoder encoder_block_2(
177 | // .clk (clk),
178 | // .rst_n (rst_n),
179 |
180 | // .data_in (block_1[block_2_time_step]),
181 | // .data_in_valid (block_1_done),
182 | // .block_sel (1),
183 |
184 | // .data_out (block_2_out),
185 | // .data_out_valid (block_2_valid),
186 | // .done (block_2_done)
187 | // );
188 |
189 | // // =========================================================================================================
190 | // // ============================================Block 3======================================================
191 | // // =========================================================================================================
192 | // reg [4:0] block_3_time_step_pre;
193 | // reg [4:0] block_3_time_step;
194 | // reg [4:0] block_3_time_step_out;
195 |
196 | // always @(posedge clk or negedge rst_n) begin
197 | // if (~rst_n) begin
198 | // block_3_time_step_pre <= 0;
199 | // end
200 | // else if (block_3_time_step_pre == 'd29)
201 | // block_3_time_step_pre <= 'd29;
202 | // else if (block_2_done) begin
203 | // block_3_time_step_pre <= block_3_time_step_pre + 1'b1;
204 | // end
205 | // end
206 |
207 | // always @(posedge clk or negedge rst_n) begin
208 | // if (~rst_n) begin
209 | // block_3_time_step <= 0;
210 | // end
211 | // else if (block_3_time_step_pre <= 'd29) begin
212 | // block_3_time_step <= block_3_time_step_pre;
213 | // end
214 | // end
215 |
216 | // always @(posedge clk or negedge rst_n) begin
217 | // if (~rst_n) begin
218 | // block_3_time_step_out <= 0;
219 | // end
220 | // else if (block_3_time_step_out == 'd29)
221 | // block_3_time_step_out <= 'd29;
222 | // else if (block_3_valid) begin
223 | // block_3_time_step_out <= block_3_time_step_out + 'd1;
224 | // end
225 | // end
226 |
227 | // reg [16-1:0] block_3[30-1:0];
228 | // wire [16-1:0] block_3_out;
229 | // wire block_3_valid;
230 | // wire block_3_done;
231 |
232 | // always@(posedge clk,negedge rst_n) begin
233 | // if (~rst_n) begin
234 | // for (i = 0; i < 30; i = i + 1) begin
235 | // for (j = 0; j < 16; j = j + 1) begin
236 | // block_3[i][j] <= 0;
237 | // end
238 | // end
239 | // end
240 | // else if (~block_3_done) begin
241 | // block_3[block_3_time_step_out] <= block_3_out;
242 | // end
243 | // end
244 |
245 | // encoder encoder_block_3(
246 | // .clk (clk),
247 | // .rst_n (rst_n),
248 |
249 | // .data_in (block_2[block_3_time_step]),
250 | // .data_in_valid (block_2_done),
251 | // .block_sel (2),
252 |
253 | // .data_out (block_3_out),
254 | // .data_out_valid (block_3_valid),
255 | // .done (block_3_done)
256 | // );
257 |
258 | // // =========================================================================================================
259 | // // ============================================Block 4======================================================
260 | // // =========================================================================================================
261 | // reg [4:0] block_4_time_step_pre;
262 | // reg [4:0] block_4_time_step;
263 | // reg [4:0] block_4_time_step_out;
264 |
265 | // always @(posedge clk or negedge rst_n) begin
266 | // if (~rst_n) begin
267 | // block_4_time_step_pre <= 0;
268 | // end
269 | // else if (block_4_time_step_pre == 'd29)
270 | // block_4_time_step_pre <= 'd29;
271 | // else if (block_3_done) begin
272 | // block_4_time_step_pre <= block_4_time_step_pre + 1'b1;
273 | // end
274 | // end
275 |
276 | // always @(posedge clk or negedge rst_n) begin
277 | // if (~rst_n) begin
278 | // block_4_time_step <= 0;
279 | // end
280 | // else if (block_4_time_step_pre <= 'd29) begin
281 | // block_4_time_step <= block_4_time_step_pre;
282 | // end
283 | // end
284 |
285 | // always @(posedge clk or negedge rst_n) begin
286 | // if (~rst_n) begin
287 | // block_4_time_step_out <= 0;
288 | // end
289 | // else if (block_4_time_step_out == 'd29)
290 | // block_4_time_step_out <= 'd29;
291 | // else if (block_4_valid) begin
292 | // block_4_time_step_out <= block_4_time_step_out + 'd1;
293 | // end
294 | // end
295 |
296 | // reg [16-1:0] block_4[30-1:0];
297 | // wire [16-1:0] block_4_out;
298 | // wire block_4_valid;
299 | // wire block_4_done;
300 |
301 | // always@(posedge clk,negedge rst_n) begin
302 | // if (~rst_n) begin
303 | // for (i = 0; i < 30; i = i + 1) begin
304 | // for (j = 0; j < 16; j = j + 1) begin
305 | // block_4[i][j] <= 0;
306 | // end
307 | // end
308 | // end
309 | // else if (~block_4_done) begin
310 | // block_4[block_4_time_step_out] <= block_4_out;
311 | // end
312 | // end
313 |
314 | // encoder encoder_block_4(
315 | // .clk (clk),
316 | // .rst_n (rst_n),
317 |
318 | // .data_in (block_3[block_4_time_step]),
319 | // .data_in_valid (block_3_done),
320 | // .block_sel (3),
321 |
322 | // .data_out (block_4_out),
323 | // .data_out_valid (block_4_valid),
324 | // .done (block_4_done)
325 | // );
326 |
327 | // // =========================================================================================================
328 | // // ============================================Block 5======================================================
329 | // // =========================================================================================================
330 | // reg [4:0] block_5_time_step_pre;
331 | // reg [4:0] block_5_time_step;
332 | // reg [4:0] block_5_time_step_out;
333 |
334 | // always @(posedge clk or negedge rst_n) begin
335 | // if (~rst_n) begin
336 | // block_5_time_step_pre <= 0;
337 | // end
338 | // else if (block_5_time_step_pre == 'd29)
339 | // block_5_time_step_pre <= 'd29;
340 | // else if (block_4_done) begin
341 | // block_5_time_step_pre <= block_5_time_step_pre + 1'b1;
342 | // end
343 | // end
344 |
345 | // always @(posedge clk or negedge rst_n) begin
346 | // if (~rst_n) begin
347 | // block_5_time_step <= 0;
348 | // end
349 | // else if (block_5_time_step_pre <= 'd29) begin
350 | // block_5_time_step <= block_5_time_step_pre;
351 | // end
352 | // end
353 |
354 | // always @(posedge clk or negedge rst_n) begin
355 | // if (~rst_n) begin
356 | // block_5_time_step_out <= 0;
357 | // end
358 | // else if (block_5_time_step_out == 'd29)
359 | // block_5_time_step_out <= 'd29;
360 | // else if (block_5_valid) begin
361 | // block_5_time_step_out <= block_5_time_step_out + 'd1;
362 | // end
363 | // end
364 |
365 | // reg [16-1:0] block_5[30-1:0];
366 | // wire [16-1:0] block_5_out;
367 | // wire block_5_valid;
368 | // wire block_5_done;
369 |
370 | // always@(posedge clk,negedge rst_n) begin
371 | // if (~rst_n) begin
372 | // for (i = 0; i < 30; i = i + 1) begin
373 | // for (j = 0; j < 16; j = j + 1) begin
374 | // block_5[i][j] <= 0;
375 | // end
376 | // end
377 | // end
378 | // else if (~block_5_done) begin
379 | // block_5[block_5_time_step_out] <= block_5_out;
380 | // end
381 | // end
382 |
383 | // encoder encoder_block_5(
384 | // .clk (clk),
385 | // .rst_n (rst_n),
386 |
387 | // .data_in (block_4[block_5_time_step]),
388 | // .data_in_valid (block_4_done),
389 | // .block_sel (4),
390 |
391 | // .data_out (block_5_out),
392 | // .data_out_valid (block_5_valid),
393 | // .done (block_5_done)
394 | // );
395 |
396 | // // =========================================================================================================
397 | // // ============================================Block 6======================================================
398 | // // =========================================================================================================
399 | // reg [4:0] block_6_time_step_pre;
400 | // reg [4:0] block_6_time_step;
401 | // reg [4:0] block_6_time_step_out;
402 |
403 | // always @(posedge clk or negedge rst_n) begin
404 | // if (~rst_n) begin
405 | // block_6_time_step_pre <= 0;
406 | // end
407 | // else if (block_6_time_step_pre == 'd29)
408 | // block_6_time_step_pre <= 'd29;
409 | // else if (block_5_done) begin
410 | // block_6_time_step_pre <= block_6_time_step_pre + 1'b1;
411 | // end
412 | // end
413 |
414 | // always @(posedge clk or negedge rst_n) begin
415 | // if (~rst_n) begin
416 | // block_6_time_step <= 0;
417 | // end
418 | // else if (block_6_time_step_pre <= 'd29) begin
419 | // block_6_time_step <= block_6_time_step_pre;
420 | // end
421 | // end
422 |
423 | // always @(posedge clk or negedge rst_n) begin
424 | // if (~rst_n) begin
425 | // block_6_time_step_out <= 0;
426 | // end
427 | // else if (block_6_time_step_out == 'd29)
428 | // block_6_time_step_out <= 'd29;
429 | // else if (block_6_valid) begin
430 | // block_6_time_step_out <= block_6_time_step_out + 'd1;
431 | // end
432 | // end
433 |
434 | // reg [16-1:0] block_6[30-1:0];
435 | // wire [16-1:0] block_6_out;
436 | // wire block_6_valid;
437 | // wire block_6_done;
438 |
439 | // always@(posedge clk,negedge rst_n) begin
440 | // if (~rst_n) begin
441 | // for (i = 0; i < 30; i = i + 1) begin
442 | // for (j = 0; j < 16; j = j + 1) begin
443 | // block_6[i][j] <= 0;
444 | // end
445 | // end
446 | // end
447 | // else if (~block_6_done) begin
448 | // block_6[block_6_time_step_out] <= block_6_out;
449 | // end
450 | // end
451 |
452 | // encoder encoder_block_6(
453 | // .clk (clk),
454 | // .rst_n (rst_n),
455 |
456 | // .data_in (block_5[block_6_time_step]),
457 | // .data_in_valid (block_5_done),
458 | // .block_sel (4),
459 |
460 | // .data_out (block_6_out),
461 | // .data_out_valid (block_6_valid),
462 | // .done (block_6_done)
463 | // );
464 |
465 | // =========================================================================================================
466 | // ============================================Flatten======================================================
467 | // =========================================================================================================
468 | reg [480-1:0] data_flatten;
469 | reg data_flatten_done;
470 | always@(posedge clk or negedge rst_n) begin
471 | if (~rst_n) begin
472 | data_flatten_done <= 0;
473 | for (i = 0; i < 30; i = i + 1) begin
474 | for (j = 0; j < 16; j = j + 1) begin
475 | data_flatten[i*16+j] <= 0;
476 | end
477 | end
478 | end
479 | else if (block_1_done) begin
480 | data_flatten_done <= 1;
481 | for (i = 0; i < 30; i = i + 1) begin
482 | for (j = 0; j < 16; j = j + 1) begin
483 | data_flatten[i*16+j] <= block_1[i][j];
484 | end
485 | end
486 | end
487 | end
488 |
489 |
490 | // =========================================================================================================
491 | // ============================================Output 1=====================================================
492 | // =========================================================================================================
493 |
494 | reg [256-1:0] output_1;
495 | wire [8-1:0] output_1_out;
496 | wire [6-1:0] output_1_time_step;
497 | wire output_1_valid;
498 | wire output_1_done;
499 |
500 | always@(posedge clk,negedge rst_n) begin
501 | if (~rst_n) begin
502 | output_1 <= 'd0;
503 | end
504 | else if (~output_1_done) begin
505 | output_1[output_1_time_step*8 +: 8] <= output_1_out;
506 | end
507 | end
508 |
509 | output_1 output_1_U(
510 | .clk (clk),
511 | .rst_n (rst_n),
512 |
513 | .data_in (data_flatten),
514 | .data_in_valid (data_flatten_done),
515 |
516 | .data_out (output_1_out),
517 | .data_out_valid (output_1_valid),
518 | .time_step (output_1_time_step),
519 | .done (output_1_done)
520 | );
521 |
522 | // =========================================================================================================
523 | // ============================================Output 2=====================================================
524 | // =========================================================================================================
525 |
526 | output_2 output_2_U(
527 | .clk (clk),
528 | .rst_n (rst_n),
529 |
530 | .data_in (output_1),
531 | .data_in_valid (output_1_done),
532 |
533 | .data_out (data_out),
534 | .data_out_valid (data_out_valid)
535 | );
536 |
537 |
538 |
539 |
540 |
541 |
542 |
543 |
544 |
545 |
546 |
547 |
548 |
549 | endmodule
550 |
--------------------------------------------------------------------------------