summaryrefslogtreecommitdiff
path: root/sim/alu.sv
diff options
context:
space:
mode:
Diffstat (limited to 'sim/alu.sv')
-rw-r--r--sim/alu.sv76
1 files changed, 76 insertions, 0 deletions
diff --git a/sim/alu.sv b/sim/alu.sv
new file mode 100644
index 0000000..407b083
--- /dev/null
+++ b/sim/alu.sv
@@ -0,0 +1,76 @@
1module alu
2 #( parameter UROM = "<no file specified>"
3 , parameter UIP_BITS = 15
4 , parameter UROM_BITS = 8
5 , parameter BUS_BITS = 16
6 )
7 ( input bit clk
8 , input bit reset
9 , input bit [UIP_BITS-1:0] uip
10 , inout bit [BUS_BITS-1:0] abus
11 , inout bit [BUS_BITS-1:0] dbus
12 );
13
14bit [BUS_BITS-1:0] x;
15
16typedef enum
17 { OP
18 , OP_SEL0
19 , OP_SEL1
20 , OP_SEL2
21 , OUTADDR
22 , OUTDATA
23 } CtrlBit;
24
25bit [UROM_BITS-1:0] ctrl;
26urom#(UROM, UIP_BITS, UROM_BITS) urom(uip, ctrl);
27
28bit [2:0] sel;
29assign sel = {ctrl[OP_SEL2], ctrl[OP_SEL1], ctrl[OP_SEL0]};
30
31bit [BUS_BITS-1:0] and_result;
32bit [BUS_BITS-1:0] or_result;
33bit [BUS_BITS-1:0] xor_result;
34bit [BUS_BITS-1:0] add_result;
35bit [BUS_BITS-1:0] sub_result;
36bit [BUS_BITS-1:0] cmp_result;
37bit [BUS_BITS-1:0] lshift_result;
38bit [BUS_BITS-1:0] rshift_result;
39
40assign and_result = abus & dbus;
41assign or_result = abus | dbus;
42assign xor_result = abus ^ dbus;
43assign add_result = abus + dbus;
44assign sub_result = abus - dbus;
45assign cmp_result = {{(BUS_BITS-6){1'b0}},
46 (abus != 0) & (dbus != 0),
47 (abus != 0) | (dbus != 0),
48 (abus != 0) ^ (dbus != 0),
49 abus > dbus,
50 abus == dbus,
51 abus < dbus};
52assign lshift_result = (dbus >= BUS_BITS) ? 0 : (abus << dbus);
53assign rshift_result = (dbus >= BUS_BITS) ? 0 : (abus >> dbus);
54
55bit [BUS_BITS-1:0] newx;
56assign newx =
57 (sel == 0) ? and_result :
58 (sel == 1) ? or_result :
59 (sel == 2) ? xor_result :
60 (sel == 3) ? add_result :
61 (sel == 4) ? sub_result :
62 (sel == 5) ? cmp_result :
63 (sel == 6) ? lshift_result :
64 (sel == 7) ? rshift_result :
65 {(BUS_BITS){1'bX}};
66
67assign abus = ctrl[OUTADDR] ? x : {(BUS_BITS){1'bZ}};
68assign dbus = ctrl[OUTDATA] ? x : {(BUS_BITS){1'bZ}};
69
70always @(posedge clk) begin
71 if (ctrl[OP]) begin
72 x <= newx;
73 end
74end
75
76endmodule