[RTLLM-p019] Arithmetic/Other Units/float_multi


提交解答


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

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

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 單精度乘法結果

運算延遲

本模組使用三個時脈週期完成一次乘法:

  1. 第一個週期:擷取並解析輸入。
  2. 第二個週期:處理特殊值或執行尾數乘法。
  3. 第三個週期:正規化、捨入並輸出結果。

模組沒有 validready 訊號,因此每次輸入至少應保持到第一個取樣時脈邊緣。

新的運算會在前一次運算完成後開始。


設計要求

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

評論

目前沒有評論。