diff --git a/.gitignore b/.gitignore index 073254b..1d106e5 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,8 @@ example_demo/build_logs* *.bba *toolchain-nix* testbench/ddr3_dimm_micron_sim_behav.wcfg +testbench/icarus_sim/*.log +testbench/icarus_sim/uberddr3_sim # But do not ignore testbench/xsim/test_*.log !testbench/xsim/test_*.log diff --git a/testbench/icarus_sim/regression_test_icarus.sh b/testbench/icarus_sim/regression_test_icarus.sh new file mode 100755 index 0000000..b4b7825 --- /dev/null +++ b/testbench/icarus_sim/regression_test_icarus.sh @@ -0,0 +1,146 @@ +#!/bin/bash + +################################################################################################################# + +# Define the test configurations (CONTROLLER_CLK_PERIOD, DDR3_CLK_PERIOD, ODELAY_SUPPORTED, LANES_OPTION, ADD_BUS_DELAY, BIST_MODE) +TESTS=( + # with bus delay + "12_000 3_000 1 EIGHT_LANES 1 1" # DDR3-666 + "10_000 2_500 1 EIGHT_LANES 1 1" # DDR3-800 + "6_000 1_500 1 EIGHT_LANES 1 2" # DDR3-1333 write dm is weird (two happens at same time???) + "5_000 1_250 1 EIGHT_LANES 1 2" # DDR3-1600 + # No bus delays + "12_000 3_000 1 EIGHT_LANES 0 2" + "10_000 2_500 1 EIGHT_LANES 0 2" + "6_000 1_500 1 EIGHT_LANES 0 1" + "5_000 1_250 1 EIGHT_LANES 0 1" + # x16 + "12_000 3_000 1 TWO_LANES 1 1" + "10_000 2_500 1 TWO_LANES 1 1" + "6_000 1_500 1 TWO_LANES 1 2" + "5_000 1_250 1 TWO_LANES 1 2" + # no odelay + "12_000 3_000 0 TWO_LANES 0 2" + "10_000 2_500 0 TWO_LANES 0 2" + "6_000 1_500 0 TWO_LANES 0 1" + "5_000 1_250 0 TWO_LANES 0 1" +) + +################################################################################################################# + +# Define the files to modify +FILENAME="../ddr3_dimm_micron_sim.sv" +DEFINES_FILE="../sim_defines.vh" +PARAMETERS_FILE="../8192Mb_ddr3_parameters.vh" + +# Check if the main file exists +if [[ ! -f "$FILENAME" ]]; then + echo "Error: File '$FILENAME' does not exist." + exit 1 +fi + +# Check if the defines file exists +if [[ ! -f "$DEFINES_FILE" ]]; then + echo "Error: File '$DEFINES_FILE' does not exist." + exit 1 +fi + +# Check if the parameters file exists +if [[ ! -f "$PARAMETERS_FILE" ]]; then + echo "Error: File '$PARAMETERS_FILE' does not exist." + exit 1 +fi + +################################################################################################################# + +# Loop over each test configuration +index=1 +for TEST in "${TESTS[@]}"; do + # Parse the test configuration into individual variables + read -r CONTROLLER_CLK_PERIOD DDR3_CLK_PERIOD ODELAY_SUPPORTED LANES_OPTION ADD_BUS_DELAY BIST_MODE <<< "$TEST" + + # Record the start time + start_time=$(date +%s) + start_time_am_pm=$(date +"%I:%M %p") # Time in AM-PM format + + # Print the current test configuration with the start time + echo "$index. Running test with CONTROLLER_CLK_PERIOD=$CONTROLLER_CLK_PERIOD, DDR3_CLK_PERIOD=$DDR3_CLK_PERIOD, ODELAY_SUPPORTED=$ODELAY_SUPPORTED, LANES_OPTION=$LANES_OPTION, ADD_BUS_DELAY=$ADD_BUS_DELAY, BIST_MODE=$BIST_MODE" + echo " Test started at: $start_time_am_pm" + + # Use sed to perform the replacements in the main file + sed -i \ + -e "s/CONTROLLER_CLK_PERIOD = [0-9_]\+/CONTROLLER_CLK_PERIOD = $CONTROLLER_CLK_PERIOD/" \ + -e "s/DDR3_CLK_PERIOD = [0-9_]\+/DDR3_CLK_PERIOD = $DDR3_CLK_PERIOD/" \ + -e "s/ODELAY_SUPPORTED = [01]/ODELAY_SUPPORTED = $ODELAY_SUPPORTED/" \ + -e "s/BIST_MODE = [0-2]/BIST_MODE = $BIST_MODE/" \ + "$FILENAME" + + # Modify the sim_defines.vh file based on LANES_OPTION + if [[ "$LANES_OPTION" == "TWO_LANES" ]]; then + sed -i \ + -e "s|^//\(\`define TWO_LANES_x8\)|\1|" \ + -e "s|^\(\`define EIGHT_LANES_x8\)|//\1|" \ + "$DEFINES_FILE" + elif [[ "$LANES_OPTION" == "EIGHT_LANES" ]]; then + sed -i \ + -e "s|^//\(\`define EIGHT_LANES_x8\)|\1|" \ + -e "s|^\(\`define TWO_LANES_x8\)|//\1|" \ + "$DEFINES_FILE" + else + echo "Error: Invalid LANES_OPTION value. Choose either 'TWO_LANES' or 'EIGHT_LANES'." + exit 1 + fi + + # Modify the parameters file based on ADD_BUS_DELAY + if [[ "$ADD_BUS_DELAY" == "1" ]]; then + sed -i \ + -e "s|BUS_DELAY = [0-9]\+|BUS_DELAY = 100|" \ + -e "s|FLY_BY_DELAY_LANE_0 = [0-9]\+|FLY_BY_DELAY_LANE_0 = 0|" \ + -e "s|FLY_BY_DELAY_LANE_1 = [0-9]\+|FLY_BY_DELAY_LANE_1 = 50|" \ + -e "s|FLY_BY_DELAY_LANE_2 = [0-9]\+|FLY_BY_DELAY_LANE_2 = 100|" \ + -e "s|FLY_BY_DELAY_LANE_3 = [0-9]\+|FLY_BY_DELAY_LANE_3 = 150|" \ + -e "s|FLY_BY_DELAY_LANE_4 = [0-9]\+|FLY_BY_DELAY_LANE_4 = 200|" \ + -e "s|FLY_BY_DELAY_LANE_5 = [0-9]\+|FLY_BY_DELAY_LANE_5 = 250|" \ + -e "s|FLY_BY_DELAY_LANE_6 = [0-9]\+|FLY_BY_DELAY_LANE_6 = 300|" \ + -e "s|FLY_BY_DELAY_LANE_7 = [0-9]\+|FLY_BY_DELAY_LANE_7 = 350|" \ + "$PARAMETERS_FILE" + else + sed -i \ + -e "s|BUS_DELAY = [0-9]\+|BUS_DELAY = 0|" \ + -e "s|FLY_BY_DELAY_LANE_0 = [0-9]\+|FLY_BY_DELAY_LANE_0 = 0|" \ + -e "s|FLY_BY_DELAY_LANE_1 = [0-9]\+|FLY_BY_DELAY_LANE_1 = 0|" \ + -e "s|FLY_BY_DELAY_LANE_2 = [0-9]\+|FLY_BY_DELAY_LANE_2 = 0|" \ + -e "s|FLY_BY_DELAY_LANE_3 = [0-9]\+|FLY_BY_DELAY_LANE_3 = 0|" \ + -e "s|FLY_BY_DELAY_LANE_4 = [0-9]\+|FLY_BY_DELAY_LANE_4 = 0|" \ + -e "s|FLY_BY_DELAY_LANE_5 = [0-9]\+|FLY_BY_DELAY_LANE_5 = 0|" \ + -e "s|FLY_BY_DELAY_LANE_6 = [0-9]\+|FLY_BY_DELAY_LANE_6 = 0|" \ + -e "s|FLY_BY_DELAY_LANE_7 = [0-9]\+|FLY_BY_DELAY_LANE_7 = 0|" \ + "$PARAMETERS_FILE" + fi + + # Run the simulation script with the respective log file + LOG_FILE="./test_${CONTROLLER_CLK_PERIOD}_ddr3_${DDR3_CLK_PERIOD}_odelay_${ODELAY_SUPPORTED}_lanes_${LANES_OPTION,,}_bus_delay_${ADD_BUS_DELAY}_bist_${BIST_MODE}.log" + rm -rf $LOG_FILE + # ./ddr3_dimm_micron_sim.sh >> "$LOG_FILE" + # add timeout if simulation takes too long + ./sim_icarus.sh >> "$LOG_FILE" 2>&1 + EXIT_CODE=$? # Capture exit code immediately + if [ $EXIT_CODE -eq 124 ]; then + echo " Error: Simulation timed out after 1 hour!" | tee -a "$LOG_FILE" + fi + + # Record the end time and calculate the duration in minutes + end_time=$(date +%s) + duration=$((end_time - start_time)) + minutes=$((duration / 60)) + seconds=$((duration % 60)) + + # Report the results + echo " Test completed. Duration: ${minutes}m ${seconds}s. Results saved to '$LOG_FILE'." + echo "" + + # Increment the index + ((index++)) +done + +################################################################################################################# diff --git a/testbench/icarus_sim/sim_icarus.sh b/testbench/icarus_sim/sim_icarus.sh new file mode 100755 index 0000000..483254e --- /dev/null +++ b/testbench/icarus_sim/sim_icarus.sh @@ -0,0 +1,28 @@ +rm -rf ./uberddr3_sim ./sim.log +iverilog -o uberddr3_sim -g2012 \ + -DNO_TEST_MODEL \ + -s ddr3_dimm_micron_sim \ + -I ../ \ + ../ddr3_dimm_micron_sim.sv \ + ../ddr3.sv \ + ../models/IDELAYCTRL_model.v \ + ../models/IDELAYE2_model.v \ + ../models/IOBUF_DCIEN.v \ + ../models/IOBUF_model.v \ + ../models/IOBUFDS_DCIEN_model.v \ + ../models/IOBUFDS_model.v \ + ../models/ISERDESE2_model.v \ + ../models/OBUFDS_model.v \ + ../models/ODELAYE2_model.v \ + ../models/OSERDESE2_model.v \ + ../models/OBUF_model.v \ + ../../rtl/ddr3_top.v \ + ../../rtl/ddr3_controller.v \ + ../../rtl/ddr3_phy.v \ + ../ddr3_module.sv + +vvp -n ./uberddr3_sim + + + + diff --git a/testbench/sim_icarus.sh b/testbench/sim_icarus.sh deleted file mode 100755 index ef75d3e..0000000 --- a/testbench/sim_icarus.sh +++ /dev/null @@ -1,33 +0,0 @@ -rm -rf ./uberddr3_sim ./sim.log -iverilog -o uberddr3_sim -g2012 \ - -DNO_TEST_MODEL \ - -s ddr3_dimm_micron_sim \ - -I ./ \ - ./ddr3_dimm_micron_sim.sv \ - ./ddr3.sv \ - ./IDELAYCTRL_model.v \ - ./IDELAYE2_model.v \ - ./IOBUF_DCIEN.v \ - ./IOBUF_model.v \ - ./IOBUFDS_DCIEN_model.v \ - ./IOBUFDS_model.v \ - ./ISERDESE2_model.v \ - ./OBUFDS_model.v \ - ./ODELAYE2_model.v \ - ./OSERDESE2_model.v \ - ./OBUF_model.v \ - ../rtl/ddr3_top.v \ - ../rtl/ddr3_controller.v \ - ../rtl/ddr3_phy.v \ - ./ddr3_module.sv - -start_time=$(date +%s) - -vvp ./uberddr3_sim > sim.log - -end_time=$(date +%s) -elapsed=$((end_time - start_time)) - -echo "[INFO] Simulation completed in ${elapsed} seconds." - -