我需要在test_bench中生成13位的随机二进制数。然后,当开始信号设置为1时,生成随机num_bin。因为在我的代码中没有生成?即生成0000000000000,何时应生成13位数。有什么不对?谢谢
注意:num_bin输入是我必须在另一个进程中提供的数字。
.
.
.
reset <= '1', '0' after 75 ns;
inicio <='0', '1' after 100 ns;
process
variable seed1 :integer ;
variable seed2 :integer ;
variable re1 : integer;
variable re2 : real ;
begin
if inicio = '1' then
uniform (seed1,seed2,re2);
re1 := integer (re2 * real(2**13 -1));
num_bin <= std_logic_vector ( to_unsigned (re1,13));
end if;
wait;
end process;
答案 0 :(得分:1)
如果要在VHDL中生成随机数,请查看开源OSVVM库。 http://www.osvvm.org
答案 1 :(得分:0)
删除流程中的条件并将seed1,seed2更改为正数并让流程生成多个num_bin值:
library ieee;
use ieee.std_logic_1164.all;
use ieee.math_real.all;
use ieee.numeric_std.all;
entity uni is
end entity;
architecture foo of uni is
signal num_bin: std_logic_vector (12 downto 0);
begin
NOLABEL:
process
variable seed1 :positive ;
variable seed2 :positive ;
variable re1 : integer;
variable re2 : real ;
begin
-- if inicio = '1' then
uniform (seed1,seed2,re2);
re1 := integer (re2 * real(2**13 -1));
num_bin <= std_logic_vector ( to_unsigned (re1,13));
-- end if;
wait for 10 ns;
if Now > 50 ns then
wait;
end if;
end process;
MONITOR:
process (num_bin)
begin
report "uniform = " & to_string(num_bin) severity NOTE;
end process;
end architecture;
我们得到:
$ GHDL -r uni
uni.vhdl:44:9:@ 0ms :(报告说明):制服= uuuuuuuuuuuuu
uni.vhdl:44:9:@ 0ms :(报告单):uniform = 1111111111111
uni.vhdl:44:9:@ 10ns :(报告说明):制服= 1111100101110
uni.vhdl:44:9:@ 20ns :(报告说明):制服= 1010010111000
uni.vhdl:44:9:@ 30ns :(报告说明):制服= 0101010101000
uni.vhdl:44:9:@ 40ns :(报告说明):制服= 0000100101111
uni.vhdl:44:9:@ 50ns :(报告说明):制服= 0010100101101
所有&#39; 1的第一个非初始值可能是seed1和seed2的初始值为类型为正的结果。
如果除了所有人之外没有得到任何其他内容,你是否正在将num_bin初始化为&#39; 0&#39;
重新添加条件评估并初始化num_bin:
architecture fum of uni is
signal num_bin: std_logic_vector (12 downto 0) := (others => '0');
signal inicio: std_logic;
begin
inicio <='0', '1' after 100 ns;
NOLABEL:
process
variable seed1 :positive ;
variable seed2 :positive ;
variable re1 : integer;
variable re2 : real ;
begin
if inicio = '1' then
uniform (seed1,seed2,re2);
re1 := integer (re2 * real(2**13 -1));
num_bin <= std_logic_vector ( to_unsigned (re1,13));
end if;
wait;
end process;
MONITOR:
process (num_bin)
begin
report "uniform = " & to_string(num_bin) severity NOTE;
end process;
end architecture;
我们得到:
$ GHDL -r uni
uni.vhdl:71:9:@ 0ms :(报告说明):uniform = 0000000000000
如果我们没有初始化num_bin,我们就会得到所有人。
原因在于未标记过程中的等待语句。您的进程将只执行一次,遇到等待,再也不会执行。该执行发生在初始化期间。
IEEE Std 1076-2008 14.7.5模型执行,14.7.5.1概述
模型的执行包括初始化阶段,然后在该模型的描述中重复执行流程语句。 ......
我将切换到1076-1993 12.6.4模拟周期,因为它不受在此上下文中不感兴趣的事物的阻碍。它是执行-2008模型时发生的事情的一个子集。
在初始化开始时,假设当前时间Tc为0 ns。
初始化阶段包括以下步骤:
- 计算每个明确声明的信号的驱动值和有效值,并且将信号的当前值设置为有效值。假设该值在模拟开始之前的无限长时间内是信号的值。
VHDL中的所有对象都有一个值。如果没有提供inicio声明中的默认值,默认值就是它的LEFT值,在这种情况下是&#39; U&#39;。
如果没有为if语句中的条件传递集合的inicio的默认值,我们就不会调用if语句所包含的语句序列的执行。以下等待语句确保该过程不会再次执行。我们从未为num_bin生成随机数值。
以inicio为条件删除if语句是不够的。我们可以看到,如果没有为seed1和seed2之一或两者生成随机或至少非1值,将获得num_bin上所有&#39; 1的第一个值。 (并且没有随机种子优先值,UNIFORM调用产生的值序列是可重复的。)