Success! Subscription added.
Success! Subscription removed.
Sorry, you must verify to complete this action. Please click the verification link in your email. You may re-send via your profile.
As described in AN 351: Simulating Nios II Embedded Processor Designs, Qsys and Nios II Software Build Tools (SBT) for Eclipse can automatically generate an RTL simulation environment for Nios II designs in which the Qsys system is the top level entity. This guide shows to modify the automatically generated simulation files to accommodate designs in which the Qsys system is not the top level. This guide is presented using Verilog, but the process is similar for designs using VHDL.
This guide assumes that you have prior experience using Qsys as well as a familiarity with Nios II SBT and the ModelSim simulator. In order to simulate the Nios II design using the instructions in this guide, you must have the following software installed:
As shown in Figure 1, the top level module of the example design used in this guide instantiates a Qsys system (niosii_system) and a simple counter module (counter). The output PIO of the Qsys system (output_pio_export) is a one-bit port that drives the enable input of the counter module.
Figure 1 – The Qsys system and counter module instantiated by the top level module 4/4a/Lower_level_qsys_design.png
The example software running on the Nios II system demonstrates interactions with hardware outside the top level module (the JTAG UART) and with a module below the top level (the counter module). As shown below, the example software enables the counter while a Hello World message is sent to the console via the JTAG UART.
int main()
{
IOWR(OUTPUT_PIO_BASE, 0, 0x1); // Enable the counter
printf("Hello from Nios II!\n"); // Send Hello World to the JTAG UART
IOWR(OUTPUT_PIO_BASE, 0, 0x0); // Disable the counter
return 0;
}
This section summarizes the process of generating the simulation files. A more detailed explanation can be found in AN 351: Simulating Nios II Embedded Processor Designs. The necessary modifications to these files are described in the next section, Modifying the Simulation Files.
The software used for this guide will activate the counter module by writing to the output PIO and will send a Hello World message to the console via JTAG UART. To create and build the software project, perform the following steps:
At this point, the Qsys and Nios II SBT software have automatically generated simulation files necessary for simulating designs in which the Qsys system is the top level entity. In order to simulate other types of designs, two of these automatically generated files need to be modified: the testbench source file and the ModelSim simulation script.
This file should be edited to correctly reflect the hierarchy of your design. The instantiation of the Qsys system should be removed and replaced by an instantiation of the correct top level module. Whether or not other modules instantiated in the testbench file, such as bus functional models (BFMs), should be removed depends on the usage of those modules. In general, you should remove BFM modules that represent components that should exist below the top level module – for example, a PIO from the Qsys system that connects to another module under the top level. You should not remove BFM modules that represent connections to the top level – for example, the clock and reset BFMs.
For this guide, the testbench file, niosii_system_tb.v, is located in:
<project directory>/niosii_system/testbench/niosii_system_tb/simulation
In general, this file will be located in:
<project directory>/<Qsys system name>/testbench/<Qsys system name>_tb/simulation
For this example design, you can either make the modifications to the test bench file yourself, or you may copy the completed code into the testbench file from the niosii_system_tb.v file, which is located in <project directory>/modified_files directory.
To make the modifications, open the automatically generated testbench file in an editor of your choice and complete the following steps:
1. Remove or comment out the instantiation of the Qsys system as shown below:
// Removed instantiation of the Qsys system
// niosii_system_tb_niosii_system_inst niosii_system_inst (
// .clk_clk (niosii_system_inst_clk_bfm_clk_clk),
// .reset_reset_n (niosii_system_inst_reset_bfm_reset_reset),
// .output_pio_export (niosii_system_inst_output_pio_export)
// );
2. Add the instantiation of the correct top level module with appropriate connections to the clock and reset. The top_level_out wire has been added in this case to connect to the output port of the top level module.
wire [7:0] top_level_out;
top_level top_level_inst (
.clk ( niosii_system_inst_clk_bfm_clk_clk ),
.rst_n ( niosii_system_inst_reset_bfm_reset_reset ),
.out ( top_level_out )
);
3. Remove or comment out the instantiation of the PIO BFM and the wire that connected the BFM to the Qsys system:
// wire [7:0] niosii_system_inst_output_pio_export;
// niosii_system_tb_niosii_system_inst_output_pio_bfm niosii_system_inst_output_pio_bfm (
// .sig_export (niosii_system_inst_output_pio_export) // conduit.export
// );
4. Save the niosii_system_tb.v file.
The ModelSim simulation script contains Tcl commands that set up the simulation environment and provide several command aliases for quickly performing tasks such as compiling source files and elaborating the top level design. The unmodified simulation script is automatically executed when Nios II SBT invokes ModelSim. The simulation script will need to be edited and re-executed as described below.
Important note: Two simulation scripts with identical names are generated in different directories while setting up the simulation environment. Make sure you are editing the correct file.
For this guide, the correct simulation script, msim_setup.tcl, is located in <project directory>/software/lower_level_qsys/obj/runtime/sim/mentor and in general will be located in <project directory>/software/<Nios II SBT project name>/obj/runtime/sim/mentor.
For this example design, you can either make the modifications to the simulation script file yourself, or you may copy the completed code into the simulation script file from the msim_setup.tclfile, which is located in <project directory>/modified_files directory.
Important note: In the file paths throughout the completed simulation script, <project directory> is set as "c:/lower_level_qsys/". If you are using a different project directory, use "Find & Replace" to replace "c:/lower_level_qsys/" with your project directory.
To make the modifications yourself, open the automatically generated ModelSim simulation script file in an editor of your choice and complete the following steps. Again, make sure you are editing the correct simulation script.
1. In the Compile the design files in correct order section, add vlog commands to compile the additional source files, as shown below:
# -----------------------------------------
# Compile the design files in correct order
alias com {
.
.
.
vlog -sv "C:/projects/lower_level_qsys/niosii_system/testbench/niosii_system_tb/simulation
/submodules/verbosity_pkg.sv"
vlog -sv "C:/projects/lower_level_qsys/niosii_system/testbench/niosii_system_tb/simulation
/submodules/altera_avalon_clock_source.sv"
vlog "C:/projects/lower_level_qsys/niosii_system/testbench/niosii_system_tb/simulation
/submodules/niosii_system_tb_niosii_system_inst.v"
# CHANGE: compile additional design files after the Qsys system, before the test bench
vlog "C:/projects/lower_level_qsys/niosii_system/testbench/niosii_system_tb/simulation
/additional_modules/counter.v"
vlog "C:/projects/lower_level_qsys/niosii_system/testbench/niosii_system_tb/simulation
/additional_modules/top_level.v"
# END OF CHANGE
vlog "C:/projects/lower_level_qsys/niosii_system/testbench/niosii_system_tb/simulation/niosii_system_tb.v"
}
When modifying the simulation script for your own design, make sure that your source files are compiled in the correct order. In ModelSim, a file containing the definition of a module must be compiled before a file containing instantiations of that module. In general, lower levels of your hierarchy should be compiled first, and your testbench should be compiled last.
2. In the Elaborate top level design and Elaborate the top level design with novopt option sections, add the hierarchy that is above the Qsys system before $SYSTEM_INSTANCE_NAME, as shown below.
Important note: Do not put a slash between the added hierarchy and the $SYSTEM_INSTANCE_NAME variable.
# CHANGE: add the hierarchy that is above the Qsys system before $SYSTEM_INSTANCE_NAME.
# DO NOT put a slash between the added hierarchy and the $SYSTEM_INSTANCE_NAME variable.
# -----------------------------------------
# Elaborate top level design
alias elab "
vsim -t ps \
-G/$TOP_LEVEL_NAME/top_level_inst$SYSTEM_INSTANCE_NAME/niosii_system_inst/ram/INIT_FILE=\"C:/projects/qsys_in_lower_hierarchical_level_example/software/hello_world_qsys_in_lower_hierachical_level_example/mem_init/ram.hex\" \
-L work -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L cycloneiii_ver $TOP_LEVEL_NAME
"
# -----------------------------------------
# Elaborate the top level design with novopt option
alias elab_debug "
vsim -novopt -t ps \
-G/$TOP_LEVEL_NAME/top_level_inst$SYSTEM_INSTANCE_NAME/niosii_system_inst/ram/INIT_FILE=\"C:/projects/qsys_in_lower_hierarchical_level_example/software/hello_world_qsys_in_lower_hierachical_level_example/mem_init/ram.hex\" \
-L work -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L cycloneiii_ver $TOP_LEVEL_NAME
"
# END OF CHANGE
You do not need to list the test bench in the hierarchical description. TOP_LEVEL_NAME is the testbench module.
3. Finally, to ensure that you have edited the correct simulation script, add an echo command at the end of the simulation script file to print a confirmation message in the transcript window, as shown below:
# -----------------------------------------
# Confirm that this is the correct simulation script
echo
echo “You edited the correct simulation script.”
4. If you are modifying the simulation script for your own design, you may need to add commands to compile libraries. These commands should be added to the Create compilation libraries and Compile device library files sections. For this example, no modifications need to be made to these sections. For information on compiling libraries, see the Mentor Graphics ModelSim and QuestaSim Support section of the Quartus II Handbook.
5. Save changes to the msim_setup.tcl simulation script.
6. In the ModelSim Transcript window, re-execute the simulation script by typing "do msim_setup.tcl" and pressing enter.
7. Finally, recompile the design files and elaborate the top level design by typing "ld" and pressing enter. You may optionally use the "ld_debug" command instead to use the -novopt option for vsim.
Now that the testbench file and the ModelSim simulation script have both been edited, load signals into the waveform viewer by selecting File > Load… and browsing to the <project directory>/wave.do waveform script file. Begin the simulation by typing "run 2 ms". As shown in Figure 2, the counter is enabled while the Hello World message is sent to the console.
Figure 2 - Simulating the lower_level_qsys design 5/5e/Lower_level_qsys_modelsim.png
Community support is provided during standard business hours (Monday to Friday 7AM - 5PM PST). Other contact methods are available here.
Intel does not verify all solutions, including but not limited to any file transfers that may appear in this community. Accordingly, Intel disclaims all express and implied warranties, including without limitation, the implied warranties of merchantability, fitness for a particular purpose, and non-infringement, as well as any warranty arising from course of performance, course of dealing, or usage in trade.
For more complete information about compiler optimizations, see our Optimization Notice.