【验证小bai】关于多个声明域变量名重名时如何取用的问题——还是以随机约束为例

简介: 【验证小bai】关于多个声明域变量名重名时如何取用的问题——还是以随机约束为例

前言

前文就是这个:


【验证小bai】randomize中的this.指的是哪个this呢


然后发现还是说的不怎么明白,因此在这篇里把情况掰开揉碎的说明一下,标题就叫:关于多个声明域变量名重名时如何取用的问题;


具体的场景就是下图,在class A的function B中随机C,此时randomize中需要使用一个变量mid,恰好A(下用class表示)/B(下用function表示)/C(下用transaction表示)内都有一个变量名字叫做mid;



最完备的场景罗列

在上次的博客博客中,我们已经确定了randomize中this的执行性,那么问题来了,如果我就是需要使用A、B或C中的mid,那么怎么办呢,看下面的示例代码:


transaction的声明:

class tv0;
    rand bit[7:0] id;
    bit[7:0] mid = 8'hF;
endclass


最外层的class的声明:

class sanity_case extends base_test;
    bit[7:0] mid = 8'hA;
  extern function new(string name = "base_test", uvm_component parent=null);
  extern virtual function void build_phase(uvm_phase phase);
  `uvm_component_utils(sanity_case)
endclass: sanity_case


function内的声明与取用验证:

function sanity_case::new(string name = "base_test", uvm_component parent=null);
    bit[7:0] mid = 8'h5;
    tv0 t0 = new();
    tv0 t1 = new();
    tv0 t2 = new();
    tv0 t3 = new();
    super.new(name, parent);
    t0.randomize with {id == this.mid;};
    t1.randomize with {id == sanity_case::mid;};
    t2.randomize with {id == local::mid;};
    t3.randomize with {id == mid;};
    $display("t0.id = 'h%0h", t0.id);
    $display("t1.id = 'h%0h", t1.id);
    $display("t2.id = 'h%0h", t2.id);
    $display("t3.id = 'h%0h", t3.id);
    $finish;
endfunction: new


目前mid的值,transaction内为'hF,class中为'hA,function中为'h5;在randomize中取用方式分别使用了this./sanity_case::/local::/不带前缀四种方式,得到的结果如下:

t0.id = 'hf
t1.id = 'ha
t2.id = 'h5
t3.id = 'hf
$finish called from file "../tc/sanity_case.sv", line 56.
$finish at simulation time                    0


因此可以得出结论,当class/transaction/function三个维度均存在该同名变量时:


  • this.mid选择的是transaction内的变量;
  • class_name::mid选择的是class内的变量;
  • local::mid选择的是function内的变量;
  • mid选择的是transaction内的变量;

当transaction内没有mid时

调整代码如下:

class tv0;
    rand bit[7:0] id;
    //bit[7:0] mid = 8'hF;
endclass


打印结果:

t0.id = 'ha
t1.id = 'ha
t2.id = 'h5
t3.id = 'h5
$finish called from file "../tc/sanity_case.sv", line 56.
$finish at simulation time                    0


结论:


  • this.mid选择的是class内的变量;
  • class_name::mid选择的是class内的变量;
  • local::mid选择的是function内的变量;
  • mid选择的是function内的变量;

~~~~~~~~~~~~~~~~~你学废了吗!~~~~~~~~~~~~~~~~~~~~~


相关文章
|
6月前
|
存储 Java
变量的分类和作用2
变量的分类和作用
42 1
|
6月前
|
存储 缓存 安全
【C/C++ 关键字 存储类说明符】C/C++ 的mutable 关键字 忽略对该数据成员的常量性检查在const函数中修改变量值
【C/C++ 关键字 存储类说明符】C/C++ 的mutable 关键字 忽略对该数据成员的常量性检查在const函数中修改变量值
67 0
|
6月前
|
Java 编译器
变量的分类和作用1
变量的分类和作用
56 0
|
6月前
|
C语言 C++ 开发者
C/C++陷阱——变量名和函数名的冲突问题
C/C++陷阱——变量名和函数名的冲突问题
|
C语言 C++
竞赛(变量定义、赋值及转换)
竞赛(变量定义、赋值及转换)
|
6月前
|
存储 C# 容器
掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南
变量是用于存储数据值的容器。 在 C# 中,有不同类型的变量(用不同的关键字定义),例如: int - 存储整数(没有小数点的整数),如 123 或 -123 double - 存储浮点数,有小数点,如 19.99 或 -19.99 char - 存储单个字符,如 'a' 或 'B'。Char 值用单引号括起来 string - 存储文本,如 "Hello World"。String 值用双引号括起来 bool - 存储具有两个状态的值:true 或 false
97 2
|
编译器
函数的声明和定义(如何分文件使用)
函数的声明和定义(如何分文件使用)
|
数据安全/隐私保护
设置公共变量
主题:公共变量的设置
西门子S7-1200PLC变量表如何使用?如何声明、选用、显示、定义、更改变量?变量保持性如何设置?
在S7-1200 CPU的编程理念中,特别强调符号寻址的使用,在开始编写程序之前,用户应当为输入、输出、中间变量定义相应的符号名,也就是标签。具体步骤如下:
西门子S7-1200PLC变量表如何使用?如何声明、选用、显示、定义、更改变量?变量保持性如何设置?
求字符串的长度(4种写法)(普通写法,函数写法(两种:有无返回值),不允许创建临时变量法(递归))
求字符串的长度(4种写法)(普通写法,函数写法(两种:有无返回值),不允许创建临时变量法(递归))
154 0
求字符串的长度(4种写法)(普通写法,函数写法(两种:有无返回值),不允许创建临时变量法(递归))