在ghdl中使用包
use package in ghdl
我正在尝试在 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 目前似乎很虚弱。谢谢!
据我所知你的代码是有效的(除了 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
这仍然对所有内容使用默认库 "work"。您不需要在测试台中使用 library work;
声明来执行此操作,它是隐式可见的。您只需要现有的 use
子句即可。
如果你想将你的包移动到不同的库中,mylib
,只需在编译时在命令行中指定...
ghdl -a --work=mylib ../my_package/my_package.vhd
(注意:一个微妙之处。在 my_package.vhd 中对 work
的任何引用现在都是对 mylib
的引用,因此如果 my_package.vhd 包含行 use work.my_secret_package.all;
你还必须将 my_secret_package.vhd 编译成 mylib。这可以保持库抽象的干净,mylib 中的所有内容都只引用 mylib,除非另有明确说明)
在测试台中从该库中使用它非常明显:将当前的 library/use 子句替换为
library mylib;
use mylib.my_package.all;
就是这样...
我正在尝试在 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 目前似乎很虚弱。谢谢!
据我所知你的代码是有效的(除了 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
这仍然对所有内容使用默认库 "work"。您不需要在测试台中使用 library work;
声明来执行此操作,它是隐式可见的。您只需要现有的 use
子句即可。
如果你想将你的包移动到不同的库中,mylib
,只需在编译时在命令行中指定...
ghdl -a --work=mylib ../my_package/my_package.vhd
(注意:一个微妙之处。在 my_package.vhd 中对 work
的任何引用现在都是对 mylib
的引用,因此如果 my_package.vhd 包含行 use work.my_secret_package.all;
你还必须将 my_secret_package.vhd 编译成 mylib。这可以保持库抽象的干净,mylib 中的所有内容都只引用 mylib,除非另有明确说明)
在测试台中从该库中使用它非常明显:将当前的 library/use 子句替换为
library mylib;
use mylib.my_package.all;
就是这样...