0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

sanyue7758 来源:验证芯发现 2023-08-21 09:31 次阅读

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进行约束。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真器
    +关注

    关注

    14

    文章

    1017

    浏览量

    83722
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8224

原文标题:Foreach对Associative Array的constraint约束

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何编写高级时序约束

    如何编写高级时序约束?我使用提前一词,因为我知道如何在ucf文件中约束的基本知识。基本内容包括将引脚分配给相应的输出和顶部模块的输入,并配置时钟引脚周期。但是除了LOC和PERIOD之外,还有很多
    发表于 03-27 09:58

    设计中的关键路径如何约束

    喜我对我的设计中的关键路径以及如何约束它们有疑问。我正在使用ISE 14.1进行实施。我有一个设计,其中关键路径(从源FD到目的地FD)给出-3.3ns的松弛(周期约束为10ns)。现在有没有其他
    发表于 04-08 08:58

    OFFSET约束问题

    嗨,大家好,据我所知,OFFSET约束强加于所有输入PAD。在我的设计中,使用了两个时钟输入。因此,PAD上的输入信号应分组为:1.需要OFFSET约束时间值#1,参考时钟输入#12.需要
    发表于 05-29 13:51

    一个约束驱动(constraint-driven)的综合工具

    Design Compiler时一个约束驱动(constraint-driven)的综合工具,它的结果与设计者施加的约束条件密切相关。
    发表于 07-29 07:56

    编程遇到的问题记录

    编程遇到的问题记录warning C318: can't open file 'commom.h'//文件路径没有错误的情况下#include "commom.h"写错头文件名字,应该是common
    发表于 11-30 07:08

    STC89C52RC单片机奇葩问题记录

    防止自己好了伤疤,忘了痛!所以开始把一些问题记录下来!版本:KEIL C51 uVision4.00a工程:STC89C52RC单片机奇葩问题1:写一个P33口的中断程序时,刚开始确实有错,后来改了
    发表于 12-08 06:26

    使用STM32的MCU开发问题记录

    的 MCU,特此把遇到的问题记录一下!注意,如果没有特殊说明,默认的开发环境为Win10 Pro 20H2 ,Keil uVision5 5.32!STM32F103 在 KEIL 调试时部分寄存器不显示数据现象进入调试状态,观察某些外设的寄存器,发现有些寄存器不显示配置的值,而是始终显示 0。如下图:为
    发表于 01-05 06:17

    华大MCU的应用中的问题记录

    华大MCU的应用中的问题记录
    发表于 02-24 08:03

    HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制ForEach循环渲染

    Array场景下,因为执行过程中很容易添加重复的数字。 4.ForEach的嵌套使用 允许将ForEach嵌套在同一组件中的另一个ForEach中,但更推荐将组件拆分为两个,每个构造函
    发表于 08-18 10:50

    时序约束爆炸的原因研究分析

    这个Xilinx Quick Take Video我们将讨论Constraint Explosion。 在本次会议中,我们将研究导致时序约束爆炸的原因,然后是如何调试和修复异常约束问题。
    的头像 发表于 11-20 06:23 2164次阅读

    Java的iterator和foreach遍历集合源代码

    Java的iterator和foreach遍历集合源代码
    发表于 03-17 09:16 9次下载
    Java的iterator和<b class='flag-5'>foreach</b>遍历集合源代码

    PHP教程:foreach使用引用注意的问题

    PHP教程:foreach使用引用注意的问题(电源技术期刊查询)-该文档为PHP教程:foreach使用引用注意的问题总结文档,是一份不错的参考资料,感兴趣的可以下载看看,,,,,,,,,,,,,,,,,
    发表于 09-22 12:28 9次下载
    PHP教程:<b class='flag-5'>foreach</b>使用引用注意的问题

    AD学习问题记录(二):pcb设计规则检查报错Silk To Solder Mask Clearance Constraint

    AD pcb设计规则检查报错Silk To Solder Mask Clearance Constraint报错原因处理方法一:改变规则中的最小间距:方法二:直接取消这一项的检查:结果软件版
    发表于 12-04 15:21 26次下载
    AD学习问<b class='flag-5'>题记录</b>(二):pcb设计规则检查报错Silk To Solder Mask Clearance <b class='flag-5'>Constraint</b>

    for循环和forEach的差异

    for循环是js提出时就有的循环方法。forEach是ES5提出的,挂载在可迭代对象原型上的方法,例如Array Set Map。forEach是一个迭代器,负责遍历可迭代对象。那么遍历 ,迭代 ,可迭代对象 分别是什么呢。
    的头像 发表于 10-11 11:10 1335次阅读

    SV约束随机化总结

    constraint 约束随机化类中的变量 在main_phase 之前就已经提前产生一个变量的随机值。 用法:一般在类中定义一个rand 类型的变量, 然后根据需求写约束就可以
    的头像 发表于 12-14 14:30 873次阅读
    SV<b class='flag-5'>约束</b>随机化总结