blob: 09694376f9db1a6fa9b6102672753363d1b85993 [file] [log] [blame]
/*
* Copyright 2018 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Base test
class riscv_instr_base_test extends uvm_test;
riscv_instr_gen_config cfg;
string test_opts;
string asm_file_name = "riscv_asm_test";
riscv_asm_program_gen asm_gen;
string instr_seq;
int start_idx;
`uvm_component_utils(riscv_instr_base_test)
function new(string name="", uvm_component parent=null);
super.new(name, parent);
void'($value$plusargs("asm_file_name=%0s", asm_file_name));
void'($value$plusargs("start_idx=%0d", start_idx));
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
`uvm_info(`gfn, "Create configuration instance", UVM_LOW)
cfg = riscv_instr_gen_config::type_id::create("cfg");
`uvm_info(`gfn, "Create configuration instance...done", UVM_LOW)
uvm_config_db#(riscv_instr_gen_config)::set(null, "*", "instr_cfg", cfg);
if(cfg.asm_test_suffix != "")
asm_file_name = {asm_file_name, ".", cfg.asm_test_suffix};
// Override the default riscv instruction sequence
if($value$plusargs("instr_seq=%0s", instr_seq)) begin
uvm_coreservice_t coreservice = uvm_coreservice_t::get();
uvm_factory factory = coreservice.get_factory();
factory.set_type_override_by_name("riscv_instr_sequence", instr_seq);
end
endfunction
function void report_phase(uvm_phase phase);
uvm_report_server rs;
int error_count;
rs = uvm_report_server::get_server();
error_count = rs.get_severity_count(UVM_WARNING) +
rs.get_severity_count(UVM_ERROR) +
rs.get_severity_count(UVM_FATAL);
if (error_count == 0) begin
`uvm_info("", "TEST PASSED", UVM_NONE);
end else begin
`uvm_info("", "TEST FAILED", UVM_NONE);
end
`uvm_info("", "TEST GENERATION DONE", UVM_NONE);
super.report_phase(phase);
endfunction
virtual function void apply_directed_instr();
endfunction
task run_phase(uvm_phase phase);
int fd;
cfg.build_instruction_template();
for(int i = 0; i < cfg.num_of_tests; i++) begin
string test_name;
randomize_cfg();
cfg.build_instruction_list();
asm_gen = riscv_asm_program_gen::type_id::create("asm_gen");
asm_gen.cfg = cfg;
asm_gen.get_directed_instr_stream();
test_name = $sformatf("%0s_%0d.S", asm_file_name, i+start_idx);
apply_directed_instr();
`uvm_info(`gfn, "All directed instruction is applied", UVM_LOW)
asm_gen.gen_program();
asm_gen.gen_test_file(test_name);
end
endtask
virtual function void randomize_cfg();
`DV_CHECK_RANDOMIZE_FATAL(cfg);
`uvm_info(`gfn, $sformatf("riscv_instr_gen_config is randomized:\n%0s",
cfg.sprint()), UVM_LOW)
endfunction
endclass