9 / 24 · 概念
在管線分界儲存完整交易
將加總與縮放算術拆開,同時對齊 valid、標籤與位元寬度。
單元可免費閱讀,註冊課程即可儲存學習進度。
暫存器分界除了位元,也攜帶意義
將 f(a,b)=3(a+b) 分成兩級。第一級儲存兩個無號八位元運算元相加的九位元總和。第二級形成十一位元縮放值,並儲存其最低八個位元。最大的寬位元結果是 1530。對此整數運算式,縮窄中間總和碰巧仍可保留最終的模 256 值,但會遺失溢位回報或後續比較所需的資訊。應明確保留中間結果的位元寬度。
每級都將 valid 與標籤和資料一起儲存。valid 為零代表空泡。空的級中可能仍保留舊資料位元,但它們不能被視為一筆交易。標籤需要與數值相同的暫存器延遲。兩個資料暫存器若只配一個標籤暫存器,就會將交易 B 的身分連到交易 A 的結果。
此核心假設沒有停頓,且埠永遠 ready。乘法前先延伸 s1,並指定常數寬度。第二級讀取舊 s1 與 t1;新輸入不能在同一個邊緣穿過兩個暫存器。
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。