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

发布于:2025-06-20 ⋅ 阅读:(22) ⋅ 点赞:(0)

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 begin
    repeat (10) begin
        value = $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) begin
    rand_val = $urandom_range(0, 99);
    if (rand_val < p * 100)
        event_happens <= 1;
    else
        event_happens <= 0;
end

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

例如:

概率
1 10%
2 30%
3 60%
integer rand, result;
always @(posedge clk) begin
    rand = $urandom_range(0, 99);
    if (rand < 10)
        result = 1;
    else if (rand < 40)
        result = 2;
    else
        result = 3;
end

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

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

// 用6个均匀分布相加近似一个正态分布
integer i;
integer gaussian;
always @(posedge clk) begin
    gaussian = 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}; // 权重分布
    }
endclass

Packet pkt = new();
initial begin
    repeat (10) begin
        pkt.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/蒙特卡洛等 验证覆盖、异常仿真、边界测试等

网站公告

今日签到

点亮在社区的每一天
去签到