在VHDL函数中生成随机值

在VHDL函数中生成随机值,vhdl,uniform,Vhdl,Uniform,我有一个设计,我正在RAM中写入/读取数据,并对读取值执行一些计算。在某些情况下,我从我还没有写入任何内容的RAM位置读取值。这是有意的,因为在这种情况下,未初始化的值不会影响计算:在这些情况下,未初始化的值乘以0 但是,将包含'U'位的无符号/有符号类型相乘,即使其他操作数为0,也会产生“不在乎”输出(即乘法输出的所有位都是'X')。因此,我无法在我的测试台中检查最终的计算输出,因为它变成了“不关心”(似乎“不关心”输出被解释为0) 为了避免这个问题,我编写了一个函数,将std\U逻辑\U向量

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

但是,将包含
'U'
位的
无符号
/
有符号
类型相乘,即使其他操作数为0,也会产生“不在乎”输出(即乘法输出的所有位都是
'X'
)。因此,我无法在我的测试台中检查最终的计算输出,因为它变成了“不关心”(似乎“不关心”输出被解释为0)

为了避免这个问题,我编写了一个函数,将
std\U逻辑\U向量中的任何
'U'
'X'
位解析为
'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'
。我尝试在
f
中使用
uniform
函数。问题是,当我在函数中定义两个种子时,每次调用函数
f
时,它都返回相同的
std\u逻辑向量
(当它被赋予相同的
std\u逻辑向量
)。当我从
uniform
函数描述中获取它时,我应该从函数
f
外部传递这两个种子,因为它们在下一次调用
uniform
时被
uniform
函数修改


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

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

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

关于你的具体情况:

根据统一函数描述,我应该从函数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库,该库允许您拥有一个受保护类型的共享变量,您可以在多个位置使用该变量。这会将其自身的状态保持在受保护类型的“内部”

我可以使用函数实现这一点,还是必须使用过程

函数不允许参数为inout、指针或受保护类型。 这限制了你的选择。OSVVM的randompkg使用受保护的类型来隐藏 种子并使用不纯函数访问它。这很容易理解 使用。只需从下载包 请看RandomPkg_user_guide.pdf

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

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


Jim

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

谢谢你的提示。目前,一个简单的均匀分布足以满足我的需要。如果我将种子传递到函数中,我必须再次返回它们,以便在下次调用该函数时将修改后的种子传递给该函数。我可以使用函数实现这一点,还是必须使用过程?尽管您对Uniform感到满意,但我仍然认为使用OSVVM包是值得的。否则,你最终会在这个地方到处传播大量种子,这会让你非常不愉快(最终)想要这么做:)回答调整,提到要制作种子,你需要一个程序。