summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nandgame/hack_alu.sv32
1 files changed, 17 insertions, 15 deletions
diff --git a/nandgame/hack_alu.sv b/nandgame/hack_alu.sv
index 8ece81a..267b4a7 100644
--- a/nandgame/hack_alu.sv
+++ b/nandgame/hack_alu.sv
@@ -2,12 +2,8 @@
`timescale 1us/1us
-`include "nandgame_types.v"
-`include "arith_unit.sv"
-`include "logic_unit.sv"
-
-`ifndef NANDGAME_ALU
-`define NANDGAME_ALU
+`ifndef HACK_ALU
+`define HACK_ALU
// See fig. 2.6 in book
module alu #(
@@ -41,26 +37,32 @@ module alu #(
output logic negate_out
);
-logic [(DATA_WIDTH-1):0] int_op_x /* verilator public */;
-logic [(DATA_WIDTH-1):0] int_op_y /* verilator public */;
+logic [(DATA_WIDTH-1):0] x1, x2, y1, y2, res1, res2 /* verilator public */;
// logic [(DATA_WIDTH-1):0] int_result_arith;
// logic [(DATA_WIDTH-1):0] int_result_logic;
-// assign int_op_x = zx_in ? 0
-// : (sw_in ? Y_in : X_in);
-// assign int_op_y = sw_in ? X_in : Y_in;
+assign x1 = zx ? 0 : X_in;
+assign y1 = zy ? 0 : Y_in;
+assign x2 = nx ? -x1 : x1;
+assign y2 = ny ? -y1 : y1;
+assign res1 = f_arith_nlogic_in ? (x2 + y2) : (x2 & y2);
+assign res2 = neg_out ? -res1 : res1;
+assign result_out = res2;
+assign zero_out = result_out == 0;
+assign negate_out = result_out[DATA_WIDTH-1] == 1;
+// assign y1 = sw_in ? X_in : Y_in;
// arith_unit au (
-// .X_in(int_op_x),
-// .Y_in(int_op_y),
+// .X_in(x1),
+// .Y_in(y1),
// .result_out(int_result_arith),
// .arith_operation_in(ArithCode'(opcode_in))
// );
// logic_unit lu (
-// .X_in(int_op_x),
-// .Y_in(int_op_y),
+// .X_in(x1),
+// .Y_in(y1),
// .result_out(int_result_logic),
// .logic_operation_in(LogicCode'(opcode_in))
// );