我有一个设计,我正在向 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函数描述中获取它时,我应该从函数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 库,它允许您拥有受保护类型的共享变量,您可以从多个地方使用它。 这将其自己的状态保留在受保护类型的“内部”。
我可以使用函数来实现此目的还是必须使用过程?
函数不允许参数为 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,允许您对不纯的函数执行相同的操作
关于从 VHDL 组件打印实例名称: ... 我的大部分工作都是使用免费的 VHDL 模拟器 GHDL 完成的。它有一个简单但功能强大的 C 接口。可以使用c代码来完成随机:... http://bknpk.ddns.net/my_web/MiscellaneousHW/vhdl_func_rand.html