| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import project_pkg::*;
- module alu(op, srcA, srcB, result, zero);
-
- input e_alu_op op;
- input word srcA;
- input word srcB;
- output word result;
- output logic zero;
-
- always_comb begin
- case(op)
- ALU_ADD: result = srcA + srcB;
- ALU_SUB: result = srcA - srcB;
- ALU_AND: result = srcA & srcB;
- ALU_OR : result = srcA | srcB;
- ALU_SLT: result = srcA > srcB;
- ALU_NOT: result = ~srcB;
- ALU_NOP: result = srcA;
- default: result = 0;
- endcase
- end
- assign zero = result == 0;
-
- endmodule
- module alu_tb;
- e_alu_op op;
- word srcA, srcB, result;
- logic zero;
-
- alu ALU(op, srcA, srcB, result, zero);
-
- initial begin
- op = ALU_NOP;
- srcA = 120;
- srcB = 100;
- #5ns;
- assert(result == srcA);
- op = ALU_ADD;
- #5ns;
- assert(result == 220);
- op = ALU_SUB;
- #5ns;
- assert(result == 20);
- op = ALU_AND;
- // 01100100 & 01111000 = 01100000
- #5ns;
- assert(result == 96);
- op = ALU_OR;
- // 01100100 | 01111000 = 01111100
- #5ns;
- assert(result == 124);
- op = ALU_SLT;
- #5ns;
- assert(result == 1);
- srcB = 140;
- #5ns;
- assert(result == 0);
- assert(zero == 1);
- $stop;
- end
- endmodule
|