diff options
Diffstat (limited to 'core/alu.v')
| -rw-r--r-- | core/alu.v | 29 |
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 |
