61 lines
2.9 KiB
Systemverilog
61 lines
2.9 KiB
Systemverilog
// Generated by CIRCT firtool-1.139.0
|
|
module ALU(
|
|
input [4:0] io_fn,
|
|
input [63:0] io_a,
|
|
io_b,
|
|
input io_isWord,
|
|
output [63:0] io_out
|
|
);
|
|
|
|
wire [5:0] shamt = io_isWord ? {1'h0, io_b[4:0]} : io_b[5:0];
|
|
wire [126:0] _raw_T_4 = {63'h0, io_a} << shamt;
|
|
wire [63:0] _GEN = {58'h0, shamt};
|
|
wire [64:0] _raw_T_22 =
|
|
$unsigned($signed($signed({io_a[63], io_a}) / $signed({io_b[63], io_b})));
|
|
wire [63:0] raw =
|
|
io_fn == 5'h0
|
|
? io_a + io_b
|
|
: io_fn == 5'h1
|
|
? io_a - io_b
|
|
: io_fn == 5'h2
|
|
? _raw_T_4[63:0]
|
|
: io_fn == 5'h3
|
|
? {63'h0, $signed(io_a) < $signed(io_b)}
|
|
: io_fn == 5'h4
|
|
? {63'h0, io_a < io_b}
|
|
: io_fn == 5'h5
|
|
? io_a ^ io_b
|
|
: io_fn == 5'h6
|
|
? io_a >> _GEN
|
|
: io_fn == 5'h7
|
|
? $signed($signed(io_a) >>> _GEN)
|
|
: io_fn == 5'h8
|
|
? io_a | io_b
|
|
: io_fn == 5'h9
|
|
? io_a & io_b
|
|
: io_fn == 5'hA
|
|
? io_a * io_b
|
|
: io_fn == 5'hB
|
|
? ((|io_b)
|
|
? _raw_T_22[63:0]
|
|
: 64'hFFFFFFFFFFFFFFFF)
|
|
: io_fn == 5'hC
|
|
? ((|io_b)
|
|
? io_a / io_b
|
|
: 64'hFFFFFFFFFFFFFFFF)
|
|
: io_fn == 5'hD
|
|
? ((|io_b)
|
|
? $signed($signed(io_a)
|
|
% $signed(io_b))
|
|
: io_a)
|
|
: io_fn == 5'hE
|
|
? ((|io_b)
|
|
? io_a % io_b
|
|
: io_a)
|
|
: io_fn == 5'hF
|
|
? io_b
|
|
: 64'h0;
|
|
assign io_out = io_isWord ? {{32{raw[31]}}, raw[31:0]} : raw;
|
|
endmodule
|
|
|