在VHDL函数中生成随机值

时间:2013-05-07 13:10:39

标签: vhdl uniform

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

但是,乘以包含unsigned位的signed / 'U'类型会导致“无关”输出(即乘法输出的所有位均为{{1} })即使另一个操作数为0.因此,我无法检查我的测试平台中的最终计算输出,因为它变得“不关心”(似乎“不关心”输出被解释为0)。

为了避免这个问题,我编写了一个功能,可以解析'X''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; 'X'位设置为'U',还要将它们随机设置为'0'或{{1 }}。我已尝试在'0'中使用'1'功能。问题在于,当我在函数中定义两个种子时,每次调用函数uniform时,它都会返回相同的f(当它被赋予相同的f时)。当我从std_logic_vector函数描述中获取它时,我应该从函数std_logic_vector之外传递两个种子,因为它们被uniform函数修改为下一次调用f }。

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

3 个答案:

答案 0 :(得分:6)

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

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

它允许您进行随机化,而不仅仅是浮点数的简单均匀分布。除了将您与状态存储问题隔离开来之外,您还注意到了这一点。

关于你的具体细节:

  

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

是的,你应该。像这样:

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);     

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

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

答案 1 :(得分:1)

  

我可以使用函数实现此功能还是必须使用某个过程?

函数不允许参数为inout,指针或受保护类型。 这限制了您的选择。 OSVVM的randompkg使用受保护的类型来隐藏 种子并使用不纯的函数来访问它。这很容易 使用。只需从http://www.synthworks.com/downloads下载该软件包 并查看RandomPkg_user_guide.pdf。

你可能会得到你想要做的工作,但是,它 将是一个挑战。您可以定义信号或信号对 在你的包装中并使用不纯的功能(YMMV,我只使用了不纯的 受保护类型内的函数)。你可以初始化种子 信号声明。

即使使用OSVVM,您也需要使用不纯的函数并声明 随机化对象作为共享变量。

吉姆

答案 2 :(得分:0)

关于从VHDL组件打印实例名称: ... 我使用免费的VHDL模拟器GHDL完成了大部分工作。它有一个简单但功能强大的c接口。随机可以使用c代码完成:... http://bknpk.ddns.net/my_web/MiscellaneousHW/vhdl_func_rand.html