Random VHDL中的随机数发生器

Random VHDL中的随机数发生器,random,vhdl,Random,Vhdl,我正在设计一个测试台,我需要为系统的一个输入创建一个随机的位序列,这个输入通常由用户控制。 我还希望每次运行模拟时,这个位序列的顺序不一样 我不能使用PRNG,因为它的初始状态是预定义的,这意味着它每次都会生成相同的数字。我也使用了统一函数,但我有同样的问题 RAND_GEN : process(clk) is variable seed1, seed2 : positive := 1; variable re : real; begin if ris

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

我不能使用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;

这个问题还有其他解决方法吗?

我对VHDL一无所知,但一般来说,我会尽量避免测试中的随机性。例如,脆弱的单元测试是不好的。有时失败的测试有什么价值


不管怎样,假设你真的想这么做,你能使用定时器吗?您可以将当前时间作为种子来初始化PRNG。密码不安全,但对于这个用例来说可能已经足够好了。

我对VHDL一无所知,但一般来说,我会尽量避免测试中的随机性。例如,脆弱的单元测试是不好的。有时失败的测试有什么价值


不管怎样,假设你真的想这么做,你能使用定时器吗?您可以将当前时间作为种子来初始化PRNG。密码不安全,但对于这个用例来说可能已经足够好了。

使用随机生成的输入进行测试是一项强大的技术,也是目前常用于验证IC的技术。通常,您将使用已知的、每确定的种子运行测试,而您希望能够生成不同的种子。因此,在运行测试时必须记录此种子,并提供使用此种子运行测试的机制。否则,当您发现一个bug时,您将无法测试是否已修复它。您可能会发现,使用少量手动生成的种子创建一组固定的测试更有用

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

date +%s >! seed.txt
然后阅读文件,例如:

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;

使用随机生成的输入进行测试是一项强大的技术,也是目前验证IC的常用技术。通常,您将使用已知的、每确定的种子运行测试,而您希望能够生成不同的种子。因此,在运行测试时必须记录此种子,并提供使用此种子运行测试的机制。否则,当您发现一个bug时,您将无法测试是否已修复它。您可能会发现,使用少量手动生成的种子创建一组固定的测试更有用

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

date +%s >! seed.txt
然后阅读文件,例如:

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;

为了记录在案,如果有人需要类似的东西,我使用了上面的想法,创建了一个do文件,首先将日期写入文件,然后运行实际测试台的do文件,按照前面的建议读取这个数字

set t [clock seconds]
set outputFile [open date.txt w]
puts $outputFile $t
close $outputFile 
do testbench.do

为了记录在案,如果有人需要类似的东西,我使用了上面的想法,创建了一个do文件,首先将日期写入文件,然后运行实际测试台的do文件,按照前面的建议读取这个数字

set t [clock seconds]
set outputFile [open date.txt w]
puts $outputFile $t
close $outputFile 
do testbench.do

我还希望每次运行模拟时,这些位的顺序都不相同。是的,您可以这样做,否则您无法找到出现的任何错误。您可能希望能够将序列从run更改为run。在Linux上,您可以从/dev/random或/dev/urandomiee Std 1076-2008 G.1.4 MATH_REAL中的伪随机数生成器的使用和约束程序包提供的伪随机数生成器与平台无关。为了生成伪随机数链,种子值只能在函数的第一次调用中设置。每次设置种子值时,都会启动不同的数字链。如果需要多个伪随机数链,则必须为每个链使用不同的种子值集。我还希望每次运行模拟时,这些位的顺序都不相同。是的,您可以这样做,否则您无法找到出现的任何错误。您可能希望能够将序列从run更改为run。在Linux上,您可以从/dev/random或/dev/urandomiee Std 1076-2008 G.1.4 MATH_REAL中的伪随机数生成器的使用和约束程序包提供的伪随机数生成器与平台无关。为了生成伪随机数链,种子值只能在函数的第一次调用中设置。每次设置种子值时,都会启动不同的数字链。如果需要多个伪随机数链,那么每个链都必须使用不同的种子值集。非常感谢。我有一个类似的想法,但搜索一个返回testin当前时间的vhdl函数
我什么也没找到。有没有办法使这个过程自动化?例如,这个文件可以在一段时间后刷新吗?在VHDL中没有用于查找wallclock时间的命令。也没有用于从VHDL运行OS命令的构造。SystemVerilog中有一个$system。您可以设置unix cron作业来不时刷新文件,但最简单的方法当然是从脚本开始模拟,并在该脚本中执行date命令。如果您未公开的模拟器具有依赖于实现的能力,可以提供顶级泛型,例如Modelsim、ghdl、Aldec,将种子值作为命令行参数传入。请注意,种子值应受到约束。非常感谢。我也有类似的想法,但在搜索返回当前时间用于测试的vhdl函数时,我什么也没找到。有没有办法使这个过程自动化?例如,这个文件可以在一段时间后刷新吗?在VHDL中没有用于查找wallclock时间的命令。也没有用于从VHDL运行OS命令的构造。SystemVerilog中有一个$system。您可以设置unix cron作业来不时刷新文件,但最简单的方法当然是从脚本开始模拟,并在该脚本中执行date命令。如果您未公开的模拟器具有依赖于实现的能力,可以提供顶级泛型,例如Modelsim、ghdl、Aldec,将种子值作为命令行参数传入。请注意,种子值应约束为SEED1