VHDL 中的随机数生成器

1 random vhdl

我正在设计一个测试台,需要为通常由用户控制的系统输入之一创建随机位序列。我还希望每次运行模拟时该位序列的顺序不一样。

我无法使用 PRNG,因为它的初始状态是预定义的,这意味着它每次都会产生相同的数字。我也使用了统一函数,但遇到了同样的问题。

RAND_GEN : process(clk) is
    variable seed1, seed2 : positive := 1;
    variable re           : real;
begin
    if rising_edge(clk) then
        uniform(seed1, seed2, re);
        if (re < 0.5) then
            rand_bit <= '0';
        else
            rand_bit <= '1';
        end if;
    end if;
end process;
Run Code Online (Sandbox Code Playgroud)

这个问题有其他选择吗?

Mat*_*lor 5

使用随机生成的输入进行测试是一项强大的技术,也是当今验证 IC 的常用技术。通常,您会使用已知的、预先确定的种子运行测试,而您希望能够生成变化的种子。因此,当您运行测试时,您绝对必须记录此种子,并提供一种使用此种子运行测试的机制。否则,当您发现错误时,您将无法测试是否已修复它。您可能会发现使用少量手动生成的种子进行一组固定的测试更有用。

date您可以使用带有格式说明符的linux命令%s,该命令输出自 1970 年 1 月 1 日以来的秒数并将其重定向到文件。

date +%s >! seed.txt
Run Code Online (Sandbox Code Playgroud)

然后读取文件,例如:

RAND_GEN : process(clk) is
    variable seed1, seed2 : positive := 1;
    variable re           : real;
    file F: TEXT;
    variable L: LINE;
    variable seed_RNG : boolean := false;
begin
    if not seed_RNG then
        file_open(F, "seed.txt", READ_MODE);
        readline (F, L);
        read (L, seed1);  -- or seed2
        file_close(F);
        report "seed1 = " & integer'image(seed1);
        seed_RNG := true;
    end if;
    if rising_edge(clk) then    
        uniform(seed1, seed2, re);
        if (re < 0.5) then
            rand_bit <= '0';
        else
            rand_bit <= '1';
        end if;
    end if;
end process;
Run Code Online (Sandbox Code Playgroud)