UVM环境介绍
HEAD commitID: 1f968ef
1. core-v-verif/lib/uvm_agents/uvma_axi5/src/uvma_axi_macros.sv
// Copyright 2024 CoreLab Tech
//
// 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/
//
`ifndef __UVMA_AXI_MACROS_SV__
`define __UVMA_AXI_MACROS_SV__
`define IFNDEF_DEFINE(name,value) \
`ifndef name \
`define name value \
`endif
`IFNDEF_DEFINE(UVMA_AXI_ADDR_MAX_WIDTH , 64 )
`IFNDEF_DEFINE(UVMA_AXI_DATA_MAX_WIDTH , 64 )
`IFNDEF_DEFINE(UVMA_AXI_USER_MAX_WIDTH , 512 )
`IFNDEF_DEFINE(UVMA_AXI_ID_MAX_WIDTH , 64 )
// `IFNDEF_DEFINE(UVMA_AXI_STRB_MAX_WIDTH , 8 )
`IFNDEF_DEFINE(UVMA_AXI_MAX_NB_TXN_BURST , 256 )
`IFNDEF_DEFINE(UVMA_AXI_LOOP_MAX_WIDTH , 8 )
`IFNDEF_DEFINE(UVMA_AXI_MMUSID_MAX_WIDTH , 32 )
`IFNDEF_DEFINE(UVMA_AXI_MMUSSID_MAX_WIDTH , 20 )
`endif // __UVMA_AXI_MACROS_SV__
1. 简要介绍
uvma_axi_macros.sv
文件主要用于定义 SystemVerilog 宏,这些宏的作用是在未定义特定宏的情况下对其进行定义,为 AXI 协议相关参数设定默认值。通过这种方式,确保在整个项目中使用统一的 AXI 协议参数,避免重复定义和潜在的错误。
2. 接口介绍
该文件无传统意义上的接口,它主要是宏定义,不涉及端口连接。不过其定义的宏会被其他模块或文件引用,以获取 AXI 协议相关的默认参数值。
3. 参数介绍
文件中定义了一系列宏作为 AXI 协议的参数,以下是部分示例:
`IFNDEF_DEFINE(UVMA_AXI_ADDR_MAX_WIDTH , 64 )
`IFNDEF_DEFINE(UVMA_AXI_DATA_MAX_WIDTH , 64 )
`IFNDEF_DEFINE(UVMA_AXI_USER_MAX_WIDTH , 512 )
`IFNDEF_DEFINE(UVMA_AXI_ID_MAX_WIDTH , 64 )
`IFNDEF_DEFINE(UVMA_AXI_MAX_NB_TXN_BURST , 256 )
`IFNDEF_DEFINE(UVMA_AXI_LOOP_MAX_WIDTH , 8 )
`IFNDEF_DEFINE(UVMA_AXI_MMUSID_MAX_WIDTH , 32 )
`IFNDEF_DEFINE(UVMA_AXI_MMUSSID_MAX_WIDTH , 20 )
UVMA_AXI_ADDR_MAX_WIDTH
:AXI 地址的最大宽度,默认值为 64 位。UVMA_AXI_DATA_MAX_WIDTH
:AXI 数据的最大宽度,默认值为 64 位。UVMA_AXI_USER_MAX_WIDTH
:AXI 用户信号的最大宽度,默认值为 512 位。UVMA_AXI_ID_MAX_WIDTH
:AXI 标识符的最大宽度,默认值为 64 位。UVMA_AXI_MAX_NB_TXN_BURST
:AXI 突发事务的最大数量,默认值为 256。UVMA_AXI_LOOP_MAX_WIDTH
:AXI 循环计数器的最大宽度,默认值为 8 位。UVMA_AXI_MMUSID_MAX_WIDTH
:AXI MMU 主 ID 的最大宽度,默认值为 32 位。UVMA_AXI_MMUSSID_MAX_WIDTH
:AXI MMU 从 ID 的最大宽度,默认值为 20 位。
4. 模块实现介绍
4.1 条件编译保护
`ifndef __UVMA_AXI_MACROS_SV__
`define __UVMA_AXI_MACROS_SV__
- 代码介绍:使用
ifndef
和define
进行条件编译。如果__UVMA_AXI_MACROS_SV__
宏未定义,则定义该宏,后续代码会被编译;若已定义,则跳过后续代码。 - 逻辑分析:防止文件被重复包含,避免宏的重复定义。
4.2 宏定义函数
`define IFNDEF_DEFINE(name,value) \
`ifndef name \
`define name value \
`endif
- 代码介绍:定义一个名为
IFNDEF_DEFINE
的宏函数,它接受两个参数name
和value
。如果name
宏未定义,则将其定义为value
。 - 逻辑分析:该宏函数简化了检查和定义宏的过程,使得代码更加简洁,可复用性更高。
4.3 使用宏函数定义参数
`IFNDEF_DEFINE(UVMA_AXI_ADDR_MAX_WIDTH , 64 )
- 代码介绍:调用
IFNDEF_DEFINE
宏函数,检查UVMA_AXI_ADDR_MAX_WIDTH
宏是否已定义,如果未定义,则将其定义为 64。 - 逻辑分析:为 AXI 协议相关参数设置默认值,确保在整个项目中使用统一的参数。
4.4 条件编译结束
`endif // __UVMA_AXI_MACROS_SV__
- 代码介绍:结束
ifndef
条件编译块。 - 逻辑分析:标志着条件编译部分的结束。
5. 总结
uvma_axi_macros.sv
文件通过定义宏和宏函数,为 AXI 协议相关参数提供了默认值,并利用条件编译防止文件重复包含。这种方式保证了在整个项目中使用统一的 AXI 协议参数,提高了代码的可维护性和可复用性。其他模块可以通过引用这些宏来获取 AXI 协议的参数,避免了参数的重复定义和潜在的错误。
2. core-v-verif/lib/uvm_agents/uvma_axi5/src/uvma_axi_r_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) – sub-contractor MU-Electronics for Thales group
// Co-Author: Abdelaali Khardazi
// *************************** READ DATA CHANNEL ************************** //
module uvma_axi_r_assert (uvma_axi_intf axi_assert);
import uvm_pkg::*;
// *************************** Check if Read Signals are not equal X or Z when RVALID is HIGH (Section A3.2.2) ************************** //
property AXI4_RID_X;
@(posedge axi_assert.clk && axi_assert.r_assertion_enabled) disable iff (!axi_assert.rst_n) axi_assert.psv_axi_cb.r_valid |-> (!$isunknown(axi_assert.psv_axi_cb.r_id));
endproperty
property AXI4_RDATA_X;
@(posedge axi_assert.clk && axi_assert.r_assertion_enabled) disable iff (!axi_assert.rst_n) axi_assert.psv_axi_cb.r_valid |-> (!$isunknown(axi_assert.psv_axi_cb.r_data));
endproperty
property AXI4_RRESP_X;
@(posedge axi_assert.clk && axi_assert.r_assertion_enabled) disable iff (!axi_assert.rst_n) axi_assert.psv_axi_cb.r_valid |-> (!$isunknown(axi_assert.psv_axi_cb.r_resp));
endproperty
property AXI4_RLAST_X;
@(posedge axi_assert.clk && axi_assert.r_assertion_enabled) disable iff (!axi_assert.rst_n) axi_assert.psv_axi_cb.r_valid |-> (!$isunknown(axi_assert.psv_axi_cb.r_last));
endproperty
property AXI4_RUSEr_X;
@(posedge axi_assert.clk && axi_assert.r_assertion_enabled) disable iff (!axi_assert.rst_n) axi_assert.psv_axi_cb.r_valid |-> (!$isunknown(axi_assert.psv_axi_cb.r_user));
endproperty
//A value of X on RVALID is not permitted when not in reset (Section A3.1.2)
property AXI4_RVALID_X;
@(posedge axi_assert.clk && axi_assert.r_assertion_enabled) disable iff (!axi_assert.rst_n) (!$isunknown(axi_assert.psv_axi_cb.r_valid));
endproperty
//A value of X on RREADY is not permitted when not in reset (Section A3.1.2)
property AXI4_RREADY_X;
@(posedge axi_assert.clk && axi_assert.r_assertion_enabled) disable iff (!axi_assert.rst_n) (!$isunknown(axi_assert.psv_axi_cb.r_ready));
endproperty
// *************************** Check if Read Signals are stable when AWVALID is HIGH (Section A3.2.1) ************************** //
property AXI4_RID_STABLE ;
@(posedge axi_assert.clk && axi_assert.r_assertion_enabled) disable iff (!axi_assert.rst_n) axi_assert.psv_axi_cb.r_valid |-> (!axi_assert.psv_axi_cb.r_ready |=> ($stable(axi_assert.psv_axi_cb.r_id)));
endproperty
property AXI4_RDATA_STABLE;
@(posedge axi_assert.clk && axi_assert.r_assertion_enabled) disable iff (!axi_assert.rst_n) axi_assert.psv_axi_cb.r_valid |-> (!axi_assert.psv_axi_cb.r_ready |=> ($stable(axi_assert.psv_axi_cb.r_data)));
endproperty
property AXI4_RRESP_STABLE;
@(posedge axi_assert.clk && axi_assert.r_assertion_enabled) disable iff (!axi_assert.rst_n