axi_tdl 0.2.0 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/gem-push.yml +46 -28
- data/.github/workflows/ruby.yml +1 -1
- data/.gitignore +2 -1
- data/.travis.yml +1 -0
- data/axi_tdl.gemspec +1 -1
- data/lib/axi/AXI4/axi4_long_to_axi4_wide_B1.sv +5 -3
- data/lib/axi/AXI4/long_axis_to_axi4_wr.rb +1 -0
- data/lib/axi/AXI4/odata_pool_axi4_A4.sv +173 -0
- data/lib/axi/AXI4/packet_fifo/axi4_packet_fifo_B1.sv +66 -0
- data/lib/axi/AXI4/packet_fifo/axi4_rd_packet_fifo_A1.sv +260 -0
- data/lib/axi/AXI4/packet_fifo/axi4_wr_packet_fifo_A1.sv +192 -0
- data/lib/axi/AXI4/wide_axis_to_axi4_wr.sv +1 -1
- data/lib/axi/AXI_stream/axi_stream_split_channel.sv +21 -21
- data/lib/axi/AXI_stream/axi_streams_combin.sv +2 -1
- data/lib/axi/AXI_stream/axi_streams_combin_A1.sv +2 -1
- data/lib/axi/AXI_stream/axi_streams_scaler.sv +2 -1
- data/lib/axi/AXI_stream/axi_streams_scaler_A1.sv +2 -1
- data/lib/axi/AXI_stream/axis_combin_with_fifo.sv +2 -1
- data/lib/axi/AXI_stream/axis_head_cut_verc.rb +2 -0
- data/lib/axi/AXI_stream/gen_big_field_table.sv +3 -2
- data/lib/axi/AXI_stream/packet_fifo/axi_stream_packet_fifo_B1F.sv +129 -0
- data/lib/axi/AXI_stream/parse_big_field_table_main.sv +101 -0
- data/lib/axi/AXI_stream/parse_big_field_table_mirror.sv +94 -0
- data/lib/axi/axi4_to_xilinx_ddr_native/axi4_to_native_for_ddr_ip_C2.sv +75 -0
- data/lib/axi/axi4_to_xilinx_ddr_native/ddr_native_fifo_A2.sv +206 -0
- data/lib/axi/axi4_to_xilinx_ddr_native/ddr_native_fifo_B1.sv +297 -0
- data/lib/axi/axi4_to_xilinx_ddr_native/model_ddr_ip_app.sv +2 -2
- data/lib/axi/common/common_ram_wrapper.sv +1 -1
- data/lib/axi/data_interface/data_inf_c/data_c_pipe_sync_seam.sv +11 -11
- data/lib/axi/data_interface/data_inf_c/data_c_scaler.sv +2 -1
- data/lib/axi/data_interface/data_inf_c/data_c_scaler_A1.sv +2 -1
- data/lib/axi/data_interface/data_streams_combin.sv +2 -1
- data/lib/axi/data_interface/data_streams_combin_A1.sv +2 -1
- data/lib/axi/data_interface/data_streams_scaler.sv +2 -1
- data/lib/axi_tdl/version.rb +1 -1
- data/lib/tdl/axi4/axi4_interconnect_verb.rb +5 -1
- data/lib/tdl/examples/2_hdl_class/tmp/test_vcs_string.sv +1 -1
- data/lib/tdl/examples/8_top_module/test_top.sv +1 -1
- data/lib/tdl/rebuild_ele/ele_base.rb +14 -0
- metadata +13 -3
@@ -0,0 +1,192 @@
|
|
1
|
+
/**********************************************
|
2
|
+
_______________________________________
|
3
|
+
___________ Cook Darwin __________
|
4
|
+
_______________________________________
|
5
|
+
descript:
|
6
|
+
author : Cook.Darwin
|
7
|
+
Version: VERA.1.0
|
8
|
+
longer fifo
|
9
|
+
creaded: 2017/2/28
|
10
|
+
madified:
|
11
|
+
***********************************************/
|
12
|
+
`timescale 1ns/1ps
|
13
|
+
module axi4_wr_packet_fifo_A1 #(
|
14
|
+
parameter PIPE = "OFF",
|
15
|
+
parameter DEPTH = 4,
|
16
|
+
parameter MAX_DATA_LEN = 1024*16
|
17
|
+
)(
|
18
|
+
axi_inf.slaver_wr axi_in,
|
19
|
+
axi_inf.master_wr axi_out
|
20
|
+
);
|
21
|
+
|
22
|
+
//--->> AUXILIARY <<------------------
|
23
|
+
logic auxiliary_fifo_empty;
|
24
|
+
logic auxiliary_fifo_full;
|
25
|
+
logic auxiliary_fifo_wr_en;
|
26
|
+
logic auxiliary_fifo_rd_en;
|
27
|
+
logic [axi_in.ASIZE+axi_in.LSIZE+axi_in.IDSIZE-1:0] auxiliary_fifo_rd_data;
|
28
|
+
|
29
|
+
independent_clock_fifo #(
|
30
|
+
.DEPTH (DEPTH ),
|
31
|
+
.DSIZE (axi_in.ASIZE+axi_in.LSIZE+axi_in.IDSIZE)
|
32
|
+
)auxiliary_independent_clock_fifo_inst(
|
33
|
+
/* input */ .wr_clk (axi_in.axi_aclk ),
|
34
|
+
/* input */ .wr_rst_n (axi_in.axi_aresetn ),
|
35
|
+
/* input */ .rd_clk (axi_out.axi_aclk ),
|
36
|
+
/* input */ .rd_rst_n (axi_out.axi_aresetn ),
|
37
|
+
/* input [DSIZE-1:0] */ .wdata ({axi_in.axi_awid,axi_in.axi_awaddr,axi_in.axi_awlen}),
|
38
|
+
/* input */ .wr_en (axi_in.axi_awvalid ),
|
39
|
+
/* output logic[DSIZE-1:0] */ .rdata (auxiliary_fifo_rd_data ),
|
40
|
+
/* input */ .rd_en ((auxiliary_fifo_rd_en && !auxiliary_fifo_empty) ),
|
41
|
+
/* output logic */ .empty (auxiliary_fifo_empty ),
|
42
|
+
/* output logic */ .full (auxiliary_fifo_full )
|
43
|
+
);
|
44
|
+
|
45
|
+
assign axi_in.axi_awready = !auxiliary_fifo_full;
|
46
|
+
// assign axi_out.axi_awvalid = !auxiliary_fifo_empty && axi_out.axi_wvalid;
|
47
|
+
// assign auxiliary_fifo_rd_en = axi_out.axi_awready && axi_out.axi_awvalid;
|
48
|
+
|
49
|
+
logic stream_fifo_empty;
|
50
|
+
|
51
|
+
axi_stream_inf #(.DSIZE(axi_in.ASIZE+axi_in.LSIZE+axi_in.IDSIZE)) id_add_len_in(.aclk(axi_out.axi_aclk),.aresetn(axi_out.axi_aresetn),.aclken(1'b1));
|
52
|
+
|
53
|
+
assign id_add_len_in.axis_tdata = auxiliary_fifo_rd_data;
|
54
|
+
assign id_add_len_in.axis_tvalid = !auxiliary_fifo_empty && !stream_fifo_empty;
|
55
|
+
assign id_add_len_in.axis_tlast = 1'b1;
|
56
|
+
assign auxiliary_fifo_rd_en = id_add_len_in.axis_tready && !stream_fifo_empty;
|
57
|
+
|
58
|
+
logic axi_stream_en;
|
59
|
+
`VCS_AXI4_CPT_LT(axi_out,master_wr_aux_no_resp,master_wr,Aux_Write)
|
60
|
+
axi4_wr_auxiliary_gen_without_resp axi4_wr_auxiliary_gen_without_resp_inst(
|
61
|
+
/* axi_stream_inf.slaver */ .id_add_len_in (id_add_len_in ), //tlast is not necessary
|
62
|
+
// /* axi_inf.master_wr_aux_no_resp */ .axi_wr_aux (axi_out ),
|
63
|
+
/* axi_inf.master_wr_aux_no_resp */ .axi_wr_aux (`axi_out_vcs_cptAux_Write ),
|
64
|
+
/* output logic */ .stream_en (axi_stream_en )
|
65
|
+
);
|
66
|
+
//---<< AUXILIARY >>------------------
|
67
|
+
//--->> BRESP<<------------------
|
68
|
+
logic resp_fifo_empty;
|
69
|
+
logic resp_fifo_full;
|
70
|
+
|
71
|
+
independent_clock_fifo #(
|
72
|
+
.DEPTH (DEPTH ),
|
73
|
+
.DSIZE (2+axi_in.IDSIZE)
|
74
|
+
)bresp_independent_clock_fifo_inst(
|
75
|
+
/* input */ .wr_clk (axi_out.axi_aclk ),
|
76
|
+
/* input */ .wr_rst_n (axi_out.axi_aresetn ),
|
77
|
+
/* input */ .rd_clk (axi_in.axi_aclk ),
|
78
|
+
/* input */ .rd_rst_n (axi_in.axi_aresetn ),
|
79
|
+
/* input [DSIZE-1:0] */ .wdata ({axi_out.axi_bresp,axi_out.axi_bid} ),
|
80
|
+
/* input */ .wr_en (axi_out.axi_bvalid ),
|
81
|
+
/* output logic[DSIZE-1:0] */ .rdata ({axi_in.axi_bresp,axi_in.axi_bid} ),
|
82
|
+
/* input */ .rd_en (axi_in.axi_bready ),
|
83
|
+
/* output logic */ .empty (resp_fifo_empty ),
|
84
|
+
/* output logic */ .full (resp_fifo_full )
|
85
|
+
);
|
86
|
+
|
87
|
+
assign axi_out.axi_bready = !resp_fifo_full;
|
88
|
+
assign axi_in.axi_bvalid = !resp_fifo_empty;
|
89
|
+
//---<< BRESP >>------------------
|
90
|
+
//--->> DATA <<-----------------------
|
91
|
+
axi_stream_inf #(
|
92
|
+
.DSIZE(axi_in.DSIZE)
|
93
|
+
)axis_in(
|
94
|
+
.aclk (axi_in.axi_aclk ),
|
95
|
+
.aresetn (axi_in.axi_aresetn ),
|
96
|
+
.aclken (1'b1 )
|
97
|
+
);
|
98
|
+
|
99
|
+
axi_stream_inf #(
|
100
|
+
.DSIZE(axi_out.DSIZE)
|
101
|
+
)axis_valve_slaver(
|
102
|
+
.aclk (axi_out.axi_aclk ),
|
103
|
+
.aresetn (axi_out.axi_aresetn ),
|
104
|
+
.aclken (1'b1 )
|
105
|
+
);
|
106
|
+
|
107
|
+
axi_stream_inf #(
|
108
|
+
.DSIZE(axi_out.DSIZE)
|
109
|
+
)axis_out(
|
110
|
+
.aclk (axi_out.axi_aclk ),
|
111
|
+
.aresetn (axi_out.axi_aresetn ),
|
112
|
+
.aclken (1'b1 )
|
113
|
+
);
|
114
|
+
|
115
|
+
data_inf_c #(axi_out.DSIZE+1) axis_out_master_inf (axi_out.axi_aclk,axi_out.axi_aresetn);
|
116
|
+
data_inf_c #(axi_out.DSIZE+1) axis_out_slaver_inf (axi_out.axi_aclk,axi_out.axi_aresetn);
|
117
|
+
|
118
|
+
axi_stream_inf #(
|
119
|
+
.DSIZE(axi_out.DSIZE)
|
120
|
+
)pre_axis_out(
|
121
|
+
.aclk (axi_out.axi_aclk ),
|
122
|
+
.aresetn (axi_out.axi_aresetn ),
|
123
|
+
.aclken (1'b1 )
|
124
|
+
);
|
125
|
+
|
126
|
+
// axi_stream_packet_fifo #(
|
127
|
+
// .DEPTH (DEPTH) //2-4
|
128
|
+
// )axi_stream_packet_fifo_inst(
|
129
|
+
// /* axi_stream_inf.slaver */ .axis_in (axis_in ),
|
130
|
+
// /* axi_stream_inf.master */ .axis_out (axis_valve_slaver )
|
131
|
+
// );
|
132
|
+
|
133
|
+
axi_stream_packet_long_fifo #(
|
134
|
+
.DEPTH (DEPTH), //2-4
|
135
|
+
.BYTE_DEPTH (MAX_DATA_LEN)
|
136
|
+
)axi_stream_packet_fifo_inst(
|
137
|
+
/* axi_stream_inf.slaver */ .axis_in (axis_in ),
|
138
|
+
/* axi_stream_inf.master */ .axis_out (axis_valve_slaver )
|
139
|
+
);
|
140
|
+
|
141
|
+
assign stream_fifo_empty = !axis_valve_slaver.axis_tvalid;
|
142
|
+
|
143
|
+
generate
|
144
|
+
if(PIPE == "ON")begin
|
145
|
+
axis_valve_with_pipe axis_valve_inst(
|
146
|
+
// axis_valve axis_valve_inst(
|
147
|
+
/* input */ .button (axi_stream_en ), //[1] OPEN ; [0] CLOSE
|
148
|
+
/* axi_stream_inf.slaver */ .axis_in (axis_valve_slaver ),
|
149
|
+
/* axi_stream_inf.master */ .axis_out (pre_axis_out )
|
150
|
+
);
|
151
|
+
|
152
|
+
assign axis_out_slaver_inf.valid = pre_axis_out.axis_tvalid;
|
153
|
+
assign axis_out_slaver_inf.data = {pre_axis_out.axis_tdata,pre_axis_out.axis_tlast};
|
154
|
+
assign pre_axis_out.axis_tready = axis_out_slaver_inf.ready;
|
155
|
+
|
156
|
+
data_c_pipe_force_vld data_c_pipe_force_vld_inst(
|
157
|
+
/* data_inf_c.slaver */ .slaver (axis_out_slaver_inf ),
|
158
|
+
/* data_inf_c.master */ .master (axis_out_master_inf )
|
159
|
+
);
|
160
|
+
|
161
|
+
assign axis_out.axis_tvalid = axis_out_master_inf.valid;
|
162
|
+
assign {axis_out.axis_tdata,axis_out.axis_tlast} = axis_out_master_inf.data;
|
163
|
+
assign axis_out_master_inf.ready = axis_out.axis_tready;
|
164
|
+
|
165
|
+
end else
|
166
|
+
axis_valve axis_valve_inst(
|
167
|
+
/* input */ .button (axi_stream_en ), //[1] OPEN ; [0] CLOSE
|
168
|
+
/* axi_stream_inf.slaver */ .axis_in (axis_valve_slaver ),
|
169
|
+
/* axi_stream_inf.master */ .axis_out (axis_out )
|
170
|
+
);
|
171
|
+
endgenerate
|
172
|
+
|
173
|
+
assign axis_in.axis_tvalid = axi_in.axi_wvalid;
|
174
|
+
assign axis_in.axis_tdata = axi_in.axi_wdata;
|
175
|
+
assign axis_in.axis_tlast = axi_in.axi_wlast;
|
176
|
+
assign axis_in.axis_tkeep = '1;
|
177
|
+
assign axis_in.axis_tuser = '0;
|
178
|
+
assign axi_in.axi_wready = axis_in.axis_tready;
|
179
|
+
|
180
|
+
assign axi_out.axi_wvalid = axis_out.axis_tvalid;
|
181
|
+
assign axi_out.axi_wdata = axis_out.axis_tdata;
|
182
|
+
assign axi_out.axi_wlast = axis_out.axis_tlast;
|
183
|
+
assign axis_out.axis_tready= axi_out.axi_wready;
|
184
|
+
//---<< DATA >>-----------------------
|
185
|
+
|
186
|
+
// axi4_wr_burst_track #(
|
187
|
+
// .MAX_LEN (16 ),
|
188
|
+
// .MAX_CYCLE (1000 )
|
189
|
+
// )axi4_wr_burst_track_inst(
|
190
|
+
// /* axi_inf.mirror_wr */ .axi4_mirror (axi_in )
|
191
|
+
// );
|
192
|
+
endmodule
|
@@ -4,7 +4,7 @@ ___________ Cook Darwin __________
|
|
4
4
|
_______________________________________
|
5
5
|
descript:
|
6
6
|
author : Cook.Darwin
|
7
|
-
Version:
|
7
|
+
Version:
|
8
8
|
creaded: XXXX.XX.XX
|
9
9
|
madified:
|
10
10
|
***********************************************/
|
@@ -55,22 +55,22 @@ axis_direct axis_direct_end_inf_inst0 (
|
|
55
55
|
);
|
56
56
|
//-------- CLOCKs Total 3 ----------------------
|
57
57
|
//--->> CheckClock <<----------------
|
58
|
-
logic
|
59
|
-
integer
|
60
|
-
ClockSameDomain
|
58
|
+
logic cc_done_8,cc_same_8;
|
59
|
+
integer cc_afreq_8,cc_bfreq_8;
|
60
|
+
ClockSameDomain CheckPClock_inst_8(
|
61
61
|
/* input */ .aclk (origin_inf.aclk ),
|
62
62
|
/* input */ .bclk (first_inf.aclk ),
|
63
|
-
/* output logic */ .done (
|
64
|
-
/* output logic */ .same (
|
65
|
-
/* output integer */ .aFreqK (
|
66
|
-
/* output integer */ .bFreqK (
|
63
|
+
/* output logic */ .done (cc_done_8),
|
64
|
+
/* output logic */ .same (cc_same_8),
|
65
|
+
/* output integer */ .aFreqK (cc_afreq_8),
|
66
|
+
/* output integer */ .bFreqK (cc_bfreq_8)
|
67
67
|
);
|
68
68
|
|
69
69
|
initial begin
|
70
|
-
wait(
|
71
|
-
assert(
|
70
|
+
wait(cc_done_8);
|
71
|
+
assert(cc_same_8)
|
72
72
|
else begin
|
73
|
-
$error("--- Error : `axi_stream_split_channel` clock is not same, origin_inf.aclk< %0f M> != first_inf.aclk<%0f M>",1000000.0/
|
73
|
+
$error("--- Error : `axi_stream_split_channel` clock is not same, origin_inf.aclk< %0f M> != first_inf.aclk<%0f M>",1000000.0/cc_afreq_8, 1000000.0/cc_bfreq_8);
|
74
74
|
repeat(10)begin
|
75
75
|
@(posedge origin_inf.aclk);
|
76
76
|
end
|
@@ -80,22 +80,22 @@ end
|
|
80
80
|
//---<< CheckClock >>----------------
|
81
81
|
|
82
82
|
//--->> CheckClock <<----------------
|
83
|
-
logic
|
84
|
-
integer
|
85
|
-
ClockSameDomain
|
83
|
+
logic cc_done_9,cc_same_9;
|
84
|
+
integer cc_afreq_9,cc_bfreq_9;
|
85
|
+
ClockSameDomain CheckPClock_inst_9(
|
86
86
|
/* input */ .aclk (origin_inf.aclk ),
|
87
87
|
/* input */ .bclk (end_inf.aclk ),
|
88
|
-
/* output logic */ .done (
|
89
|
-
/* output logic */ .same (
|
90
|
-
/* output integer */ .aFreqK (
|
91
|
-
/* output integer */ .bFreqK (
|
88
|
+
/* output logic */ .done (cc_done_9),
|
89
|
+
/* output logic */ .same (cc_same_9),
|
90
|
+
/* output integer */ .aFreqK (cc_afreq_9),
|
91
|
+
/* output integer */ .bFreqK (cc_bfreq_9)
|
92
92
|
);
|
93
93
|
|
94
94
|
initial begin
|
95
|
-
wait(
|
96
|
-
assert(
|
95
|
+
wait(cc_done_9);
|
96
|
+
assert(cc_same_9)
|
97
97
|
else begin
|
98
|
-
$error("--- Error : `axi_stream_split_channel` clock is not same, origin_inf.aclk< %0f M> != end_inf.aclk<%0f M>",1000000.0/
|
98
|
+
$error("--- Error : `axi_stream_split_channel` clock is not same, origin_inf.aclk< %0f M> != end_inf.aclk<%0f M>",1000000.0/cc_afreq_9, 1000000.0/cc_bfreq_9);
|
99
99
|
repeat(10)begin
|
100
100
|
@(posedge origin_inf.aclk);
|
101
101
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
/**********************************************
|
2
2
|
_______________________________________
|
3
3
|
___________ Cook Darwin __________
|
4
|
-
|
4
|
+
_______________________________________
|
5
|
+
descript:
|
5
6
|
author : Cook.Darwin
|
6
7
|
Version: VERA.0.0
|
7
8
|
build from axi_streams_scaler
|
@@ -1,7 +1,8 @@
|
|
1
1
|
/**********************************************
|
2
2
|
_______________________________________
|
3
3
|
___________ Cook Darwin __________
|
4
|
-
|
4
|
+
_______________________________________
|
5
|
+
descript:
|
5
6
|
author : Cook.Darwin
|
6
7
|
Version: VERA.0.0
|
7
8
|
build from axi_streams_scaler
|
@@ -1,7 +1,8 @@
|
|
1
1
|
/**********************************************
|
2
2
|
_______________________________________
|
3
3
|
___________ Cook Darwin __________
|
4
|
-
|
4
|
+
_______________________________________
|
5
|
+
descript:
|
5
6
|
author : Cook.Darwin
|
6
7
|
Version: VERA.0.0
|
7
8
|
creaded: 2016/12/9
|
@@ -1,7 +1,8 @@
|
|
1
1
|
/**********************************************
|
2
2
|
_______________________________________
|
3
3
|
___________ Cook Darwin __________
|
4
|
-
|
4
|
+
_______________________________________
|
5
|
+
descript:
|
5
6
|
author : Cook.Darwin
|
6
7
|
Version: VERA.1.0 2018-4-16 12:13:05
|
7
8
|
use data_c_scaler
|
@@ -1,7 +1,8 @@
|
|
1
1
|
/**********************************************
|
2
2
|
_______________________________________
|
3
3
|
___________ Cook Darwin __________
|
4
|
-
|
4
|
+
_______________________________________
|
5
|
+
descript:
|
5
6
|
author : Cook.Darwin
|
6
7
|
Version: VERA.0.0
|
7
8
|
creaded: 2017/3/23
|
@@ -34,9 +34,10 @@ logic [DSIZE*16*8-1:0] value_tmp;
|
|
34
34
|
|
35
35
|
// assign value_tmp = {value,{(16*8-FIELD_LEN){1'b0}}};
|
36
36
|
generate
|
37
|
-
if(FIELD_LEN < 128)
|
37
|
+
if(FIELD_LEN < 128)begin
|
38
38
|
assign value_tmp[DSIZE*16*8-1-:DSIZE*FIELD_LEN] = value;
|
39
|
-
|
39
|
+
assign value_tmp[DSIZE*16*8-1-DSIZE*FIELD_LEN:0] = '0;
|
40
|
+
end else
|
40
41
|
assign value_tmp = value;
|
41
42
|
endgenerate
|
42
43
|
|
@@ -0,0 +1,129 @@
|
|
1
|
+
/**********************************************
|
2
|
+
_______________________________________
|
3
|
+
___________ Cook Darwin __________
|
4
|
+
_______________________________________
|
5
|
+
descript:
|
6
|
+
author : Cook.Darwin
|
7
|
+
Version: VERB.0.0 :
|
8
|
+
add custom signalssync to last
|
9
|
+
Version: VERB.1.0 :2017/3/15
|
10
|
+
add empty size
|
11
|
+
Version: VERB.1.1 :2017/11/3
|
12
|
+
user xilinx_fifo_verb
|
13
|
+
Version: VERB.1.F
|
14
|
+
longer fifo
|
15
|
+
creaded:
|
16
|
+
madified:
|
17
|
+
***********************************************/
|
18
|
+
`timescale 1ns/1ps
|
19
|
+
module axi_stream_packet_fifo_B1F #(
|
20
|
+
parameter DEPTH = 2, //2-4
|
21
|
+
parameter CSIZE = 1,
|
22
|
+
parameter DSIZE = 24,
|
23
|
+
parameter MAX_DATA_LEN = 1024*16
|
24
|
+
)(
|
25
|
+
input [CSIZE-1:0] in_cdata,
|
26
|
+
output[CSIZE-1:0] out_cdata,
|
27
|
+
axi_stream_inf.slaver slaver_inf,
|
28
|
+
axi_stream_inf.master master_inf
|
29
|
+
);
|
30
|
+
|
31
|
+
|
32
|
+
parameter LSIZE = $clog2(1024+1);
|
33
|
+
|
34
|
+
logic data_fifo_full;
|
35
|
+
logic data_fifo_empty;
|
36
|
+
|
37
|
+
|
38
|
+
long_fifo_verb #(
|
39
|
+
.DSIZE (DSIZE ),
|
40
|
+
.LENGTH (MAX_DATA_LEN )
|
41
|
+
)long_fifo_verb_inst(
|
42
|
+
/* input */ .wr_clk (slaver_inf.aclk ),
|
43
|
+
/* input */ .wr_rst (!slaver_inf.aresetn ),
|
44
|
+
/* input */ .rd_clk (master_inf.aclk ),
|
45
|
+
/* input */ .rd_rst (!master_inf.aresetn ),
|
46
|
+
/* input [DSIZE-1:0] */ .din (slaver_inf.axis_tdata ),
|
47
|
+
/* input */ .wr_en ((slaver_inf.axis_tvalid && slaver_inf.axis_tready) ),
|
48
|
+
/* input */ .rd_en ((master_inf.axis_tvalid && master_inf.axis_tready) ),
|
49
|
+
/* output [DSIZE-1:0] */ .dout (master_inf.axis_tdata ),
|
50
|
+
/* output */ .full (data_fifo_full ),
|
51
|
+
/* output */ .empty (data_fifo_empty )
|
52
|
+
);
|
53
|
+
|
54
|
+
//---<< NATIVE FIFO IP >>------------------------------
|
55
|
+
|
56
|
+
//--->> PACKET <<--------------------------------------
|
57
|
+
logic packet_fifo_full;
|
58
|
+
logic packet_fifo_empty;
|
59
|
+
logic [15:0] w_bytes_total;
|
60
|
+
logic [15:0] r_bytes_total;
|
61
|
+
logic w_total_eq_1;
|
62
|
+
logic r_total_eq_1;
|
63
|
+
|
64
|
+
// assign w_total_eq_1 = w_bytes_total=='0;
|
65
|
+
assign w_total_eq_1 = slaver_inf.axis_tcnt =='0;
|
66
|
+
|
67
|
+
localparam IDEPTH = (DEPTH<4)? 4 : DEPTH;
|
68
|
+
|
69
|
+
independent_clock_fifo #(
|
70
|
+
.DEPTH (IDEPTH ),
|
71
|
+
.DSIZE (16+1+CSIZE )
|
72
|
+
)common_independent_clock_fifo_inst(
|
73
|
+
/* input */ .wr_clk (slaver_inf.aclk ),
|
74
|
+
/* input */ .wr_rst_n (slaver_inf.aresetn ),
|
75
|
+
/* input */ .rd_clk (master_inf.aclk ),
|
76
|
+
/* input */ .rd_rst_n (master_inf.aresetn ),
|
77
|
+
/* input [DSIZE-1:0] */ .wdata ({w_total_eq_1,w_bytes_total,in_cdata} ),
|
78
|
+
/* input */ .wr_en ((slaver_inf.axis_tvalid && slaver_inf.axis_tlast && slaver_inf.axis_tready) ),
|
79
|
+
/* output logic[DSIZE-1:0] */ .rdata ({r_total_eq_1,r_bytes_total,out_cdata} ),
|
80
|
+
/* input */ .rd_en ((master_inf.axis_tvalid && master_inf.axis_tlast && master_inf.axis_tready) ),
|
81
|
+
/* output logic */ .empty (packet_fifo_empty ),
|
82
|
+
/* output logic */ .full (packet_fifo_full )
|
83
|
+
);
|
84
|
+
|
85
|
+
assign slaver_inf.axis_tready = !packet_fifo_full && !data_fifo_full;
|
86
|
+
assign master_inf.axis_tvalid = !packet_fifo_empty && !data_fifo_empty;
|
87
|
+
//---<< PACKET >>--------------------------------------
|
88
|
+
//--->> bytes counter <<-------------------------------
|
89
|
+
logic reset_w_bytes;
|
90
|
+
assign #1 reset_w_bytes = slaver_inf.axis_tvalid && slaver_inf.axis_tlast && slaver_inf.axis_tready;
|
91
|
+
|
92
|
+
always@(posedge slaver_inf.aclk,negedge slaver_inf.aresetn)
|
93
|
+
if(~slaver_inf.aresetn) w_bytes_total <= '0;
|
94
|
+
else begin
|
95
|
+
if(reset_w_bytes)
|
96
|
+
w_bytes_total <= '0;
|
97
|
+
else if(slaver_inf.axis_tvalid && slaver_inf.axis_tready)
|
98
|
+
w_bytes_total <= w_bytes_total + 1'b1;
|
99
|
+
else w_bytes_total <= w_bytes_total;
|
100
|
+
end
|
101
|
+
|
102
|
+
logic [15:0] out_cnt;
|
103
|
+
|
104
|
+
always@(posedge master_inf.aclk,negedge master_inf.aresetn)
|
105
|
+
if(~master_inf.aresetn) out_cnt <= '0;
|
106
|
+
else begin
|
107
|
+
if(master_inf.axis_tvalid && master_inf.axis_tlast && master_inf.axis_tready)
|
108
|
+
out_cnt <= '0;
|
109
|
+
else if(master_inf.axis_tvalid && master_inf.axis_tready)
|
110
|
+
out_cnt <= out_cnt + 1'b1;
|
111
|
+
else out_cnt <= out_cnt;
|
112
|
+
end
|
113
|
+
//---<< bytes counter >>-------------------------------
|
114
|
+
//--->> READ LAST <<-----------------------------------
|
115
|
+
logic native_last;
|
116
|
+
|
117
|
+
always@(posedge master_inf.aclk,negedge master_inf.aresetn)
|
118
|
+
if(~master_inf.aresetn) native_last <= 1'b0;
|
119
|
+
else begin
|
120
|
+
if(master_inf.axis_tvalid && native_last && master_inf.axis_tready)
|
121
|
+
native_last <= 1'b0;
|
122
|
+
else if(out_cnt == (r_bytes_total-1) && master_inf.axis_tvalid && master_inf.axis_tready)
|
123
|
+
native_last <= 1'b1;
|
124
|
+
else native_last <= native_last;
|
125
|
+
end
|
126
|
+
|
127
|
+
assign master_inf.axis_tlast = native_last || r_total_eq_1;
|
128
|
+
//---<< READ LAST >>-----------------------------------
|
129
|
+
endmodule
|
@@ -0,0 +1,101 @@
|
|
1
|
+
/**********************************************
|
2
|
+
_______________________________________
|
3
|
+
___________ Cook Darwin __________
|
4
|
+
_______________________________________
|
5
|
+
descript: 解析大块的值域用于 common_frame_table
|
6
|
+
author : Cook.Darwin
|
7
|
+
Version: VERA.2.0 2017/9/11
|
8
|
+
resever value
|
9
|
+
Version: VERA.2.0 2017/12/11
|
10
|
+
use parse_common_frame_table_A2
|
11
|
+
Version: VERB.0.0 ###### Tue Oct 20 09:42:34 CST 2020
|
12
|
+
rebuild
|
13
|
+
creaded: 2016/12/22
|
14
|
+
madified:
|
15
|
+
***********************************************/
|
16
|
+
`timescale 1ns/1ps
|
17
|
+
module parse_big_field_table_main #(
|
18
|
+
parameter DSIZE = 8,
|
19
|
+
parameter FIELD_LEN = 16*8, //MAX 16*8
|
20
|
+
parameter START_INDEX = 0
|
21
|
+
)(
|
22
|
+
output logic[START_INDEX:DSIZE*FIELD_LEN-1] value,
|
23
|
+
output logic out_valid,
|
24
|
+
axi_stream_inf.slaver cm_tb_s,
|
25
|
+
axi_stream_inf.master cm_tb_m
|
26
|
+
);
|
27
|
+
|
28
|
+
localparam VSIZE = $clog2(FIELD_LEN);
|
29
|
+
|
30
|
+
import SystemPkg::*;
|
31
|
+
|
32
|
+
initial begin
|
33
|
+
assert(DSIZE == cm_tb_s.DSIZE)
|
34
|
+
else begin
|
35
|
+
$error("DSIZE<%d> != stream.DSIZE<%d>",DSIZE, cm_tb_s.DSIZE);
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
wire clock,rst_n,clken;
|
40
|
+
|
41
|
+
axi_stream_inf #(.DSIZE(DSIZE)) parse_stream (.aclk(clock),.aresetn(rst_n),.aclken(clken));
|
42
|
+
|
43
|
+
assign clock = cm_tb_s.aclk;
|
44
|
+
assign rst_n = cm_tb_s.aresetn;
|
45
|
+
assign clken = cm_tb_s.aclken;
|
46
|
+
|
47
|
+
|
48
|
+
assign parse_stream.axis_tkeep = cm_tb_s.axis_tkeep ;
|
49
|
+
assign parse_stream.axis_tuser = cm_tb_s.axis_tuser ;
|
50
|
+
assign parse_stream.axis_tlast = cm_tb_s.axis_tlast ;
|
51
|
+
assign parse_stream.axis_tdata = cm_tb_s.axis_tdata ;
|
52
|
+
assign parse_stream.axis_tvalid= cm_tb_s.axis_tvalid;
|
53
|
+
assign parse_stream.axis_tready= cm_tb_m.axis_tready;
|
54
|
+
assign cm_tb_s.axis_tready = cm_tb_m.axis_tready;
|
55
|
+
|
56
|
+
|
57
|
+
logic region_valid;
|
58
|
+
|
59
|
+
always_ff@(posedge clock,negedge rst_n)begin
|
60
|
+
if(~rst_n) region_valid <= 1'b1;
|
61
|
+
else begin
|
62
|
+
if(parse_stream.axis_tvalid && parse_stream.axis_tready && parse_stream.axis_tlast)
|
63
|
+
region_valid <= 1'b1;
|
64
|
+
else if(parse_stream.axis_tvalid && parse_stream.axis_tready && parse_stream.axis_tcnt[VSIZE:0] == (FIELD_LEN-1'b1))
|
65
|
+
region_valid <= 1'b0;
|
66
|
+
else region_valid <= region_valid;
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
logic[DSIZE-1:0] value_array [0:FIELD_LEN-1];
|
72
|
+
|
73
|
+
always_ff@(posedge clock,negedge rst_n)begin
|
74
|
+
if(~rst_n)
|
75
|
+
foreach(value_array[i])
|
76
|
+
value_array[i] <= '0;
|
77
|
+
else begin
|
78
|
+
if(region_valid)begin
|
79
|
+
value_array[parse_stream.axis_tcnt[VSIZE-1:0]] <= parse_stream.axis_tdata;
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
assign value = {>>{value_array}};
|
85
|
+
|
86
|
+
always_ff@(posedge clock,negedge rst_n)begin
|
87
|
+
if(~rst_n) out_valid <= 1'b0;
|
88
|
+
else begin
|
89
|
+
if(parse_stream.axis_tvalid && parse_stream.axis_tready && parse_stream.axis_tlast)
|
90
|
+
if(out_valid)
|
91
|
+
out_valid <= 1'b0;
|
92
|
+
else out_valid <= 1'b1;
|
93
|
+
else if(parse_stream.axis_tvalid && parse_stream.axis_tready && parse_stream.axis_tcnt[VSIZE:0] == (FIELD_LEN-1'b1))
|
94
|
+
out_valid <= 1'b1;
|
95
|
+
else if(region_valid)
|
96
|
+
out_valid <= 1'b0;
|
97
|
+
else out_valid <= out_valid;
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
endmodule
|
@@ -0,0 +1,94 @@
|
|
1
|
+
/**********************************************
|
2
|
+
_______________________________________
|
3
|
+
___________ Cook Darwin __________
|
4
|
+
_______________________________________
|
5
|
+
descript: 解析大块的值域用于 common_frame_table
|
6
|
+
author : Cook.Darwin
|
7
|
+
Version: VERA.2.0 2017/9/11
|
8
|
+
resever value
|
9
|
+
Version: VERA.2.0 2017/12/11
|
10
|
+
use parse_common_frame_table_A2
|
11
|
+
Version: VERB.0.0 ###### Tue Oct 20 09:42:34 CST 2020
|
12
|
+
rebuild
|
13
|
+
creaded: 2016/12/22
|
14
|
+
madified:
|
15
|
+
***********************************************/
|
16
|
+
`timescale 1ns/1ps
|
17
|
+
module parse_big_field_table_mirror #(
|
18
|
+
parameter DSIZE = 8,
|
19
|
+
parameter FIELD_LEN = 16*8, //MAX 16*8
|
20
|
+
parameter START_INDEX = 0
|
21
|
+
)(
|
22
|
+
output logic[START_INDEX:DSIZE*FIELD_LEN-1] value,
|
23
|
+
output logic out_valid,
|
24
|
+
axi_stream_inf.mirror cm_mirror
|
25
|
+
);
|
26
|
+
|
27
|
+
localparam VSIZE = $clog2(FIELD_LEN);
|
28
|
+
|
29
|
+
import SystemPkg::*;
|
30
|
+
|
31
|
+
|
32
|
+
wire clock,rst_n,clken;
|
33
|
+
|
34
|
+
axi_stream_inf #(.DSIZE(DSIZE)) parse_stream (.aclk(clock),.aresetn(rst_n),.aclken(clken));
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
assign clock = cm_mirror.aclk;
|
39
|
+
assign rst_n = cm_mirror.aresetn;
|
40
|
+
assign clken = cm_mirror.aclken;
|
41
|
+
|
42
|
+
assign parse_stream.axis_tkeep = cm_mirror.axis_tkeep ;
|
43
|
+
assign parse_stream.axis_tuser = cm_mirror.axis_tuser ;
|
44
|
+
assign parse_stream.axis_tlast = cm_mirror.axis_tlast ;
|
45
|
+
assign parse_stream.axis_tdata = cm_mirror.axis_tdata ;
|
46
|
+
assign parse_stream.axis_tvalid= cm_mirror.axis_tvalid;
|
47
|
+
assign parse_stream.axis_tready= cm_mirror.axis_tready;
|
48
|
+
|
49
|
+
|
50
|
+
logic region_valid;
|
51
|
+
|
52
|
+
always_ff@(posedge clock,negedge rst_n)begin
|
53
|
+
if(~rst_n) region_valid <= 1'b1;
|
54
|
+
else begin
|
55
|
+
if(parse_stream.axis_tvalid && parse_stream.axis_tready && parse_stream.axis_tlast)
|
56
|
+
region_valid <= 1'b1;
|
57
|
+
else if(parse_stream.axis_tvalid && parse_stream.axis_tready && parse_stream.axis_tcnt[VSIZE:0] == (FIELD_LEN-1'b1))
|
58
|
+
region_valid <= 1'b0;
|
59
|
+
else region_valid <= region_valid;
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
logic[DSIZE-1:0] value_array [0:FIELD_LEN-1];
|
65
|
+
|
66
|
+
always_ff@(posedge clock,negedge rst_n)begin
|
67
|
+
if(~rst_n)
|
68
|
+
foreach(value_array[i])
|
69
|
+
value_array[i] <= '0;
|
70
|
+
else begin
|
71
|
+
if(region_valid)begin
|
72
|
+
value_array[parse_stream.axis_tcnt[VSIZE-1:0]] <= parse_stream.axis_tdata;
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
assign value = {>>{value_array}};
|
78
|
+
|
79
|
+
always_ff@(posedge clock,negedge rst_n)begin
|
80
|
+
if(~rst_n) out_valid <= 1'b0;
|
81
|
+
else begin
|
82
|
+
if(parse_stream.axis_tvalid && parse_stream.axis_tready && parse_stream.axis_tlast)
|
83
|
+
if(out_valid)
|
84
|
+
out_valid <= 1'b0;
|
85
|
+
else out_valid <= 1'b1;
|
86
|
+
else if(parse_stream.axis_tvalid && parse_stream.axis_tready && parse_stream.axis_tcnt[VSIZE:0] == (FIELD_LEN-1'b1))
|
87
|
+
out_valid <= 1'b1;
|
88
|
+
else if(region_valid)
|
89
|
+
out_valid <= 1'b0;
|
90
|
+
else out_valid <= out_valid;
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
endmodule
|