-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDiagnostic_loop_chains.v
More file actions
131 lines (113 loc) · 4.62 KB
/
Diagnostic_loop_chains.v
File metadata and controls
131 lines (113 loc) · 4.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//Parameterized Diagnostic_loop_chains
module Diagnostic_loop_chains #(
parameter SYSTOLIC_SIZE = 8, // 可設定的脈動陣列大小,預設為8x8
parameter ADDR_WIDTH = $clog2(SYSTOLIC_SIZE) //counter的位寬
)(
input clk,
input rst_n,
input start_en,
input [SYSTOLIC_SIZE-1:0] col_inputs,
output [SYSTOLIC_SIZE-1:0] single_pe_detection, //單row pe輸出
output [SYSTOLIC_SIZE-1:0] column_fault_detection, // 每個column的fault檢測輸出
output [SYSTOLIC_SIZE-1:0] row_fault_detection // 每個row的fault檢測輸出
// output reg [ADDR_WIDTH-1:0] counter //輸出給envm讀取第幾個row的錯誤資訊,因envm 沒有rst沒辦法rst counter 訊號
// 改由bist送addr
);
// 動態宣告線路和暫存器
wire [SYSTOLIC_SIZE-1:0] col_0; // 每個column的第0級輸出
reg [SYSTOLIC_SIZE-1:0] col_reg [0:SYSTOLIC_SIZE-1]; // 二維陣列儲存所有暫存器
// 產生各個column的第0級信號 (輸入信號 or 最後一級的回饋)
genvar i;
generate
for (i = 0; i < SYSTOLIC_SIZE; i = i + 1) begin : col_input_gen
assign col_0[i] = col_inputs[i] || col_reg[SYSTOLIC_SIZE-1][i];
end
endgenerate
integer k;
// 產生各個column的診斷迴路鏈
generate
for (i = 0; i < SYSTOLIC_SIZE; i = i + 1) begin : col_chain_gen
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
// 重置所有該column的暫存器
for (k = 0; k < SYSTOLIC_SIZE; k = k + 1) begin
col_reg[k][i] <= 1'b0;
end
end
else if(start_en) begin
// 建立移位暫存器鏈
// col_reg[0][i] <= col_0[i];
col_reg[0][i] <= col_inputs[i] || col_reg[SYSTOLIC_SIZE-1][i];
for (k = 1; k < SYSTOLIC_SIZE; k = k + 1) begin
col_reg[k][i] <= col_reg[k-1][i];
end
end
else;
end
end
endgenerate
//----------------------- Row fault detector -----------------------
wire row_and_result;
wire row_detect_0;
reg [SYSTOLIC_SIZE-1:0] row_detect_reg;
// 對最後3個columns的第0級進行AND運算 (從最上面取值)
assign row_and_result = col_0[SYSTOLIC_SIZE-1] && col_0[SYSTOLIC_SIZE-2] && col_0[SYSTOLIC_SIZE-3];
assign row_detect_0 = row_and_result || row_detect_reg[SYSTOLIC_SIZE-1];
// Row detector的移位暫存器鏈
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
for (k = 0; k < SYSTOLIC_SIZE; k = k + 1) begin
row_detect_reg[k] <= 1'b0;
end
end
else if(start_en) begin
row_detect_reg[0] <= row_detect_0;
for (k = 1; k < SYSTOLIC_SIZE; k = k + 1) begin
row_detect_reg[k] <= row_detect_reg[k-1];
end
end
else;
end
//----------------------- Column fault detector -----------------------
wire [SYSTOLIC_SIZE-1:0] col_and_result;
reg [SYSTOLIC_SIZE-1:0] column_detect;
// 對每個column的最後3個stage進行AND運算 (從最下面取值)
generate
for (i = 0; i < SYSTOLIC_SIZE; i = i + 1) begin : col_detect_gen
assign col_and_result[i] = col_reg[SYSTOLIC_SIZE-1][i] && col_reg[SYSTOLIC_SIZE-2][i] && col_reg[SYSTOLIC_SIZE-3][i];
end
endgenerate
// Column detector的暫存器
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
for (k = 0; k < SYSTOLIC_SIZE; k = k + 1) begin
column_detect[k] <= 1'b0;
end
end
else if(start_en) begin
for (k = 0; k < SYSTOLIC_SIZE; k = k + 1) begin
column_detect[k] <= col_and_result[k];
end
end
else;
end
// always @(posedge clk or negedge rst_n) begin
// if(!rst_n) begin
// counter <= {ADDR_WIDTH{1'b0}};
// end
// else if(start_en) begin
// if(counter == SYSTOLIC_SIZE - 1) begin
// counter <= {ADDR_WIDTH{1'b0}}; // Reset counter to 0
// end
// else begin
// counter <= counter + 1; // Increment counter
// end
// end
// else;
// end
// 輸出信號連接
assign column_fault_detection = column_detect;
assign row_fault_detection = row_detect_reg;
//看cycle修正要輸出哪一列的PE(or gate後面 或 第一個reg後)
assign single_pe_detection = col_0;
endmodule