Altifigence Academy

9 / 24 · 概念

在管線分界儲存完整交易

將加總與縮放算術拆開,同時對齊 valid、標籤與位元寬度。

暫存器分界除了位元,也攜帶意義

將 f(a,b)=3(a+b) 分成兩級。第一級儲存兩個無號八位元運算元相加的九位元總和。第二級形成十一位元縮放值,並儲存其最低八個位元。最大的寬位元結果是 1530。對此整數運算式,縮窄中間總和碰巧仍可保留最終的模 256 值,但會遺失溢位回報或後續比較所需的資訊。應明確保留中間結果的位元寬度。

每級都將 valid 與標籤和資料一起儲存。valid 為零代表空泡。空的級中可能仍保留舊資料位元,但它們不能被視為一筆交易。標籤需要與數值相同的暫存器延遲。兩個資料暫存器若只配一個標籤暫存器,就會將交易 B 的身分連到交易 A 的結果。

此核心假設沒有停頓,且埠永遠 ready。乘法前先延伸 s1,並指定常數寬度。第二級讀取舊 s1 與 t1;新輸入不能在同一個邊緣穿過兩個暫存器。

SystemVerilog
logic [8:0] s1;
logic [7:0] s2, t1, t2;
logic v1, v2;
logic [10:0] scaled;
assign scaled = {2'b00, s1} * 11'd3;
always_ff @(posedge clk) begin
  if (rst) begin
    v1 <= 1'b0;
    v2 <= 1'b0;
  end else begin
    v1 <= in_valid;
    v2 <= v1;
    if (in_valid) begin
      s1 <= {1'b0, a} + {1'b0, b};
      t1 <= in_tag;
    end
    if (v1) begin
      s2 <= scaled[7:0];
      t2 <= t1;
    end
  end
end

在邊緣 0 接受 A=(1,2):之後 s1=3。在邊緣 1 接受 B=(250,10):s1 變為 260,而 s2 儲存 A 的結果 9。A 在邊緣 1 之後有效,可於邊緣 2 傳輸。B 隨後產生 780 對 256 取模的結果,也就是 12。

空泡也必須透過 valid 暫存器移動。缺少輸入時若仍保持舊 v1=1,就可能重複一筆交易。重設會清除有效狀態,讓過期資料無法成為新結果。在每個分界,列出所有伴隨欄位:操作碼、標籤、例外、位址或封包結束標記。檢查這些欄位在整條管線中都維持同一筆交易。

自己試試看

連續接受 A=(1,2,tag=10) 與 B=(250,10,tag=11)。若使用 t2<=in_tag,A 的結果會附帶哪個標籤?寫出正確連接。

查看解說

在邊緣 1,s2 計算舊交易 A,但當前 in_tag 是 11,因此結果 9 會帶標籤 11。使用 t2<=t1,擷取 A 在第一級的舊標籤 10。

此選擇適用於本瀏覽器,隨時可從頁尾變更。