0

我正在尝试在 ghdl 中使用我自己的包。有人可以帮我解决结构和编译问题。目前我的代码如下所示:

在 ./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 目前似乎很虚弱。谢谢!

4

1 回答 1

4

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

小减速带的出现是因为您将源文件放在不同的目录中,以保持包和它们的客户端分开......

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

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

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,只需在编译时在命令行中指定...

ghdl -a --work=mylib ../my_package/my_package.vhd

(注意:一个微妙之处。对workmy_package.vhd 内部的任何引用现在都是引用,mylib因此如果 my_package.vhd 包含use work.my_secret_package.all;您还必须将 my_secret_package.vhd 编译到 mylib 中的行。这使库抽象保持干净,mylib 中的所有内容仅引用 mylib除非另有明确说明)

在测试台中从该库中使用它非常明显:将当前库/使用子句替换为

library mylib;
use mylib.my_package.all;

就是这样……

于 2017-01-15T13:46:55.450 回答