[RTLLM-p037] Miscellaneous/RISC-V/alu


提交解答


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

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

32 位元 MIPS ALU

請設計一個名為 alu 的 32 位元算術邏輯單元。輸入 ab 為兩個 32 位元運算元,輸入 aluc 用來選擇要執行的運算。

ALU 必須輸出 32 位元運算結果 r,並產生 zerocarrynegativeoverflowflag 狀態訊號。


模組名稱

alu

輸入埠

埠名稱 位元寬度 說明
a 32 第一個運算元
b 32 第二個運算元
aluc 6 ALU 運算控制碼

輸出埠

埠名稱 位元寬度 說明
r 32 ALU 運算結果
zero 1 r 為 0 時輸出 1
carry 1 加減法產生的進位或無借位訊號
negative 1 等於結果 r 的最高位元
overflow 1 有號加減法的溢位訊號
flag 1 SLTSLTU 的比較結果;其他操作輸出高阻抗

支援的運算

指令 aluc 運算
ADD 6'b100000 有號加法 a + b
ADDU 6'b100001 無號加法 a + b
SUB 6'b100010 有號減法 a - b
SUBU 6'b100011 無號減法 a - b
AND 6'b100100 a & b
OR 6'b100101 a | b
XOR 6'b100110 a ^ b
NOR 6'b100111 ~(a | b)
SLT 6'b101010 有號比較 a < b
SLTU 6'b101011 無號比較 a < b
SLL 6'b000000 b 向左移動 a
SRL 6'b000010 b 邏輯右移 a
SRA 6'b000011 b 算術右移 a
SLLV 6'b000100 b 向左移動 a[4:0]
SRLV 6'b000110 b 邏輯右移 a[4:0]
SRAV 6'b000111 b 算術右移 a[4:0]
LUI 6'b001111 a[15:0] 放入結果高 16 位元

狀態訊號

Zero

當結果全部為 0 時:

zero = 1'b1;

否則:

zero = 1'b0;
Carry

加法時,carry 表示第 32 位元的進位輸出。

減法使用二補數加法完成:

a - b = a + ~b + 1

此時 carry = 1 表示減法沒有借位。

Negative

negative 直接取結果的最高位元:

negative = r[31];
Overflow

overflow 只針對有號 ADDSUB 計算。

有號加法發生溢位的情況:

  • 兩個正數相加得到負數。
  • 兩個負數相加得到正數。

有號減法發生溢位的情況:

  • ab 符號不同。
  • 結果符號與 a 不同。
Flag

執行 SLTSLTU 時,flag 為比較結果:

1:a 小於 b
0:a 不小於 b

執行其他操作時:

flag = 1'bz;

程式模板

module alu (
    input      [31:0] a,
    input      [31:0] b,
    input      [5:0]  aluc,
    output     [31:0] r,
    output            zero,
    output            carry,
    output            negative,
    output            overflow,
    output            flag
);

    // Write your code here

endmodule

評論

目前沒有評論。