diff options
| author | MyDariell <Dari3llsugiaman@gmail.com> | 2026-06-22 19:55:02 -0700 |
|---|---|---|
| committer | Warrick Lo <wlo@warricklo.net> | 2026-06-22 19:55:02 -0700 |
| commit | 7643e8f7afc960429dac33471dbcd56f1416a85f (patch) | |
| tree | 60ae88f956c3028ea3c9f48c55ed42609431eab5 /rtl/alu.sv | |
| parent | Implement XOR, OR, AND logical operations in sliced ALU (diff) | |
| download | montreal-7643e8f7afc960429dac33471dbcd56f1416a85f.tar.xz montreal-7643e8f7afc960429dac33471dbcd56f1416a85f.zip | |
Clean up ALU before merge
Co-authored-by: Warrick Lo <wlo@warricklo.net>
Signed-off-by: Warrick Lo <wlo@warricklo.net>
Diffstat (limited to 'rtl/alu.sv')
| -rw-r--r-- | rtl/alu.sv | 47 |
1 files changed, 18 insertions, 29 deletions
@@ -1,6 +1,8 @@ -module alu - import montreal_pkg::*; -#( +/* SPDX-License-Identifier: CERN-OHL-P-2.0 */ + +`include "types.svh" + +module alu #( parameter int unsigned XLEN = config_pkg::XLEN, parameter int unsigned SLICE_WIDTH = config_pkg::SLICE_WIDTH, @@ -27,48 +29,35 @@ module alu /* Carry signals. */ logic carry, carry_d, carry_q; - /* Adder width is SLICE_WIDTH + 1 to account for carry-out. */ - logic [SLICE_WIDTH:0] adder_a, adder_b, adder_result; - - /* For the first slice, carry-in must be driven to zero for addition - * and one for subtraction or comparisons. All other slices use the + /* For the first slice, carry-in must be driven to zero for addition + * and one for subtraction or comparisons. All other slices use the * carry-out from the previous slice */ + assign carry = (count_i == '0) ? negate_b : carry_q; - assign carry = (count_i == '0) ? negate_b : carry_q; + /* Adder width is SLICE_WIDTH + 1 to account for carry-out. */ + logic [SLICE_WIDTH:0] adder_a, adder_b, adder_result; - /* ADD, SUB, SLT, SLTU use the same adder to computer their results*/ - assign adder_a = {1'b0, a_i}; assign adder_b = {1'b0, (b_i ^ {SLICE_WIDTH{negate_b}})}; + + /* ADD, SUB, SLT, SLTU use the same adder to computer their results*/ assign adder_result = adder_a + adder_b + (SLICE_WIDTH + 1)'(carry); + assign carry_o = adder_result[SLICE_WIDTH]; assign carry_d = carry_o; /* Combinational arithmetic/logic core. */ always_comb begin : alu_core - result_o = '0; - unique casez (alu_op_i[2:0]) /* ADD, SUB, SLT, SLTU. */ - 3'b0??: begin - result_o = adder_result[SLICE_WIDTH-1:0]; - end + 3'b0??: result_o = adder_result[SLICE_WIDTH-1:0]; /* XOR. */ - 3'b100: begin - result_o = a_i ^ b_i; - carry_d = 0; - end + 3'b100: result_o = a_i ^ b_i; /* OR. */ - 3'b110: begin - result_o = a_i | b_i; - carry_d = 0; - end + 3'b110: result_o = a_i | b_i; /* AND. */ - 3'b111: begin - result_o = a_i & b_i; - carry_d = 0; - end - default: begin end + 3'b111: result_o = a_i & b_i; + default: result_o = '0; endcase end : alu_core |