core-v-verif系列之lib<32>

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__
  • 代码介绍:使用 ifndefdefine 进行条件编译。如果 __UVMA_AXI_MACROS_SV__ 宏未定义,则定义该宏,后续代码会被编译;若已定义,则跳过后续代码。
  • 逻辑分析:防止文件被重复包含,避免宏的重复定义。
4.2 宏定义函数
`define IFNDEF_DEFINE(name,value) \
  `ifndef name \
    `define name value \
  `endif
  • 代码介绍:定义一个名为 IFNDEF_DEFINE 的宏函数,它接受两个参数 namevalue。如果 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值