我有一个设计,我正在写入/读取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
}。
是否有可能使用函数实现这一目标?
答案 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