[RTLLM-p019] Arithmetic/Other Units/float_multi
IEEE-754 單精度浮點數乘法器
題目說明
請設計一個名為 float_multi 的 Verilog 模組,用於計算兩個 32 位元 IEEE-754 單精度浮點數的乘積:
z = a × b
模組必須使用時脈驅動的多週期架構,依序完成輸入解析、特殊值判斷、尾數乘法、指數計算、正規化、捨入以及結果輸出。
IEEE-754 單精度格式
32 位元 IEEE-754 單精度浮點數由以下欄位組成:
31 30 23 22 0
+--------------+----------------------+---------------------------+
| Sign (1 bit) | Exponent (8 bits) | Fraction (23 bits) |
+--------------+----------------------+---------------------------+
各欄位意義如下:
| 欄位 | 位元 | 說明 |
|---|---|---|
| Sign | 1 | 符號位元 |
| Exponent | 8 | 偏移指數,Bias 為 127 |
| Fraction | 23 | 小數部分 |
一般正規化數值可表示為:
(-1)^sign × 1.fraction × 2^(exponent-127)
模組介面
| 埠 | 方向 | 位元寬度 | 說明 |
|---|---|---|---|
clk |
input | 1 | 時脈訊號 |
rst |
input | 1 | 高電位有效同步重置 |
a |
input | 32 | 第一個 IEEE-754 單精度浮點數 |
b |
input | 32 | 第二個 IEEE-754 單精度浮點數 |
z |
output reg | 32 | IEEE-754 單精度乘法結果 |
運算延遲
本模組使用三個時脈週期完成一次乘法:
- 第一個週期:擷取並解析輸入。
- 第二個週期:處理特殊值或執行尾數乘法。
- 第三個週期:正規化、捨入並輸出結果。
模組沒有 valid 或 ready 訊號,因此每次輸入至少應保持到第一個取樣時脈邊緣。
新的運算會在前一次運算完成後開始。
設計要求
1. 符號計算
結果符號為兩個輸入符號的 XOR:
z_sign = a_sign XOR b_sign
2. 指數計算
對一般正規化數值,結果的未偏移指數為:
z_exponent = a_exponent + b_exponent
輸出時再加回 Bias 127。
3. 尾數乘法
正規化數值具有隱藏的最高位元 1:
1.fraction
因此,每個有效尾數共有 24 個位元。
兩個 24 位元尾數相乘會產生最多 48 位元的乘積。
4. 正規化
尾數相乘後,必須找到乘積的最高有效位元,並將結果調整為 IEEE-754 所需的形式:
1.xxxxxxxxxxxxxxxxxxxxxxx
正規化時必須同步調整指數。
5. 捨入
本題採用 IEEE-754 預設的:
Round to Nearest, Ties to Even
也就是最接近值捨入;若剛好位於中間,則捨入到最低保留位元為偶數的結果。
6. 特殊值
模組必須處理以下特殊輸入:
| 情況 | 輸出 |
|---|---|
| 任一輸入為 NaN | Quiet NaN |
| Infinity × Zero | Quiet NaN |
| Infinity × 非零有限值 | Infinity |
| Zero × 有限值 | Zero |
| 指數溢位 | Infinity |
| 指數下溢 | 次正規數或 Zero |
本題使用以下 canonical quiet NaN:
0x7FC00000
7. 次正規數
當 exponent 欄位為零、fraction 不為零時,輸入為次正規數。
次正規數沒有隱藏的最高位元 1,其值為:
(-1)^sign × 0.fraction × 2^-126
輸出結果也必須支援次正規數。
程式設計模板
module float_multi (
input clk,
input rst,
input [31:0] a,
input [31:0] b,
output reg [31:0] z
);
// Write your code here
endmodule
評論