UVM环境介绍
HEAD commitID: 1f968ef
1. core-v-verif/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.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
/***** AXI4 slave agent package *****/
`ifndef __UVMA_AXI_PKG_SV__
`define __UVMA_AXI_PKG_SV__
// Pre-processor macros
`include "uvm_macros.svh"
`include "uvma_axi_macros.sv"
// Interfaces / Modules / Checkers
`include "uvma_axi_intf.sv"
`include "uvma_axi_aw_assert.sv"
`include "uvma_axi_w_assert.sv"
`include "uvma_axi_ar_assert.sv"
`include "uvma_axi_r_assert.sv"
`include "uvma_axi_b_assert.sv"
package uvma_axi_pkg;
import uvm_pkg::*;
import uvml_mem_pkg ::*;
import uvml_trn_pkg ::*;
import uvml_logs_pkg ::*;
import "DPI-C" function read_elf(input string filename);
import "DPI-C" function byte get_section(output longint address, output longint len);
import "DPI-C" context function read_section_sv(input longint address, inout byte buffer[]);
localparam NrSlaves = 2; // actually masters, but slaves on the crossbar
localparam IdWidth = 4; // 4 is recommended by AXI standard, so lets stick to it, do not change
localparam IdWidthSlave = IdWidth + $clog2(NrSlaves);
parameter AXI_ADDR_WIDTH = `UVMA_AXI_ADDR_MAX_WIDTH;
parameter AXI_DATA_WIDTH = `UVMA_AXI_DATA_MAX_WIDTH;
parameter AXI_USER_WIDTH = `UVMA_AXI_USER_MAX_WIDTH;
parameter AXI_ID_WIDTH = IdWidthSlave;
parameter NUM_WORDS = 2**24;
`include "uvma_axi_tdefs.sv"
// Objects
`include "uvma_axi_cfg.sv"
`include "uvma_axi_cntxt.sv"
`include "uvma_axi_base_seq_item.sv"
`include "uvma_axi_aw_item.sv"
`include "uvma_axi_w_item.sv"
`include "uvma_axi_b_item.sv"
`include "uvma_axi_ar_item.sv"
`include "uvma_axi_r_item.sv"
`include "uvma_axi_aw_drv.sv"
`include "uvma_axi_w_drv.sv"
`include "uvma_axi_b_drv.sv"
`include "uvma_axi_ar_drv.sv"
`include "uvma_axi_r_drv.sv"
`include "uvma_axi_aw_mon.sv"
`include "uvma_axi_w_mon.sv"
`include "uvma_axi_b_mon.sv"
`include "uvma_axi_ar_mon.sv"
`include "uvma_axi_r_mon.sv"
`include "uvma_axi_aw_sqr.sv"
`include "uvma_axi_w_sqr.sv"
`include "uvma_axi_b_sqr.sv"
`include "uvma_axi_ar_sqr.sv"
`include "uvma_axi_r_sqr.sv"
`include "uvma_axi_seq_item_logger.sv"
`include "uvma_axi_aw_agent.sv"
`include "uvma_axi_w_agent.sv"
`include "uvma_axi_b_agent.sv"
`include "uvma_axi_ar_agent.sv"
`include "uvma_axi_r_agent.sv"
`include "uvma_axi_vsqr.sv"
`include "uvma_axi_agent.sv"
// Sequences
`include "uvma_axi_seq_lib.sv"
endpackage : uvma_axi_pkg
`endif
1. 简要介绍
uvma_axi_pkg.sv
文件定义了一个名为 uvma_axi_pkg
的 SystemVerilog 包,该包主要用于封装 AXI4 从机代理相关的组件和资源。它导入了多个必要的包和 DPI - C 函数,定义了一系列参数,并包含了大量的文件包含语句,用于引入 AXI4 验证环境所需的接口、类型定义、对象、驱动、监视器、序列器、序列等文件,为 AXI4 协议的验证提供了完整的基础框架。
2. 接口介绍
此文件主要定义包,不涉及传统意义上的接口,因此没有接口相关代码。
3. 参数介绍
localparam NrSlaves = 2; // actually masters, but slaves on the crossbar
localparam IdWidth = 4; // 4 is recommended by AXI standard, so lets stick to it, do not change
localparam IdWidthSlave = IdWidth + $clog2(NrSlaves);
parameter AXI_ADDR_WIDTH = `UVMA_AXI_ADDR_MAX_WIDTH;
parameter AXI_DATA_WIDTH = `UVMA_AXI_DATA_MAX_WIDTH;
parameter AXI_USER_WIDTH = `UVMA_AXI_USER_MAX_WIDTH;
parameter AXI_ID_WIDTH = IdWidthSlave;
parameter NUM_WORDS = 2**24;
localparam NrSlaves = 2;
:定义从机数量为 2,注释说明这些实际是主机,但在交叉开关上作为从机。localparam
表明该参数仅在包内可见。localparam IdWidth = 4;
:定义 ID 宽度为 4,这是 AXI 标准推荐的值,注释建议不要修改。localparam IdWidthSlave = IdWidth + $clog2(NrSlaves);
:计算从机的 ID 宽度,为IdWidth
加上从机数量以 2 为底的对数。parameter AXI_ADDR_WIDTH =
UVMA_AXI_ADDR_MAX_WIDTH;:定义 AXI 地址宽度,取值为
UVMA_AXI_ADDR_MAX_WIDTH` 宏的值。parameter AXI_DATA_WIDTH =
UVMA_AXI_DATA_MAX_WIDTH;:定义 AXI 数据宽度,取值为
UVMA_AXI_DATA_MAX_WIDTH` 宏的值。parameter AXI_USER_WIDTH =
UVMA_AXI_USER_MAX_WIDTH;:定义 AXI 用户信号宽度,取值为
UVMA_AXI_USER_MAX_WIDTH` 宏的值。parameter AXI_ID_WIDTH = IdWidthSlave;
:定义 AXI ID 宽度,取值为计算得到的IdWidthSlave
。parameter NUM_WORDS = 2**24;
:定义字的数量为2^24
。
4. 模块实现介绍
4.1 条件编译和头文件包含
`ifndef __UVMA_AXI_PKG_SV__
`define __UVMA_AXI_PKG_SV__
// Pre-processor macros
`include "uvm_macros.svh"
`include "uvma_axi_macros.sv"
// Interfaces / Modules / Checkers
`include "uvma_axi_intf.sv"
`include "uvma_axi_aw_assert.sv"
`include "uvma_axi_w_assert.sv"
`include "uvma_axi_ar_assert.sv"
`include "uvma_axi_r_assert.sv"
`include "uvma_axi_b_assert.sv"
ifndef __UVMA_AXI_PKG_SV__
和define __UVMA_AXI_PKG_SV__
:使用条件编译防止该文件被重复包含。include "uvm_macros.svh"
:包含 UVM 宏文件,引入 UVM 验证方法学的宏定义。include "uvma_axi_macros.sv"
:包含自定义的 AXI 宏文件,引入 AXI 相关的宏定义。- 后续的
include
语句包含了 AXI 接口、断言检查等相关文件,为 AXI 验证提供基础组件。
4.2 包定义和包导入
package uvma_axi_pkg;
import uvm_pkg::*;
import uvml_mem_pkg ::*;
import uvml_trn_pkg ::*;
import uvml_logs_pkg ::*;
import "DPI-C" function read_elf(input string filename);
import "DPI-C" function byte get_section(output longint address, output longint len);
import "DPI-C" context function read_section_sv(input longint address, inout byte buffer[]);
package uvma_axi_pkg;
:定义名为uvma_axi_pkg
的包。import uvm_pkg::*;
等:导入 UVM 包以及其他自定义包,引入所需的类和函数。import "DPI-C"
相关语句:导入 DPI - C 函数,用于与 C 语言代码进行交互,如读取 ELF 文件等操作。
4.3 类型定义和对象文件包含
`include "uvma_axi_tdefs.sv"
// Objects
`include "uvma_axi_cfg.sv"
`include "uvma_axi_cntxt.sv"
`include "uvma_axi_base_seq_item.sv"
`include "uvma_axi_aw_item.sv"
`include "uvma_axi_w_item.sv"
`include "uvma_axi_b_item.sv"
`include "uvma_axi_ar_item.sv"
`include "uvma_axi_r_item.sv"
include "uvma_axi_tdefs.sv"
:包含 AXI 类型定义文件,定义 AXI 相关的数据类型。- 后续的
include
语句包含了 AXI 配置、上下文、序列项等对象文件,为 AXI 验证环境提供各种对象。
4.4 驱动、监视器、序列器和代理文件包含
`include "uvma_axi_aw_drv.sv"
`include "uvma_axi_w_drv.sv"
`include "uvma_axi_b_drv.sv"
`include "uvma_axi_ar_drv.sv"
`include "uvma_axi_r_drv.sv"
`include "uvma_axi_aw_mon.sv"
`include "uvma_axi_w_mon.sv"
`include "uvma_axi_b_mon.sv"
`include "uvma_axi_ar_mon.sv"
`include "uvma_axi_r_mon.sv"
`include "uvma_axi_aw_sqr.sv"
`include "uvma_axi_w_sqr.sv"
`include "uvma_axi_b_sqr.sv"
`include "uvma_axi_ar_sqr.sv"
`include "uvma_axi_r_sqr.sv"
`include "uvma_axi_aw_agent.sv"
`include "uvma_axi_w_agent.sv"
`include "uvma_axi_b_agent.sv"
`include "uvma_axi_ar_agent.sv"
`include "uvma_axi_r_agent.sv"
`include "uvma_axi_vsqr.sv"
`include "uvma_axi_agent.sv"
这些 include
语句包含了 AXI 各个通道的驱动、监视器、序列器和代理文件,构建了完整的 AXI 验证组件。
4.5 序列库文件包含
`include "uvma_axi_seq_lib.sv"
包含 AXI 序列库文件,提供各种 AXI 序列,用于生成不同的测试激励。
4.6 包结束
endpackage : uvma_axi_pkg
`endif
endpackage : uvma_axi_pkg
:结束uvma_axi_pkg
包的定义。endif
:结束条件编译。
5. 总结
uvma_axi_pkg.sv
通过定义一个包,将 AXI4 从机代理验证所需的各种资源和组件进行了封装。它引入了必要的包和 DPI - C 函数,定义了关键参数,并通过大量的文件包含语句引入了接口、类型定义、对象、驱动、监视器、序列器、序列等文件,为 AXI4 协议的验证提供了一个完整、可复用的基础框架。这种设计方式提高了代码的模块化程度和可维护性,方便开发人员进行 AXI4 相关的验证工作。
2. core-v-verif/lib/uvm_agents/uvma_axi/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)
// Co-Author: Abdelaali Khardazi
// *************************** READ DATA CHANNEL ************************** //
module uvma_axi_r_assert (uvma_axi_intf.passive axi_assert, input bit clk, input rst_n);
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 clk) disable iff (