UVM环境介绍
HEAD commitID: 1f968ef
1. core-v-verif/lib/uvm_agents/uvma_axi/src/uvma_axi_ar_assert.sv
// Copyright 2022 Thales DIS SAS
//
// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0
// You may obtain a copy of the License at https://solderpad.org/licenses/
//
// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com)
// Co-Author: Abdelaali Khardazi
// *************************** READ ADDRESS CHANNEL ************************** //
module uvma_axi_ar_assert (uvma_axi_intf.passive axi_assert, input bit clk, input rst_n);
import uvm_pkg::*;
// *************************** Check if control information Signals are not equal to X or Z when ARVALID is HIGH (Section A3.2.2) ************************** //
property AXI4_ARID_X;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_id));
endproperty
property AXI4_ARADDR_X;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_addr));
endproperty
property AXI4_ARLEN_X;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_len));
endproperty
property AXI4_ARSIZE_X;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_size));
endproperty
property AXI4_ARBURST_X;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_burst));
endproperty
property AXI4_ARLOCK_X;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_lock));
endproperty
property AXI4_ARCACHE_X;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_cache));
endproperty
property AXI4_ARPROT_X;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_prot));
endproperty
property AXI4_ARUSER_X;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_user));
endproperty
property AXI4_ARQOS_X;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_qos));
endproperty
property AXI4_ARREGION_X;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_region));
endproperty
// A value of X on ARVALID is not permitted when not in reset (Section A3.1.2)
property AXI4_ARVALID_X;
@(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.ar_valid));
endproperty
// A value of X on ARREADY is not permitted when not in reset (Section A3.1.2)
property AXI4_ARREADY_X;
@(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.ar_ready));
endproperty
// *************************** Check if control information Signals are stable when ARVALID is HIGH (Section A3.2.1) ************************** //
property AXI4_ARID_STABLE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_id)));
endproperty
property AXI4_ARADDR_STABLE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_addr)));
endproperty
property AXI4_ARLEN_STABLE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_len)));
endproperty
property AXI4_ARSIZE_STABLE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_size)));
endproperty
property AXI4_ARBURST_STABLE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_burst)));
endproperty
property AXI4_ARLOCK_STABLE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_lock)));
endproperty
property AXI4_ARCACHE_STABLE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_cache)));
endproperty
property AXI4_ARPROT_STABLE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_prot)));
endproperty
property AXI4_ARUSER_STABLE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_user)));
endproperty
property AXI4_ARQOS_STABLE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_qos)));
endproperty
property AXI4_ARREGION_STABLE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_region)));
endproperty
// Check if, Once asserted, ar_valid must remain asserted until ar_ready is HIGH (Section A3.2.1)
property AXI4_AR_VALID_READY ;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (axi_assert.psv_axi_cb.ar_valid throughout (axi_assert.psv_axi_cb.ar_ready [->1]));
endproperty
// check if a read transaction with burst type WRAP has an aligned address (Section A3.4.1)
property AXI_ARADDR_WRAP_ALIGN;
@(posedge clk) disable iff (!rst_n) (axi_assert.psv_axi_cb.ar_valid && axi_assert.psv_axi_cb.ar_burst == 2'b10) |-> !((axi_assert.psv_axi_cb.ar_addr) % (2**axi_assert.psv_axi_cb.ar_size));
endproperty
// check if The size of a read transfer does not exceed the width of the data interface (Section A3.4.1)
property AXI_ERRM_ARSIZE;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (8*(2**axi_assert.psv_axi_cb.ar_size) <= `UVMA_AXI_DATA_MAX_WIDTH);
endproperty
// check if burst crosses 4KB boundaries (Section A3.4.1)
property AXI4_ERRM_ARADDR_BOUNDARY;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (((axi_assert.psv_axi_cb.ar_addr + (axi_assert.psv_axi_cb.ar_len + 1)*(2**axi_assert.psv_axi_cb.ar_size)) % 4096) > (axi_assert.psv_axi_cb.ar_addr % 4096)) || !((axi_assert.psv_axi_cb.ar_addr+(axi_assert.psv_axi_cb.ar_len + 1) * (2**axi_assert.psv_axi_cb.ar_size)) % 4096) ;
endproperty
// Check if the burst length equal to 2, 4, 8, or 16, for wrapping bursts (Section A3.4.1)
property AXI_ARLEN_WRAPP_BURST;
@(posedge clk) disable iff (!rst_n) (axi_assert.psv_axi_cb.ar_valid && axi_assert.psv_axi_cb.ar_burst == 2'b10) |-> (axi_assert.psv_axi_cb.ar_len == 1) || (axi_assert.psv_axi_cb.ar_len == 3) || (axi_assert.psv_axi_cb.ar_len == 7) || (axi_assert.psv_axi_cb.ar_len == 15);
endproperty
// Check if ar_burst can’t be 2’b11 (Table A3-3)
property AXI4_AR_BURST_CANT_2b11;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (axi_assert.psv_axi_cb.ar_burst != 2'b11);
endproperty
// Check if ARVALID is LOW for the first cycle after ARESETn goes HIGH (Figure A3-1)
property AXI4_ARVALID_RESET;
@(posedge clk) $rose(rst_n) |=> !(axi_assert.psv_axi_cb.ar_valid);
endproperty
// Check if the length of an exclusive access transaction don't pass 16 beats (Section A7.2.4)
property AXI4_ARLEN_LOCK;
@(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_lock |-> (signed' (axi_assert.psv_axi_cb.ar_len)) <= 16;
endproperty
// Check if ARCACHE[3:2] are LOW, When ARVALID is HIGH and ARCACHE[1] is LOW (Table A4-5)
property AXI4_ARCACHE_LOW;
@(posedge clk) disable iff (!rst_n) (axi_assert