gpt4 book ai didi

vhdl - 在 VHDL 函数中生成随机值

转载 作者:行者123 更新时间:2023-12-04 23:56:06 24 4
gpt4 key购买 nike

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

但是,乘以 unsigned/signed包含 'U' 的类型即使另一个操作数为 0,位也会导致“无关”输出(即乘法输出的所有位都是 '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 验证方法的一部分。这里有说明和下载链接。

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

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

关于你的具体情况:

As I take it from the uniform function description, I should pass the two seeds from outside the function f because they are modified by the uniform function for the next call to 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 库,它允许您拥有一个 protected 类型的共享变量,您可以从多个地方使用它。这将在 protected 类型的“内部”保持其自己的状态。

关于vhdl - 在 VHDL 函数中生成随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16419962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com