VHDL 生成随机数:从均匀分布到 OSVVM
VHDL 内置伪随机生成器产生 [0, 1] 区间浮点值。通过缩放和偏移,可创建任意类型随机数据——实数、整数、std_logic_vector 或 time,适用于测试平台。以下指南展示如何用 IEEE MATH_REAL 包的 uniform 过程构建这些生成器,并利用 OSVVM Random 包获得更大灵活性。
下面示例基于 IEEE MATH_REAL 包定义的 uniform 过程:
procedure UNIFORM(variable SEED1, SEED2 : inout POSITIVE; variable X : out REAL);
它需两个种子变量,每次调用更新。输出 X 为 0 到 1 间伪随机实数。因算法确定性,相同初始种子对产生完全相同数列——可重复测试平台的关键属性。
深入了解底层算法,参阅 Pierre L'Ecuyer 的 Efficient and Portable Combined Random Number Generators 论文,或查看 GHDL 仿真器附带的实现。
测试用例
下文所有示例用 999 作为两个种子值。在进程声明区声明种子,在同一进程内将随机化函数实现为非纯函数:
variable seed1, seed2 : integer := 999;
可下载包含本文所有示例的完整测试平台 ZIP 文件。压缩包含编译运行仿真的 ModelSim 工程脚本。
随机实数值
uniform 过程返回 [0.0, 1.0] 区间实数。映射到任意区间 [min_val, max_val],乘以宽度加偏移:
impure function rand_real(min_val, max_val : real) return real is variable r : real; begin uniform(seed1, seed2, r); return r * (max_val - min_val) + min_val; end function;
随机整数值
从实数生成随机整数棘手,简单四舍五入会偏移极值概率。下面函数在四舍五入前加 0.5 修正偏差:

impure function rand_int(min_val, max_val : integer) return integer is variable r : real; begin uniform(seed1, seed2, r); return integer( round(r * real(max_val - min_val + 1) + real(min_val) - 0.5)); end function;
此调整确保区间 [min_val, max_val] 内每个整数等概率被选中。
随机 std_logic_vector
用随机位填充任意长度 std_logic_vector,遍历每位置,随机实数超 0.5 赋 '1' 否则 '0':
impure function rand_slv(len : integer) return std_logic_vector is variable r : real; variable slv : std_logic_vector(len - 1 downto 0); begin for i in slv'range loop uniform(seed1, seed2, r); slv(i) := '1' when r > 0.5 else '0'; end loop; return slv; end function;
随机时间值
需随机时间戳时(如模拟突发数据流量),可将随机实数缩放到目标区间并转回 VHDL time 类型:
impure function rand_time(min_val, max_val : time; unit : time := ns) return time is variable r, r_scaled, min_real, max_real : real; begin uniform(seed1, seed2, r); min_real := real(min_val / unit); max_real := real(max_val / unit); r_scaled := r * (max_real - min_real) + min_real; return real(r_scaled) * unit; end function;
注意必须向函数提供仿真器时间单位(如 ns)。
OSVVM Random 包
偏好现成方案的用户,OSVVM Random 包提供丰富重载函数,为所有标准 VHDL 类型生成随机值。导入包:
library osvvm; use osvvm.RandomPkg.all;
ModelSim 预装 OSVVM,该平台无需额外下载。其他仿真器参考 OSVVM GitHub 仓库的 RandomPck.vhd 文件。
VHDL