$random(seed)是verilog中最简单的产生随机数的系统函数。

在调用系统函数$random(seed)时,可以写成三种样式:1)$random,2)$random(),3)$random(seed)。下面分别说明:

1)$random

这是最简单的一种写法,略去了seed这个传入参数,$random会使用一个默认的seed(这个默认值为0?)。也正因此,每次进行仿真时,$random产生的随机数序列都是相同的。

2)$random()

这种写法和写法1)的作用是相同的,同样是没有给$random传入seed。

3)$random(seed)

这种写法与上面两种不同,给$random传入了参数seed,因此$random根据seed来产生随机数。seed不同,产生的随机数的序列也不同。而且,每执行一次$random(seed)产生一个随机数,seed也自动更新一次。

下面讨论seed的产生。

据我有限的知识,seed有两种产生方式:4)直接赋值为一个确定数,5)利用系统函数$get_initial_random_seed获得值。下面分别讨论:

4)直接赋值

在一个initial块中直接将seed变量写成某值,如下面代码:

integer seed;

reg [7:0] rand_num;

initial  begin seed = 0; end

always @(posedge clk) begin rand_num <= $random(seed); end

在上面代码中,seed初始值被赋为0(也可以是1或其它数),在第一个时钟上升沿,rand_num取得的第一个随机数就是$random(0)产生的,seed也随即更新;在第二个时钟上升沿时,rand_num取得第二个随机数,是$random(更新后的seed)产生的,seed又随即更新;如此下去。

值得注意的是,如果把seed赋值为0,那么利用$random(seed)产生的随机数序列和直接执行$random产生的随机数序列是相同的。这个结论是我根据经验得出的。

5)seed = $get_initial_random_seed()

如下面代码:

integer seed;

reg [7:0] rand_num;

initial  begin seed = $get_initial_random_seed(); end

always @(posedge clk) begin rand_num <= $random(seed); end

在上面代码中,利用系统函数得到的seed的值是1,此后seed更新后的值和$random(seed)产生的随机数序列都和将seed直接赋值成1,利用$random(seed)产生随机数的情况相同。这也是我根据经验得出的结论。

我在网上没有找到关于$get_initial_random_seed的详细介绍。

下面讨论仿真时如何改变seed的初值:

如果seed的初值是确定的,那么不论进行多少次仿真,产生的随机数的序列总是确定的,就不能覆盖更多的情况。因此在仿真时,要能够改变seed的初值。目前我所知道的改变seed的初值有两种方法:6)修改代码;7)采用deposit方式。下面分别介绍:

6)修改代码

这种方式最直接,缺点是每次要修改seed时都需要重新编辑一遍代码。

比如,第一次仿真时,代码写成下面的样子:

integer seed;

reg [7:0] rand_num;

initial  begin seed = 0; end

always @(posedge clk) begin rand_num <= $random(seed); end

而第二次仿真时,想修改seed的初值,就写成下面的样子:

integer seed;

reg [7:0] rand_num;

initial  begin seed = 1; end

always @(posedge clk) begin rand_num <= $random(seed); end

7)采用deposit的方式

这种方式比较灵活,不必修改代码,也不必重新编译,直接修改输入到仿真软件的命令即可。

下面是最简单的一个命令:

deposit top.seed 2

run 125ns

exit

上面命令的意思是,将信号(或变量)seed的初值设成1,然后开始仿真,仿真时间为125ns,然后结束仿真。

deposit是在仿真开始之前起作用的(如果没有给deposit加上其它时间方面的条件),而且它只是将某个信号的初始值设为某一个数(可以是确定数,也可以是随机数),此后便不再干预该信号的值。如果仿真开始后有别的条件或语句改变该变量的值,则该变量就变成改变后的值。

如果代码按下面的样子写:

integer seed;

reg [7:0] rand_num;

initial  begin seed = 1; end

always @(posedge clk) begin rand_num <= $random(seed); end

我们来看一下,在仿真开始之前deposit将seed赋值为2,然而仿真开始后的0ns时刻,initial块又将seed赋为1,因此相当于deposit没有起到预期的作用。我们想要的是,seed的初值为2,$random(2)产生一个随机数后,seed再由2变成其它的数;而不是$random(1)产生一个随机数,然后seed又由1变成其它的数。

为了达到我们的预期目的,要把deposit命令改成下面的样子:

deposit top.seed 2 -after 1ns

run 125ns

exit

在仿真开始的0ns时,initial块执行,将seed设为1。加上"-after 1ns"后,deposit命令就会在仿真开始后的1ns时起作用,把seed的值改为2,然后作用于第一次$random(seed)的执行,然后seed再更新。

综上讨论,我得出以下结论:

1. 利用$random产生随机数时最好利用上seed参数,即写成$random(seed)样式。

2. 没有必要利用$get_initial_random_seed()函数给seed赋值,直接写成一个值即可,像4)一样。

3. 建议用deposit的方式在仿真时改变seed的初值,使$random(seed)产生不同的随机数序列

转载于:https://www.cnblogs.com/Dinging006/p/8592393.html

总结verilog产生随机数的$random和seed相关推荐

  1. verilog产生随机数序列_总结verilog产生随机数的$random和seed

    http://blog.sina.com.cn/s/blog_679686370102woyz.html $random(seed)是verilog中最简单的产生随机数的系统函数. $random(s ...

  2. python 生成随机数_python 生成随机数模块random 常用方法总结

    random.random() 用来随机生成一个0到1之间的浮点数,包括零. In [1]: import random In [2]: random.random() Out[2]: 0.15790 ...

  3. [转载] python中随机数生成函数_python中seed随机函数如何生成随机数?

    参考链接: Python中的随机数 如果要考察某公司的牛奶产品质量,可以从100袋牛奶中抽取30袋,在随机数表中选中一数,并用向上.下.左.右不同的读法组成30个数,并按牛奶的标号进行检测,虽然麻烦, ...

  4. erlang的随机数 及 random:uniform()函数

    每次调用会更新进程字典里的random_seed变量,这样在同一个进程内每次调用random:uniform()时,随机数种子都不同,所以生成的随机数都不一样(调用完random:uniform()后 ...

  5. C++11产生随机数,random库产生随机数

    c++自带rand()产生随机数 srand()设置随机数种子,rand()产生0-RANMAX之间的随机整数,通过自己设计变换可以转换成其他分布的随机数 #include<iostream&g ...

  6. Java 随机数生成器 Random SecureRandom 原理分析

    文章目录 java.util.Random java.Security.SecureRandom /dev/random 与 /dev/urandom 资料 Java 里提供了一些用于生成随机数的工具 ...

  7. python随机模块 无范围_Python模块:生成随机数模块random

    随机数种子 要每次产生随机数相同就要设置种子,相同种子数的Random对象,相同次数生成的随机数字是完全相同的: random.seed(1)这样 random.randint( 0, 6, ( 4, ...

  8. Java生成随机数(random()和Random类)

    在 Java 中要生成一个指定范围之内的随机数字有两种方法:一种是调用 Math 类的 random() 方法,一种是使用 Random 类. Random 类提供了丰富的随机数生成方法,可以产生 b ...

  9. Java 随机数产生 Random和Math 解决

    ઇଓ 欢迎来阅读子豪的博客(Java语法篇) ☾ ⋆有什么宝贵的意见或建议可以在留言区留言 ღღ欢迎 素质三连 点赞 关注 收藏 ❣ฅ码云仓库:补集王子 (YZH_skr) - Gitee.com 目 ...

最新文章

  1. java jar 打印_Java 打印流 及 commons-io.jar包方法
  2. android游戏开发笔记(0)——游戏开发分析及开发所需知识
  3. Camelyon Challenge: 癌症细胞区域检测竞赛
  4. main.xml Design显示不是设计界面,而是view属性的解决办法
  5. Python学习之关键要素
  6. Field Service Center Customization
  7. SQL 分组统计并返回当前行
  8. 【Python基础知识-pycharm版】第六节-控制语句
  9. 计算机必修课程英语单词,《计算机专业英语》课程标准.doc
  10. mysql 页级锁写法_MYSQL中表级锁、行级锁、页级锁介绍
  11. java 判断ip和port是否存活_java判断IP和端口号是否可以访问
  12. 【笔记】汇编..寄存器和地址的概述
  13. Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍
  14. Illustrator 教程,如何在 Illustrator 中编辑路径和形状?
  15. laravel 分页和共多少条 加参数的分页链接
  16. 财会行业男女薪资比例matlab,2004:会计师事务所薪资调查分析报告
  17. 再谈微服务负载均衡器:Ribbon均衡器和SpringCloud自带LoadBalancer均衡器
  18. 会声会影2020试用版如何激活序列号正式版及快速零基础剪辑教程
  19. Linux启动/停止/重启防火墙
  20. 小程序实现6位数密码框

热门文章

  1. 2017计算机应用考研大纲,2017考研计算机大纲
  2. linux内核percpu变量声明,Linux kernel percpu变量解析
  3. qt结构体嵌套结构体方法_9.2 C++结构体类型变量
  4. android studio smssdk,SMSSDK for Android 配置
  5. java实现周期任务_java定时任务的实现方式
  6. 二叉树第i层中的所有结点_讲透学烂二叉树(二):图中树的定义amp;各类型树的特征分析...
  7. Python HTMLCalendar类| 带实例的formatyear()方法
  8. 使用Java中的equals()和compareTo()方法比较字符串
  9. 显卡测试软件毛毛虫,超龙超龙,与众不同,顶流配备,散热一流,3070Ti超龙旗舰版评测...
  10. 原理简介_消息通信的利器MQTT协议简介及协议原理