[RTLLM-p038] Miscellaneous/RISC-V/pe
32 位元乘加累加器
請設計一個名為 pe 的 32 位元乘加累加器(Multiply-Accumulate,MAC)。
模組內部包含一個 32 位元累加暫存器 c。在每一個時脈上升沿,模組計算輸入 a 與 b 的乘積,並將乘積加到目前的累加結果中:
c = c + a × b
當 Reset 訊號 rst 為 1 時,累加結果 c 必須立即清除為 0。
模組名稱
pe
輸入埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
clk |
1 | 時脈訊號,乘加運算在上升沿進行 |
rst |
1 | 高電位有效的非同步 Reset |
a |
32 | 乘法運算元 A |
b |
32 | 乘法運算元 B |
輸出埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
c |
32 | 目前的累加結果 |
功能說明
Reset
當:
rst = 1
時,無須等待時脈上升沿,輸出暫存器立即清除:
c = 32'h00000000
乘加運算
當:
rst = 0
時,在每一個 clk 上升沿執行:
c ← c + a × b
例如,Reset 後依序輸入:
| 時脈週期 | a |
b |
新的 c |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 5 |
| 3 | 3 | 3 | 14 |
計算過程為:
0 + 1 × 1 = 1
1 + 2 × 2 = 5
5 + 3 × 3 = 14
因此最後結果為:
c = 32'h0000000e
資料寬度
兩個 32 位元數相乘,完整乘積最多需要 64 位元:
wire [63:0] product;
但輸出累加器 c 只有 32 位元,因此本題保留乘積與累加結果的低 32 位元。
當結果超過 32 位元可表示的範圍時,高位元會被捨棄,運算結果相當於模 (2^{32}) 運算。
設計要求
- 模組名稱必須為
pe。 a與b都是 32 位元輸入。c為 32 位元累加暫存器。- Reset 為高電位有效的非同步 Reset。
rst = 1時,c必須立即清除為 0。rst = 0時,每個時脈上升沿執行一次乘加運算。- 沒有運算使能訊號,因此每一個有效時脈週期都會累加。
- 時序邏輯必須使用 nonblocking assignment。
程式模板
module pe (
input clk,
input rst,
input [31:0] a,
input [31:0] b,
output reg [31:0] c
);
// Write your code here
endmodule
評論