UVM环境介绍
HEAD commitID: 1f968ef
1. core-v-verif/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_item.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 sequence item : Read Address channel ****/
`ifndef __UVMA_AXI_AR_ITEM_SV__
`define __UVMA_AXI_AR_ITEM_SV__
class uvma_axi_ar_item_c extends uvm_sequence_item;
rand logic [AXI_ID_WIDTH-1:0] ar_id;
rand logic [AXI_ADDR_WIDTH-1:0] ar_addr;
rand logic [7:0] ar_len;
rand logic [2:0] ar_size;
rand logic [1:0] ar_burst;
rand logic [1:0] ar_user;
rand logic ar_valid;
rand logic ar_ready;
rand logic ar_lock;
int ar_latency;
`uvm_object_utils_begin(uvma_axi_ar_item_c)
`uvm_field_int(ar_id, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_addr, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_len, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_size, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_burst, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_user, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_valid, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_ready, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_lock, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_latency, UVM_DEFAULT + UVM_DEC + UVM_NOCOMPARE);
`uvm_object_utils_end
function new(string name = "uvma_axi_ar_item_c");
super.new(name);
endfunction
endclass
`endif
1. 简要介绍
uvma_axi_ar_item.sv
文件定义了一个继承自 uvm_sequence_item
的类 uvma_axi_ar_item_c
,用于描述 AXI4 协议中读地址通道(AR 通道)的序列项。该类包含了读地址通道的多个随机化信号,以及一个整型的延迟变量,同时使用 UVM 的对象实用工具宏来实现对象的创建、复制、打印等功能。
2. 接口介绍
该文件主要定义类,不存在传统硬件模块的接口。类通过其成员变量和方法与外部进行交互,外部代码可以创建该类的对象,设置或获取对象的成员变量值。
3. 参数介绍
文件中未显式定义 parameter
或 localparam
,但使用了预定义的宏 AXI_ID_WIDTH
和 AXI_ADDR_WIDTH
来确定成员变量的位宽。
rand logic [AXI_ID_WIDTH-1:0] ar_id;
rand logic [AXI_ADDR_WIDTH-1:0] ar_addr;
AXI_ID_WIDTH
:用于确定ar_id
信号的位宽,ar_id
代表读地址通道的 ID 信号。AXI_ADDR_WIDTH
:用于确定ar_addr
信号的位宽,ar_addr
代表读地址通道的地址信号。
4. 模块实现介绍
4.1 条件编译
`ifndef __UVMA_AXI_AR_ITEM_SV__
`define __UVMA_AXI_AR_ITEM_SV__
// ... 中间代码 ...
`endif
- 代码介绍:使用条件编译指令防止文件被重复包含。如果
__UVMA_AXI_AR_ITEM_SV__
宏未定义,则定义该宏并编译中间代码;若已定义,则跳过中间代码。 - 逻辑分析:避免在编译过程中多次包含该文件,导致类重复定义的错误。
4.2 类定义与成员变量声明
class uvma_axi_ar_item_c extends uvm_sequence_item;
rand logic [AXI_ID_WIDTH-1:0] ar_id;
rand logic [AXI_ADDR_WIDTH-1:0] ar_addr;
rand logic [7:0] ar_len;
rand logic [2:0] ar_size;
rand logic [1:0] ar_burst;
rand logic [1:0] ar_user;
rand logic ar_valid;
rand logic ar_ready;
rand logic ar_lock;
int ar_latency;
- 代码介绍:定义一个名为
uvma_axi_ar_item_c
的类,继承自uvm_sequence_item
。该类包含多个随机化的成员变量,用于表示 AXI4 读地址通道的各个信号,以及一个整型的ar_latency
变量。 - 逐行分析:
class uvma_axi_ar_item_c extends uvm_sequence_item;
:开始定义类uvma_axi_ar_item_c
,并继承自uvm_sequence_item
,这是 UVM 中用于序列项的基类。rand logic [AXI_ID_WIDTH-1:0] ar_id;
:声明一个随机化的逻辑变量ar_id
,位宽由AXI_ID_WIDTH
确定,代表读地址通道的 ID。rand logic [AXI_ADDR_WIDTH-1:0] ar_addr;
:声明一个随机化的逻辑变量ar_addr
,位宽由AXI_ADDR_WIDTH
确定,代表读地址通道的地址。rand logic [7:0] ar_len;
:声明一个 8 位的随机化逻辑变量ar_len
,代表读突发的长度。rand logic [2:0] ar_size;
:声明一个 3 位的随机化逻辑变量ar_size
,代表每次传输的数据大小。rand logic [1:0] ar_burst;
:声明一个 2 位的随机化逻辑变量ar_burst
,代表突发传输的类型。rand logic [1:0] ar_user;
:声明一个 2 位的随机化逻辑变量ar_user
,代表用户自定义信号。rand logic ar_valid;
:声明一个随机化的单比特逻辑变量ar_valid
,表示读地址通道的数据是否有效。rand logic ar_ready;
:声明一个随机化的单比特逻辑变量ar_ready
,表示从设备是否准备好接收读地址。rand logic ar_lock;
:声明一个随机化的单比特逻辑变量ar_lock
,表示读地址通道的锁定信号。int ar_latency;
:声明一个整型变量ar_latency
,表示读地址通道的延迟。
4.3 UVM 对象实用工具宏
`uvm_object_utils_begin(uvma_axi_ar_item_c)
`uvm_field_int(ar_id, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_addr, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_len, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_size, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_burst, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_user, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_valid, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_ready, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_lock, UVM_ALL_ON | UVM_NOPACK);
`uvm_field_int(ar_latency, UVM_DEFAULT + UVM_DEC + UVM_NOCOMPARE);
`uvm_object_utils_end
- 代码介绍:使用 UVM 的对象实用工具宏来注册类和其成员变量,方便 UVM 框架对对象进行创建、复制、打印、打包等操作。
- 逐行分析:
uvm_object_utils_begin(uvma_axi_ar_item_c)
:开始注册类uvma_axi_ar_item_c
。uvm_field_int(...)
:注册类的各个成员变量,UVM_ALL_ON
表示启用所有操作(如打印、复制等),UVM_NOPACK
表示不进行打包操作。对于ar_latency
,UVM_DEC
表示以十进制形式打印,UVM_NOCOMPARE
表示在比较对象时忽略该字段。uvm_object_utils_end
:结束类的注册。
4.4 构造函数
function new(string name = "uvma_axi_ar_item_c");
super.new(name);
endfunction
- 代码介绍:定义类的构造函数
new
,用于创建类的对象。 - 逐行分析:
function new(string name = "uvma_axi_ar_item_c");
:定义构造函数,接受一个字符串参数name
,默认值为"uvma_axi_ar_item_c"
。super.new(nam