CallMeMinxJ 2023-08-17 21:33 采纳率: 0%
浏览 12

SystemVerilog中inside产生权重的问题

在SystemVerilog绿皮书中提到了inside,上面说使用inside指定一个集合来约束,如果不做其他约束,所有的元素出现的概率是相等的。
还提到了,inside指定数组作为集合,数组中有重复的数值,即使一个数值重复好几遍,也不会影响他们彼此之间的权重。
看到这里我就好奇,仿照它的例子写一个,测试了一下,我得到的结论恰恰相反,我不知道是什么的问题,是SV的语法有更新,还是其他原因,有没有人可以指点一下。
以下是我测试的代码:


program test;

class Weighted;
    rand int val;
    int array[] = '{0,1,1,2,2,2,3,3,3,3};
    constraint c {
        val inside array;
    }
endclass

Weighted w;

initial begin
    int count[4], summ;

    w = new();

    repeat (4000) begin
        assert (w.randomize());
        count[w.val] ++;
    end

    summ = count.sum();

    foreach (count[i]) begin
        if (count[i]) begin
            $write("count[%0d] = %5d ", i, count[i]);
            repeat(count[i] * 50 / summ) $write("*");
            $display;
        end
    end

end

endprogram

以下是仿真结果:

      (Specify +UVM_NO_RELNOTES to turn off this notice)

count[0] =   403 *****
count[1] =   827 **********
count[2] =  1165 **************
count[3] =  1605 ********************
$finish at simulation time                    0
           V C S   S i m u l a t i o n   R e p o r t 
Time: 0 ps
CPU Time:      0.230 seconds;       Data structure size:   0.2Mb
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-18 08:43
    关注

    【以下回答由 GPT 生成】

    根据你提供的代码和仿真结果,可以看出结果与文档描述相反。在这个例子中,元素出现的概率不是相等的。原因可能有以下几点:

    1. 权重数组的声明和初始化方式不正确。根据SystemVerilog的语法,应该使用int array[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 3};的形式来声明和初始化数组。请注意花括号的使用。

    2. 可能存在其他约束条件。你的代码中只显示了val inside array的约束条件,但实际可能还存在其他约束条件,这些条件可能会影响到生成的随机数的分布。

    重新编写一下代码,进行正确的初始化和约束条件的设置:

    program test;
    
    class Weighted;
        rand int val;
        int array[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 3};
        constraint c {
            val inside array;
        }
    endclass
    
    Weighted w;
    
    initial begin
        int count[4], summ;
    
        w = new();
    
        repeat (4000) begin
            assert (w.randomize());
            count[w.val]++;
        end
    
        summ = count.sum();
    
        foreach (count[i]) begin
            if (count[i]) begin
                $write("count[%0d] = %5d ", i, count[i]);
                repeat(count[i] * 50 / summ) $write("*");
                $display;
            end
        end
    
    end
    
    endprogram
    

    重新运行仿真,结果应该能够符合文档描述的相等概率分布。如果问题仍然存在,可能还需要检查其他约束条件或相关部分的代码。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 8月17日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见