在ghdl中使用包

时间:2017-01-15 13:16:31

标签: vhdl ghdl

我试图在ghdl中使用我自己的包。有人可以帮我完成结构和编译。目前我的代码看起来像这样:

in ./my_package/my_package.vhd

library IEEE;
use IEEE.std_logic_1164.all;

package my_package is
  constant my_constant : std_logic_vector(3 downto 0) := "1111";
end my_package;

我在my_package中按如下方式编译:

myname@myrechner my_package$ ghdl -a --work=my_package my_package.vhd

然后在./uses_my_package/uses_my_package.vhd

library IEEE;
use IEEE.std_logic_1164.all;

entity uses_my_package is
  port(
    vector_in : in std_logic_vector(3 downto 0);
    vector_out : out std_logic_vector(3 downto 0));
end uses_my_package;

architecture impl of uses_my_package is
begin
  vector_out <= vector_in;
end impl;

和./uses_my_package/testbench.vhd:

library IEEE;
use IEEE.std_logic_1164.all;
library work;
use work.my_package.all;

entity testbench is
end testbench;

architecture tb of testbench is
  component uses_my_package is
    port (
      vector_in : in std_logic_vector(3 downto 0);
      vector_out : out std_logic_vector(3 downto 0));
  end component;

  signal vector_in_signal : std_logic_vector(3 downto 0);
  signal vector_out_signal : std_logic_vector(3 downto 0);
  constant clk_period : time := 1 ms;

begin
  dut : uses_my_package
    port map (vector_in_signal, vector_out_signal);

  process
  begin
    vector_in_signal <= "0000";
    wait for clk_period;
    assert vector_out_signal = my_constant report "fail 0000" severity error;
    vector_in_signal <= "1111";
    wait for clk_period;
    assert vector_out_signal = my_constant report "fail 1111" severity error;
    wait;
  end process;

end tb;

有人能告诉我如何编译这个程序或者指向我关于ghdl中的包和库的教程吗?我的google-foo目前看起来很安静。感谢您!

1 个答案:

答案 0 :(得分:2)

据我所知,你的代码是有效的(除了import实际上没有!)所以你的问题是关于编译命令行的吗?

因为你把源文件放在不同的目录中,以保持包和他们的客户分开,所以会出现这个小小的速度障碍......

好的,这是一个很好的做法,你只需要在命令行中包含这些目录的路径。

本着保持结构整洁的精神,不仅要将构建对象堆放在根目录中,还要为它们创建一个文件夹。所以这是一种方法......

uses_my_package.vhd

这仍然使用默认库“work”来处理所有事情。您在测试平台中不需要mkdir build cd build ghdl -a ../my_package/my_package.vhd ghdl -a ../uses_my_package/uses_my_package.vhd ghdl -a ../uses_my_package/testbench.vhd ghdl -e testbench ghdl -r testbench 声明来执行此操作,它隐式可见。你只需要library work;子句就可以了。

如果要将包移动到不同的库use,只需在编译时在命令行中指定...

mylib

(注意:一个细微之处。对my_package.vhd中ghdl -a --work=mylib ../my_package/my_package.vhd 的任何引用现在都引用work,所以如果my_package.vhd包含行mylib,你还必须编译my_secret_package。 vhd进入mylib。这样可以保持库抽象清晰,除非另外明确指定,否则mylib中的所有内容都只引用mylib)

在测试平台中从该库中使用它非常明显:用

替换当前的库/ use子句
use work.my_secret_package.all;

就是这样......