傳輸觸發架構

在計算機架構中，傳輸觸發架構（ Transport triggered architecture, TTA ）是一種處理器設計，其中程序直接控制處理器的內部傳輸總線。計算作為數據傳輸的副作用發生：將數據寫入功能單元的觸發端口會觸發功能單元開始計算。這與脈動陣列中的情況類似。由於其模塊化結構，TTA 是應用特定指令集處理器（ASIP）的理想處理器模板，具有定製的數據路徑，但沒有固定功能硬件加速器的靈活性和設計成本。
通常，傳輸觸發處理器具有多個傳輸總線和多個連接到總線的功能單元，這為指令級並行性提供了機會。並行性由程序員靜態定義。在這方面（顯然由於指令字寬度較大），TTA 架構類似於非常長指令字（VLIW）架構。TTA 指令字由多個槽組成，每個總線一個槽，每個槽確定在相應總線上發生的數據傳輸。細粒度控制允許一些在傳統處理器中無法實現的優化。例如，軟件可以在功能單元之間直接傳輸數據，而無需使用寄存器。
傳輸觸發暴露了一些通常對程序員隱藏的微架構細節。這大大簡化了處理器的控制邏輯，因為許多通常在運行時做出的決策在編譯時就已固定。然而，這也意味著為一個 TTA 處理器編譯的二進制文件如果在兩個處理器之間的架構存在微小差異，則無法在另一個處理器上運行，必須重新編譯。二進制不兼容問題，加上實現完整上下文切換的複雜性，使得 TTA 更適合嵌入式系統而非通用計算。
在所有單指令集計算機架構中，TTA 架構是為數不多的有基於其構建的處理器的架構之一，也是唯一一個有基於其的處理器進行商業銷售的架構。

**與 VLIW 架構相比的優勢**
TTA 可以被視為“暴露數據路徑”的 VLIW 架構。雖然 VLIW 是通過操作進行編程的，但 TTA 將操作執行拆分為多個移動操作。與標準 VLIW 相比，低級編程模型帶來了幾個好處。例如，TTA 架構可以提供比 VLIW 更簡單的寄存器文件和更多的並行性。由於程序員可以控制操作數和結果數據傳輸的時序，因此寄存器文件（RF）的複雜性（輸入和輸出端口的數量）不必根據多個並行指令的最壞情況發射/完成場景進行縮放。
由傳輸編程啟用的一種重要獨特軟件優化稱為軟件旁路。在軟件旁路的情況下，程序員通過將數據直接移動到下一個功能單元的操作數端口來繞過寄存器文件的寫回。當這種優化被積極應用時，傳輸結果到寄存器文件的原始移動可以完全消除，從而減少寄存器文件端口的壓力，併為其他臨時變量釋放一個通用寄存器。減少的寄存器壓力，除了簡化 RF 硬件所需的複雜性外，還可以帶來顯著的 CPU 能量節省，這在移動嵌入式系統中尤其是一個重要的好處。  

**結構（Structure）**
TTA 處理器由獨立的功能單元和寄存器文件構成，這些單元通過傳輸總線和插座連接。

**功能單元（Function unit）**
每個功能單元實現一個或多個操作，這些操作的功能範圍從簡單的整數加法到複雜的任意用戶定義的特定應用計算。操作的操作數通過功能單元端口傳輸。
每個功能單元可能有一個獨立的流水線。如果一個功能單元是完全流水線化的，那麼每個時鐘週期都可以開始一個需要多個時鐘週期才能完成的新操作。另一方面，流水線可以是這樣的：在一箇舊操作仍在執行時，它並不總是接受新的操作啟動請求。
數據內存訪問和與處理器外部的通信是通過使用特殊功能單元來處理的。實現內存訪問操作並連接到內存模塊的功能單元通常稱為加載/存儲單元。

**控制單元（Control unit）**
控制單元是功能單元的一個特殊案例，它控制程序的執行。控制單元可以訪問指令存儲器，以便獲取要執行的指令。為了允許已執行的程序將執行（跳轉）轉移到已執行程序中的任意位置，控制單元提供控制流操作。控制單元通常具有指令流水線，包含獲取、解碼和執行程序指令的各個階段。

**寄存器文件（Register files）**
寄存器文件包含通用寄存器，用於在程序中存儲變量。與功能單元一樣，寄存器文件也具有輸入和輸出端口。讀寫端口的數量，即在同一個時鐘週期內能夠讀取和寫入多個寄存器的能力，可以在每個寄存器文件中有所不同。

**傳輸總線和套接字（Transport buses and sockets）**
互連架構由傳輸總線組成，這些總線通過插座連接到功能單元端口。由於連接的成本，通常會減少單元之間的連接數量（功能單元和寄存器文件）。如果每個單元的輸出端口到每個單元的輸入端口之間都有路徑，則稱 TTA 為完全連接。
套接字（Sockets）提供了編程 TTA 處理器的手段，通過允許在任何時刻選擇插座的哪些總線到端口連接被啟用。因此，發生在一個時鐘週期內的數據傳輸可以通過定義每個總線要啟用的源和目標插座/端口連接來編程。

**條件執行（Conditional execution）**
某些 TTA 實現支持條件執行。
條件執行是通過保護器實現的。每個數據傳輸都可以通過一個保護器進行條件化，該保護器連接到一個寄存器（通常是一個 1 位條件寄存器）和一個總線。如果被保護寄存器的值評估為假（零），則連接到該保護器的總線上的數據傳輸將被壓制，即不寫入其目的地。無條件數據傳輸不連接到任何保護器，並始終執行。

**分支（Branches）**
所有處理器，包括 TTA 處理器，都包含控制流指令，這些指令會改變程序計數器，用於實現子程序、if-then-else、for 循環等。TTA 處理器的彙編語言通常包括控制流指令，如無條件跳轉（JUMP）、條件相對跳轉（BNZ）、子程序調用（CALL）、條件返回（RETNZ）等，這些指令與其他處理器的相應彙編語言指令看起來相同。
與 TTA 機器上的所有其他操作一樣，這些指令作為“移動”指令實現到一個特殊功能單元。
支持條件執行的 TTA 實現，例如 sTTAck 和第一個 MOVE 原型，可以將大多數這些控制流指令實現為對程序計數器的條件移動。  
僅支持無條件數據傳輸的 TTA 實現，例如 Maxim Integrated MAXQ，  通常具有一個與程序計數器緊密連接的特殊功能單元，該單元響應各種目的地址。每個這樣的地址在作為“移動”的目的地時，對程序計數器有不同的影響——每個“相對分支 ”指令對於每個條件都有不同的目的地址；其他目的地址用於 CALL、RETNZ 等。

**編程**
在更傳統的處理器架構中，處理器通常通過定義執行的操作及其操作數來編程。例如，RISC 架構中的加法指令可能如下所示。
add r3, r1, r2
這個示例操作將通用寄存器 r1 和 r2 的值相加，並將結果存儲在寄存器 r3 中。粗略地說，處理器中指令的執行可能會導致將指令轉換為控制信號，這些控制信號控制互連網絡連接和功能單元。互連網絡用於將寄存器 r1 和 r2 的當前值傳輸到能夠執行加法操作的功能單元，通常稱為 ALU，即算術邏輯單元。最後，一個控制信號選擇並觸發 ALU 中的加法操作，其結果被傳回寄存器 r3。
TTA 程序不定義操作，僅定義寫入和讀取操作數值所需的數據傳輸。操作本身是通過向操作的觸發操作數寫入數據來觸發的。因此，操作是作為觸發數據傳輸的副作用執行的。因此，在 TTA 中執行加法操作需要三個數據傳輸定義，也稱為移動。移動定義了在傳輸總線中進行的數據傳輸的端點。例如，移動可以聲明從功能單元 F，端口 1，到寄存器文件 R，寄存器索引 2 的數據傳輸應在總線 B1 中進行。如果目標處理器中有多個總線，則可以在同一個時鐘週期內並行利用每個總線。因此，通過在同一條指令中調度多個數據傳輸，可以利用數據傳輸級別的並行性。
在 TTA 處理器中，可以執行加法操作，如下所示：
r1 -> ALU.operand1
r2 -> ALU.add.trigger
ALU.result -> r3
第二個操作，即對稱為 ALU 的功能單元的第二個操作數進行寫入，觸發了加法操作。這使得加法的結果在'add'的執行延遲後可在輸出端口'result'中獲得。
與 ALU 相關的端口可以充當累加器，允許創建抽象底層 TTA 的宏指令：
lda r1    ; "load ALU": move value to ALU operand 1
add r2    ; add: move value to add trigger
sta r3    ; "store ALU": move value from ALU result

**程序員可見的操作延遲**
TTAs 的主要理念是將複雜性從硬件轉移到軟件。因此，程序員面臨著幾個額外的風險。其中之一是延遲槽，即功能單元的可見操作延遲。時序完全由程序員負責。程序員必須安排指令，以確保結果既不會過早讀取，也不會過晚讀取。如果結果過早讀取，硬件不會檢測到並鎖定處理器。例如，考慮一個具有延遲為 1 的加法操作和延遲為 3 的乘法操作的架構。當觸發加法操作時，可以在下一條指令（下一個時鐘週期）中讀取結果，但在乘法操作的情況下，必須等待兩條指令才能讀取結果。結果在觸發指令後的第 3 條指令時準備就緒。
過早讀取結果會導致讀取到先前觸發的操作的結果，或者在函數單元中沒有先前觸發的操作時，讀取的值是未定義的。另一方面，結果必須足夠早地讀取，以確保下一個操作的結果不會覆蓋輸出端口中尚未讀取的結果。
由於程序員可見的處理器上下文豐富，實際上除了寄存器文件內容外，還包括功能單元管道寄存器內容和/或功能單元輸入輸出端口，因此在 TTA 處理器中，外部中斷支持所需的上下文保存可能變得複雜且實現成本高。因此，TTA 處理器通常不支持中斷，而是將其任務委託給外部硬件（例如，I/O 處理器），或者通過使用輪詢等替代同步/通信機制來避免其需求。

**實現**
  MAXQ    來自 Maxim Integrated，是唯一一款基於傳輸觸發架構的商用微控制器，它是一種 OISC 或“單指令集計算機”。它提供了一個靈活的 MOVE 指令，可以通過將值直接移動到程序計數器來充當各種虛擬指令。 “move project”設計並製造了幾個實驗性的 TTA 微處理器。 OpenASIP 是一個開源的應用特定指令集工具集，利用 TTA 作為處理器模板。 Amiga Copper 的架構具有傳輸觸發架構的所有基本特徵。 新英格蘭數字公司開發的 Able 處理器。 基於 WireWorld 的計算機。 Dr. Dobb's 發佈了 One-Der，一個用 Verilog 編寫的 32 位 TTA，配有匹配的交叉彙編器和 Forth 編譯器。   Mali (200/400) 頂點處理器，使用 128 位指令字單精度浮點標量 TTA citation needed 。

**另見**
 Application-specific instruction-set processor (ASIP) 專用指令集處理器 (ASIP)-  超長指令字 (VLIW) date=20211020031851 - Explicitly parallel instruction computing (EPIC) 顯式並行指令計算 (EPIC)- 數據流架構

**參考文獻**
# V. Guzma, P. Jääskeläinen, P. Kellomäki, and J. Takala, “Impact of Software Bypassing on Instruction Level Parallelism and Register File Traffic”
# ^ Johan Janssen. "Compiler Strategies for Transport Triggered Architectures". 2001. p. 168.
# ^ Henk Corporaal. "Transport Triggered Architectures examined for general purpose applications"http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.79.7011&rep=rep1&type=pdf
# ^ Aliaksei V. Chapyzhenka. "sTTAck: Stack Transport Triggered Architecture"http://www.complang.tuwien.ac.at/anton/euroforth/ef99/chapyzhenka99.pdf
# ^ a b Jump up to:"MAXQ Family User's Guide". Maxim Integrated. Section "1.1 Instruction Set". A register-based, transport-triggered architecture allows all instructions to be coded as simple transfer operations. All instructions reduce to either writing an immediate value to a destination register or memory location or moving data between registers and/or memory locations.
# ^Catsoulis, John (2005), Designing embedded hardware (2 ed.), O'Reilly Media, pp. 327–333, ISBN 978-0-596-00755-3
# ^ Dr. Dobb's article with 32-bit FPGA CPU in Verilog
# ^ Web site with more details on the Dr. Dobb's CPU Archived 2013-02-18 at archive.today