[RTLLM-p038] Miscellaneous/RISC-V/pe


提交解答


分數: 5
時間限制: 2.0s
記憶體限制: 256M

作者:
題目代碼
題目類型
允許的語言
Verilog

32 位元乘加累加器

請設計一個名為 pe 的 32 位元乘加累加器(Multiply-Accumulate,MAC)。

模組內部包含一個 32 位元累加暫存器 c。在每一個時脈上升沿,模組計算輸入 ab 的乘積,並將乘積加到目前的累加結果中:

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}) 運算。


設計要求

  1. 模組名稱必須為 pe
  2. ab 都是 32 位元輸入。
  3. c 為 32 位元累加暫存器。
  4. Reset 為高電位有效的非同步 Reset。
  5. rst = 1 時,c 必須立即清除為 0。
  6. rst = 0 時,每個時脈上升沿執行一次乘加運算。
  7. 沒有運算使能訊號,因此每一個有效時脈週期都會累加。
  8. 時序邏輯必須使用 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

評論

目前沒有評論。