1

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

这些程序在打包时无法访问硬件位。在 Verilog 中,我会将常用程序放入包含文件中,并根据给定测试套件的要求将它们链接到 CPU 模型中。

更多细节:

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

cpu_read(address, read_result);

cpu_write(address, write_data);

等等

我将这些调用的组捆绑到更高级别的程序中,例如

configure_communication_bus;

clear_all_packet_counters; 

等等

在下一层,这些通用函数调用一个更具体的硬件版本,该版本知道设计的接口时序,然后这些程序使用输入记录和输出记录连接到硬件模块端口并根据需要摆动 cpu 总线信号。

cpu_read 调用hardware_cpu_read(cpu_input_record, cpu_output_record, address)

像这样的东西:

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_input_recordcpu_output_record在 cpu 模型 vhdl 文件中被声明为 nnn_record 类型的信号。

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

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

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

具有讽刺意味的是,我可以将最低级别的硬件程序推送到一个包中,并从“主”进程中调用这些程序,但更高级别的进程不能放入该包或任何其他包中,因为它们没有访问cpu_read_recordcpu_write_record

我觉得必须有一种简单的方法来清理这段代码并使其模块化,而我只是遗漏了一些明显的东西。

顺便说一句,我真的不认为制作命令解释器并将我的测试代码加载到行为 ROM 中是正确的方法。也不是与模拟器界面打架来连接一个 C 程序,但我可能会崩溃并尝试这个..

4

3 回答 3

4

答案的快速草图(我认为你在问的问题!:-) 虽然我可能不在光束...

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

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

然后在执行范围内编写参数精简本地等效项(包装器),它只是调用显式提供所有参数的包版本。

这只是样板文件 - 不是很漂亮,但它确实允许您将 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;
于 2013-09-12T21:03:56.527 回答
1

目前,您的测试程序需要两个额外的信号,cpu_input_record 和 cpu_output_record。这还不错。在与 cpu 交互并完成的所有程序上都使用这些并不少见。所以使用hardware_cpu_read 而不是cpu_read。将 cpu_input_record、cpu_output_record 添加到您的 configure_communication_bus 和 clear_all_packet_counters 程序并完成。也许选择较短的名称。

我做了类似的方法,除了我只使用一个带有已解析元素的记录。要完成这项工作,您需要初始化记录,以便所有元素都是非驱动的(即:std_logic 的“Z”)。为了使其更灵活,我创建了整数、时间和实数的解析函数。但是,这只会为您节省一个信号。不是真正的巨大胜利。也许你认为你想成为的一半。但它比你正在做的工作更多。

对于 VHDL-201X,我们正在研究允许参数/端口自动映射到同名信号的语法。这将使您使用任何方法(您的、我的或 Brian 的,没有额外的包装子程序)到达您想要的位置。它张贴在这里: http ://www.eda.org/twiki/bin/view.cgi/P1076/ImplicitConnections 。鉴于此,我会将这两条记录添加到您的程序中,并且现在称其为足够好。

一旦你解决了这个问题,你似乎也在问我如何使用同一个测试平台编写单独的测试。为此,我使用了多种架构——我喜欢将它们视为并发代码的工厂类。为了使这可行,我将激励生成代码与测试台的其余部分(通常:网表连接和时钟)分开。我的演示文稿“Leapfrog SystemVerilog 的 VHDL 测试台技术”概述了该架构以及许多其他优点。可在以下网址获得: http ://www.synthworks.com/papers/index.htm

于 2013-09-14T00:34:51.093 回答
0

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

于 2013-09-13T18:30:18.667 回答