diff options
| author | Humberto Jimenez <humberto.jimenez@ni.com> | 2022-02-21 16:40:40 -0600 | 
|---|---|---|
| committer | Humberto Jimenez <31545256+hjimenez-ni@users.noreply.github.com> | 2022-03-15 08:49:25 -0500 | 
| commit | 232a9a7345f0264602caba0caf2b96dd0856aed6 (patch) | |
| tree | f475c37f111750cd5bfbc968c66b6942e66df48f | |
| parent | 4fc2e3beeed4759dc108a670350276ae5554e072 (diff) | |
| download | uhd-232a9a7345f0264602caba0caf2b96dd0856aed6.tar.gz uhd-232a9a7345f0264602caba0caf2b96dd0856aed6.tar.bz2 uhd-232a9a7345f0264602caba0caf2b96dd0856aed6.zip | |
fpga: ci: Add stages-based pipeline
| -rw-r--r-- | fpga/.ci/fpga-pipeline-pr.yml | 64 | ||||
| -rw-r--r-- | fpga/.ci/fpga-pipeline.yml | 60 | ||||
| -rw-r--r-- | fpga/.ci/oss_testbenches.yml | 74 | ||||
| -rw-r--r-- | fpga/.ci/scripts/refresh_ip.sh | 38 | ||||
| -rw-r--r-- | fpga/.ci/scripts/run_setup.sh | 43 | ||||
| -rw-r--r-- | fpga/.ci/templates/check_clean_repo_steps.yml | 2 | ||||
| -rw-r--r-- | fpga/.ci/templates/fpga_build.yml | 82 | ||||
| -rw-r--r-- | fpga/.ci/templates/job-build-fpga.yml | 94 | ||||
| -rw-r--r-- | fpga/.ci/templates/job-build-ip.yml | 98 | ||||
| -rw-r--r-- | fpga/.ci/templates/job-package-images.yml | 71 | ||||
| -rw-r--r-- | fpga/.ci/templates/job-run-testbenches.yml | 40 | ||||
| -rw-r--r-- | fpga/.ci/templates/stages-fpga-pipeline.yml | 104 | ||||
| -rw-r--r-- | fpga/.ci/x4xx-pr-check.yml | 114 | 
13 files changed, 613 insertions, 271 deletions
| diff --git a/fpga/.ci/fpga-pipeline-pr.yml b/fpga/.ci/fpga-pipeline-pr.yml new file mode 100644 index 000000000..7f98c4fd6 --- /dev/null +++ b/fpga/.ci/fpga-pipeline-pr.yml @@ -0,0 +1,64 @@ +# +# Copyright 2022 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# +# Description: +# +#   This pipeline is used to build FPGAs and run testbenches for PRs. +# +#   See https://aka.ms/yaml for pipeline YAML documentation. +# + +parameters: +- name: run_testbenches +  type: boolean +  displayName: Run Testbenches +  default: true +- name: clean_ip_build +  type: boolean +  displayName: Clean IP Build +  default: false +- name: build_x410 +  type: boolean +  displayName: Build X410 +  default: true +- name: x410_targets_matrix +  type: object +  displayName: X410 Targets +  default: +    X410_XG_100: +      target_name: X410_XG_100 +      timeout: 480 +    X410_X4_200: +      target_name: X410_X4_200 +      timeout: 480 +    X410_CG_400: +      target_name: X410_CG_400 +      timeout: 480 +- name: package_images +  type: boolean +  displayName: Package Images +  default: false + +trigger: none + +pr: +  branches: +    include: +    - master +  paths: +    include: +    - fpga/usrp3/lib +    - fpga/usrp3/top/x400 +    - fpga/.ci + +extends: +  template: templates/stages-fpga-pipeline.yml +  parameters: +    run_testbenches: ${{ parameters.run_testbenches }} +    package_images: ${{ parameters.package_images }} +    build_x410: ${{ parameters.build_x410 }} +    x410_targets_matrix: ${{ parameters.x410_targets_matrix }} +    publish_int_files: true +    clean_ip_build: ${{ parameters.clean_ip_build }} diff --git a/fpga/.ci/fpga-pipeline.yml b/fpga/.ci/fpga-pipeline.yml new file mode 100644 index 000000000..9bf6d78f4 --- /dev/null +++ b/fpga/.ci/fpga-pipeline.yml @@ -0,0 +1,60 @@ +# +# Copyright 2022 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# +# Description: +# +#   This pipeline is used to build FPGAs and run testbenches as CI +#   from commits in master. +# +#   See https://aka.ms/yaml for pipeline YAML documentation. +# + +parameters: +- name: run_testbenches +  type: boolean +  displayName: Run Testbenches +  default: false +- name: clean_ip_build +  type: boolean +  displayName: Clean IP Build +  default: true +- name: build_x410 +  type: boolean +  displayName: Build X410 +  default: true +- name: package_images +  type: boolean +  displayName: Package Images +  default: true + +trigger: +  batch: true +  branches: +    include: +    - master +  paths: +    include: +    - fpga/usrp3/lib +    - fpga/usrp3/top/x400 +    - fpga/.ci + +pr: none + +extends: +  template: templates/stages-fpga-pipeline.yml +  parameters: +    run_testbenches: ${{ parameters.run_testbenches }} +    package_images: ${{ parameters.package_images }} +    build_x410: ${{ parameters.build_x410 }} +    # These targets are shipped and included in the binaries package. +    x410_targets_matrix: +      X410_X4_200: +        target_name: X410_X4_200 +        timeout: 480 +      X410_CG_400: +        target_name: X410_CG_400 +        timeout: 480 +    publish_int_files: false +    clean_ip_build: ${{ parameters.clean_ip_build }} diff --git a/fpga/.ci/oss_testbenches.yml b/fpga/.ci/oss_testbenches.yml deleted file mode 100644 index f4a01edbc..000000000 --- a/fpga/.ci/oss_testbenches.yml +++ /dev/null @@ -1,74 +0,0 @@ -# -# Copyright 2021 Ettus Research, a National Instruments Brand -# -# SPDX-License-Identifier: LGPL-3.0-or-later -# -# Description: -# -#   This pipeline is used to run all the testbenches using ModelSim. -# - -trigger: -- none - -pr: -  branches: -    include: -    - master -  paths: -    include: -    - fpga/usrp3/lib -    - fpga/usrp3/tools -    - fpga/usrp3/top -    - fpga/usrp3/sim -    - fpga/.ci - -resources: -  repositories: -  - repository: hwtools -    type: git -    ref: main -    name: DevCentral/hwtools - -name: -jobs: -- job: -  displayName: "ModelSim Simulation" -  timeoutInMinutes: 360 -  pool: -    name: Hardware -  steps: -    - checkout: self -      clean: true -      persistCredentials: true - -    - checkout: hwtools -      clean: true -      path: s/hwtools/head -      persistCredentials: true - -    - bash: | -        set -e - -        echo "---- Set environment variables ----" -        export path_hwtools=$(Pipeline.Workspace)/s/hwtools/head/setup -        export PATH=$path_hwtools:$PATH - -        echo "---- Run hwsetup ----" -        # This script sets the XILINX_VIVADO, MODELSIM, and LIB_BASE_PATH -        # variables based on the agent's configuration so we can find the EDA -        # tools. -        pushd ../.ci/hwtools -        source hwsetup.sh -        popd - -        echo "---- Run setupenv ----" -        export MSIM_VIV_COMPLIBDIR=$LIB_BASE_PATH/vivado/2019.1.1/modelsim_SE-64_2020 -        source ./top/x300/setupenv.sh --vivado-path $(dirname $XILINX_VIVADO) --modelsim-path $(dirname $MODELSIM) - -        echo "---- Run testbenches ----" -        pushd ./tools/utils -        python3 ./run_testbenches.py --logged --simulator modelsim --excludes=modelsim.excludes -j2 run -        popd -      workingDirectory: uhddev/fpga/usrp3 -      displayName: "Run Testbenches" diff --git a/fpga/.ci/scripts/refresh_ip.sh b/fpga/.ci/scripts/refresh_ip.sh new file mode 100644 index 000000000..f4e37bf5b --- /dev/null +++ b/fpga/.ci/scripts/refresh_ip.sh @@ -0,0 +1,38 @@ +# +# Copyright 2022 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# +# Description: +# +#   This script first refreshes a given build IP directory to the current time +#   (assume all the IP files within that directory were just built) and then +#   the script touches all the files that changed between the current repo's +#   working tree and a given hash (used to build IP). +#   This allows the user to download pre-built IP (e.g. cached) and re-build +#   only those IP components that changed in between the cached commit and the +#   current working tree. +# +# Arguments: +# +#   $1 = absolute path to build-ip/ directory +#   $2 = git hash used to build IP in $1 +# +# Example: +# +#   bash .refresh_ip.sh `realpath path/to/build-ip` 1234abc +# + +# # Step 1: refresh build-ip/ directory to current time +echo "[refresh_ip.sh] Resetting timestamp for files in $1" +find $1 -type f -exec touch --no-create {} + + +# # Step 2: determine all files that changed and update their time (dirty) +echo "[refresh_ip.sh] Differences between $2 and working tree (marked dirty):" +git diff --line-prefix=`git rev-parse --show-toplevel`/ --name-only $2 | \ +  while read -r line; do \ +    if [[ $line == *"ip/"* ]]; then \ +      echo "    $line"; \ +      touch --no-create $line; \ +    fi \ +  done diff --git a/fpga/.ci/scripts/run_setup.sh b/fpga/.ci/scripts/run_setup.sh new file mode 100644 index 000000000..c70fd5702 --- /dev/null +++ b/fpga/.ci/scripts/run_setup.sh @@ -0,0 +1,43 @@ +# +# Copyright 2022 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# +# Description: +# +#   Script to run NI hwsetup and UHD setupenv for the target build. Always +#   source this file. +# +#   Arguments: +# +#     $1 = Directory where setupenv is located +# +#  Example: +# +#     source run_setup.sh ./usrp3/top/x400 +# + +set -e + +echo "---- Set environment variables ----" +export path_hwtools=$BUILD_SOURCESDIRECTORY/hwtools/head/setup +export PATH=$path_hwtools:$PATH + +echo "---- Run hwsetup ----" +# This script sets the XILINX_VIVADO, MODELSIM, and LIB_BASE_PATH +# variables based on the agent's configuration so we can find the EDA +# tools. +pushd $BUILD_SOURCESDIRECTORY/uhddev/fpga/.ci/hwtools +source hwsetup.sh +popd + +echo "---- Install Vivado patches ----" +pushd $BUILD_SOURCESDIRECTORY +wget -q $PATCHES_PATH/2019.1/AR73068_Vivado_2019_1_preliminary_rev1.zip -O ./AR73068_Vivado_2019_1_preliminary_rev1.zip +unzip -q -o AR73068_Vivado_2019_1_preliminary_rev1.zip -d ./patch/ +export XILINX_PATH=$PWD/patch/vivado +popd + +echo "---- Run setupenv ----" +export MSIM_VIV_COMPLIBDIR=$LIB_BASE_PATH/vivado/2019.1.1/modelsim_SE-64_2020 +source $1/setupenv.sh --vivado-path $(dirname $XILINX_VIVADO) --modelsim-path $(dirname $MODELSIM) diff --git a/fpga/.ci/templates/check_clean_repo_steps.yml b/fpga/.ci/templates/check_clean_repo_steps.yml index 7ac034dd8..08eb670ba 100644 --- a/fpga/.ci/templates/check_clean_repo_steps.yml +++ b/fpga/.ci/templates/check_clean_repo_steps.yml @@ -12,7 +12,7 @@ parameters:    # Directory to execute the commands in    - name: directory      type: string -    default: $(Agent.BuildDirectory)/s +    default: $(Agent.BuildDirectory)/s/uhddev  steps:  # Windows based calls diff --git a/fpga/.ci/templates/fpga_build.yml b/fpga/.ci/templates/fpga_build.yml deleted file mode 100644 index dbc41b790..000000000 --- a/fpga/.ci/templates/fpga_build.yml +++ /dev/null @@ -1,82 +0,0 @@ -# -# Copyright 2021 Ettus Research, a National Instruments Brand -# -# SPDX-License-Identifier: LGPL-3.0-or-later -# -# Description: -# -#   This template should be used for all FPGA builds within the uhddev -#   repository. Exports the FPGA build results (bitfile, device tree and timing -#   report from build directory) as artifacts 'FPGA image <target>'. -# -#   See description for the parameters below. -# - -parameters: -  ### Required parameters -  # FPGA target to be built e.g. X410_XG -  - name: target -    type: string - -  ### Optional parameters -  # Set to true if the intermediate files from build-<target> directory should -  # be exported for debugging as artifact 'FPGA build <target> (<attempt>)' -  - name: debug -    type: boolean -    default: false -  # Checkout repository in a clean state as described in -  # https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema%2Cparameter-schema#checkout -  - name: clean -    type: boolean -    default: true -  # Default timeout of 4h -  - name: timeout -    type: number -    default: 240 - -jobs: -- job: FPGA_${{ parameters.target }} -  displayName: 'Build FPGA ${{ parameters.target }}' -  pool: -    name: de-dre-lab -    demands: -    - ettus_fpga_build -    - vivado2019.1 -  timeoutInMinutes: ${{ parameters.timeout }} -  steps: -    # Currently limited to be executed in same repo. -    # Removes all unversioned files if necessary. -    # Checkout path defined by single repository case in -    # https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#checkout-path -    - checkout: self -      clean: ${{ parameters.clean }} - -    # Remove incomplete IP builds due to aborted previous runs. -    - bash: | -        python3 cleanup_incomplete_ip_builds.py -d fpga/usrp3/top/x400 -      workingDirectory: $(Agent.BuildDirectory)/s/fpga/.ci/scripts/ -      displayName: 'Incomplete IP Cleanup' - -    # Clean export directories and run FPGA build. -    - bash: | -        rm -rf build -        rm -rf build-${{ parameters.target }} -        source setupenv.sh -        make ${{ parameters.target }} -      workingDirectory: $(Agent.BuildDirectory)/s/fpga/usrp3/top/x400 -      displayName: 'Build Target' - -    # Publish the final result only if all previous steps passed -    - publish: $(Agent.BuildDirectory)/s/fpga/usrp3/top/x400/build -      artifact: 'FPGA image ${{ parameters.target }}' -      displayName: 'Publish FPGA' - -    # Publish intermediate files. -    - publish: $(Agent.BuildDirectory)/s/fpga/usrp3/top/x400/build-${{ parameters.target }} -      artifact: 'FPGA build ${{ parameters.target }} ($(System.JobAttempt))' -      condition: and(always(), eq('${{ parameters.debug }}', true)) -      displayName: 'Publish Build Directory' - -    # Check if FPGA build left any untracked files. -    - ${{ if eq(parameters.debug, true) }}: -      - template: check_clean_repo_steps.yml diff --git a/fpga/.ci/templates/job-build-fpga.yml b/fpga/.ci/templates/job-build-fpga.yml new file mode 100644 index 000000000..eb8a1f5aa --- /dev/null +++ b/fpga/.ci/templates/job-build-fpga.yml @@ -0,0 +1,94 @@ +# +# Copyright 2022 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# +# Description: +# +#   This template shall be used for FPGA builds within the uhddev +#   repository. Exports the FPGA build results (bitfile, device tree and build +#   report from build directory) as artifacts '<target>'. +# +#   See description for the parameters below. +# + +parameters: +### Required parameters +# FPGA targets to be built. +# E.g. +#   targets_matrix: +#     X410_XG_100: +#       target: X410_XG_100 +#       timeout: 480 +#     X410_X4_200: +#       target: X410_X4_200 +#       timeout: 480 +- name: targets_matrix +  type: object +# IP artifact name (from pipeline) to be used +- name: ip_artifact +  type: string +# PATH to device's top directory (where Makefile is located) +- name: top_dir +  type: string + +### Optional parameters +# Set to true if the intermediate files from build-<target> directory should +# be exported for debugging as artifact 'Build artifacts <target> (Attempt <attempt>)' +- name: publish_int_files +  type: boolean +  default: false + + +jobs: +- job: build_fpga +  displayName: 'Build FPGA' +  timeoutInMinutes: $[ variables['timeout'] ] +  pool: +    name: hardware +  variables: +  - group: sdr-pipeline-vars +  strategy: +    matrix: +      ${{ parameters.targets_matrix }} +  steps: +    - checkout: self +      clean: true + +    - checkout: hwtools +      clean: true +      path: s/hwtools/head +      persistCredentials: true + +    - download: current +      artifact: ${{ parameters.ip_artifact }} +      displayName: 'Download ${{ parameters.ip_artifact }}' + +    - bash: | +        mv $(Pipeline.Workspace)/${{ parameters.ip_artifact }} \ +           ${{ parameters.top_dir }}/build-ip/ +      displayName: 'Populate build-ip' + +    - bash: | +        source $(Build.SourcesDirectory)/uhddev/fpga/.ci/scripts/run_setup.sh ./ +        make $(target_name) +      workingDirectory: ${{ parameters.top_dir }} +      env: +        PATCHES_PATH: $(sdr-vivado-patches) +      displayName: 'Build Target' + +    # Publish the final result only if all previous steps passed +    - publish: ${{ parameters.top_dir }}/build +      artifact: '$(target_name)' +      displayName: 'Publish FPGA' + +    # Publish intermediate files. +    - publish: ${{ parameters.top_dir }}/build-$(target_name) +      artifact: 'Build artifacts $(target_name) (Attempt $(System.JobAttempt))' +      condition: and(always(), eq('${{ parameters.publish_int_files }}', true)) +      displayName: 'Publish Build Directory' + +    # Check if FPGA build left any untracked files. +    - template: check_clean_repo_steps.yml +      parameters: +        directory: ${{ parameters.top_dir }} diff --git a/fpga/.ci/templates/job-build-ip.yml b/fpga/.ci/templates/job-build-ip.yml new file mode 100644 index 000000000..ab58b9fcc --- /dev/null +++ b/fpga/.ci/templates/job-build-ip.yml @@ -0,0 +1,98 @@ +# +# Copyright 2022 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# +# Description: +# +#   This template should be used for IP builds within the uhddev repository. +#   This job uses Azure's caching mechanism to speed up the build. A +#   successful job publishes the corresponding build-ip/ directory as a +#   pipeline artifact. +# +#   See description for the parameters below. +# + +parameters: +### Required parameters +# PATH to device's top directory (where Makefile is located) +- name: directory +  type: string +# Name of the IP Make target (e.g. X410_IP for X410's IP) +- name: ip_target +  type: string + +### Optional parameters +# Option to ignore cached artifacts (when available) and perform +# a clean IP build. +- name: clean_build +  type: boolean +  default: false + +jobs: +- job: ${{ parameters.ip_target }} +  displayName: 'Build ${{ parameters.ip_target }}' +  pool: +    name: Hardware +  timeoutInMinutes: 240 +  variables: +  - group: sdr-pipeline-vars +  steps: +    - checkout: self +      clean: true +      persistCredentials: true + +    - checkout: hwtools +      clean: true +      path: s/hwtools/head +      persistCredentials: true + +    # Pipeline caching is leveraged in this job to minimize the time it takes +    # to build all the IP. +    # At a high level, the pipeline checks for an available and valid cache +    # artifact from its scope (target branch in PR or its own branch) and +    # downloads it to the workspace (Cache hit). +    # If no valid cache artifact exists (Cache miss), then the build will run +    # and the pipeline will automatically save the result as a cache artifact +    # for subsequent runs. +    # Further details on "Pipeline caching" available online: +    #   https://docs.microsoft.com/en-us/azure/devops/pipelines/release/caching?view=azure-devops +    - ${{ if eq(parameters.clean_build, false) }}: +      - task: Cache@2 +        inputs: +          key: "uhddev-fpga-${{ parameters.ip_target }}" +          path: ${{ parameters.directory }}/build-ip +          cacheHitVar: CACHE_RESTORED +        displayName: Cache IP + +    - bash: | +        BUILD_IP_CACHE_HASH=`cat build-ip/.ci/build-hash` +        echo "BUILD_IP_CACHE_HASH=$BUILD_IP_CACHE_HASH" +        git fetch origin $BUILD_IP_CACHE_HASH +        bash $(Build.SourcesDirectory)/uhddev/fpga/.ci/scripts/refresh_ip.sh \ +          `realpath build-ip/` $BUILD_IP_CACHE_HASH +      workingDirectory: ${{ parameters.directory }} +      condition: eq(variables.CACHE_RESTORED, 'true') +      displayName: "Refresh IP" + +    - bash: | +        source $(Build.SourcesDirectory)/uhddev/fpga/.ci/scripts/run_setup.sh ./ +        make ${{ parameters.ip_target }} +        mkdir -p build-ip/.ci/ +        git rev-parse --verify HEAD 2>/dev/null 1>build-ip/.ci/build-hash +      workingDirectory: ${{ parameters.directory }} +      env: +        PATCHES_PATH: $(sdr-vivado-patches) +      displayName: "Build IP" + +    - publish: ${{ parameters.directory }}/build-ip +      artifact: '${{ parameters.ip_target }} (Attempt $(System.JobAttempt))' +      condition: failed() + +    - publish: ${{ parameters.directory }}/build-ip +      artifact: ${{ parameters.ip_target }} +      condition: succeeded() + +    - template: check_clean_repo_steps.yml +      parameters: +        directory: ${{ parameters.directory }} diff --git a/fpga/.ci/templates/job-package-images.yml b/fpga/.ci/templates/job-package-images.yml new file mode 100644 index 000000000..df7350042 --- /dev/null +++ b/fpga/.ci/templates/job-package-images.yml @@ -0,0 +1,71 @@ +# +# Copyright 2022 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# +# Description: +# +#   This template shall be used to package images. +# +#   See description for the parameters below. +# + +parameters: +### Required parameters +# Package name for identification purposes +- name: package_name +  type: string +# FPGA artifacts to be downloaded to "build_directory" +# Note that the value for each key is not used in this job. +# E.g. +#   targets_matrix: +#     X410_XG_100: +#       target: X410_XG_100 +#       timeout: 480 +#     X410_X4_200: +#       target: X410_X4_200 +#       timeout: 480 +- name: artifacts_matrix +  type: object +# PATH to device's build directory (where artifacts will be copied and +# packaging utility will be run) +- name: build_directory +  type: string + + +jobs: +- job: ${{ parameters.package_name }} +  displayName: 'Create ${{ parameters.package_name }}' +  timeoutInMinutes: 10 +  pool: +    name: hardware +  steps: +    - checkout: self +      clean: true + +    - ${{ each artifact in parameters.artifacts_matrix }}: +      - download: current +        artifact: ${{ artifact.key }} +        displayName: 'Download ${{ artifact.key }}' + +    - ${{ each artifact in parameters.artifacts_matrix }}: +      - bash: | +          mkdir -p ${{ parameters.build_directory }} +          cp $(Pipeline.Workspace)/${{ artifact.key }}/* \ +             ${{ parameters.build_directory }}/ +          rm -rf $(Pipeline.Workspace)/${{ artifact.key }}/ +        displayName: 'Populate ${{ artifact.key }} artifacts' + +    - bash: | +        OSS_REPO_HASH="$(git rev-parse --verify HEAD --short=7 2>/dev/null)" +        echo "##vso[task.setvariable variable=OSS_REPO_HASH]$OSS_REPO_HASH" +        echo "OSS Repo hash: $OSS_REPO_HASH" +        python3 $(Build.SourcesDirectory)/fpga/usrp3/tools/utils/package_images.py --githash "uhd-$OSS_REPO_HASH" +        rm -f *.bit *.dts *.rpt *.md5 +      workingDirectory: ${{ parameters.build_directory }} +      displayName: 'Run package_images.py' + +    # Publish the final result only if all previous steps passed +    - publish: ${{ parameters.build_directory }} +      artifact: '${{ parameters.package_name }}-g$(OSS_REPO_HASH)' +      displayName: 'Publish package' diff --git a/fpga/.ci/templates/job-run-testbenches.yml b/fpga/.ci/templates/job-run-testbenches.yml new file mode 100644 index 000000000..6f6ef142b --- /dev/null +++ b/fpga/.ci/templates/job-run-testbenches.yml @@ -0,0 +1,40 @@ +# +# Copyright 2022 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# +# Description: +# +#   This template is used to run all the testbenches using ModelSim. +# + + +jobs: +- job: +  displayName: "ModelSim Simulation" +  timeoutInMinutes: 360 +  pool: +    name: Hardware +  variables: +  - group: sdr-pipeline-vars +  steps: +    - checkout: self +      clean: true +      persistCredentials: true + +    - checkout: hwtools +      clean: true +      path: s/hwtools/head +      persistCredentials: true + +    - bash: | +        source $(Build.SourcesDirectory)/uhddev/fpga/.ci/scripts/run_setup.sh ./top/x300 + +        echo "---- Run testbenches ----" +        pushd ./tools/utils +        python3 ./run_testbenches.py --logged --simulator modelsim --excludes=modelsim.excludes -j2 run +        popd +      workingDirectory: uhddev/fpga/usrp3 +      env: +        PATCHES_PATH: $(sdr-vivado-patches) +      displayName: "Run Testbenches" diff --git a/fpga/.ci/templates/stages-fpga-pipeline.yml b/fpga/.ci/templates/stages-fpga-pipeline.yml new file mode 100644 index 000000000..3bd98e390 --- /dev/null +++ b/fpga/.ci/templates/stages-fpga-pipeline.yml @@ -0,0 +1,104 @@ +# +# Copyright 2022 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# +# Description: +# +#   This template defines a stages-based pipeline that may be leveraged by both +#   a PR pipeline or a continuous delivery pipeline. +# +#   See https://aka.ms/yaml for pipeline YAML documentation. +# + +parameters: +## Optional parameters +# Run testbenches +- name: run_testbenches +  type: boolean +  default: true +# Option to ignore cached artifacts (if available) and perform +# a clean IP build. +- name: clean_ip_build +  type: boolean +  default: false +# Build X410 FPGA targets +- name: build_x410 +  type: boolean +  default: true +# X410 FPGA targets to build (if build_x410 is true) +- name: x410_targets_matrix +  type: object +  default: +    X410_X4_200: +      target_name: X410_X4_200 +      timeout: 480 +# Option to publish intermediate files +- name: publish_int_files +  type: boolean +  default: false +# Create images package +- name: package_images +  type: boolean +  default: false + + +resources: +  repositories: +  - repository: hwtools +    type: git +    ref: main +    name: DevCentral/hwtools + + +stages: + +### START: Testbenches stage + +- stage: run_testbenches_stage +  displayName: Run Testbenches +  dependsOn: [] +  condition: and(succeeded(), eq('${{ parameters.run_testbenches }}', 'true')) +  jobs: +  - template: job-run-testbenches.yml + +### END: Testbenches stage + + +### START: X410 stages + +- stage: build_x410_ip_stage +  displayName: Build X410 IP +  dependsOn: [] +  condition: and(succeeded(), eq('${{ parameters.build_x410 }}', 'true')) +  jobs: +  - template: job-build-ip.yml +    parameters: +      directory: uhddev/fpga/usrp3/top/x400 +      ip_target: X410_IP +      clean_build: ${{ parameters.clean_ip_build }} + +- stage: build_x410_targets_stage +  displayName: Build X410 FPGA Targets +  dependsOn: build_x410_ip_stage +  condition: and(succeeded('build_x410_ip_stage'), eq('${{ parameters.build_x410 }}', 'true')) +  jobs: +  - template: job-build-fpga.yml +    parameters: +      targets_matrix: ${{ parameters.x410_targets_matrix }} +      ip_artifact: X410_IP +      top_dir: uhddev/fpga/usrp3/top/x400 +      publish_int_files: ${{ parameters.publish_int_files }} + +- stage: create_x410_packages_stage +  displayName: Create X410 Packages +  dependsOn: build_x410_targets_stage +  condition: and(succeeded('build_x410_targets_stage'), eq('${{ parameters.package_images }}', 'true')) +  jobs: +  - template: job-package-images.yml +    parameters: +      package_name: x4xx_x410_fpga_default +      artifacts_matrix: ${{ parameters.x410_targets_matrix }} +      build_directory: uhddev/fpga/usrp3/top/x400/build/ + +### END: X410 stages diff --git a/fpga/.ci/x4xx-pr-check.yml b/fpga/.ci/x4xx-pr-check.yml deleted file mode 100644 index c1a26edf9..000000000 --- a/fpga/.ci/x4xx-pr-check.yml +++ /dev/null @@ -1,114 +0,0 @@ -# -# Copyright 2021 Ettus Research, a National Instruments Brand -# -# SPDX-License-Identifier: LGPL-3.0-or-later -# -# Description: -# -#   This pipeline is used to test building  the FPGA and CPLD for each pull -#   request. -# -#   See https://aka.ms/yaml for pipeline YAML documentation. -# - -trigger: -- none - -# Filter for target branches and paths on PRs. See: -# https://docs.microsoft.com/en-us/azure/devops/pipelines/build/triggers?view=azure-devops&tabs=yaml#pr-triggers -pr: -  branches: -    include: -    - master -  paths: -    include: -    - fpga/usrp3/lib -    - fpga/usrp3/tools -    - fpga/usrp3/top/x400 -    - fpga/.ci - -jobs: -# ------------------------------------------------------------------- -# Build XG FPGA (100 MHz) -# ------------------------------------------------------------------- -- template: templates/fpga_build.yml -  parameters: -    target: X410_XG_100 -    debug: true  # to be able to debug any failed attempts -    clean: false # for speedup of PR testing -    timeout: 480 - -# ------------------------------------------------------------------- -# Build X4 FPGA (200 MHz) -# ------------------------------------------------------------------- -- template: templates/fpga_build.yml -  parameters: -    target: X410_X4_200 -    debug: true  # to be able to debug any failed attempts -    clean: false # for speedup of PR testing -    timeout: 480 - -# ------------------------------------------------------------------- -# Build C1 FPGA (400 MHz) -# ------------------------------------------------------------------- -- template: templates/fpga_build.yml -  parameters: -    target: X410_C1_400 -    debug: true  # to be able to debug any failed attempts -    clean: false # for speedup of PR testing -    timeout: 480 - -# ------------------------------------------------------------------- -# Make CPLD -# ------------------------------------------------------------------- -#- template: templates/mb_cpld_build.yml -#  parameters: -#    debug: true  # to be able to debug any failed attempts - -# ------------------------------------------------------------------- -# Make ZBX CPLD -# ------------------------------------------------------------------- -#- template: templates/zbx_cpld_build.yml -#  parameters: -#    debug: true  # to be able to debug any failed attempts - -# ------------------------------------------------------------------- -# Build IP -# ------------------------------------------------------------------- -- job: IP -  displayName: 'Build IP' -  pool: -    name: de-dre-lab -    demands: -    - ettus_fpga_build -    - vivado2019.1 -  timeoutInMinutes: 120 -  steps: -    - checkout: self -      clean: false - -    - bash: | -        python3 cleanup_incomplete_ip_builds.py -d $BUILD_SOURCESDIRECTORY/fpga/usrp3/top/x400 -      workingDirectory: fpga/.ci/scripts/ -      displayName: 'Incomplete IP Cleanup' - -    # Delete everything except for the build-ip directory, which is expected to -    # remain for speed-up. -    - bash: | -        git clean -xdff -e build-ip -      displayName: 'git clean' - -    - bash: | -        source setupenv.sh -        make X410_IP -      workingDirectory: fpga/usrp3/top/x400 - -    - publish: fpga/usrp3/top/x400/build-ip -      artifact: 'IP ($(System.JobAttempt))' -      condition: failed() - -    - publish: fpga/usrp3/top/x400/build-ip -      artifact: 'IP' -      condition: succeeded() - -    - template: templates/check_clean_repo_steps.yml | 
