2015年11月20日 星期五

JTAG

JTAG (Joint Test Action Group) 是一個在 1985 年成立的電子工業協會,致力於發展產品製造後如何驗證設計及測試印刷電路板接線的方法。在 1990 年結果寫成 IEEE Standard 1149.1-1990,標題是「Standard Test Access Port and Boundary-Scan Architecture」,但坊間仍俗稱 JTAG。JTAG 除了可用來作 Boundary-Scan Test,也就是測試電路板上元件間的接線是否正確外,常常擴充提供許多廠商自定的功能,例如燒錄、In-Circuit Emulation 等。

JTAG 存取界面稱為 TAP (Test Access Port),包括跟外部通訊的序列訊號接腳、內部的狀態機器及暫存器。
圖來自 Spartan-6 FPGA Configuration User Guide

TAP 接腳有 TCK、TMS、TDI、TDO 四個訊號,透過控制 TAP 狀態機器來存取 TAP 暫存器。所有 JTAG 功能都透過這四個訊號完成。
  • TCK (Test Clock) 輸入:TAP 的運作時脈。
  • TMS (Test Mode Select) 輸入:選擇下個 TAP 狀態轉移,TCK 上升緣動作。TAP 採用序列狀態機器,下個狀態只依據 TMS 只有 0 跟 1 兩種選擇。TMS 持續輸入 1 可回復重置狀態,一般會有內部 pull-up 提供邏輯 1 輸入。
  • TDI (Test Data In) 輸入:序列位移進 TAP 暫存器,TCK 上升緣動作。
  • TDO (Test Data Out) 輸出:序列位移出 TAP 暫存器,在 TCK 下降緣動作,且只有在位移輸出暫存器時才驅動輸出。
另外可能還有 TRST (Test Reset) 接腳,強制 TAP 重置,但 TMS 持續輸入 1 也可以重置,所以不是必要的。

圖來自 Spartan-6 FPGA Configuration User Guide
多個 JTAG 可以串接使用,其中 TCK 跟 TMS 是共用,而 TDI 跟 TDO 則是串接。

TAP 暫存器會有一個指令暫存器 (Instruction Register, IR),其它為資料暫存器 (Data Register, DR)。DR 數目不一定,可能有 BYPASS、IDCODE、EXTEST、INTEST 等,有些是 IEEE 定義的,其它則廠商自己定義。TAP 狀態跟 IR 的內容,決定 TDI 輸入到及 TDO 輸出自哪個暫存器。
  • IR:至少 2-bit,由廠商決定長度,不同指令選擇不同的資料暫存器,而有不同的功能。
  • BYPASS:IEEE Std 1149.1 定義的標準暫存器,只有 1-bit,作為多個 JTAG 元件串接時,把 TDI 跟 TDO 以序列方式串起來,來 bypass 特定元件,在 CAPTURE-DR 時會初始化為 0。
  • IDCODE:大部分 JTAG 相容元件都有 32-bit IDCODE,儲存元件特定的識別碼,可看出製造商及元件型號。
  • Bound-Scan Register (BSR)
  • EXTEST, INTEST, SAMPLE, USERCODE, and HIGHZ
JTAG 相容元件用 Boundary Scan Description Language (BSDL) 檔案定義其功能,BSDL 用 VHDL 語言撰寫,描述元件的接腳及 boundary-scan 暫存器。

狀態機器
圖來自 Spartan-6 FPGA Configuration User Guide

TAP 有 16 種狀態,由 TCK 時脈的 rising edge 看 TMS 的 0 或 1 決定狀態的轉換。主要有兩種路徑分別是要對 IR 或 DR 作內容移位。IR 在實作上可能分成兩部份,一是解碼使用的 IR,另一是位移的時候用。DR 未必有這樣的設計。
  • Test-Logic-Reset (TLR):測試邏輯於重置狀態,也就是測試邏輯電路是關閉的,此時元件可正常使用。不論目前在哪個狀態,只要 5 次 TMS 1 就會進入 Test-Logic-Reset 狀態。持續 1 維持在 Test-Logig-Reset,0 離開。
  • Run-Test/Idle (RTI):在特定的指令下進入並停留在此狀態來執行測試 (Run-Test),直到 TMS 接腳為 1 結束。其它指令則為閒置 (Idle)。
  • Select-DR-Scan:選擇是否進入 DR 路徑。
  • Select-IR-Scan:選擇是否進入 IR 路徑。
  • Capture-IR 或 Capture-DR:擷取 IR 或 DR 作為 TDO 輸出用。
    • IR 在實作上可能分成兩部份,一是寫入的版本作為解碼使用,另一是位移的版本。Capture-IR 時將位移的版本載入固定值,且這個固定值最後 2-bit 為 01,不是寫入的 IR。之後 Update-IR 時,會將位移的版本平行載入作為寫入的版本。
    • DR 未必有這樣的設計。Capture-DR 則擷取 IR 所選擇 DR 作為輸出,實際上可能沒區分出專作位移的版本,而沒有實際擷取的動作。
  • Shift-IR 或 Shift-DR:此時暫存器跟接腳 TDI 及 TDO 串起來進行內容位移。TMS 為 0 時持續進行位移,為 1 時結束。
  • Exit1-IR 或 Exit1-DR:控制是要進入 Pause-IR (Pause-DR) 還是 Update-IR (Update-DR)。
  • Pause-IR 或 Pause-DR:暫停位移。
  • Exit2-DR 或 Exit2-DR:控制是要進入 Shift-IR (Shift-DR),還是進入 Update-IR (Update-DR)。
  • Update-IR 或 Update-DR:在 TCK falling edge 更新 IR 或 DR。
範例:讀取 IDCODE,首先 IR 寫入指令 IDCODE,然後在從 DR 讀出 IDCODE
TAP stateTDITMS#TCK說明
any
x15回復到重置狀態
Test-Logic-Reset
x01
Run-Test/Idle
x11
Select-DR-Scan
x11
Select-IR-Scan
x01
Capture-IR
x01
Shift-IR
0100105從 LSB 開始位移 IDCODE 指令
Shift-IR
011位移 IDCODE 指令最後 MSB,並離開位移狀態
Exit1-IR
x11更新指令為 IDCODE = 0x09
Update-IR
x11
Select-DR-Scan
x01
Capture-DR
x01
Shift-DR
?031TDO 從 LSB 開始位移出 IDCODE
Shift-DR
?11TDO 位移出 IDCODE 最後 bit,並離開位移狀態
Exit1-DR
x11
Update-DR
x01回到 Run-Test/Idle 完成動作
Run-Test/Idle

如果多個元件串接時,由於 TMS 是接在一起的,所以每個元件的 TAP 停留的狀態是一致的,只差在讀寫暫存器所需要位移的長度變長了
  1. IR 寫入指令 IDCODE 時,需要依照跟所有元件串接的順序排指令碼,目標元件填 IDCODE 指令碼,其它元件則填 BYPASS 指令碼。BYPASS 指令碼都是 1,只是不同元件 IR 的長度會有所不同。
  2. DR 讀出 IDCODE 時,需要把讀到的 BYPASS 過濾掉,每個 BYPASS 佔 1-bit。
JTAG 雖然有 16 種狀態,除了重置及 Run-Test 外,其它都是為了存取 IR 及 DR。JTAG 訊號很像 SPI,多了 TMS 來轉移狀態,多了 IR/DR 可無限擴充可能的功能。

參考來源:
  1. https://en.wikipedia.org/wiki/Joint_Test_Action_Group
  2. Spartan-6 FPGA Configuration User Guide

3 則留言:

  1. 回覆
    1. 哈哈,我的用心總算有人看見了。有時會用到 JTAG,但對其原理都是一知半解,看到的文件也都有一些交待不清,當時就下定決心好好弄清楚。

      有什麼需要改進的,還請指教。

      刪除
  2. 雖然離發表很久了,但看完也來推一下

    回覆刪除