Lab2_test_alu.v 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. `timescale 1ns/100ps
  2. module test_alu;
  3. reg [7:0] inputA,inputB,true_out;
  4. reg clk,reset;
  5. reg [3:0] instruction;
  6. wire [7:0] alu_out;
  7. integer i,j,outfile,pat_error;
  8. ALU my_alu(alu_out,instruction,inputA,inputB,clk,reset);
  9. always #5 clk=~clk; //cycle time is 10ns
  10. initial begin
  11. //$dumpfile("Lab2_alu.vcd");
  12. //$dumpvars;
  13. //$sdf_annotate("Lab2_alu_s.sdf",my_alu);
  14. //$fsdbDumpfile("Lab2_alu.fsdb");
  15. //$fsdbDumpvars;
  16. outfile=$fopen("alu_out.txt"); //open one file for writing
  17. if(!outfile) begin
  18. $display("Can not write file!");
  19. $finish;
  20. end
  21. pat_error=0;
  22. reset=1'b1;clk=1'b1;inputA=0;inputB=0;instruction=0;
  23. #2 reset=1'b0; // system reset
  24. #3 reset=1'b1;
  25. // test for instruction 0: Add
  26. instruction=0;
  27. for(i=0;i<256;i=i+1)
  28. begin
  29. for(j=0;j<256;j=j+1)
  30. begin
  31. inputA=i[7:0];inputB=j[7:0];
  32. #20 true_out=inputA+inputB;
  33. if(alu_out !== true_out[7:0])
  34. begin
  35. $fdisplay(outfile,"%b + %b should be %b. But your output is %b.",inputA,inputB,true_out,alu_out);
  36. pat_error=pat_error+1;
  37. end
  38. end
  39. end
  40. // test for instruction 1: Sub
  41. instruction=4'b0001;
  42. for(i=0;i<256;i=i+1)
  43. begin
  44. for(j=0;j<256;j=j+1)
  45. begin
  46. inputA=i[7:0];inputB=j[7:0];
  47. #20 true_out=inputA-inputB;
  48. if(alu_out !== true_out[7:0])
  49. begin
  50. $fdisplay(outfile,"%b - %b should be %b. But your output is %b.",inputA,inputB,true_out,alu_out);
  51. pat_error=pat_error+1;
  52. end
  53. end
  54. end
  55. // test for instruction 2: Not
  56. instruction=4'b0010;
  57. for(j=0;j<256;j=j+1)
  58. begin
  59. inputB=j[7:0];
  60. #20 true_out=~inputB;
  61. if(alu_out !== true_out[7:0])
  62. begin
  63. $fdisplay(outfile,"~ %b should be %b. But your output is %b.",inputB,true_out,alu_out);
  64. pat_error=pat_error+1;
  65. end
  66. end
  67. // test for instruction 3: And
  68. instruction=4'b0011;
  69. for(i=0;i<256;i=i+1)
  70. begin
  71. for(j=0;j<256;j=j+1)
  72. begin
  73. inputA=i[7:0];inputB=j[7:0];
  74. #20 true_out=inputA&inputB;
  75. if(alu_out !== true_out[7:0])
  76. begin
  77. $fdisplay(outfile,"%b & %b should be %b. But your output is %b.",inputA,inputB,true_out,alu_out);
  78. pat_error=pat_error+1;
  79. end
  80. end
  81. end
  82. // test for instruction 4: Or
  83. instruction=4'b0100;
  84. for(i=0;i<256;i=i+1)
  85. begin
  86. for(j=0;j<256;j=j+1)
  87. begin
  88. inputA=i[7:0];inputB=j[7:0];
  89. #20 true_out=inputA|inputB;
  90. if(alu_out !== true_out[7:0])
  91. begin
  92. $fdisplay(outfile,"%b | %b should be %b. But your output is %b.",inputA,inputB,true_out,alu_out);
  93. pat_error=pat_error+1;
  94. end
  95. end
  96. end
  97. // test for instruction 5: Xor
  98. instruction=4'b0101;
  99. for(i=0;i<256;i=i+1)
  100. begin
  101. for(j=0;j<256;j=j+1)
  102. begin
  103. inputA=i[7:0];inputB=j[7:0];
  104. #20 true_out=inputA^inputB;
  105. if(alu_out !== true_out[7:0])
  106. begin
  107. $fdisplay(outfile,"%b ^ %b should be %b. But your output is %b.",inputA,inputB,true_out,alu_out);
  108. pat_error=pat_error+1;
  109. end
  110. end
  111. end
  112. if(!pat_error)
  113. $display("\nCongratulations!! Your Verilog Code is correct!!\n");
  114. else
  115. $display("\nYour Verilog Code has %d errors. \nPlease read alu_out.txt for details.\n",pat_error);
  116. #10 $finish;
  117. end
  118. endmodule