前言

之前的笔记继续往博客上整理,关于验证环境中各种random的特点,之前在另外一篇问文章中有过详细的讨论:
静态模块(module或interface等)中的可控随机探索($urandom/$random)
当然了,上面的文章主要探索的是在静态模块内的随机场景,这篇文章则是动态automatic仿真环境中的使用规则。

随机特点总结

$random / $random()

不同种子的仿真结果一样,不受种子控制。
同一个用例中,同一变量随机多次值不相同。

random(n)

括号内值固定后,随机不受种子控制,为常值。

$urandom() / $uramdom / $urandom_range()

不同种子的仿真结果不同。
同一个种子的仿真结果相同。

$urandom(n)

随机值不受种子影响,且为常值。

大位宽数值的随机

值得注意的是,所有的urandom都只能最大随机32bit的数值,想随机更大的位宽需要使用std::randomize(value)来进行随机。

    begin
        bit[63:0]test1;
        bit[63:0]test2;
        test1 = $urandom;
        std::randomize(test2);
        $display("'h%0h", test1);
        $display("'h%0h", test2);
    end

随机的结果为:

'h69867058
'heb78ea6bbe59d6dd