在VHDL函数中生成随机值

sim*_*mon 4 vhdl uniform

我有一个设计,我正在写入/读取RAM并从读取值执行一些计算.在某些情况下,我从RAM位置读取值,我还没有写任何东西.这是故意的,因为在发生这种情况的情况下,未初始化的值不会影响计算:在这些情况下,未初始化的值乘以0.

但是,乘以包含位的unsigned/ signed类型会'U'导致"不关心"输出(即乘法输出的所有位都是'X'),即使另一个操作数为0.因此,我无法检查我的最终计算输出testbench因为它变得"不关心"(似乎"不关心"输出被解释为0).

为了避免这个问题,我编写了一个函数来解析to中的任何'U''X'位.功能如下std_logic_vector'0'

function f(x : std_logic_vector) return std_logic_vector is
  variable y : std_logic_vector (x'range);
begin
  y := x;
  -- pragma synthesis off
  for i in 0 to x'length-1 loop
    case x(i) is
      when 'U' | 'X' => y(i) := '0';
      when others    => y(i) := x(i);
    end case;
  end loop;  -- i
  -- pragma synthesis on
  return y;
end;
Run Code Online (Sandbox Code Playgroud)

现在我想通过设置'X''U'位来扩展功能,'0'但是随机将它们设置为'0'或者'1'.我试过在里面使用这个uniform功能f.问题在于,当我在函数中定义两个种子时,每次f调用函数时它返回相同的函数std_logic_vector(当它被赋予相同的时候std_logic_vector).当我从uniform函数描述中获取它时,我应该从函数外部传递两个种子,f因为它们被uniform下一次调用的函数修改uniform.

是否有可能使用函数实现这一目标?

Mar*_*son 6

这里有一个非常好的随机库作为开源VHDL验证方法的一部分.这里有一个描述和下载链接.

http://www.synthworks.com/blog/osvvm/

它允许您随机化不仅仅是浮点数的简单均匀分布.除了你已经注意到的状态存储问题之外.

关于你的具体情况:

当我从统一函数描述中得到它时,我应该从函数f外部传递两个种子,因为它们被统一函数修改以用于下一次调用uniform.

是的你应该.像这样:

PROCESS
  VARIABLE seed1, seed2: positive; -- Seed and state values for random generator
  VARIABLE rand: real;             -- Random real-number value in range 0 to 1.0
BEGIN
    UNIFORM(seed1, seed2, rand);     
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,您必须将这些"状态"变量传递到您的函数中(以及从函数中传出) - 这在实践中意味着它必须是一个过程.

或者使用上面链接的OSVVM库,它允许您拥有受保护类型的共享变量,您可以在各种位置使用它.这使自己的状态保持在受保护类型的"内部".