【验证小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内的变量;

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


相关文章
|
SEO
模块SEO优化中{分类名称}分隔符去掉及只调用下级分类方法
 if($catid) { if($CAT['parentid']) { $seo_catname = ''; $tmp = strip_tags(cat_pos($CAT, 'DESTOON')); $tmp = explode('DESTOON', $tmp); $tmp = array_reverse($tmp); /* foreach($tmp
1307 0
|
SQL 数据建模
关于CS1061报错(XX不包含XXX的定义,并且找不到类型为XX的第一个参.....)的一种可能的解决的办法
在我编程中,我遇到了一个这样的报错, 可是我引用的product类中又确实定义了这么一个方法,   protected void BindPageData(int categoryID) { Product product = new Product(); DataTable dt = product.
1147 0
|
JavaScript 前端开发
i++ 和 ++i 之间的区别详细解释(后缀与前缀)
i++ 和 ++i 之间的区别详细解释(后缀与前缀)
223 0
|
JavaScript 开发者
路由-关于命名视图的名称到底是变量还是字符串的说明|学习笔记
快速学习路由-关于命名视图的名称到底是变量还是字符串的说明
|
编译器
函数的声明和定义(如何分文件使用)
函数的声明和定义(如何分文件使用)
C++中名字隐藏,名字查找优先于类型检查
题目 C++中名字隐藏是什么? 解答 让我们通过一个例子来讲解C++中的名字隐藏。在C++中,如果一个类里有一个重载的方法, 你用另一个类去继承它并重写(覆盖)那个方法。你必须重写所有的重载方法, 否则未被重写的方法会因为名字相同而被隐藏,从而使它在派生类中不可见。
713 0
|
C# Python
C#里枚举类型以及值引用和地址引用差别演示代码
在其它语言里,都已了解到。但还是写出来,印象深点。 1 using System; 2 using System.Collections.Generic; 3 using System.
855 0
vc里面怎样实现对话框之间传递变量的值
Dialog1的类名是CDialog1, 头文件是dialog1.h。里有成员变量CString str1, str2;Dialog2的类名是CDialog2, 头文件是dialog2.h。里有成员变量CString str11, str22;要想将Dialog1里的变量传递给Dialog2里的变量...
824 0
变量替换
变量替换
117 0

热门文章

最新文章