FPGA基础 -- Verilog 概率分布函数
Verilog 概率分布函数(PDF, Probability Distribution Function) 。
一、引言:Verilog 语言中的概率建模场景
虽然 Verilog HDL 本身是一种确定性的硬件描述语言,但在仿真验证环境中(尤其是 testbench 设计中),我们经常需要 引入随机性:
- 模拟信号的随机抖动
- 随机输入测试样本(Fuzz 测试、随机码流)
- 建立蒙特卡洛模拟(Monte Carlo)
- 功能覆盖率分析中生成各种边界条件
这时,“概率分布函数” 和 “随机数控制机制” 就显得至关重要。
二、Verilog 支持概率建模的基本工具
分类 | 描述 | 举例 |
---|---|---|
$random | 32位伪随机数(种子固定可复现) | $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)
例如:
值 | 概率 |
---|---|
1 | 10% |
2 | 30% |
3 | 60% |
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 的
rand
、randc
和constraint
提供了更完善的概率建模机制。
🧩 示例:定义约束概率分布
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/蒙特卡洛等 | 验证覆盖、异常仿真、边界测试等 |