我正在设计一个测试台,我需要为系统输入之一创建一个随机的位序列,该序列通常由用户控制。 我还希望每次运行模拟时,这些位序列都不会处于相同的顺序。
我不能使用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;
这个问题有其他选择吗?
答案 0 :(得分:3)
使用随机生成的输入进行测试是一项强大的技术,并且是当今通常用于验证IC的技术。通常,您将使用已知的,确定的种子运行测试,而您希望能够生成变化的种子。因此,您绝对必须在运行测试时记录该种子,并提供使用该种子运行测试的机制。否则,当您发现错误时,将无法测试是否已修复它。您可能会发现,这对于使用较少数量的手动生成种子的固定测试集更为有用。
您可以将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;
答案 1 :(得分:0)
我对VHDL一无所知,但总的来说,我会尽量避免测试中的随机性。例如,不稳定的单元测试是不好的。仅在某些时候失败的测试有什么价值?
无论如何,假设您确实要这样做,是否可以使用计时器?您可以使用当前时间作为种子来初始化PRNG。不是加密安全的,但对于此用例来说可能足够好。
答案 2 :(得分:0)
为了便于记录,万一有人需要类似的东西,我通过创建一个do文件来使用上述思想,该文件首先将日期写入文件中,然后运行实际测试台的do文件,并按建议读取此数字以前。
set t [clock seconds]
set outputFile [open date.txt w]
puts $outputFile $t
close $outputFile
do testbench.do