Thứ Năm, 7 tháng 11, 2019

[JTAG] Bài 3 - Mạch nguyên lý của bộ điều khiển TAP

Bài viết này trình bày một ví dụ về thiết kế bộ điều khiển TAP (TAP controller). Đồng thời, tác giả sẽ phân tích ví dụ trình bày trong chuẩn IEEE 1149.1-2001, từ phần này về sau sẽ gọi tắt là chuẩn IEEE.

Danh sách bài viết trước đó:


1) Reset của bộ điều khiển TAP
Bộ điều khiển TAP được reset bởi 2 nguồn:
  • Reset khi mới bật nguồn (Power-up hoặc power-on reset)
  • Reset bất cứ lúc nào chân TRST_n=0
Ngoài hai nguồn trên, bộ điều khiển TAP sẽ không bị reset bởi bất cứ nguồn nào khác. Đặc biệt, nó không được phép reset bởi reset của logic hệ thống.
Trong quá trình chip đang được cấp nguồn, dù đang ở bất cứ trạng thái nào, FSM đều có thể được đưa về trạng thái reset (TEST_LOGIC_RESET) bằng cách giữ chân TMS=1 trong nhiều cạnh lên xung clock TCK. Trường hợp xấu nhất, số cạnh lên xung clock TCK cần thiết để giữ TMS=1 là 5 cạnh lên. Ví dụ như trạng thái FSM đang trong trạng thái CAPTURE_IR, khi giữ TMS=1, FSM sẽ chuyển trạng thái như sau:
  • Cạnh lên thứ 1: CAPTURE_IR chuyển sang EXIT1_IR
  • Cạnh lên thứ 2: EXIT1_IR chuyển sang UPDATE_IR
  • Cạnh lên thứ 3: UPDATE_IR chuyển sang SELECT_DR_SCAN
  • Cạnh lên thứ 4: SELECT_DR_SCAN chuyển sang SELECT_IR_SCAN
  • Cạnh lên thứ 5: SELECT_IR_SCAN chuyển sang TEST_LOGIC_RESET
Trong trường hợp, chân TRST_n không được hỗ trợ thì logic bộ điều khiển TAP sẽ được reset bởi power-on reset để đảm bảo các logic của bộ điều khiển TAP được reset sau khi cấp nguồn và trước khi hoạt động.
Giả sử TRST_n và power-on reset đều không được sử dụng để reset logic bộ điều khiển TAP. Khi mới cấp nguồn FSM của TAP có thể rơi vào một trong 16 trạng thái đã được quy định. Thông qua việc lái clock TCK TMS=1, một bus master có thể đưa FSM về trạng thái reset như đã trình bày phía trên. Tuy nhiên, đây là một cách thiết kế không an toàn vì không có gì đảm bảo:
  • TCK sẽ hoạt động trong quá trình nguồn đang được cấp
  • Quá trình reset này sẽ xảy ra trong khoảng thời gian power-on reset của hệ thống
Mạch nguyên lý tín hiệu reset cho logic hệ thống và logic bộ điều khiển TAP thể hiện trong hình sau.
Hình 1: Mạch nguyên lý tạo tín hiệu reset tích cực mức thấp cho logic hệ thống và logic bộ điều khiển TAP controller
2) Mạch nguyên lý của FSM và logic điều khiển
Mục này trình bày một ví dụ về logic của bộ điều khiển TAP bên trong chip gồm FSM và logic điều khiển sinh ra từ FSM. Chú ý, đây là một ví dụ thiết kế cơ bản, giúp người thiết kế hình dung cách thực hiện bộ điều khiển TAP. Tùy vào trường hợp và chức năng cụ thể tích hợp với bộ điều khiển TAP, thiết kế sẽ được thay đổi để đáp ứng yêu cầu sử dụng. 
Một ví dụ tương tự được trình bày trong tài liệu IEEE, mục "6.2.2 Description". Ví dụ này được trình bày ngắn gọn và mạch nguyên lý chỉ biểu diễn theo cổng AND và NAND. Trong bài viết này, ví dụ sẽ được trình bày lại theo một cách tiếp cận khác với mục tiêu giúp bạn đọc dễ hiểu hơn. 
Logic điều khiển sinh ra từ FSM sẽ điều khiển việc lựa chọn thanh ghi IR và các thanh ghi DR; điều khiển TDO và điều khiển các logic kiểm tra khác. Giả sử bộ điều khiển TAP cần tạo ra các tín hiệu điều khiển sau đây:
Hình 2: Các tín hiệu điều khiển cần tạo ra bởi bộ điều khiển TAP
Hình 3: Một ví dụ về các tín hiệu giao tiếp của bộ điều khiển TAP
Chú ý, bộ điều khiển TAP không phụ thuộc vào tín hiệu TDI và TDO.
Như đã trình bày trước đó, bộ điều khiển TAP gồm một FSM và logic tạo ra các tín hiệu điều khiển từ FSM. Cấu trúc này được minh họa như hình 4. Trong hình minh họa các trạng thái sẽ được lưu trong một thanh ghi 4 bit có tên jtag_state[3:0]. Giá trị thanh ghi này sẽ là đầu vào của một mạch tổ hợp tạo ra các tín hiệu điều khiển. Tín hiệu từ mạch tổ hợp có thể sử dụng trực tiếp hoặc được chốt qua Flip-Flop.
Hình 4: Cấu trúc cơ bản của bộ điều khiển TAP
Trong ví dụ này, các tín hiệu được tạo ra từ một FF gồm:
  • reset_n
  • enable_tdo
  • shift_ir
  • shift_dr
Các tín hiệu được tạo từ FF được lái theo cạnh xuống của TCK, ứng với việc dùng clock TCK_n là đảo của TCK. Các tín hiệu điều khiển còn lại tạo ra từ mạch tổ hợp.
Hình 5: Logic các tín hiệu điều khiển
Như vậy, việc thiết bộ điều khiển TAP cần tập trung vào hai điểm chính sau đây:
  • Các trạng thái của FSM được mã hóa như thế nào?
  • Một tín hiệu điều khiển sẽ được tích cực trong trạng thái nào của FSM?
Trong ví dụ này, các giá trị mã hóa trạng thái của FSM sẽ được lấy từ bảng 6-3 “State assignment for example TAP controller” trong tài liệu IEEE. Bảng gán giá trị này cũng được sử dụng nhiều trong các thiết kế thực tế.
Hình 6: Bảng gán giá trị trạng thái (mã hóa trạng thái)
Điều kiện tích cực của các tín hiệu tạo từ mạch tổ hợp các trạng thái FSM được mô tả trong bảng dưới đây:
Hình 7: Bảng sự thật của các tín hiệu điều khiển phụ thuộc vào trạng thái FSM
Trong đó:
  • reset_n_in tích cực mức 0 chỉ trong trạng thái TEST_LOGIC_RESET
  • select_ir tích cực mức 1 trong các trạng thái chứa từ khóa “_IR”, trừ trạng thái SELECT_IR_SCAN. Trong trạng thái SELECT_IR_SCAN, tín hiệu này có thể không cần tích cực vì đây chỉ là trạng thái tạm, thanh ghi IR không có bất cứ hoạt động gì trong trạng thái này. Bên cạnh đó, tín hiệu này còn tích cực trong hai trạng thái RUN_TEST_IDLE và TEST_LOGIC_RESET giúp cho logic của select_ir đơn giản và tốn ít tài nguyên. Lúc này select_ir chính là bit 3 của jtag_state.
  • enable_tdo_in chỉ tích cực khi có dữ liệu cần dịch ra TDO nên chỉ tích cực trong SHIFT_IR và SHIFT_DR.
  • shift_ir_in tích chỉ tích cực trong trạng thái dịch lệnh SHIFT_IR.
  • capture_ir chỉ tích cực trong hai trạng thái CAPTURE_IR.
  • update_ir tích chỉ tích cực trong trạng thái UPDATE_IR.
  • shift_dr_in tích chỉ tích cực trong trạng thái dịch dữ liệu SHIFT_DR. 
  • capture_dr tích cực trong hai trạng thái CAPTURE_DR.
  • update_dr tích chỉ tích cực trong trạng thái UPDATE_DR.
Với các phân tích trên đây, chúng ta hoàn toàn có thể mô tả RTL code cho bộ điều khiển TAP.
3) Mô tả RTL code cho bộ điều khiển TAP
3.1) RTL code cho FSM
enum logic [3:0] {
EXIT2_DR = 4'h0,
EXIT1_DR = 4'h1,
SHIFT_DR = 4'h2,
PAUSE_DR = 4'h3,
SELECT_IR_SCAN = 4'h4,
UPDATE_DR = 4'h5,
CAPTURE_DR = 4'h6,
SELECT_DR_SCAN = 4'h7,
EXIT2_IR = 4'h8,
EXIT1_IR = 4'h9,
SHIFT_IR = 4'ha,
PAUSE_IR = 4'hb,
RUN_TEST_IDLE = 4'hc,
UPDATE_IR = 4'hd,
CAPTURE_IR = 4'he,
TEST_LOGIC_RESET = 4'hf
} jtag_state, jtag_next_state;

always_ff @ (posedge TCK, negedge TRST_n) begin
  if (!TRST_n)
    jtag_state <= TEST_LOGIC_RESET;
  else
    jtag_state <= jtag_next_state;
end
//
always_comb begin
unique case (jtag_state[3:0])
TEST_LOGIC_RESET: jtag_next_state = TMS? jtag_state: RUN_TEST_IDLE;
RUN_TEST_IDLE: jtag_next_state = TMS? SELECT_DR_SCAN: jtag_state;
//DR stream
SELECT_DR_SCAN: jtag_next_state = TMS? SELECT_IR_SCAN: CAPTURE_DR;
CAPTURE_DR: jtag_next_state = TMS? EXIT1_DR: SHIFT_DR;
SHIFT_DR: jtag_next_state = TMS? EXIT1_DR: jtag_state;
EXIT1_DR: jtag_next_state = TMS? UPDATE_DR: PAUSE_DR;
PAUSE_DR: jtag_next_state = TMS? EXIT2_DR: jtag_state;
EXIT2_DR: jtag_next_state = TMS? UPDATE_DR: SHIFT_DR;
UPDATE_DR: jtag_next_state = TMS? SELECT_DR_SCAN: RUN_TEST_IDLE;
//IR stream
SELECT_IR_SCAN: jtag_next_state = TMS? TEST_LOGIC_RESET: CAPTURE_IR;
CAPTURE_IR: jtag_next_state = TMS? EXIT1_IR: SHIFT_IR;
SHIFT_IR: jtag_next_state = TMS? EXIT1_IR: jtag_state;
EXIT1_IR: jtag_next_state = TMS? UPDATE_IR: PAUSE_IR;
PAUSE_IR: jtag_next_state = TMS? EXIT2_IR: jtag_state;
EXIT2_IR: jtag_next_state = TMS? UPDATE_IR: SHIFT_IR;
UPDATE_IR: jtag_next_state = TMS? SELECT_DR_SCAN: RUN_TEST_IDLE;
default: jtag_next_state = jtag_state;
endcase
end

3.2) RTL code cho các tín hiệu điều khiển

assign tlr_state = (jtag_state == TEST_LOGIC_RESET);
assign cdr_state = (jtag_state == CAPTURE_DR);
assign sdr_state = (jtag_state == SHIFT_DR);
assign udr_state = (jtag_state == UPDATE_DR);
assign cir_state = (jtag_state == CAPTURE_IR);
assign sir_state = (jtag_state == SHIFT_IR);
assign uir_state = (jtag_state == UPDATE_IR);
//
always_ff @ (posedge TCK_n, negedge TRST_n) begin
  if (!TRST_n)
    reset_n <= 1'b0;
  else
    reset_n <= ~tlr_state;
end
//
assign select_ir = jtag_state[3];
//
always_ff @ (posedge TCK_n, negedge TRST_n) begin
  if (!TRST_n)
    enable_tdo <= 1'b0;
  else
    enable_tdo <= sdr_state | sir_state;
end
//
always_ff @ (posedge TCK_n, negedge TRST_n) begin
  if (!TRST_n)
    shift_ir <= 1'b0;
  else
    shift_ir <= sir_state;
end
//
assign capture_ir = cir_state;
assign update_ir = uir_state;
//
always_ff @ (posedge TCK_n, negedge TRST_n) begin
  if (!TRST_n)
    shift_dr <= 1'b0;
  else
    shift_dr <= sdr_state;
end
//
assign capture_dr = cdr_state;
assign update_dr = udr_state;

4) Phân tích logic của bộ điều khiển TAP theo phương pháp SOP
4.1) Phân tích logic của FSM
Cách phân tích như đã trình bày trên đây là cách thường dùng. Đối với FSM, chỉ cần có sơ đồ chuyển trạng thái và bảng mã hóa trạng thái là có thể mô tả RTL code. Đối với các tín hiệu điều khiển, chỉ cần làm rõ sự phụ thuộc của các tín hiệu và các trạng thái FSM là có thể mô tả RTL code.
Trong tài liệu IEEE, mục “6.2.2 Description”, logic của trạng thái kế tiếp {ND, NC, NB, NA} được biểu diễn bằng các biểu thức Boolean như sau:

ND := DC* + DB + T*CB* + D*CB*A*
NC := CB* + CA + TB*
NB := T*BA* + T*C* + T*D*B + T*D*A* + TCB* + TDCA
NA := T*C*A + TB* + TA* + TDC

Trong đó:
  • T = TMS
  • ND, NC, NB, NA là 4 bit của trạng thái kết tiếp, tương tự tín hiệu jtag_next_state[3:0]
  • D, C, B, A là 4 bit của trạng thái hiện tại, tương tự như jtag_state[3:0]
  • “*” là kí hiệu có ý nghĩ “đảo”.
Mạch nguyên lý của các bit trạng thái kế tiếp được minh họa trong hình 6-6 (Figure 6-6 A TAP controller implementation – next state logic) trong tài liệu IEEE.
Hình 8: Mạch nguyên lý của trạng thái kế tiếp được mô tả trong IEEE 1149.1-2001
Để có được các biểu thức này, một phương pháp có thể sử dụng là tổng các tích, SOP (Sum Of Product). SOP được thực hiện như sau: 
  • Lập bảng sự thật (truth table) của từng bit jtag_next_state[3:0] phụ thuộc theo các bit giá trị ngõ vào, jtag_state[3:0] và TMS. 
  • Lập tổng của “tích các bit ngõ vào” ở các ví trị bit ngõ ra bằng 1. Tổng, dấu “+”, ứng với logic OR. Tích, dấu “.” hoặc không có dấu, ứng với logic AND.
  • Rút gọn biểu thức
Hình 9: Bảng sự thật của jtag_next_state[3:0] phụ thuộc vào jtag_state[3:0] và TMS
Chú ý, trong bảng sự thật trên các bit ngõ vào được ký hiệu lại như sau: 
  • jtag_state[3] là A 
  • jtag_state[2] là B 
  • jtag_state[1] là C 
  • jtag_state[0] là D 
TMSE. Mục đích của việc ký hiệu lại là để phù hợp với phần mềm rút gọn trên trang http://www.32x8.com/var5.html. Tác giả sẽ sử dụng phần mềm online này để rút gọn.
4.2) Biểu thức cho bit 3 của jtag_next_state
Bảng sự thật của jtag_next_state[3]:
Kết quả rút gọn của jtag_next_state[3]:
Thực hiện chuyển đổi tương cổng logic OR thành cổng NAND như sau:

Mạch nguyên lý sẽ chuyển thành dạng toàn cổng NAND như hình 6-6 (Figure 6-6 A TAP controller implementation – next state logic) trong tài liệu IEEE 1149.1-2001.
Hình 10: Mạch nguyên lý trong tài liệu IEEE cho bit 3 của trạng thái kế tiếp
4.3)Biểu thức cho bit 2 của jtag_next_state
Bảng sự thật của jtag_next_state[2]:
Kết quả rút gọn của jtag_next_state[2]:

Chuyển đổi tương đương thành cổng NAND trong tài liệu IEEE:
Hình 12: Mạch nguyên lý trong tài liệu IEEE cho bit 2 của trạng thái kế tiếp
4.4) Biểu thức cho bit 1 của jtag_next_state
Bảng sự thật của jtag_next_state[1]:

Kết quả rút gọn của jtag_next_state[1]:
Chuyển đổi tương đương thành cổng NAND trong tài liệu IEEE:
Hình 13: Mạch nguyên lý trong tài liệu IEEE cho bit 1 của trạng thái kế tiếp
4.5) Biểu thức cho bit 0 của jtag_next_state
Bảng sự thật của jtag_next_state[0]:
Kết quả rút gọn của jtag_next_state[0]:

Chuyển đổi tương đương thành cổng NAND trong tài liệu IEEE:
Hình 14: Mạch nguyên lý trong tài liệu IEEE cho bit 0 của trạng thái kế tiếp
5) Phân tích logic của các tín hiệu điều khiển bằng phương pháp SOP
Cách phân tích cho các tín hiệu điều khiển sẽ được thực hiện tương tự như cách đã thực hiện cho các bit trạng thái jtag_next_state[3:0] đã mô tả ở mục trên. 
Lưu ý, mạch logic trình bày trong bài viết này khác với mạch logic trong ví dụ hình 6-5 “Figure 6-5 – A TAP controller implementation – state registers and output logic” của tài liệu IEEE ở các điểm sau: 
  • Tín hiệu update_ir/dr: trong tài liệu IEEE, update_ir/drUpdateIR UpdateDR. Tín hiệu này được tổ hợp với tín hiệu clock bù của TCK là TCK_n.
  • Tín hiệu capture_ir/dr: trong tài liệu IEEE, hai tín hiệu này không được tạo ra. Thay vào đó, hai tín hiệu clock_irclock_dr được tạo ra. 
    • clock_ir sẽ là TCK trong hai trạng thái CAPTURE_IR và SHIFT_IR
    • clock_dr sẽ là TCK trong hai trạng thái CAPTURE_DR và SHIFT_DR
Hình 15: Mạch nguyên lý các tín hiệu điều khiển trong tài liệu IEEE 1149.1-2001
6) Waveform các tín hiệu 
6.1) Mô tả testbench 
Một testbench cơ bản được tạo ra để tạo ra waveform kiểm tra cho các tín hiệu điều khiển. Testbench này được tạo dựa trên waveform trong hình 6-7 (figure 6-7 – Operation of the example TAP controller) trong tài liệu IEEE để giúp so sánh kết quả. 
Testbench gồm các thành phần như sau: 
  • Bộ tạo clock 
initial begin 
  TCK = 1'b0; 
  forever #2 TCK = ~TCK; 
end 

Mô hình một thanh ghi dịch và ngõ ra TDO để kiểm chứng hoạt động của tín hiệu enable_tdo 
always @ (posedge TCK, negedge TRST_n) begin 
  if (!TRST_n)
    shift_reg[3:0] <= 4'b1010; 
  else if (shift_ir | shift_dr) 
    shift_reg[3:0] <= {TDI, shift_reg[3:1]}; 
end 
//
always @ (negedge TCK) begin 
  tdo_reg <= shift_reg[0]; 
end 
//
assign TDO = enable_tdo? tdo_reg: 1'bz; 

Tạo giá trị trên TDI bằng cách đảo giá trị tại mỗi cạnh xuống TCK
initial begin 
TDI <= 0; 
  while (1) begin 
    @ (negedge TCK); 
    TDI <= ~TDI; 
  end 
end 

Reset bộ điều khiển TAP và lái TMS theo cạnh xuống TCK để tạo ra waveform mong muốn:

initial begin 

TRST_n <= 1'b0; 
TMS <= 1'b1; 
repeat (2) @ (posedge TCK); 
TRST_n <= 1'b1; 
// 
repeat (1) @ (negedge TCK); 
TMS <= 1'b1; //F 
repeat (3) @ (negedge TCK); 
TMS <= 1'b0; //C 
repeat (1) @ (negedge TCK); 
TMS <= 1'b1; //7, 4 
repeat (2) @ (negedge TCK); 
TMS <= 1'b0; //E,A 
repeat (3) @ (negedge TCK); 
TMS <= 1'b1; //9 
repeat (1) @ (negedge TCK); 
TMS <= 1'b0; //B 
repeat (4) @ (negedge TCK); 
TMS <= 1'b1; //8 
repeat (1) @ (negedge TCK); 
TMS <= 1'b0; //A 
repeat (4) @ (negedge TCK); 
TMS <= 1'b1; //9,D 
repeat (2) @ (negedge TCK); 
TMS <= 1'b0; //C 
repeat (3) @ (negedge TCK); 
TMS <= 1'b1; //7 
repeat (1) @ (negedge TCK); 
TMS <= 1'b0; //6,2 
repeat (4) @ (negedge TCK); 
TMS <= 1'b1; //1 
repeat (1) @ (negedge TCK); 
TMS <= 1'b0; //3 
repeat (4) @ (negedge TCK); 
TMS <= 1'b1; //0 
repeat (1) @ (negedge TCK); 
TMS <= 1'b0; //2 
repeat (4) @ (negedge TCK); 
TMS <= 1'b1; //1,5 
repeat (2) @ (negedge TCK); 
TMS <= 1'b0; //C 
repeat (3) @ (negedge TCK); 
TMS <= 1'b1; 
repeat (5) @ (negedge TCK); 
$stop; 

end

6.2) Waveform của các tín hiệu điều khiển trong ví dụ của bài viết này
Hình 16: Waveform của ví dụ trong bài viết
Như đã trình bày, do thiết kế khác nhau nên độ rộng của 2 tín hiệu update_ir update_dr trong bài viết này và độ rộng của 2 tín hiệu UpdateIR UpdateDR trong tài liệu IEEE sẽ khác nhau.
Hình 17: Sự khác nhau về độ rộng tín hiệu
update_ir update_dr có độ rộng 1 chu kỳ TCK khi TAP trong trạng thái UPDATE_IR và UPDATE_DR. UpdateIR UpdateDR có độ rộng nửa chu kỳ TCK vì nó là tổ hợp giữa trạng thái UPDATE_IR/DR và tín hiệu clock bù của TCK. Bên cạnh đó, ví dụ trong bài viết tạo ra 2 tín hiệu tên capture_ir capture_dr. Trong tài liệu IEEE, ví dụ minh họa tạo ra 2 tín hiệu clock_ir clock_dr có ý nghĩa và cách sử dụng hoàn toàn khác với ví dụ trong bài viết.
7) Lưu ý
Trên thực tế, người thiết kế ít áp dụng việc phân tích và rút gọn biểu thức các bit bằng phương pháp SOP hoặc bất kỳ phương pháp nào khác như tích các tổng POS (Product Of Sum) hay bìa K (Karnaugh) như đã trình bày trong mục 4 và 5 của bài viết này. Hai mục này được trình bày chỉ với mục đích giúp bạn đọc hiểu rõ hơn ví dụ trình bày trong tài liệu IEEE 1149.1-2001. 
Việc phân tích thiết kế sẽ được thực hiện như mục 2 và RTL code sẽ được mô tả theo những phân tích ở bước này. Việc tối ưu logic sẽ được thực thi bởi trình tổng hợp dựa trên những điều kiện ràng buộc về timing và diện tích mà người thiết kế mong muốn. 
Thiết kế như trong bài viết này hoặc như trong IEEE 1149.1-2001 chỉ là một ví dụ tham khảo. Trên thực tế, bộ điều khiển TAP có thể được thực hiện bằng nhiều cách khác nhau và tạo ra các tín hiệu điều khiển khác với ví dụ này tùy vào yêu cầu cụ thể. 
Việc hiểu rõ waveform và logic các tín hiệu điều khiển trong thiết kế mẫu của chuẩn IEEE 1149.1-2001 sẽ giúp bạn đọc hiểu hoạt động của các thành phần logic khác như thanh ghi lệnh (IR) và thanh ghi boundary scan vì các phần tử (cell) của các thanh ghi này sử dụng trực tiếp các tín hiệu điều khiển của ví dụ thiết kế mà IEEE đã trình bày. 
Lưu ý quan trong cuối cùng, các tín hiệu điều khiển trong ví dụ của bài viết này có các điểm khác biệt với ví dụ trong tài liệu IEEE. Điểm khác biệt này sẽ ảnh hưởng đến việc thiết kế các thành phần logic kiểm tra khác, ví dụ như thanh ghi lệnh IR được trình bày ở bài tiếp theo.

Tài liệu tham khảo:
1) Test Technology Standards Committee; IEEE Std 1149.1-2001 - IEEE Standard Test Access Port and Boundary-Scan Architecture; 14.Jun.2001
2) Lauterbach GmbH; Training JTAG Interface; 16.Apr.2019

Lịch sử cập nhật:
1) 2019.11.07 - Tạo lần đầu

0 bình luận:

Đăng nhận xét