我有一个设计,我正在写入/读取RAM并从读取值执行一些计算.在某些情况下,我从RAM位置读取值,我还没有写任何东西.这是故意的,因为在发生这种情况的情况下,未初始化的值不会影响计算:在这些情况下,未初始化的值乘以0.
但是,乘以包含位的unsigned
/ signed
类型会'U'
导致"不关心"输出(即乘法输出的所有位都是'X'
),即使另一个操作数为0.因此,我无法检查我的最终计算输出testbench因为它变得"不关心"(似乎"不关心"输出被解释为0).
为了避免这个问题,我编写了一个函数来解析to中的任何'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;
Run Code Online (Sandbox Code Playgroud)
现在我想通过设置'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/
它允许您随机化不仅仅是浮点数的简单均匀分布.除了你已经注意到的状态存储问题之外.
关于你的具体情况:
当我从统一函数描述中得到它时,我应该从函数f外部传递两个种子,因为它们被统一函数修改以用于下一次调用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);
Run Code Online (Sandbox Code Playgroud)
因此,在您的情况下,您必须将这些"状态"变量传递到您的函数中(以及从函数中传出) - 这在实践中意味着它必须是一个过程.
或者使用上面链接的OSVVM库,它允许您拥有受保护类型的共享变量,您可以在各种位置使用它.这使自己的状态保持在受保护类型的"内部".