全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

Foreach对Associative Array的constraint约束问题记录分享

时间:2023-08-21 09:31

人气:

作者:admin

标签: 仿真器 

导读:systemverilog constraint中的foreach可以对数组进行遍历和约束,常用于普通数组,队列或者动态数组。...

systemverilog constraint中的foreach可以对数组进行遍历和约束,常用于普通数组,队列或者动态数组。而当对associative array(联合数组/字典)应用foreach时,遇到一些问题,记录分享如下。

联合数组含有key和value两个元素,在这里key的类型以int和string为例,value元素以int和int[$]队列为例。

[int/string] [int] Associative Array

实践的demo代码如下:

classtest;
randbit[3:0]rd_dict[int];
randbit[3:0]rd_dict_fix[int];
randbit[3:0]rd_dict_str[string];

constraintc_rand{
rd_dict.size==7;
foreach(rd_dict[i]){
rd_dict[i]< 13;
        }

        foreach(rd_dict_fix[i]) 
            rd_dict_fix[i]== 13;

        foreach(rd_dict_str[i]) 
            rd_dict_str[i]== 14;
    }

    function new();
        rd_dict_fix[9] = 0;
        rd_dict_str["A"] = 0;
    endfunction

rd_dict没有进行初始化,使用constraint的size进行约束联合数组key的个数和value取值约束

rd_dict_fix在new函数中进行初始化,包含一个int key元素,在constraint中对value进行约束

rd_dict_str在new函数进行初始化,包含一个string key元素,在constraint中对value进行约束

添加适当的测试打印代买,可以得到如下的仿真结果:

5910deaa-3f6a-11ee-ac96-dac502259ad0.png

可以看出,普通的联合数组,如果没有初始化key元素,可以在constraint中使用size约束key的个数,但key是顺序递增的,0~size-1。

如果初始化了key元素,无论是int还是string类型的key,使用foreach时,可以对已初始化的key对应的value进行约束。

int/string->int[$] Associative Array

联合数组的value是int队列时,demo代码如下:

classtest;
randbit[3:0]rd_dict[int][$];
randbit[3:0]rd_dict_fix[int][$];
randbit[3:0]rd_dict_str[string][$];

constraintc_rand{
rd_dict.size==7;
foreach(rd_dict[i]){
rd_dict[i].size==3;
foreach(rd_dict[i][j]){
rd_dict[i][j]< 13;
            }
        }

        foreach(rd_dict_fix[i]) {
            rd_dict_fix[i].size == 4;
            foreach(rd_dict_fix[i][j]) rd_dict_fix[i][j]== 13;
        }

        foreach(rd_dict_str[i]) {
            rd_dict_str[i].size == 4;
            foreach(rd_dict_str[i][j]) rd_dict_str[i][j]== 14;
        }
    }

    function new();
        rd_dict_fix[9] = '{};
        rd_dict_str["A"] = '{};
    endfunction

rd_dict的key是int类型,value是int[$]队列类型的value,size和value值都进行了约束。

rd_dict_fix类型和rd_dict相同,区别在于new函数中进行key初始化,仅包含一个key。

rd_dict_str的key类型是string类型,其他和rd_dict_fix相同。

不出意外,上述的code编译出错:

...
Expressionofthistypecannotbeusedtoindexthearray
...

错误在于key是string类型,value是int[$]队列的字典,constraint中不能使用foreach操作。

将上述string->int[$]的constraint注释后,编译可以通过,在仿真时会出错:

Theconstraintsolverfailedwhenaccessinganullarrayrd_dict[0].
Pleasemakesurearrayrd_dict[0]isallocatedproperly.

由于rd_dict[int][$]并没有在new函数中进行初始化,即使在constraint中使用了size约束大小,也没有达到预期的效果,这点和[int/string] [int] Associative Array例子中不同。

上述问题解决后,可得到最后的仿真结果:

59200d6c-3f6a-11ee-ac96-dac502259ad0.png

从上述的结果来看,如果联合数组的value是队列时,则需要先进行key的初始化,才可在constraint中进行对value队列的约束。key是string类型时,似乎没办法使用foreach进行约束。





审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信