1 |
2 |
dsmv |
//////////////////////////////////////////////////////////////////////////////////
|
2 |
|
|
// Company: ;)
|
3 |
|
|
// Engineer: Kuzmi4
|
4 |
|
|
//
|
5 |
|
|
// Create Date: 14:39:52 05/19/2010
|
6 |
|
|
// Design Name:
|
7 |
|
|
// Module Name: block_check_wb_burst_slave_0
|
8 |
|
|
// Project Name: DS_DMA
|
9 |
|
|
// Target Devices: any
|
10 |
|
|
// Tool versions:
|
11 |
|
|
// Description:
|
12 |
|
|
// This component designed for test "pcie_core64_m6" inner logis (dsmv req)
|
13 |
|
|
//
|
14 |
|
|
//
|
15 |
|
|
// Revision:
|
16 |
|
|
// Revision 0.01 - File Created
|
17 |
|
|
// Revision 0.02 - add full wrk functionality.
|
18 |
|
|
//
|
19 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
20 |
|
|
`timescale 1ns / 1ps
|
21 |
|
|
|
22 |
|
|
module block_check_wb_burst_slave
|
23 |
|
|
(
|
24 |
|
|
//
|
25 |
|
|
// SYS_CON
|
26 |
|
|
input i_clk,
|
27 |
|
|
input i_rst,
|
28 |
|
|
//
|
29 |
|
|
// WB BURST SLAVE IF (WRITE-ONLY IF)
|
30 |
|
|
input [11:0] iv_wbs_burst_addr,
|
31 |
|
|
input [63:0] iv_wbs_burst_data,
|
32 |
|
|
input [ 7:0] iv_wbs_burst_sel,
|
33 |
|
|
input i_wbs_burst_we,
|
34 |
|
|
input i_wbs_burst_cyc,
|
35 |
|
|
input i_wbs_burst_stb,
|
36 |
|
|
input [ 2:0] iv_wbs_burst_cti,
|
37 |
|
|
input [ 1:0] iv_wbs_burst_bte,
|
38 |
|
|
|
39 |
|
|
output o_wbs_burst_ack,
|
40 |
|
|
output o_wbs_burst_err,
|
41 |
|
|
output o_wbs_burst_rty,
|
42 |
|
|
//
|
43 |
|
|
// TEST_CHECK IF (Output data with ENA) ==> always LOW
|
44 |
|
|
output reg [63:0] ov_test_check_data,
|
45 |
|
|
output reg o_test_check_data_ena,
|
46 |
|
|
//
|
47 |
|
|
// TEST_CHECK Controls (WBS_CFG)
|
48 |
|
|
input [15:0] iv_control
|
49 |
|
|
);
|
50 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
51 |
|
|
/*
|
52 |
|
|
localparam lp_ENA_DLY = 1;
|
53 |
|
|
localparam lp_START_DLY_POS = 473; // Stop IDX == 510
|
54 |
|
|
localparam lp_WB_ACK_DLY = 40;*/
|
55 |
|
|
//
|
56 |
|
|
localparam lp_WB_BURST_DLY_POS_START = 0;
|
57 |
|
|
localparam lp_WB_BURST_DLY_POS_END = 8;
|
58 |
|
|
|
59 |
|
|
localparam lp_WB_BURST_ACK_DLY_POS_START = 9;
|
60 |
|
|
localparam lp_WB_BURST_ACK_DLY_POS_END = 14;
|
61 |
|
|
|
62 |
|
|
localparam lp_WB_BURST_DLY_ENA = 15;
|
63 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
64 |
|
|
// WBS stuff:
|
65 |
|
|
wire s_wb_transfer_ok_0;
|
66 |
|
|
reg [8:0] sv_wbs_burst_counter;
|
67 |
|
|
reg [5:0] sv_wb_ack_dly_counter;
|
68 |
|
|
// WBS ACK delay output:
|
69 |
|
|
wire [lp_WB_BURST_ACK_DLY_POS_END-lp_WB_BURST_ACK_DLY_POS_START:0] sv_wbs_ack_dly_value;
|
70 |
|
|
wire [lp_WB_BURST_DLY_POS_END-lp_WB_BURST_DLY_POS_START:0] sv_wbs_dly_position;
|
71 |
|
|
wire s_wbs_dly_ena;
|
72 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
73 |
|
|
// WBS ACK delay route/flags:
|
74 |
|
|
assign sv_wbs_ack_dly_value = iv_control[lp_WB_BURST_ACK_DLY_POS_END : lp_WB_BURST_ACK_DLY_POS_START];
|
75 |
|
|
assign sv_wbs_dly_position = iv_control[lp_WB_BURST_DLY_POS_END : lp_WB_BURST_DLY_POS_START];
|
76 |
|
|
assign s_wbs_dly_ena = iv_control[lp_WB_BURST_DLY_ENA];
|
77 |
|
|
//
|
78 |
|
|
// WBS controls output:
|
79 |
|
|
assign o_wbs_burst_ack = (s_wbs_dly_ena)?
|
80 |
|
|
(
|
81 |
|
|
(sv_wbs_burst_counter==sv_wbs_dly_position)? 0 : s_wb_transfer_ok_0
|
82 |
|
|
) :
|
83 |
|
|
s_wb_transfer_ok_0;
|
84 |
|
|
assign o_wbs_burst_err = 0;
|
85 |
|
|
assign o_wbs_burst_rty = 0;
|
86 |
|
|
// WBS inner ack flag:
|
87 |
|
|
assign s_wb_transfer_ok_0 = (iv_wbs_burst_addr==0) & // START from INIT ADDR
|
88 |
|
|
i_wbs_burst_cyc & i_wbs_burst_stb & i_wbs_burst_we & // WB Transfer strobes
|
89 |
|
|
iv_wbs_burst_sel==8'hFF & // WB_SEL point to 64bit transfer
|
90 |
|
|
iv_wbs_burst_bte==2'b00 ; // WB Burst Transfer type check (Linear Burst)
|
91 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
92 |
|
|
//
|
93 |
|
|
// Create TEST_CHECK data output:
|
94 |
|
|
//
|
95 |
|
|
always @ (posedge i_clk or posedge i_rst)
|
96 |
|
|
begin : TEST_CHECK_DATA_OUT
|
97 |
|
|
if (i_rst)
|
98 |
|
|
begin : RST
|
99 |
|
|
ov_test_check_data <= 0;
|
100 |
|
|
o_test_check_data_ena <= 0;
|
101 |
|
|
end
|
102 |
|
|
else
|
103 |
|
|
begin : WRK
|
104 |
|
|
o_test_check_data_ena <= o_wbs_burst_ack;
|
105 |
|
|
ov_test_check_data <= iv_wbs_burst_data;
|
106 |
|
|
end
|
107 |
|
|
end
|
108 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
109 |
|
|
//
|
110 |
|
|
// Provide WBS ACK delay counter:
|
111 |
|
|
//
|
112 |
|
|
always @ (posedge i_clk or posedge i_rst)
|
113 |
|
|
begin : WB_ACK_ADD
|
114 |
|
|
if (i_rst)
|
115 |
|
|
begin : RST
|
116 |
|
|
sv_wb_ack_dly_counter <= 0;
|
117 |
|
|
end
|
118 |
|
|
else
|
119 |
|
|
begin : WRK
|
120 |
|
|
if (sv_wbs_burst_counter!=0 & !o_wbs_burst_ack)
|
121 |
|
|
begin : ENA_CNT
|
122 |
|
|
if (sv_wb_ack_dly_counter < sv_wbs_ack_dly_value)
|
123 |
|
|
sv_wb_ack_dly_counter <= sv_wb_ack_dly_counter + 1;
|
124 |
|
|
else
|
125 |
|
|
sv_wb_ack_dly_counter <= 0;
|
126 |
|
|
end
|
127 |
|
|
end
|
128 |
|
|
end
|
129 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
130 |
|
|
//
|
131 |
|
|
// Provide WBS Burst counter logic:
|
132 |
|
|
//
|
133 |
|
|
always @ (posedge i_clk or posedge i_rst)
|
134 |
|
|
begin : WB_BURST_COUNTER
|
135 |
|
|
if (i_rst)
|
136 |
|
|
begin : RST
|
137 |
|
|
sv_wbs_burst_counter <= 0;
|
138 |
|
|
end
|
139 |
|
|
else
|
140 |
|
|
begin : WRK
|
141 |
|
|
if (i_wbs_burst_cyc)
|
142 |
|
|
begin : TIME_TO_COUNT
|
143 |
|
|
if (o_wbs_burst_ack | sv_wb_ack_dly_counter==sv_wbs_ack_dly_value) // count ENA: wb_ack OR wb_ack_dly_counter issue
|
144 |
|
|
sv_wbs_burst_counter <= sv_wbs_burst_counter + 1;
|
145 |
|
|
end
|
146 |
|
|
else // W8 for COUNT Time, CLR COUNTER
|
147 |
|
|
sv_wbs_burst_counter <= 0;
|
148 |
|
|
end
|
149 |
|
|
end
|
150 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
151 |
|
|
endmodule
|