当前位置: 首页 > news >正文

FPGA基础 -- Verilog 概率分布函数

Verilog 概率分布函数(PDF, Probability Distribution Function)


一、引言:Verilog 语言中的概率建模场景

虽然 Verilog HDL 本身是一种确定性的硬件描述语言,但在仿真验证环境中(尤其是 testbench 设计中),我们经常需要 引入随机性

  • 模拟信号的随机抖动
  • 随机输入测试样本(Fuzz 测试、随机码流)
  • 建立蒙特卡洛模拟(Monte Carlo)
  • 功能覆盖率分析中生成各种边界条件

这时,“概率分布函数” 和 “随机数控制机制” 就显得至关重要。


二、Verilog 支持概率建模的基本工具

分类描述举例
$random32位伪随机数(种子固定可复现)$random(seed)
$urandom无符号 32位伪随机数$urandom
$urandom_range(min, max)限定区间的均匀分布$urandom_range(0, 255)
SystemVerilog 的 rand/randc类对象中的随机变量控制rand bit [3:0] val;

注:标准 Verilog-2001 不支持复杂的概率控制,通常依赖于 SystemVerilog


三、如何实现概率分布函数(PDF)模拟

✅ 3.1 均匀分布(Uniform Distribution)

// 模拟一个 [0, 99] 的均匀分布
integer value;
initial beginrepeat (10) beginvalue = $urandom_range(0, 99);$display("Uniform value: %0d", value);end
end

✅ 3.2 二项分布 / 布尔概率事件模拟

实现某个事件以p%的概率发生

// 模拟以30%概率触发一个事件
real p = 0.3;
integer rand_val;always @(posedge clk) beginrand_val = $urandom_range(0, 99);if (rand_val < p * 100)event_happens <= 1;elseevent_happens <= 0;
end

✅ 3.3 自定义离散概率分布(概率质量函数 PMF)

例如:

概率
110%
230%
360%
integer rand, result;
always @(posedge clk) beginrand = $urandom_range(0, 99);if (rand < 10)result = 1;else if (rand < 40)result = 2;elseresult = 3;
end

✅ 3.4 近似高斯分布(Normal/Gaussian)

Verilog 本身不支持原生高斯分布,但可以通过“中心极限定理”近似实现:

// 用6个均匀分布相加近似一个正态分布
integer i;
integer gaussian;
always @(posedge clk) begingaussian = 0;for (i = 0; i < 6; i = i + 1)gaussian = gaussian + $urandom_range(0, 10);$display("Gaussian approximation: %d", gaussian);
end

这种方式产生的值服从均值为30,近似标准差为若干的正态分布


四、SystemVerilog 中的概率语义(更强大)

SystemVerilog 的 randrandcconstraint 提供了更完善的概率建模机制。

🧩 示例:定义约束概率分布

class Packet;rand bit [7:0] type;constraint type_dist {type dist {8'h01 := 10, 8'h02 := 30, 8'h03 := 60}; // 权重分布}
endclassPacket pkt = new();
initial beginrepeat (10) beginpkt.randomize();$display("Packet type: %h", pkt.type);end
end

这是实现“离散概率质量分布函数 PMF”的最简洁方案。


五、概率分布函数的实际应用场景

应用描述
功能覆盖测试多样化随机输入数据
误码注入模拟概率性链路错误
蒙特卡洛分析多次仿真得到可靠性估计
自动验证环境UVM + 随机约束构建全面测试覆盖
图像/视频输入模拟随机图像信号抖动与噪声模式

六、常见误区

错误原因
$random 结果不均匀是有符号32位数,会出现负值
忘记控制种子仿真不可复现结果,debug困难
使用 $random 超出范围没有进行合理归一化或限制范围
误用 blocking 与 non-blocking 混杂时序行为偏差

总结

要点内容
Verilog 原生支持基本的伪随机$random / $urandom[_range]
可以手动模拟离散 PDF / 近似高斯if-else + 多次均匀叠加
SystemVerilog 提供原生概率建模rand, constraint, dist
可用于 UVM/RTL Testbench/蒙特卡洛等验证覆盖、异常仿真、边界测试等
http://www.xdnf.cn/news/1060705.html

相关文章:

  • Stable Diffusion 实战-手机壁纸制作 第二篇:优化那些“崩脸”和“马赛克”问题,让图像更加完美!
  • 【LLM学习笔记3】搭建基于chatgpt的问答系统(下)
  • AJAX拦截器失效排查指南:当你的beforeSend有效但error/complete沉默时
  • CppCon 2017 学习:Everything You Ever Wanted to Know about DLLs
  • API 接口:程序世界的通用语言与交互基因
  • Spring Boot 虚拟线程 vs WebFlux:谁更胜一筹?
  • 主流防火墙策略绕过漏洞的修复方案与加固实践
  • 啊啊啊啊啊啊啊啊code
  • C++实现手写strlen函数
  • 什么是池化
  • [11-5]硬件SPI读写W25Q64 江协科技学习笔记(20个知识点)
  • Java求职者面试指南:Spring, Spring Boot, Spring MVC, MyBatis技术点深度解析
  • RK3568笔记八十五:LVGL播放AVI视频
  • MySQL读写分离技术详解:架构设计与实践指南
  • 不同系统修改 Docker Desktop 存储路径(从C盘修改到D盘)
  • 【AI论文】SWE-Factory:您的自动化工厂,提供问题解决培训数据和评估基准
  • PHP 生成当月日期
  • JavaEE->多线程2
  • 介绍一款免费MES、开源MES系统、MES源码
  • uni.getStorage 与 uni.getStorageSync 的区别解析
  • 矩阵变换终极笔记
  • react forwardRef和readux的connect冲突,导致ref.current获取不到值
  • infinisynapse 使用清华源有问题的暂时解决方法:换回阿里云源并安装配置PPA
  • 【MySQL基础】MySQL内置函数全面解析:提升你的数据库操作效率
  • AWK在网络安全中的高效应用:从日志分析到威胁狩猎
  • 苍穹外卖-2025 完成基础配置环节(详细图解)
  • 【嵌入式硬件实例】-555定时器控制舵机/伺服电机
  • 力扣网C语言编程题:接雨水(动态规划实现)
  • SCRM软件数据分析功能使用指南:从数据挖掘到商业决策
  • 什么是Nacos