| 
									
										
										
										
											2018-06-05 23:42:20 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Arithmetic Logic Unit, as described in our book. This is a general | 
					
						
							|  |  |  |  * purpose aritmetic circuit. The width parameter specifies the operand width, | 
					
						
							|  |  |  |  * and left and right are the operands. op is the instruction, which decodes as | 
					
						
							|  |  |  |  * follows: | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  * 000 left AND right | 
					
						
							|  |  |  |  * 001 left OR right | 
					
						
							|  |  |  |  * 010 left + right | 
					
						
							|  |  |  |  * 011 unused | 
					
						
							|  |  |  |  * 000 left AND NOT right | 
					
						
							|  |  |  |  * 001 left OR NOT right | 
					
						
							|  |  |  |  * 010 left - right | 
					
						
							|  |  |  |  * 011 SLT left, right | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-05 00:06:45 -07:00
										 |  |  | module alu #(width=32) | 
					
						
							|  |  |  | 			 (input logic [width-1:0] left, right, | 
					
						
							|  |  |  | 			  input logic [2:0] op, | 
					
						
							|  |  |  | 			  output logic [width-1:0] out); | 
					
						
							|  |  |  | 	logic [width-1:0] selected_right, not_right; | 
					
						
							|  |  |  | 	assign not_right = ~right; | 
					
						
							|  |  |  | 	mux2 #(width) right_mux( | 
					
						
							|  |  |  | 		.left(right), | 
					
						
							|  |  |  | 		.right(not_right), | 
					
						
							|  |  |  | 		.select(op[2]), | 
					
						
							|  |  |  | 		.out(selected_right)); | 
					
						
							| 
									
										
										
										
											2018-06-05 23:42:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-05 00:06:45 -07:00
										 |  |  | 	logic [width-1:0] op_and, op_or, op_sum, op_slt; | 
					
						
							|  |  |  | 	assign op_and = left & selected_right; | 
					
						
							|  |  |  | 	assign op_or = left | selected_right; | 
					
						
							|  |  |  | 	assign op_sum = left + selected_right + op[2]; | 
					
						
							|  |  |  | 	assign op_slt = op_sum[width-1]; | 
					
						
							| 
									
										
										
										
											2018-06-05 23:42:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-05 00:06:45 -07:00
										 |  |  | 	mux4 output_mux( | 
					
						
							|  |  |  | 		.first(op_and), | 
					
						
							|  |  |  | 		.second(op_or), | 
					
						
							|  |  |  | 		.third(op_sum), | 
					
						
							|  |  |  | 		.fourth(op_slt), | 
					
						
							|  |  |  | 		.select(op[1:0]), | 
					
						
							|  |  |  | 		.out(out)); | 
					
						
							| 
									
										
										
										
											2018-06-05 23:42:20 -07:00
										 |  |  | endmodule |