3

我试图用 GHDL 模拟 Xilinx GTXE2 收发器。在 GTXE2_CHANNEL.vhd 中,我收到一个错误,即在库“ieee”中找不到“std_logic_arith”。

首先,这是我的机器设置:

所以问题1:这个包是否包含在GHDL中?

我试图将 VHDL 标准更改为 VHDL-2008 --std=08,但是 ghdl 无法识别此选项,因此我目前正在使用 VHDL-2002 进行编译。但什么都没有改变。

我还尝试从 Xilinx 的 vhdl 源文件夹中手动包含 IEEE 源C:\Xilinx\14.7\ISE_DS \ISE\vhdl\src\ieee。但是,当我编译std_logic_arith时,它会抱怨缺少std_logic_1164,这通常是可以找到的。除此之外,std_logic_1164中的 FOREIGN 属性也存在问题。

所以这是我要编译的文件列表/编译顺序(Xilinx' *.prj-files 的修改版本):

# board and device configuration
#vhdl poc       "tb/common/my_config_KC705.vhdl"

# IEEE packages
#xilinx ieee    "ieee/std_logic_1164.vhd"
#xilinx ieee    "ieee/std_logic_arith.vhd"

# Xilinx Packages and Primitives
xilinx unisim   "unisims/unisim_VCOMP.vhd"
xilinx unisim   "unisims/unisim_VPKG.vhd"
xilinx work     "unisims/primitive/FD.vhd"
xilinx work     "unisims/primitive/BUFG.vhd"
xilinx work     "unisims/primitive/BUFR.vhd"
xilinx work     "unisims/secureip/GTXE2_CHANNEL.vhd"

该列表被翻译成 GHDL 命令,这些命令在临时目录中执行:

C:\Program Files (x86)\GHDL\0.31\bin\ghdl.exe -a --std=02 -P. --work=poc "D:\VHDL\git\SATAController\lib\PoC\tb\common\my_config_KC705.vhdl"
GHDL Messages:
  D:\VHDL\git\SATAController\lib\PoC\tb\common\my_config_KC705.vhdl:52:14:warning: package "my_config" does not require a body
C:\Program Files (x86)\GHDL\0.31\bin\ghdl.exe -a --std=02 -P. --work=unisim "C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\unisims\unisim_VCOMP.vhd"
C:\Program Files (x86)\GHDL\0.31\bin\ghdl.exe -a --std=02 -P. --work=unisim "C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\unisims\unisim_VPKG.vhd"
C:\Program Files (x86)\GHDL\0.31\bin\ghdl.exe -a --std=02 -P. --work=work "C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\unisims\primitive\FD.vhd"
C:\Program Files (x86)\GHDL\0.31\bin\ghdl.exe -a --std=02 -P. --work=work "C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\unisims\primitive\BUFG.vhd"
C:\Program Files (x86)\GHDL\0.31\bin\ghdl.exe -a --std=02 -P. --work=work "C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\unisims\primitive\BUFR.vhd"
C:\Program Files (x86)\GHDL\0.31\bin\ghdl.exe -a --std=02 -P. --work=work "C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\unisims\secureip\GTXE2_CHANNEL.vhd"
GHDL Messages:
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\unisims\secureip\GTXE2_CHANNEL.vhd:34:10: primary unit "std_logic_arith" not found in library "ieee"

最后是ieee.std_logic_1164中的 FOREIGN 属性错误:

PS D:\VHDL\git\SATAController\lib\PoC\temp\ghdl> & 'C:\Program Files (x86)\GHDL\0.31\bin\ghdl.exe' -a --std=02 '-P.' --work=ieee 'C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd'
GHDL Messages:
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:211:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:212:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:213:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:214:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:215:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:216:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:218:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:219:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:220:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:221:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:223:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:224:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:225:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:227:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:228:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:229:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:231:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:232:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:233:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:235:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:236:15: value of 'FOREIGN attribute does not begin with VHPIDIRECT
  C:\Xilinx\14.7\ISE_DS\ISE\vhdl\src\ieee\std_logic_arith.vhd:238:15: 'FOREIGN allowed only for architectures and subprograms

问题2:如何编译ieee.std_logic_1164?

每个安装了 GHDL 环境的人都可以测试这个示例。赛灵思库不需要 my_config_KC705.vhdl。


这样做的目的是什么?

  • iSim 模拟非常慢 -> 大约 15 ns sim-time 在 1 秒 cpu-time 中计算;100 us -> 40 分钟的等待
  • iSim 使用大约 2.6 GiB 的主存储器 - 可能是 GHDL 更节省
  • xSim 对我们的 VHDL 库有些抱怨 - 所以 iSim 目前是选项 #1
  • 我之前用 Xilinx 原语测试过 GHDL 并且它工作正常,所以下一个挑战是模拟一个 secureip 组件 :)
  • 如果我有足够的时间,我也会尝试 QuestaSim
4

1 回答 1

6

是的,这个包包含在 ghdl

在 ghdl 手册或手册页中,您会发现您可以选择--ieee=synopsys--ieee=mentor作为命令行选项来进行分析和详细命令。

查看您的库目录:

david_koontz@Macbook: ls /opt/ghdl/ghdl_mcode/libraries/synopsys
std_logic_arith.vhdl      std_logic_misc.vhdl       std_logic_textio.vhdl
std_logic_misc-body.vhdl  std_logic_signed.vhdl     std_logic_unsigned.vhdl

david_koontz@Macbook: ls /opt/ghdl/ghdl_mcode/libraries/mentor
std_logic_arith.vhdl       std_logic_arith_body.vhdl

你会找到 package std_logic_arith

因为存在相互冲突的声明,您会发现在分析和详细说明期间还需要使用-fexplicit命令行选项。

分析 ( -a) 或细化 ( -e) 期间给出的选项遵循命令。

如何编译 ieee.std_logic_1164?

您不需要分析 package ieee.std_logic_1164,它们是预先分析的。首先尝试上述方法(更常见的是 synopsys)。请注意,指导者和 synopsys 包都不包含任何 FOREIGN 属性。FOREIGN 属性修饰以外语编程语言实现的子程序声明(函数)。

info ghdlghdl.htmlGHDL 指南)第 5 节VHDL 的 GHDL 实现(使用供应商库的小节,它提供了一些关于处理 unisim 的建议)。还有一节与其他语言的接口处理如何使用 FOREIGN 属性。

另请参阅3.10 IEEE library pitfalls,解释非 IEEE '标准' 库的问题,撇开 Tristan 的非母语英语拼写错误。

如果您真的想自己分析 IEEE 库,请先阅读整个GHDL 指南。它涉及应首先了解的几个命令行选项。Windows ghdl 发行版基于即时代码生成系统 (mcode),该系统将代码分析为库文件(以 .cf 后缀结尾),并在细化过程中重新分析在您的发行版库中找到的完全相同的源代码。

我已经在 OS X 下的 ghdl 的 mcode 版本上成功地分析和使用了 unisim 库,而无需修改 IEEE 库。

您会发现 ghdl 在内存利用率方面不是最节俭的,也不是最快的。

您还可以加入一个Ghdl 讨论邮件列表。ghdl 正在 Sourceforge 上积极开发。请参阅ghdl-updates。ghdl-0.32 应该会在今年发布(希望如此),并且会增加对 -2008 的支持以及无数的修复。

Windows 版本可能是取代 mcode 版本(它是 32 位二进制文​​件)的新解释版本。目前所有的开发工作都由 Tristan Gingold 单独完成。他还实现了一个全方位的 LLVM 后端版本,它有望在 Windows 上实现更好的性能。

关于 FOREIGN 属性

我发现我有几个包含 FOREIGN 属性的 Xilinxstd_logic_arith包源文件,尽管行号减少了四。

属性和编译器编译指示的组合,例如:

  -- pragma map_to_operator MULT_TC_OP
  -- pragma type_function MULT_SIGNED_ARG
  -- pragma return_port_name Z

用于允许加速功能执行。ghdl 无法使用外语库,mcode (Windows) 版本无论如何都无法使用它们。此外,在GHDL 指南的5.8.1 Foreign declarations中发现FOREIGN 属性的字符串值包含前缀为“VHPIDIRECT”的要求是在 gcc 版本中启用链接的限制,如果找到这些库的 ABI,则不能保证无论如何都要兼容。

您可以简单地注释掉错误消息中找到的属性。没有加速执行的可能性,这无论如何都需要 ghdl 的 gcc 版本。

与使用 ghdl 的 Synopsys 软件包相比,没有性能优势。

于 2014-09-14T21:19:08.533 回答