alu.sv 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import project_pkg::*;
  2. module alu(op, srcA, srcB, result, zero);
  3. input e_alu_op op;
  4. input word srcA;
  5. input word srcB;
  6. output word result;
  7. output logic zero;
  8. always_comb begin
  9. case(op)
  10. ALU_ADD: result = srcA + srcB;
  11. ALU_SUB: result = srcA - srcB;
  12. ALU_AND: result = srcA & srcB;
  13. ALU_OR : result = srcA | srcB;
  14. ALU_SLT: result = srcA > srcB;
  15. ALU_NOT: result = ~srcB;
  16. ALU_NOP: result = srcA;
  17. default: result = 0;
  18. endcase
  19. end
  20. assign zero = result == 0;
  21. endmodule
  22. module alu_tb;
  23. e_alu_op op;
  24. word srcA, srcB, result;
  25. logic zero;
  26. alu ALU(op, srcA, srcB, result, zero);
  27. initial begin
  28. op = ALU_NOP;
  29. srcA = 120;
  30. srcB = 100;
  31. #5ns;
  32. assert(result == srcA);
  33. op = ALU_ADD;
  34. #5ns;
  35. assert(result == 220);
  36. op = ALU_SUB;
  37. #5ns;
  38. assert(result == 20);
  39. op = ALU_AND;
  40. // 01100100 & 01111000 = 01100000
  41. #5ns;
  42. assert(result == 96);
  43. op = ALU_OR;
  44. // 01100100 | 01111000 = 01111100
  45. #5ns;
  46. assert(result == 124);
  47. op = ALU_SLT;
  48. #5ns;
  49. assert(result == 1);
  50. srcB = 140;
  51. #5ns;
  52. assert(result == 0);
  53. assert(zero == 1);
  54. $stop;
  55. end
  56. endmodule