Verilog 随机数及概率分布

news2025/7/14 23:31:57

随机数

        Verilog 中使用系统任务 $random(seed) 产生随机数,seed 为随机数种子。seed 值不同,产生的随机数也不同。如果 seed 相同,产生的随机数也是一样的。可以为 seed 赋初值,也可以忽略 seed 选项,seed 默认初始值为 0。不使用 seed 选项和指定 seed 并对其修改来调用 $random 的代码如下所示:

   //seed var
   integer seed ;
   initial begin
      seed = 2 ;
      #30 ;
      seed = 10 ;
   end
   //no seed
   reg [15:0]   randnum_noseed ;
   always@(posedge clk) begin
      randnum_noseed <= $random(); //不指定随机种子
   end
   //with seed
   reg [15:0]   randnum_wtseed ;
   always@(posedge clk) begin
      randnum_wtseed <= $random(seed); //指定随机种子
   end

       无论是否赋初值,每产生一次随机数后,seed 值改变,随机数也随之改变。每改变一次 seed 值,当前输出的随机值会改变;但是下一个状态时,随机数的走向又恢复成系统内部产生的随机序列。

        建议调用系统任务 $random 时,不指定 seed 选项,或指定 seed 选项时使用变量传递参数。不建议调用 $random 时,将常数项写到 seed 参数处。此时 seed 值被固定,可能只会产生一个随机数。例如以下写法是不建议的:

      randnum_wtseed <= $random(2); //不建议将常数项指定给 seed

可以使用取余的方法,将随机数限定在一定的数据范围内。例如:


   //with a range
   parameter    MAX_NUM = 512;
   parameter    MIN_NUM = 256;
   reg [15:0]   num_range1, num_range2, num_range3 ;
   always@(posedge clk) begin
      //产生的随机数范围为 -511 ~ 511, ±(MAX_NUM-1)
      num_range1 <= $random() % MAX_NUM;
      //产生的随机数范围为 0 ~ 511, (0 ~ MAX_NUM-1)
      num_range2 <= {$random()} % MAX_NUM;
      //产生的随机数范围为 MIN_NUM ~ MAX_NUM,包含边界
      num_range3 <= MIN_NUM + {$random()} % (MAX_NUM-MIN_NUM+1);
   end

概率分布

Verilog 提供了许多按一定概率分布产生数据的系统任务,简单描述如下:

系统任务调用格式任务描述
均匀分布$dist_uniform(seed, start, end);start、end 为数据的起始、结尾
正态分布$dist_normal (seed, mean, std_dev);mean 为期望值,std_dev 为标准差
泊松分布$dist_poisson(seed, mean);mean 为期望 (等于标准差)
指数分布$dist_exponential(seed , mean);mean 为单位时间内事件发生的次数
卡方分布$dist_chi_square(seed, free_deg);free_deg 为自由度
t 分布$dist_t(seed, free_deg);free_deg 为自由度
埃尔朗分布$dist_erlang(seed, k_stage, mean);k_stage 为阶数,mean 为期望

均匀分布(Uniform Distribution)

均匀分布在等长区间上的取值概率是相同的。

概率密度函数及概率分布图如下所示:

其实,系统任务 $random 实现的就是均匀分布。

调用 $dist_uniform 在(256,512)区间上产生均匀分布数据的代码如下:

   //2.1 uniform dis
   reg [15:0]   data_uniform;
   always@(posedge clk) begin //在 MIN_NUM ~ MAX_NUM 产生随机数
      data_uniform <= $dist_uniform(seed_dis, MIN_NUM, MAX_NUM);
   end

正态分布(Normal Distribution)

正态分布数学期望为 μ,标准差为 σ,记做 N (μ, σ²)。

数学期望为 0、标准差为 1 的正态分布称为标准正态分布。

正态分布曲线呈钟型,两边低,中间高,左右对称。

正态分布概率密度函数及分布图如下所示:

调用 $dist_normal 产生期望为 0、标准差为 1 的标准正态分布数据的代码如下:

   //2.2 normal dis
   reg [15:0]   data_normal;
   always@(posedge clk) begin //期望为0、标准差为1 的标准正态分布
      data_normal <= $dist_normal(seed_dis, 0, 1);
   end

泊松分布(Poisson Distribution)

泊松分布用于描述某个时间或空间范围内,某事件发生 X 次的概率。

泊松分布的数学期望和标准差相同,均为 λ,其概率密度函数及分布图如下所示:

调用 $dist_poisson 产生期望为 4 的泊松分布数据的代码如下:

 //2.3 poisson dis
   reg [15:0]   data_poisson;
   always@(posedge clk) begin
      data_poisson <= $dist_poisson(seed_dis, 4);
   end

指数分布(Exponential Distribution)

        指数分布用以描述泊松过程中随机事件发生的时间间隔的概率。泊松过程即事件以恒定的平均速率连续且独立地发生的过程。例如等公交车时两辆车到来的时间间隔,就符合指数分布。设 λ>0 为单位时间内事件发生的次数(又称为率参数),x 为事件发生的时间间隔,则其概率密度函数及分布图如下所示:

调用 $dist_exponential 产生率参数为 1 的指数分布数据的代码如下:

   //2.4 exp dis
   reg [15:0]   data_exp;
   always@(posedge clk) begin
      data_exp <= $dist_exponential(seed_dis, 1);
   end

卡方分布(Chi-Square Distribution)

n 个服从标准正态分布的随机变量的平方和构成新的随机变量的分布规律称为卡方分布,记做

,其中 n 称为自由度。卡方分布概率密度函数及分布图如下所示:

调用 $dist_chi_square 产生自由度为 6 的卡方分布数据的代码如下:

 //2.5 chi-square dis
   reg [15:0]   data_chi_sq;
   always@(posedge clk) begin
      data_chi_sq <= $dist_chi_square(seed_dis, 6);
   end

t 分布(T-Distribution)

假设 X 服从标准正态分布 N (0, 1),Y 服从卡方分布

的分布称为自由度为 n 的 t 分布,记为 Z ~ t(n) 。t 分布用于根据小样本来估计呈正态分布且方差未知的数据变量总体的均值。如果样本数量足够多且总体方差已知,则应该用正态分布来估计总体均值。t 分布是对称的钟形分布,与正态分布类似,但尾部较重,这意味着它更容易产生远低于平均值的值。其概率密度函数及分布图如下所示:

调用 $dist_t 产生自由度为 5 的 t 分布数据的代码如下:

  //2.6 t dis
   reg [15:0]   data_t;
   always@(posedge clk) begin
      data_t <= $dist_t(seed_dis, 5);
   end

埃尔朗分布(Erlang Distribution)

设参数为 λ 泊松过程 V1, V2, ..., V3, Vn 相互独立,N (t) 表示 [0, t) 内随机点出现的个数,则 N (t) = V1 + V2 + ... + Vn 的分布称为 Erlang 分布。

Erlang 分布与指数分布一样,多用来表示独立随机事件发生的时间间隔。遵循 Erlang 分布的随机变量可以被分解为多个相同参数的指数分布的随机变量之和,使得 Erlang 分布被广泛应用于可靠性理论和排队论中。

Erlang 分布概率密度函数及分布图如下所示:

Why The Face? 你竟然拿这样的水果 idea 来充数 Erlang 分布?

上述概率分布任务都只列举了调用方法,并没有对数据进行分析验证。下面有介绍借助 Matlab 画图工具,自己动手去分析概率分布任务 $dist_erlang 所产生数据的特性。

调用 $dist_erlang 产生阶数为 3、期望为 6 的 Erlang 分布数据的代码如下:

   //2.7 Erlang dis
   reg [15:0]   data_erlang;
   always@(posedge clk) begin
      data_erlang <= $dist_erlang(seed_dis, 3, 6);
   end

数据分析

现实证明,还是熟知的分布数据分析起来比较方便。一些平台关于 Erlang 分布相关的可参考性集成函数是少之又少。明知没有爱(尔朗),偏向爱而行!

Verilog 数据文件

首先,在 Verilog 模型中产生 4 组服从 Erlang 分布的数据,并打印到文件中。

 //generating data file of Erlang dis
   integer fd1, fd2, fd3, fd30 ;
   initial begin
      fd1 = $fopen("data_erlang1.hex", "w");
      fd2 = $fopen("data_erlang2.hex", "w");
      fd3 = $fopen("data_erlang3.hex", "w");
      fd30 = $fopen("data_erlang30.hex", "w");
      repeat(1000) begin //取1000个数据分析
         @(posedge clk) ;
         #1 ;
         $fdisplay(fd1, "%h", data_erlang1);
         $fdisplay(fd2, "%h", data_erlang2);
         $fdisplay(fd3, "%h", data_erlang3);
         $fdisplay(fd30, "%h", data_erlang30);
      end
      $fclose(fd1);
      $fclose(fd2);
      $fclose(fd3);
      $fclose(fd30);
   end

   reg [15:0]   data_erlang1;
   reg [15:0]   data_erlang2;
   reg [15:0]   data_erlang3;
   reg [15:0]   data_erlang30;
   always@(posedge clk) begin
      data_erlang1  <= $dist_erlang(seed_dis, 1, 6);
      data_erlang2  <= $dist_erlang(seed_dis, 2, 6);
      data_erlang3  <= $dist_erlang(seed_dis, 3, 6);
      data_erlang30 <= $dist_erlang(seed_dis, 30, 6);
   end

Verilog 数据分析

Matlab 中可以使用柱状图函数 hist 直接对各个数据进行统计画图显示,但对于概率分布情况该函数实际画图效果并不是很好(欢迎提供良好的画图方法)。这里使用 Matlab 数量统计函数 tabulate 对各个数据进行统计,然后使用普通画图函数 plot 显示其百分比。

Matlab 读取 Verilog 模块产生的数据并对其进行分布图显示的代码如下。

clear all;close all;clc;
%=======================================================
% data analysis from $dist_erlang in Verilog
%=======================================================

%按字符串读取,再进行十六进制到十进制的转换
data_erlang1_hex    = textread('data_erlang1.hex', '%s') ;
data_erlang2_hex    = textread('data_erlang2.hex', '%s') ;
data_erlang3_hex    = textread('data_erlang3.hex', '%s') ;
data_erlang30_hex   = textread('data_erlang30.hex', '%s') ;
data_erlang1        = hex2dec(data_erlang1_hex);
data_erlang2        = hex2dec(data_erlang2_hex);
data_erlang3        = hex2dec(data_erlang3_hex);
data_erlang30       = hex2dec(data_erlang30_hex);

%统计数据数量,并画图显示
num_erlang1  = tabulate(data_erlang1) ;
num_erlang2  = tabulate(data_erlang2) ;
num_erlang3  = tabulate(data_erlang3) ;
num_erlang30 = tabulate(data_erlang30) ;
figure;  plot(num_erlang1(:,1)/6, num_erlang1(:,3));
hold on; plot(num_erlang2(:,1)/6, num_erlang2(:,3), 'r');
hold on; plot(num_erlang3(:,1)/6, num_erlang3(:,3), 'g');
hold on; plot(num_erlang30(:,1)/6, num_erlang30(:,3), 'y');
legend('n=1', 'n=2', 'n=3', 'n=30');

Verilog 模型产生的 Erlang 数据分布图如下所示。

Erlang 分布期望

        千万要注意的是,λ 参数是泊松分布的期望,而不是 Erlang 分布的期望。Verilog 系统任务 $dist_erlang(seed, k_stage, mean) 中第三个参数为期望值。如果直接将期望值带入到 λ 参数,将得到错误的分布结果。下面简(偷)单(懒)推(参)导(考)下 Erlang 分布的数学期望。

附 Erlang 分布方差的推导过程。

Matlab 理论分布

使用 Matlab 内置函数 random,可以产生多种类型的分布数据,然而偏偏没有 Erlang 分布。

下面利用概率密度分布函数产生服从 Erlang 分布的数据。

其中,Verilog 模型中期望值为 6,则实际参数 λ = n/6 。

Matlab 产生 Erlang 分布数据的代码如下。

clear all;close all;clc;
%=======================================================
% generating data of Erlang distribution
%=======================================================
NUM         = 400 ;
EXPECT      = 6 ;
for n=[1, 2, 3, 30]         //产生4组数据
    lamda   = n/EXPECT;     //期望值转换
    t       = (0:NUM-1)*0.1 ;
    pt(n,:) = (lamda).^n *(t).^(n-1)/factorial(n-1) .* exp(-lamda * t) ;
end

figure; plot(t, pt(1,:)*100);
hold on;plot(t, pt(2,:)*100, 'r');
hold on;plot(t, pt(3,:)*100, 'g');
hold on;plot(t, pt(n,:)*100, 'y');
xlabel('t');
ylabel('f(t) / 100%');
legend('n=1', 'n=2', 'n=3', 'n=30');

Matlab 产生 Erlang 的数据分布图如下所示。

对比 Verilog 模型产生的数据,两者的分布区间、分布概率及分布曲线走势基本是一致的。只是 Verilog 中产生的是时间间隔较大的数据,分布图不是平滑的曲线。

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

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

相关文章

130. 被围绕的区域

130. 被围绕的区域 给你一个 m∗nm * nm∗n 的矩阵 board &#xff0c;由若干字符 ‘X’ 和 ‘O’ &#xff0c;找到所有被 ‘X’ 围绕的区域&#xff0c;并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 实例1&#xff1a; 输入&#xff1a;board [[“X”,“X”,“X”,“X”],…

内容云筑底,火山引擎能否为企业添一把火?

在App里面再搭一个“今日头条”&#xff0c;让用户在自家的App里看图文、刷视频&#xff0c;这是很多企业都想干的一件事情。尤其是对于用户使用频率低的App而言&#xff0c;他们更需要依靠信息流内容加长用户停留时间&#xff0c;增加用户互动次数&#xff0c;进而留住用户&am…

神经网络和深度学习-梯度下降Gradient Descent

梯度下降 损失函数 绝大多数的机器学习模型都会有一个损失函数。比如常见的均方误差&#xff08;Mean Squared Error)损失函数&#xff1a; L(w,b)1N∑i1N(yi−f(wxib))2L(w, b)\frac{1}{N} \sum_{i1}^{N}\left(y_{i}-f\left(w x_{i}b\right)\right)^{2} L(w,b)N1​i1∑N​(y…

物理层物理层

该层解决具体比特传输问题 一般的数据通信系统如图&#xff1a; 该系统可按通信方式分为两种&#xff1a;同步/异步通信和模拟/数字通信&#xff1a; 异步通信是通信双方各自时钟独立&#xff0c;每次只传输一个字符&#xff0c;时钟在传送开始时对齐&#xff1b;这种机制简单…

[附源码]计算机毕业设计JAVA驾校管理系统

[附源码]计算机毕业设计JAVA驾校管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

Docker(四):Docker可视化管理工具

背景 在技术这一行&#xff0c;学无止境&#xff0c;无数的知识点在大脑里面堆积着。各种命令行脚本&#xff08;Python,Java,Nodejs,Linux,Docker&#xff09;数不胜数&#xff0c;如果有视图化的管理工具&#xff0c;帮我们管理着这些命令行脚本&#xff0c;岂不美哉。可以节…

11.22Spring 学习day02

1. 1.1 XML和注解的区别 xml优点&#xff1a; 把标签配置和java代码解耦一目了然&#xff0c;对于业务量大的需求&#xff0c;可以清晰表明各个对象的关系 缺点&#xff1a; 配置不方便&#xff0c;读取和解析需要一定的时间无法及时校验正确性 注解优点&#xff1a; 配置…

返乡人员信息登记管理系统,助力精准管控

随着全国疫情的零星化&#xff0c;再加上元旦与春节很快就要来临了。这几个月各省的人员流动性肯定会逐渐增加&#xff0c;为了应对佳节的人流高峰期&#xff0c;不少省市都早已发出通知。要求返乡人员提前3天提前报备行程&#xff0c;从而便于极大地提高了登记效率&#xff0c…

数字集成电路设计(五、仿真验证与 Testbench 编写)(四)

文章目录7. 用户自定义元件模型7.1 UDP应用实例8. 基本门级元件和模块的延时建模8.1 门级延迟建模8.1.1 门级延迟的基本延迟表达形式8.1.2 门级延迟的最小、典型、最大延迟表达形式8.1.3 例子用VerilogHDL建立图5.8-1 模块D的延迟仿真模块8.2 模块延迟建模8.2.1 延迟说明块 Spe…

数据分析和可视化必备的几大软件,你用过几个?

本文主要是面向数据分析初学者&#xff0c;因此分享的基本是一些免编程的可视化工具&#xff0c;详细介绍了7款工具&#xff0c;推荐大家使用&#xff0c;主要是让初学数据分析的朋友知道可视化工具大概有哪些、流行的有哪些。 Power BI Power BI是微软开发的商业分析工具。用户…

LeetCode 91 双周赛

2465. 不同的平均值数目 给你一个下标从 0 开始长度为 偶数 的整数数组 nums 。 只要 nums 不是 空数组&#xff0c;你就重复执行以下步骤&#xff1a; 找到 nums 中的最小值&#xff0c;并删除它。找到 nums 中的最大值&#xff0c;并删除它。计算删除两数的平均值。 两数…

mysql InnooDb存储引擎的体系结构和逻辑存储结构

前言 这是一篇理论性比较强的文章&#xff0c;是不是很多人一听理论性的东西&#xff0c;就被劝退了&#xff1f;可千万别。其实分享内容非常简单&#xff0c;也非常干&#xff0c;相信你会喜欢的&#xff0c;对你也是有帮助的。切入正题&#xff0c;mysql的体系结构可以作为一…

机理类模型的建模思路|2021年亚太赛B题|2022备赛|前景目标提取

目录 一、 前景目标提取问题 1.背景目标和前景目标提取 2.问题一 2.2问题一求解 3.问题二 4.问题三 5.问题四 6.问题五​ 7.问题六 8.矩阵范数 二、前景目标提取——机理总结 三、编程实现 一、 前景目标提取问题 1.背景目标和前景目标提取 不动 & 动 视…

redis集群

Redis集群在保证主从加哨兵的基本功能之外&#xff0c;还能够提升Redis存储数据的能力。 一致性hash环 k1-->crc(16)? 0-16384 redis集群的ping-pang机制&#xff1a;一个主机向另一个主机ping&#xff0c;另一个pang回来&#xff0c;说明连接成功&#xff0c;通过这样的方…

脑与认知科学基础(期末复习)

脑与认知科学基础&#xff08;期末复习&#xff09; 文章目录脑与认知科学基础&#xff08;期末复习&#xff09;第一章 脑与认知科学简介认知元认知中国脑计划第二章 大脑简介Human brain解剖参考坐标大脑皮质脑的内侧和腹侧面神经系统神经系统的细胞神经元间信号传导神经回路…

【LeetCode】No.94. Binary Tree Inorder Traversal -- Java Version

题目链接&#xff1a;https://leetcode.com/problems/binary-tree-inorder-traversal/ 1. 题目介绍&#xff08;Binary Tree Inorder Traversal&#xff09; Given the root of a binary tree, return the inorder traversal of its nodes’ values. 【Translate】&#xff1a…

Trie字典树详解

字典树&#x1f4d6;1. 什么是Trie树&#x1f4d6;2. Trie树的一些应用场景&#x1f4d6;3. Trie树的优缺点&#x1f4d6;4. Trie树的节点怎样定义&#x1f4d6;5. 代码实现&#x1f4d6;6. 字典树的优化&#x1f4d6;1. 什么是Trie树 Trie树&#xff0c;又叫字典树&#xff0…

linux性能中常用压测工具

stress工具 stress是Linux的一个压力测试工具&#xff0c;可以对CPU、Memory、IO、磁盘进行压力测试。 安装: sudo yum install stress 命令的使用: -c, --cpu N&#xff1a;产生N个进程&#xff0c;每个进程都循环调用sqrt函数产生CPU压力。 -i, --io N&#xff1a;产生N个进…

Java搭建实战springboot基于若依项目工时统计成本核算管理源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套基于若依开发的springboot项目工时统计成本核算管理源码&#xff0c;该系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术架构 技术框架&#xff1a;Sp…

计算机毕设推荐基于微信小程序的自来水收费系统

&#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设老哥&#x1f525; &#x1f496; 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; Java实战项目专栏 Python实…