aboutsummaryrefslogtreecommitdiff
path: root/core/alu.v
diff options
context:
space:
mode:
Diffstat (limited to 'core/alu.v')
-rw-r--r--core/alu.v29
1 files changed, 29 insertions, 0 deletions
diff --git a/core/alu.v b/core/alu.v
new file mode 100644
index 0000000..439df08
--- /dev/null
+++ b/core/alu.v
@@ -0,0 +1,29 @@
+module alu(
+ input wire [3:0] op,
+ input wire [63:0] in_x,
+ input wire [63:0] in_y,
+ output reg [63:0] out
+ );
+
+ always @* begin
+ case (op)
+ 4'b0000: out = in_x & in_y; // and
+ 4'b0001: out = in_x | in_y; // or
+ 4'b0010: out = in_x + in_y; // add
+ 4'b0011: out = in_x - in_y; // sub
+ 4'b0100: out = $signed(in_x) >>> $signed(in_y); // sra signed
+ 4'b0101: out = in_x < in_y; // stlu
+ 4'b0110: out = in_x ^ in_y; // xor
+ 4'b0111: out = in_x >> in_y; // srl
+ 4'b1000: out = $signed(in_x) < $signed(in_y); // slt signed
+ 4'b1001: out = in_x << in_y; // sll
+ 4'b1010: out = ~(in_x | in_y); // nor
+ 4'b1011: out = $signed(in_x) >= $signed(in_y); // sge
+ 4'b1100: out = in_x >= in_y; // sgeu
+ 4'b1101: out = in_x == in_y; // seq
+ 4'b1110: out = in_x != in_y; // sne
+ 4'b1111: out = 0; // invalid
+ endcase
+ end // always @ *
+
+endmodule // alu