# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

-covInput $SCRATCH_PATH/cov_merge/merged.vdb
-covDUT $dut_instance

# Provide the clock specification
-clock clk_i 100
# Provide the reset specification: signal_name, active_value, num clk cycles reset to be active
-reset rst_ni 0 20

# Enables the Elite licensing for UNR
# Adding this switch avoids the compile error saying could not find the `VC-static-cov` license
-fmlElite

# Black box common security modules
 -blackBoxes -type design prim_count+prim_spare_fsm+prim_double_lfsr

# Name of the generated exclusion file
-save_exclusion $SCRATCH_PATH/cov_unr/unr_exclude.el

# Enables verbose reporting in addition to summary reporting.
-verboseReport
