| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- `timescale 1ns/100ps
- module test_alu;
- reg [7:0] inputA,inputB,true_out;
- reg clk,reset;
- reg [3:0] instruction;
- wire [7:0] alu_out;
- integer i,j,outfile,pat_error;
- ALU my_alu(alu_out,instruction,inputA,inputB,clk,reset);
- always #5 clk=~clk; //cycle time is 10ns
- initial begin
- //$dumpfile("Lab2_alu.vcd");
- //$dumpvars;
- //$sdf_annotate("Lab2_alu_s.sdf",my_alu);
- //$fsdbDumpfile("Lab2_alu.fsdb");
- //$fsdbDumpvars;
- outfile=$fopen("alu_out.txt"); //open one file for writing
- if(!outfile) begin
- $display("Can not write file!");
- $finish;
- end
- pat_error=0;
- reset=1'b1;clk=1'b1;inputA=0;inputB=0;instruction=0;
- #2 reset=1'b0; // system reset
- #3 reset=1'b1;
- // test for instruction 0: Add
- instruction=0;
- for(i=0;i<256;i=i+1)
- begin
- for(j=0;j<256;j=j+1)
- begin
- inputA=i[7:0];inputB=j[7:0];
- #20 true_out=inputA+inputB;
- if(alu_out !== true_out[7:0])
- begin
- $fdisplay(outfile,"%b + %b should be %b. But your output is %b.",inputA,inputB,true_out,alu_out);
- pat_error=pat_error+1;
- end
- end
- end
-
- // test for instruction 1: Sub
- instruction=4'b0001;
- for(i=0;i<256;i=i+1)
- begin
- for(j=0;j<256;j=j+1)
- begin
- inputA=i[7:0];inputB=j[7:0];
- #20 true_out=inputA-inputB;
- if(alu_out !== true_out[7:0])
- begin
- $fdisplay(outfile,"%b - %b should be %b. But your output is %b.",inputA,inputB,true_out,alu_out);
- pat_error=pat_error+1;
- end
- end
- end
- // test for instruction 2: Not
- instruction=4'b0010;
- for(j=0;j<256;j=j+1)
- begin
- inputB=j[7:0];
- #20 true_out=~inputB;
- if(alu_out !== true_out[7:0])
- begin
- $fdisplay(outfile,"~ %b should be %b. But your output is %b.",inputB,true_out,alu_out);
- pat_error=pat_error+1;
- end
- end
-
- // test for instruction 3: And
- instruction=4'b0011;
- for(i=0;i<256;i=i+1)
- begin
- for(j=0;j<256;j=j+1)
- begin
- inputA=i[7:0];inputB=j[7:0];
- #20 true_out=inputA&inputB;
- if(alu_out !== true_out[7:0])
- begin
- $fdisplay(outfile,"%b & %b should be %b. But your output is %b.",inputA,inputB,true_out,alu_out);
- pat_error=pat_error+1;
- end
- end
- end
- // test for instruction 4: Or
- instruction=4'b0100;
- for(i=0;i<256;i=i+1)
- begin
- for(j=0;j<256;j=j+1)
- begin
- inputA=i[7:0];inputB=j[7:0];
- #20 true_out=inputA|inputB;
- if(alu_out !== true_out[7:0])
- begin
- $fdisplay(outfile,"%b | %b should be %b. But your output is %b.",inputA,inputB,true_out,alu_out);
- pat_error=pat_error+1;
- end
- end
- end
- // test for instruction 5: Xor
- instruction=4'b0101;
- for(i=0;i<256;i=i+1)
- begin
- for(j=0;j<256;j=j+1)
- begin
- inputA=i[7:0];inputB=j[7:0];
- #20 true_out=inputA^inputB;
- if(alu_out !== true_out[7:0])
- begin
- $fdisplay(outfile,"%b ^ %b should be %b. But your output is %b.",inputA,inputB,true_out,alu_out);
- pat_error=pat_error+1;
- end
- end
- end
-
- if(!pat_error)
- $display("\nCongratulations!! Your Verilog Code is correct!!\n");
- else
- $display("\nYour Verilog Code has %d errors. \nPlease read alu_out.txt for details.\n",pat_error);
- #10 $finish;
-
- end
- endmodule
|