我正在设计一个测试台,需要为通常由用户控制的系统输入之一创建随机位序列。我还希望每次运行模拟时该位序列的顺序不一样。
我无法使用 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)
这个问题有其他选择吗?
使用随机生成的输入进行测试是一项强大的技术,也是当今验证 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)