[core] split a big function to 4 sub functions so that we can efficiently reuse for mock wrapper

This commit is contained in:
tangxifan 2023-05-26 17:31:07 -07:00
parent f7afbfa0bd
commit 788b1495dd
3 changed files with 126 additions and 17 deletions

View File

@ -330,19 +330,29 @@ int print_verilog_mock_fpga_wrapper(
std::vector<std::string> benchmark_clock_port_names =
find_atom_netlist_clock_port_names(atom_ctx.nlist, netlist_annotation);
/* Print local wires */
print_verilog_testbench_shared_input_ports(
fp, module_manager, global_ports, pin_constraints, atom_ctx,
netlist_annotation, benchmark_clock_port_names,
std::string(APPINST_PORT_POSTFIX), false);
print_verilog_testbench_shared_benchmark_output_ports(
fp, atom_ctx, netlist_annotation, std::string(APPINST_PORT_POSTFIX));
/* Instanciate application HDL module */
print_verilog_testbench_benchmark_instance(
fp, circuit_name, std::string(APP_INSTANCE_NAME), std::string(),
std::string(), std::string(APPINST_PORT_POSTFIX), std::string(APPINST_PORT_POSTFIX),
benchmark_clock_port_names, atom_ctx, netlist_annotation, pin_constraints,
bus_group, options.explicit_port_mapping());
std::string(), std::string(APPINST_PORT_POSTFIX),
std::string(APPINST_PORT_POSTFIX), benchmark_clock_port_names, atom_ctx,
netlist_annotation, pin_constraints, bus_group,
options.explicit_port_mapping());
/* Connect I/Os to benchmark I/Os or constant driver */
print_verilog_mock_fpga_wrapper_connect_ios(
fp, module_manager, top_module, atom_ctx, place_ctx, io_location_map,
netlist_annotation, bus_group, std::string(),
std::string(APPINST_PORT_POSTFIX), std::string(APPINST_PORT_POSTFIX), std::vector<std::string>(),
(size_t)VERILOG_DEFAULT_SIGNAL_INIT_VALUE);
std::string(APPINST_PORT_POSTFIX), std::string(APPINST_PORT_POSTFIX),
std::vector<std::string>(), (size_t)VERILOG_DEFAULT_SIGNAL_INIT_VALUE);
/* Testbench ends*/
print_verilog_module_end(fp, title);

View File

@ -914,20 +914,15 @@ void print_verilog_testbench_random_stimuli(
* which are
* 1. the shared input ports (registers) to drive both
* FPGA fabric and benchmark instance
* 2. the output ports (wires) for both FPGA fabric and benchmark instance
* 3. the checking flag ports to evaluate if outputs matches under the
* same input vectors
*******************************************************************/
void print_verilog_testbench_shared_ports(
void print_verilog_testbench_shared_input_ports(
std::fstream& fp, const ModuleManager& module_manager,
const FabricGlobalPortInfo& global_ports,
const PinConstraints& pin_constraints, const AtomContext& atom_ctx,
const VprNetlistAnnotation& netlist_annotation,
const std::vector<std::string>& clock_port_names,
const std::string& shared_input_port_postfix,
const std::string& benchmark_output_port_postfix,
const std::string& fpga_output_port_postfix,
const std::string& check_flag_port_postfix, const bool& no_self_checking) {
const std::string& shared_input_port_postfix, const bool& use_reg_port) {
/* Validate the file stream */
valid_file_stream(fp);
@ -959,8 +954,13 @@ void print_verilog_testbench_shared_ports(
if (false ==
port_is_fabric_global_reset_port(global_ports, module_manager,
pin_constraints.net_pin(block_name))) {
fp << "\t" << generate_verilog_port(VERILOG_PORT_REG, input_port) << ";"
<< std::endl;
if (use_reg_port) {
fp << "\t" << generate_verilog_port(VERILOG_PORT_REG, input_port) << ";"
<< std::endl;
} else {
fp << "\t" << generate_verilog_port(VERILOG_PORT_WIRE, input_port)
<< ";" << std::endl;
}
} else {
fp << "\t" << generate_verilog_port(VERILOG_PORT_WIRE, input_port) << ";"
<< std::endl;
@ -969,6 +969,19 @@ void print_verilog_testbench_shared_ports(
/* Add an empty line as splitter */
fp << std::endl;
}
/********************************************************************
* Print Verilog declaration of shared ports appear in testbenches
* which are
* 2. the output ports (wires) for FPGA fabric
*******************************************************************/
void print_verilog_testbench_shared_fpga_output_ports(
std::fstream& fp, const AtomContext& atom_ctx,
const VprNetlistAnnotation& netlist_annotation,
const std::string& fpga_output_port_postfix) {
/* Validate the file stream */
valid_file_stream(fp);
/* Instantiate wires for FPGA fabric outputs */
print_verilog_comment(fp, std::string("----- FPGA fabric outputs -------"));
@ -996,10 +1009,19 @@ void print_verilog_testbench_shared_ports(
/* Add an empty line as splitter */
fp << std::endl;
}
if (no_self_checking) {
return;
}
/********************************************************************
* Print Verilog declaration of shared ports appear in testbenches
* which are
* 2. the output ports (wires) for benchmark instance
*******************************************************************/
void print_verilog_testbench_shared_benchmark_output_ports(
std::fstream& fp, const AtomContext& atom_ctx,
const VprNetlistAnnotation& netlist_annotation,
const std::string& benchmark_output_port_postfix) {
/* Validate the file stream */
valid_file_stream(fp);
/* Instantiate wire for benchmark output */
print_verilog_comment(fp, std::string("----- Benchmark outputs -------"));
@ -1026,6 +1048,23 @@ void print_verilog_testbench_shared_ports(
/* Add an empty line as splitter */
fp << std::endl;
}
/********************************************************************
* Print Verilog declaration of shared ports appear in testbenches
* which are
* 1. the shared input ports (registers) to drive both
* FPGA fabric and benchmark instance
* 2. the output ports (wires) for both FPGA fabric and benchmark instance
* 3. the checking flag ports to evaluate if outputs matches under the
* same input vectors
*******************************************************************/
void print_verilog_testbench_shared_check_flags(
std::fstream& fp, const AtomContext& atom_ctx,
const VprNetlistAnnotation& netlist_annotation,
const std::string& check_flag_port_postfix) {
/* Validate the file stream */
valid_file_stream(fp);
/* Instantiate register for output comparison */
print_verilog_comment(
@ -1054,6 +1093,43 @@ void print_verilog_testbench_shared_ports(
fp << std::endl;
}
/********************************************************************
* Print Verilog declaration of shared ports appear in testbenches
* which are
* 1. the shared input ports (registers) to drive both
* FPGA fabric and benchmark instance
* 2. the output ports (wires) for both FPGA fabric and benchmark instance
* 3. the checking flag ports to evaluate if outputs matches under the
* same input vectors
*******************************************************************/
void print_verilog_testbench_shared_ports(
std::fstream& fp, const ModuleManager& module_manager,
const FabricGlobalPortInfo& global_ports,
const PinConstraints& pin_constraints, const AtomContext& atom_ctx,
const VprNetlistAnnotation& netlist_annotation,
const std::vector<std::string>& clock_port_names,
const std::string& shared_input_port_postfix,
const std::string& benchmark_output_port_postfix,
const std::string& fpga_output_port_postfix,
const std::string& check_flag_port_postfix, const bool& no_self_checking) {
print_verilog_testbench_shared_input_ports(
fp, module_manager, global_ports, pin_constraints, atom_ctx,
netlist_annotation, clock_port_names, shared_input_port_postfix, true);
print_verilog_testbench_shared_fpga_output_ports(
fp, atom_ctx, netlist_annotation, fpga_output_port_postfix);
if (no_self_checking) {
return;
}
print_verilog_testbench_shared_benchmark_output_ports(
fp, atom_ctx, netlist_annotation, benchmark_output_port_postfix);
print_verilog_testbench_shared_check_flags(fp, atom_ctx, netlist_annotation,
check_flag_port_postfix);
}
/********************************************************************
* Print signal initialization which
* deposit initial values for the input ports of primitive circuit models

View File

@ -90,6 +90,29 @@ void print_verilog_testbench_random_stimuli(
const std::string& check_flag_port_postfix,
const std::vector<BasicPort>& clock_ports, const bool& no_self_checking);
void print_verilog_testbench_shared_input_ports(
std::fstream& fp, const ModuleManager& module_manager,
const FabricGlobalPortInfo& global_ports,
const PinConstraints& pin_constraints, const AtomContext& atom_ctx,
const VprNetlistAnnotation& netlist_annotation,
const std::vector<std::string>& clock_port_names,
const std::string& shared_input_port_postfix, const bool& use_reg_port);
void print_verilog_testbench_shared_fpga_output_ports(
std::fstream& fp, const AtomContext& atom_ctx,
const VprNetlistAnnotation& netlist_annotation,
const std::string& fpga_output_port_postfix);
void print_verilog_testbench_shared_benchmark_output_ports(
std::fstream& fp, const AtomContext& atom_ctx,
const VprNetlistAnnotation& netlist_annotation,
const std::string& benchmark_output_port_postfix);
void print_verilog_testbench_shared_check_flags(
std::fstream& fp, const AtomContext& atom_ctx,
const VprNetlistAnnotation& netlist_annotation,
const std::string& check_flag_port_postfix);
void print_verilog_testbench_shared_ports(
std::fstream& fp, const ModuleManager& module_manager,
const FabricGlobalPortInfo& global_ports,