78 lines
4.2 KiB
Systemverilog
78 lines
4.2 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 [127:0] _GEN = {{64{io_a[63]}}, io_a};
|
|
wire [127:0] _signedProduct_T_2 = _GEN * {{64{io_b[63]}}, io_b};
|
|
wire [127:0] _GEN_0 = {64'h0, io_b};
|
|
wire [127:0] _signedUnsignedProduct_T_3 = _GEN * _GEN_0;
|
|
wire [127:0] unsignedProduct = {64'h0, io_a} * _GEN_0;
|
|
wire [126:0] _raw_T_5 = {63'h0, io_a} << shamt;
|
|
wire [31:0] _GEN_1 = {27'h0, io_b[4:0]};
|
|
wire [63:0] _GEN_2 = {58'h0, shamt};
|
|
wire [64:0] _raw_T_33 =
|
|
$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
|
|
? (io_isWord ? {1'h0, {31'h0, io_a[31:0]} << io_b[4:0]} : _raw_T_5[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_isWord
|
|
? {32'h0, io_a[31:0] >> _GEN_1}
|
|
: io_a >> _GEN_2)
|
|
: io_fn == 5'h7
|
|
? (io_isWord
|
|
? {32'h0, $signed($signed(io_a[31:0]) >>> _GEN_1)}
|
|
: $signed($signed(io_a) >>> _GEN_2))
|
|
: io_fn == 5'h8
|
|
? io_a | io_b
|
|
: io_fn == 5'h9
|
|
? io_a & io_b
|
|
: io_fn == 5'hA
|
|
? unsignedProduct[63:0]
|
|
: io_fn == 5'h10
|
|
? _signedProduct_T_2[127:64]
|
|
: io_fn == 5'h11
|
|
? _signedUnsignedProduct_T_3[127:64]
|
|
: io_fn == 5'h12
|
|
? unsignedProduct[127:64]
|
|
: io_fn == 5'hB
|
|
? ((|io_b)
|
|
? _raw_T_33[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
|
|
|