You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GHDL-4.0.0编译VHDL时无法找到包中定义的函数

GHDL编译VHDL包函数引用错误解决

问题场景

使用GHDL-4.0.0编译引用独立VHDL包函数的实体时,出现编译错误:

error: no declaration for "bmax_calc"

可复现源码如下:

common.vhd

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.math_real.all;

package common is
    function Bmax_calc(Bin : natural; R : natural; N : natural; M : natural) return natural;
end package;

package body common is
    function Bmax_calc(Bin : natural; R : natural; N : natural; M : natural) return natural is
        constant a : real := real(R*M);
        constant b : real := log2(a);
        constant c : real := real(real(N) * b);
    begin
        return natural(c) + Bin;
    end function;
end package body;

mydesign.vhd

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;

entity mydesign is
    generic (
        Bin : natural := 24;
        R : natural := 8;
        N : natural := 3;
        M : natural := 1
    );
    port (
        clk : in std_logic;
        data_i : in signed(Bin - 1 downto 0);
        data_o : out signed(Bin - 1 downto 0)
    );
end mydesign;

architecture arch of mydesign is
    constant Bmax : integer := Bmax_calc(Bin, R, N, M);
    subtype regsize is signed(Bmax - 1 downto 0);
    signal int_r, int_out : regsize := (others => '0');
begin
    process(clk)
    begin
        if (rising_edge(clk)) then
            data_o <= data_i;
        end if;
    end process;
end arch;

build.sh

#!/usr/bin/bash
mkdir build
cd build
ghdl -a ../common.vhd
ghdl -a --ieee=synopsys ../mydesign.vhd
ghdl -e mydesign

控制台输出

../mydesign.vhd:22:36:error: no declaration for "bmax_calc"
        constant Bmax : integer := Bmax_calc(Bin, R, N, M);
                                   ^

疑问:是否需要在编译时显式指定包?GHDL不支持引用包中的函数吗?或者还有其他可能的问题?


问题原因与解决方法

核心问题

你没有在mydesign.vhd中导入自定义的common包。GHDL完全支持VHDL包的函数引用,错误的本质是编译器在当前可见范围内找不到Bmax_calc的声明。

VHDL中,自定义包编译后默认存放在work库(默认工作库),使用前必须通过library声明库,并通过use语句导入包内的内容。

具体修改步骤

  1. 修改mydesign.vhd,添加包导入语句
    在现有的library和use语句后,添加:
library work;
use work.common.all;

同时建议移除冲突的std_logic_unsigned包(因为你使用了signed类型,numeric_std是标准的有符号/无符号类型处理包,两者共存可能引发歧义)。修改后的mydesign.vhd如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
-- 移除std_logic_unsigned,避免与numeric_std冲突
library work;
use work.common.all;

entity mydesign is
    generic (
        Bin : natural := 24;
        R : natural := 8;
        N : natural := 3;
        M : natural := 1
    );
    port (
        clk : in std_logic;
        data_i : in signed(Bin - 1 downto 0);
        data_o : out signed(Bin - 1 downto 0)
    );
end mydesign;

architecture arch of mydesign is
    constant Bmax : integer := Bmax_calc(Bin, R, N, M);
    subtype regsize is signed(Bmax - 1 downto 0);
    signal int_r, int_out : regsize := (others => '0');
begin
    process(clk)
    begin
        if (rising_edge(clk)) then
            data_o <= data_i;
        end if;
    end process;
end arch;
  1. 无需修改build.sh
    你的编译脚本已经先编译了common.vhd,它会被存入当前目录的work库,后续编译mydesign.vhd时会自动从work库查找导入的包。

额外说明

  • 如果自定义包不在work库(比如你指定了其他库),需要在编译时用--workdir或-P参数指定库路径,同时在代码中声明对应库。
  • VHDL对大小写不敏感,但保持函数名和包名的大小写一致可以提升代码可读性。

内容的提问来源于stack exchange,提问作者mnemocron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 18:32:09