`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: MIET // Engineer: Nikita Bulavin // // Create Date: // Design Name: // Module Name: tb_decoder_riscv // Project Name: RISCV_practicum // Target Devices: Nexys A7-100T // Tool Versions: // Description: tb for decoder riscv // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// import riscv_pkg::*; module tb_decoder_riscv(); 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 mem_req; wire mem_we; wire [2:0] mem_size; wire gpr_we_a; wire wb_src_sel; wire illegal_instr; wire branch; wire jal; wire jalr; reg [1:0] a_sel_miss; reg [2:0] b_sel_miss; reg [ALU_OP_WIDTH-1:0] alu_op_miss; reg mem_req_miss; reg mem_we_miss; reg [2:0] mem_size_miss; reg gpr_we_a_miss; reg wb_src_sel_miss; reg illegal_miss; reg branch_miss; reg jal_miss; reg jalr_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), .mem_req_o (mem_req), .mem_we_o (mem_we), .mem_size_o (mem_size), .gpr_we_a_o (gpr_we_a), .wb_src_sel_o (wb_src_sel), .illegal_instr_o (illegal_instr), .branch_o (branch), .jal_o (jal), .jalr_o (jalr) ); 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; mem_req_miss = 'b0; mem_we_miss = 'b0; mem_size_miss = 'b0; gpr_we_a_miss = 'b0; wb_src_sel_miss = 'b0; illegal_miss = 'b0; branch_miss = 'b0; jal_miss = 'b0; jalr_miss = 'b0; case (opcode) LOAD_OPCODE, STORE_OPCODE: begin a_sel_miss = (grm.ex_op_a_sel_o !== a_sel) & !illegal_instr; b_sel_miss = (grm.ex_op_b_sel_o !== b_sel) & !illegal_instr; alu_op_miss = (grm.alu_op_o !== alu_op) & !illegal_instr; 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_a_miss = grm.gpr_we_a_o !== gpr_we_a; wb_src_sel_miss = (grm.wb_src_sel_o !== wb_src_sel) & !illegal_instr; illegal_miss = grm.illegal_instr_o !== illegal_instr; branch_miss = grm.branch_o !== branch; jal_miss = grm.jal_o !== jal; jalr_miss = grm.jalr_o !== jalr; end JAL_OPCODE, JALR_OPCODE, AUIPC_OPCODE, OP_IMM_OPCODE, OP_OPCODE: begin a_sel_miss = (grm.ex_op_a_sel_o !== a_sel) & !illegal_instr; b_sel_miss = (grm.ex_op_b_sel_o !== b_sel) & !illegal_instr; alu_op_miss = (grm.alu_op_o !== alu_op) & !illegal_instr; 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_a_miss = grm.gpr_we_a_o !== gpr_we_a; wb_src_sel_miss = (grm.wb_src_sel_o !== wb_src_sel) & !illegal_instr; illegal_miss = grm.illegal_instr_o !== illegal_instr; branch_miss = grm.branch_o !== branch; jal_miss = grm.jal_o !== jal; jalr_miss = grm.jalr_o !== jalr; end BRANCH_OPCODE: begin a_sel_miss = (grm.ex_op_a_sel_o !== a_sel) & !illegal_instr; b_sel_miss = (grm.ex_op_b_sel_o !== b_sel) & !illegal_instr; alu_op_miss = (grm.alu_op_o !== alu_op) & !illegal_instr; 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_a_miss = grm.gpr_we_a_o !== gpr_we_a; //wb_src_sel_miss = (grm.wb_src_sel_o !== wb_src_sel) & !illegal_instr; illegal_miss = grm.illegal_instr_o !== illegal_instr; branch_miss = grm.branch_o !== branch; jal_miss = grm.jal_o !== jal; jalr_miss = grm.jalr_o !== jalr; end LUI_OPCODE: begin a_sel_miss = (grm.ex_op_a_sel_o !== a_sel) & !illegal_instr; b_sel_miss = (grm.ex_op_b_sel_o !== b_sel) & !illegal_instr; alu_op_miss = ((alu_op !== ALU_ADD)&(alu_op !== ALU_XOR)&(alu_op !== ALU_OR)) & !illegal_instr; 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_a_miss = grm.gpr_we_a_o !== gpr_we_a; wb_src_sel_miss = (grm.wb_src_sel_o !== wb_src_sel) & !illegal_instr; illegal_miss = grm.illegal_instr_o !== illegal_instr; branch_miss = grm.branch_o !== branch; jal_miss = grm.jal_o !== jal; jalr_miss = grm.jalr_o !== jalr; end default: //MISC_MEM_OPCODE, SYSTEM_OPCODE and other begin //a_sel_miss = grm.ex_op_a_sel_o !== a_sel; //b_sel_miss = grm.ex_op_b_sel_o !== b_sel; //alu_op_miss = grm.alu_op_o !== alu_op; 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_a_miss = grm.gpr_we_a_o !== gpr_we_a; //wb_src_sel_miss = grm.wb_src_sel_o !== wb_src_sel; illegal_miss = grm.illegal_instr_o !== illegal_instr; branch_miss = grm.branch_o !== branch; jal_miss = grm.jal_o !== jal; jalr_miss = grm.jalr_o !== jalr; end endcase end reg [4:0] 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