总结verilog产生随机数的$random和seed

 

$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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

326. 3的幂

326. 3的幂 给定一个整数&#xff0c;写一个函数来判断它是否是 3 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 3 的幂次方需满足&#xff1a;存在整数 x 使得 n 3x 示例 1&#xff1a;输入&#xff1a;n 27 输出&#x…

Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果

说到动画效果&#xff0c;一般都会感到很高端&#xff0c;感觉很酷炫&#xff1b;而小菜技术有限&#xff0c;稍复杂的动画效果也需要很多时间处理&#xff0c;但是遇到时间紧任务重的情况该怎么办呢&#xff1f;那就尝试一下 Lottie 吧&#xff0c;酷炫的动画集成却相当简单&a…

正则表达式(读书过程所记未整理)

\d 表示一位数字字符 \d{3} 表示3个数字字符 匹配电话比如400-400-1118 import re phone_number re.compile(r\d{3}-\d{3}-\d{4}) mo phone_number.search(rfor a number is 400-400-4000) print(mo.group()) ************************************************************…

java1

不知道为啥粘贴的图片是一堆编码。。。。 如何插入图片 博客后后台MarkDown编辑器上只有一个按钮&#xff0c;就是用来上传图片并自动插入MarkDown标记的&#xff0c;超级好用 &#xff08;一&#xff09;学习总结 1.在java中通过Scanner类完成控制台的输入&#xff0c;查阅JDK…

430. 扁平化多级双向链表

430. 扁平化多级双向链表 多级双向链表中&#xff0c;除了指向下一个节点和前一个节点指针之外&#xff0c;它还有一个子链表指针&#xff0c;可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项&#xff0c;依此类推&#xff0c;生成多级数据结构&#xff0c…

PHPstudy搭建本地环境的网页加载速度慢的解决方案

PHP5.3以上&#xff0c;如果数据库链接地址是localhost&#xff0c;会自动检测最终的地址是IPV4还是IPV6&#xff0c;所以会比较慢。解决办法&#xff1a;修改数据库的链接地址&#xff0c;将localhost改为127.0.0.1即可。 原文链接&#xff1a;https://chasjd.com/posts/fb433…

标记偏见_分析师的偏见

标记偏见“Beware of the HiPPO in the room” — The risks and dangers of top-down, intuition-based decision making are well known in the business world. Experimentation and data-based decision making become widely acknowledged as the right way to steer a bu…

scott登录查询常用语句

一、简单查询 1.简单查询select * from emp;--查询表emp中的所有数据select empno as id,ename as name from emp;--查询表emp中的empno显示为id&#xff0c;ename显示为name 2.去除重复select distinct job from emp;--将表emp中的job去重select distinct job,deptno from emp…

CSS结构的基础认知

css的属性值与html的属性值用法不相上下&#xff0c;但是css主要分为内联样式表和外联样式表。 内联样式表用法&#xff1a;在html文件中的《head》头文件中添加<style></style>标签&#xff0c;在标签内添加所需的属性值&#xff0c;例如&#xff1a;<!DOCTYPE…

BZOJ1453: [Wc]Dface双面棋盘

Time Limit: 10 Sec Memory Limit: 64 MB Submit: 784 Solved: 422 [Submit][Status][Discuss] Description 佳佳有一个 nnn 行 nnn 列的黑白棋盘&#xff0c;每个格子都有两面&#xff0c;一面白色&#xff0c;一面黑色。佳佳把棋盘平放在桌子上&#xff0c;因此每个格子恰好一…

用户体验数据分析 书单_如何使用数据改善用户体验设计

用户体验数据分析 书单In the current age of technology, if an entrepreneur comes up with a grand idea, chances are they’ll need a pretty sweet website to go along with it. And if they want their idea to really sell, they will also need a website that reall…

推荐11个实用的JavaScript库

2019独角兽企业重金招聘Python工程师标准>>> JavaScript 仍然是 2018 年最受欢迎和使用最为广泛的编程语言&#xff0c;因此 JavaScript 生态系统也会继续发展壮大。 然而&#xff0c;JavaScript 的标准库仍然继续保持“短小精悍”的身材。为了填补标准库功能方面的…

371. 两整数之和

371. 两整数之和 给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - ​​​​​​​&#xff0c;计算并返回两整数之和。 示例 1&#xff1a; 输入&#xff1a;a 1, b 2 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;a 2, b 3 输出&#xff1a;5 提示&a…

【福利】微信小程序精选Demo合集

小编最近在开发小程序&#xff0c;也读到了不少优秀的小程序源码&#xff0c;项目中有些需求可以直接从源码里粘贴复制过来&#xff0c;虽然这样做不利于自己独立编写代码&#xff0c;但比较是给公司做项目啊&#xff0c;秉着效率第一的原则&#xff0c;简直没有什么比ctrlc,ct…

639. 解码方法 II

639. 解码方法 II 一条包含字母 A-Z 的消息通过以下的方式进行了编码&#xff1a; A -> 1 B -> 2 ... Z -> 26要 解码 一条已编码的消息&#xff0c;所有的数字都必须分组&#xff0c;然后按原来的编码方案反向映射回字母&#xff08;可能存在多种方式&#xff09;。…

[cpyhon源代码]dict对象原理学习

Cpython 2.7 分支中&#xff0c;dict 对象的源代码 lookdict 搜索算法 1 static PyDictEntry *2 lookdict(PyDictObject *mp, PyObject *key, register long hash)3 {4 register size_t i;5 register size_t perturb;6 register PyDictEntry *freeslot;7 regis…

熊猫数据集_熊猫迈向数据科学的第一步

熊猫数据集I started learning Data Science like everyone else by creating my first model using some machine learning technique. My first line of code was :通过使用某种机器学习技术创建我的第一个模型&#xff0c;我开始像其他所有人一样学习数据科学。 我的第一行代…

SQLServer锁的机制

SQLServer锁的机制&#xff1a;共享锁(S)排它锁(X)更新锁(U)意向共享 (IS)意向排它 (IX) 意向排它共享 (SIX)架构修改(Sch-M) 架构稳定性(Sch-S)大容量更新&#xff08;BU&#xff09;转载于:https://www.cnblogs.com/yldIndex/p/8603902.html

你是否具有价值

一个有价值的人往往受欢迎的程度才会高。白天上午花了两个多小时的时间帮前同事远程解决了服务器部署时由于防火墙机制问题引起的系统功能失败的问题。解决完这个问题之后&#xff0c;同事的心情很愉悦&#xff0c;其实我自己的心情也很愉悦&#xff0c;看来人都有帮助别人和被…

为什么选择做班级管理系统_为什么即使在平衡的班级下准确性也很麻烦

为什么选择做班级管理系统Accuracy is a go-to metric because it’s highly interpretable and low-cost to evaluate. For this reason, accuracy — perhaps the most simple of machine learning metrics — is (rightfully) commonplace. However, it’s also true that m…