//Testbench for miniCPU `timescale 10ns/1ns `include "C:/intelFPGA_lite/23.1std/miniCPU_modules.sv" //`include "C:/intelFPGA_lite/23.1std/miniCPU_tb_tasks.sv" module miniCPU_tb; //Outputs of dut = inputs to testbench wire [15:0] Address_tb; wire Read_tb; wire Write_tb; wire IO_Req_tb; wire Mem_Req_tb; wire [7:0] State_tb; wire Dir_tb; wire [7:0] Data_bus_tb; //Inputs to dut = outputs from testbench reg Reset_tb, Clock_tb; //Testbench variables reg [7:0] Data_out_tb; reg [7:0] Data_in_tb; logic [7:0] mem [0:255]; logic [7:0] port [0:15]; int fd; miniCPU dut ( .Reset(Reset_tb), .Address(Address_tb), .Data_bus(Data_bus_tb), .Clock(Clock_tb), .Read(Read_tb), .Write(Write_tb), .IO_Req(IO_Req_tb), .Mem_Req(Mem_Req_tb), .State(State_tb), .Dir(Dir_tb)); bidirec2 U1 (Dir_tb, Data_in_tb, Data_out_tb, Data_bus_tb); initial begin :initial_block open_file; readBinFile2Mem; close_file; printMem; end :initial_block initial begin: CLOCK_GENERATOR Clock_tb=0; forever begin #25 Clock_tb = ~ Clock_tb; end end initial begin Reset_tb = 0; #500 Reset_tb = 1; end always @(*) begin //Read memory if (!Mem_Req_tb & !Read_tb) Data_in_tb = mem [Address_tb [7:0]]; end always @(posedge Clock_tb) begin //Write memory if (!Mem_Req_tb & !Write_tb) mem [Address_tb [7:0]] <= Data_out_tb; end always @(*) begin //Read port if (!IO_Req_tb & !Read_tb) Data_in_tb = port [Address_tb [3:0]]; end always @(posedge Clock_tb) begin //Write port if (!IO_Req_tb & !Write_tb) port [Address_tb [3:0]] <= Data_out_tb; end // --------------------------------------------------------------------------- // Open the file // --------------------------------------------------------------------------- task open_file(); $display("Opening file"); fd = $fopen("test1.obj","rb"); $display ("File descriptor 1 = %0d", fd); endtask // --------------------------------------------------------------------------- // Read the contents of file descriptor // --------------------------------------------------------------------------- task readBinFile2Mem (); int n_Temp; n_Temp = $fread(mem, fd); $display ("File descriptor 2 = %0d", fd); $display("n_Temp = %0d",n_Temp); endtask // --------------------------------------------------------------------------- // Close the file // --------------------------------------------------------------------------- task close_file(); $display("Closing the file"); $fclose(fd); endtask // --------------------------------------------------------------------------- // Print memory contents // --------------------------------------------------------------------------- task printMem(); foreach(mem[i]) $display("mem[%0d] = %h",i,mem[i]); endtask endmodule