Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Simulation VHDL总线功能建模-Can';t将多组过程放入一个包中以清理代码_Simulation_Vhdl_Modeling_Bus - Fatal编程技术网

Simulation VHDL总线功能建模-Can';t将多组过程放入一个包中以清理代码

Simulation VHDL总线功能建模-Can';t将多组过程放入一个包中以清理代码,simulation,vhdl,modeling,bus,Simulation,Vhdl,Modeling,Bus,我想组织一个工作总线功能模型,并将常用程序(看起来像CPU子例程)推出到一个包中,然后将它们从主CPU模型中取出,但我被卡住了 当这些过程在一个包中推出时,它们无法访问硬件位。 在Verilog中,我会将常用的过程放入一个include文件中,并根据给定测试套件的需要将它们链接到CPU模型中 更多详情: 我有一个CPU的工作总线功能模型,用于模拟测试台。 在“用户界面”级别,我在CPU模型中运行了一个名为“main”的进程,该进程调用预定义的“指令集”,如下所示: cpu_read(addres

我想组织一个工作总线功能模型,并将常用程序(看起来像CPU子例程)推出到一个包中,然后将它们从主CPU模型中取出,但我被卡住了

当这些过程在一个包中推出时,它们无法访问硬件位。 在Verilog中,我会将常用的过程放入一个include文件中,并根据给定测试套件的需要将它们链接到CPU模型中

更多详情:

我有一个CPU的工作总线功能模型,用于模拟测试台。 在“用户界面”级别,我在CPU模型中运行了一个名为“main”的进程,该进程调用预定义的“指令集”,如下所示:

cpu_read(address, read_result);

cpu_write(address, write_data);
procedure cpu_read (address : in std_logic_vector(15 downto 0);
                    read_result : out std_logic_vector(31 downto 0));
    begin
        hardware_cpu_read(cpu_input_record, cpu_output_record, address, read_result);
    end procedure;
等等

我将这些调用组合到更高级别的过程中,如

configure_communication_bus;

clear_all_packet_counters; 
等等

在下一层,这些通用功能调用更硬件特定的版本,该版本知道设计的接口时间, 然后,这些过程使用输入记录和输出记录连接到硬件模块端口,并根据需要摆动cpu总线信号

cpu读取调用硬件cpu读取(cpu输入记录、cpu输出记录、地址)

大概是这样的:

cpu_read(address, read_result);

cpu_write(address, write_data);
procedure cpu_read (address : in std_logic_vector(15 downto 0);
                    read_result : out std_logic_vector(31 downto 0));
    begin
        hardware_cpu_read(cpu_input_record, cpu_output_record, address, read_result);
    end procedure;
cpu\u输入\u记录
cpu\u输出\u记录
在cpu模型vhdl文件中声明为nnn\u记录类型的信号

这一切都正常,但这些过程中的每一个都存储在cpu VHDL模块文件中,并且都在过程声明部分,因此它们都在同一范围内

如果我与团队成员共享模型,他们将需要添加自己的测试子例程,这些子例程也都在文件中的相同位置,他们的模拟测试代码必须与我的代码一起进入“主”过程

我宁愿从模型外部链接各种测试,并且只在模型文件中保留特定于模型的过程

具有讽刺意味的是,我可以将最低级别的硬件过程推出到一个包中,并从“主”进程中调用这些过程,但更高级别的进程无法放入该包或任何其他包中,因为它们无法访问
cpu\u read\u record
cpu\u write\u record

我觉得必须有一个简单的方法来清理这些代码并使其模块化,我只是缺少一些明显的东西

我真的不认为制作命令解释器并将测试代码加载到行为ROM中是正确的方法。也不是为了连接一个C程序而与模拟器接口抗争,但我可能会崩溃并尝试这个..

一个答案的快速草图(我想你在问这个问题!:-)尽管我可能会偏离波束

要将BFM子程序移动到一个可重用的包中,它们需要独立于执行范围——这通常意味着它们每个都有一个很长的参数列表。因此,与现在的无参数(或参数lite)版本相比,在测试台上使用它们很快就会变得乏味

通常的解决方法是在一个包中实现BFM,其中包含很长的参数列表

然后在执行范围中编写参数lite本地等价物(包装器),它只需显式调用提供所有参数的包版本

这只是一个样板——并不漂亮,但它确实允许您将BFM移动到一个包中。这些包装器可以是测试台、测试台中的进程,甚至测试台中的子程序的本地包装器

(参数类型可以是整洁的记录:这些可能在第三个包中声明,在BFM.TB和测试中的可合成设备之间共享…)

由于重载,本地和BFM包版本之间没有歧义,因此实际的测试台尽可能简单

包装器函数示例:

function cpu_read(address : unsigned) return slv_32 is
begin
   return BFM_pack.cpu_read ( 
      address     => address,
      rd_data_bus => tb_rd_data_bus,
      wait        => tb_wait_signal,
      oe          => tb_mem_oe,
      -- ditto for all the signals constants variables it needs from the tb_ scope
      );
end cpu_read;
(我想你在问的问题的答案的速写!-)虽然我可能不太明白

要将BFM子程序移动到一个可重用的包中,它们需要独立于执行范围——这通常意味着它们每个都有一个很长的参数列表。因此,与现在的无参数(或参数lite)版本相比,在测试台上使用它们很快就会变得乏味

通常的解决方法是在一个包中实现BFM,其中包含很长的参数列表

然后在执行范围中编写参数lite本地等价物(包装器),它只需显式调用提供所有参数的包版本

这只是一个样板——并不漂亮,但它确实允许您将BFM移动到一个包中。这些包装器可以是测试台、测试台中的进程,甚至测试台中的子程序的本地包装器

(参数类型可以是整洁的记录:这些可能在第三个包中声明,在BFM.TB和测试中的可合成设备之间共享…)

由于重载,本地和BFM包版本之间没有歧义,因此实际的测试台尽可能简单

包装器函数示例:

function cpu_read(address : unsigned) return slv_32 is
begin
   return BFM_pack.cpu_read ( 
      address     => address,
      rd_data_bus => tb_rd_data_bus,
      wait        => tb_wait_signal,
      oe          => tb_mem_oe,
      -- ditto for all the signals constants variables it needs from the tb_ scope
      );
end cpu_read;

你肯定是在正确的轨道上,事实上我有一个这样的变体(你所描述的)。 问题是,现在我使用“参数光”过程构建了一个完整的子例程,这些是我想要放在包中共享和重用的。问题是,推送到包中的任何过程都不能调用主vhdl文件中的参数light procedures。。 我们有一个主vhdl文件,其中包含所有常见的CPU硬件设置例程,每个设计人员的测试代码都在同一个vhdl文件中。。
长话短说,把我们的测试子例程放到不同的文件中,这正是我所希望的

你肯定是在正确的轨道上,事实上我有一个这样的变体(你描述的)。 问题是,现在我使用