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 下降緣動作,且只有在位移輸出暫存器時才驅動輸出。
圖來自 Spartan-6 FPGA Configuration User Guide |
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
狀態機器
圖來自 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。
TAP state | TDI | TMS | #TCK | 說明 |
---|---|---|---|---|
any | ||||
x | 1 | 5 | 回復到重置狀態 | |
Test-Logic-Reset | ||||
x | 0 | 1 | ||
Run-Test/Idle | ||||
x | 1 | 1 | ||
Select-DR-Scan | ||||
x | 1 | 1 | ||
Select-IR-Scan | ||||
x | 0 | 1 | ||
Capture-IR | ||||
x | 0 | 1 | ||
Shift-IR | ||||
01001 | 0 | 5 | 從 LSB 開始位移 IDCODE 指令 | |
Shift-IR | ||||
0 | 1 | 1 | 位移 IDCODE 指令最後 MSB,並離開位移狀態 | |
Exit1-IR | ||||
x | 1 | 1 | 更新指令為 IDCODE = 0x09 | |
Update-IR | ||||
x | 1 | 1 | ||
Select-DR-Scan | ||||
x | 0 | 1 | ||
Capture-DR | ||||
x | 0 | 1 | ||
Shift-DR | ||||
? | 0 | 31 | TDO 從 LSB 開始位移出 IDCODE | |
Shift-DR | ||||
? | 1 | 1 | TDO 位移出 IDCODE 最後 bit,並離開位移狀態 | |
Exit1-DR | ||||
x | 1 | 1 | ||
Update-DR | ||||
x | 0 | 1 | 回到 Run-Test/Idle 完成動作 | |
Run-Test/Idle | ||||
如果多個元件串接時,由於 TMS 是接在一起的,所以每個元件的 TAP 停留的狀態是一致的,只差在讀寫暫存器所需要位移的長度變長了
- IR 寫入指令 IDCODE 時,需要依照跟所有元件串接的順序排指令碼,目標元件填 IDCODE 指令碼,其它元件則填 BYPASS 指令碼。BYPASS 指令碼都是 1,只是不同元件 IR 的長度會有所不同。
- DR 讀出 IDCODE 時,需要把讀到的 BYPASS 過濾掉,每個 BYPASS 佔 1-bit。
參考來源:
- https://en.wikipedia.org/wiki/Joint_Test_Action_Group
- Spartan-6 FPGA Configuration User Guide
這篇很詳細 推~
回覆刪除哈哈,我的用心總算有人看見了。有時會用到 JTAG,但對其原理都是一知半解,看到的文件也都有一些交待不清,當時就下定決心好好弄清楚。
刪除有什麼需要改進的,還請指教。
雖然離發表很久了,但看完也來推一下
回覆刪除Thanks, it's useful
回覆刪除