在VHDL函数中生成随机值

问题描述 投票:0回答:3

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

但是,即使另一个操作数为 0,将包含

unsigned
位的
signed
/
'U'
类型相乘也会导致“无关”输出(即乘法输出的所有位均为
'X'
)。因此,我无法检查测试台中的最终计算输出,因为它变成“不关心”(似乎“不关心”输出被解释为 0)。

为了避免这个问题,我编写了一个函数来解析

'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'
,而且将它们随机设置为
'0'
'1'
。我尝试过在
uniform
中使用
f
函数。问题是,当我在函数中定义两个种子时,每次调用函数
f
时,它都会返回相同的
std_logic_vector
(当给定相同的
std_logic_vector
时)。正如我从
uniform
函数描述中获取的那样,我应该从函数
f
外部传递两个种子,因为它们会被
uniform
函数修改以供下次调用
uniform

有没有可能使用函数来实现这一点?

vhdl uniform
3个回答
8
投票

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

https://osvvm.org/

它允许您随机化不仅仅是浮点数的简单均匀分布。 以及将您与您注意到的状态存储问题隔离开来。

关于您的具体情况:

当我从uniform函数描述中获取它时,我应该从函数f外部传递两个种子,因为它们被uniform函数修改以供下次调用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);     

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

或者使用上面链接的 OSVVM 库,它允许您拥有受保护类型的共享变量,您可以从多个地方使用它。 这将其自己的状态保留在受保护类型的“内部”。


2
投票

我可以使用函数来实现此目的还是必须使用过程?

函数不允许参数为 inout、指针或受保护类型(更新见下文)。 这限制了你的选择。 OSVVM的randompkg使用受保护类型来隐藏 种子并使用不纯的函数来访问它。 这很容易 使用。 只需从 https://github.com/OSVVM/OsvvmLibraries 下载软件包即可。 RandomPkg 位于 osvvm 目录(OSVVM 实用程序库)中,文档位于 Documentation/RandomPkg_user_guide.pdf。

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

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

--- 10多年后回归

函数不允许参数为 inout、指针或受保护类型。

我们在 VHDL-2019 中修复了这个问题。 不纯函数现在允许这些。

对 VHDL-2019 的模拟器支持仍在不断出现(2024 年),但是,Aldec 模拟器支持它,并且较新版本的 Questa(2024.2 及更高版本)支持此功能。

因此,OSVVM 引入了 RandomPkg2019,允许您对不纯的函数执行相同的操作


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.