////////////////////////////////////////////////////////////////////////////////// // Company: MIET // Engineer: Nikita Bulavin // Module Name: tb_decoder_riscv // Project Name: RISCV_practicum // Target Devices: Nexys A7-100T // Description: tb for decoder riscv ////////////////////////////////////////////////////////////////////////////////// module tb_decoder_riscv(); import riscv_pkg::*; parameter delay = 4; parameter cycle = 200; // per one opcode reg [31:0] instr; wire [1:0] a_sel; wire [2:0] b_sel; wire [ALU_OP_WIDTH-1:0] alu_op; wire [2:0] csr_op; wire csr_we; wire mem_req; wire mem_we; wire [2:0] mem_size; wire gpr_we; wire [1:0] wb_sel; wire illegal_instr; wire branch; wire jal; wire jalr; wire mret; reg a_sel_miss; reg b_sel_miss; reg alu_op_miss; reg csr_op_miss; reg csr_we_miss; reg mem_req_miss; reg mem_we_miss; reg mem_size_miss; reg gpr_we_miss; reg wb_sel_miss; reg illegal_miss; reg branch_miss; reg jal_miss; reg jalr_miss; reg mret_miss; string opcode_type; string instr_type; decoder_riscv dut ( .fetched_instr_i (instr), .a_sel_o (a_sel), .b_sel_o (b_sel), .alu_op_o (alu_op), .csr_op_o (csr_op), .csr_we_o (csr_we), .mem_req_o (mem_req), .mem_we_o (mem_we), .mem_size_o (mem_size), .gpr_we_o (gpr_we), .wb_sel_o (wb_sel), .illegal_instr_o (illegal_instr), .branch_o (branch), .jal_o (jal), .jalr_o (jalr), .mret_o (mret) ); decoder_riscv_ref grm(.fetched_instr_i (instr)); wire [4:0] opcode; assign opcode = instr[6:2]; always @(*) begin case (opcode) LUI_OPCODE, AUIPC_OPCODE, JAL_OPCODE: instr_type = $sformatf("%020b %05b %07b ", instr[31:12], instr[11:7], instr[6:0]); JALR_OPCODE, LOAD_OPCODE, OP_IMM_OPCODE, SYSTEM_OPCODE: instr_type = $sformatf("%012b %05b %03b %05b %07b ", instr[31:20], instr[19:15], instr[14:12], instr[11:7], instr[6:0]); BRANCH_OPCODE, STORE_OPCODE, OP_OPCODE: instr_type = $sformatf("%07b %05b %05b %03b %05b %07b", instr[31:25], instr[24:20], instr[19:15], instr[14:12], instr[11:7], instr[6:0]); MISC_MEM_OPCODE: instr_type = $sformatf("%017b %03b %05b %07b ", instr[31:15], instr[14:12], instr[11:7], instr[6:0]); default: instr_type = $sformatf("%032b ", instr); endcase end always @(*) begin a_sel_miss = 'b0; b_sel_miss = 'b0; alu_op_miss = 'b0; csr_op_miss = 'b0; csr_we_miss = 'b0; mem_req_miss = 'b0; mem_we_miss = 'b0; mem_size_miss = 'b0; gpr_we_miss = 'b0; wb_sel_miss = 'b0; illegal_miss = 'b0; branch_miss = 'b0; jal_miss = 'b0; jalr_miss = 'b0; mret_miss = 'b0; illegal_miss = grm.illegal_instr_o !== illegal_instr; case (opcode) LOAD_OPCODE, STORE_OPCODE: begin a_sel_miss = (grm.a_sel_o !== a_sel) & !illegal_instr; b_sel_miss = (grm.b_sel_o !== b_sel) & !illegal_instr; alu_op_miss = (grm.alu_op_o !== alu_op) & !illegal_instr; csr_we_miss = (grm.csr_we_o !== csr_we); mem_req_miss = grm.mem_req_o !== mem_req; mem_we_miss = grm.mem_we_o !== mem_we; mem_size_miss = (grm.mem_size_o !== mem_size) & !illegal_instr; gpr_we_miss = grm.gpr_we_o !== gpr_we; wb_sel_miss = (grm.wb_sel_o !== wb_sel) & !illegal_instr; branch_miss = grm.branch_o !== branch; jal_miss = grm.jal_o !== jal; jalr_miss = grm.jalr_o !== jalr; mret_miss = grm.mret_o !== mret; end JAL_OPCODE, JALR_OPCODE, AUIPC_OPCODE, OP_IMM_OPCODE, OP_OPCODE: begin a_sel_miss = (grm.a_sel_o !== a_sel) & !illegal_instr; b_sel_miss = (grm.b_sel_o !== b_sel) & !illegal_instr; alu_op_miss = (grm.alu_op_o !== alu_op) & !illegal_instr; csr_we_miss = (grm.csr_we_o !== csr_we); mem_req_miss = grm.mem_req_o !== mem_req; mem_we_miss = grm.mem_we_o !== mem_we; //mem_size_miss = (grm.mem_size_o !== mem_size) & !illegal_instr; gpr_we_miss = grm.gpr_we_o !== gpr_we; wb_sel_miss = (grm.wb_sel_o !== wb_sel) & !illegal_instr; branch_miss = grm.branch_o !== branch; jal_miss = grm.jal_o !== jal; jalr_miss = grm.jalr_o !== jalr; mret_miss = grm.mret_o !== mret; end BRANCH_OPCODE: begin a_sel_miss = (grm.a_sel_o !== a_sel) & !illegal_instr; b_sel_miss = (grm.b_sel_o !== b_sel) & !illegal_instr; alu_op_miss = (grm.alu_op_o !== alu_op) & !illegal_instr; csr_we_miss = (grm.csr_we_o !== csr_we); mem_req_miss = grm.mem_req_o !== mem_req; mem_we_miss = grm.mem_we_o !== mem_we; //mem_size_miss = (grm.mem_size_o !== mem_size) & !illegal_instr; gpr_we_miss = grm.gpr_we_o !== gpr_we; //wb_sel_miss = (grm.wb_sel_o !== wb_sel) & !illegal_instr; branch_miss = grm.branch_o !== branch; jal_miss = grm.jal_o !== jal; jalr_miss = grm.jalr_o !== jalr; mret_miss = grm.mret_o !== mret; end LUI_OPCODE: begin a_sel_miss = (grm.a_sel_o !== a_sel) & !illegal_instr; b_sel_miss = (grm.b_sel_o !== b_sel) & !illegal_instr; alu_op_miss = ((alu_op !== ALU_ADD)&(alu_op !== ALU_XOR)&(alu_op !== ALU_OR)) & !illegal_instr; csr_we_miss = (grm.csr_we_o !== csr_we); mem_req_miss = grm.mem_req_o !== mem_req; mem_we_miss = grm.mem_we_o !== mem_we; //mem_size_miss = (grm.mem_size_o !== mem_size) & !illegal_instr; gpr_we_miss = grm.gpr_we_o !== gpr_we; wb_sel_miss = (grm.wb_sel_o !== wb_sel) & !illegal_instr; branch_miss = grm.branch_o !== branch; jal_miss = grm.jal_o !== jal; jalr_miss = grm.jalr_o !== jalr; mret_miss = grm.mret_o !== mret; end SYSTEM_OPCODE: begin //a_sel_miss = (grm.a_sel_o !== a_sel) & !illegal_instr; //b_sel_miss = (grm.b_sel_o !== b_sel) & !illegal_instr; //alu_op_miss = ((alu_op !== ALU_ADD)&(alu_op !== ALU_XOR)&(alu_op !== ALU_OR)) & !illegal_instr; csr_we_miss = (grm.csr_we_o !== csr_we); mem_req_miss = grm.mem_req_o !== mem_req; mem_we_miss = grm.mem_we_o !== mem_we; //mem_size_miss = (grm.mem_size_o !== mem_size) & !illegal_instr; gpr_we_miss = grm.gpr_we_o !== gpr_we; wb_sel_miss = (grm.wb_sel_o !== wb_sel) & !illegal_instr & !mret; branch_miss = grm.branch_o !== branch; jal_miss = grm.jal_o !== jal; jalr_miss = grm.jalr_o !== jalr; mret_miss = grm.mret_o !== mret; end default: //MISC_MEM_OPCODE and other begin //a_sel_miss = grm.a_sel_o !== a_sel; //b_sel_miss = grm.b_sel_o !== b_sel; //alu_op_miss = grm.alu_op_o !== alu_op; csr_we_miss = (grm.csr_we_o !== csr_we); mem_req_miss = grm.mem_req_o !== mem_req; mem_we_miss = grm.mem_we_o !== mem_we; //mem_size_miss = grm.mem_size_o !== mem_size; gpr_we_miss = grm.gpr_we_o !== gpr_we; //wb_sel_miss = grm.wb_sel_o !== wb_sel; branch_miss = grm.branch_o !== branch; jal_miss = grm.jal_o !== jal; jalr_miss = grm.jalr_o !== jalr; mret_miss = grm.mret_o !== mret; end endcase end integer X; reg [$clog2(cycle+1)-1:0] V; integer error; initial begin $timeformat(-9, 2, " ns", 3); error = 0; end initial begin $display( "\nStart test: \n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop(); for (V=0; V