GHDL指定--ieee=synopsys选项仍无法识别Synopsys的std_logic_textio包怎么办?
看起来你已经做了不少尝试——指定--ieee=synopsys编译选项、甚至更换了LLVM后端,但还是栽在找不到std_logic_textio包的问题上。结合你给出的环境信息(GHDL 0.35-dev、系统里存在对应包的源文件),这个问题大概率是Synopsys版本的IEEE库没有被正确预编译,或者GHDL没找到预编译后的库文件。下面是一步步的解决方法:
1. 手动预编译Synopsys版IEEE库
GHDL不会自动预编译所有版本的库,默认可能只处理了标准IEEE库。你需要手动编译Synopsys扩展库:
# 导入Synopsys库的所有源文件 ghdl -i --ieee=synopsys -fexplicit /usr/local/lib/ghdl/src/synopsys/*.vhdl # 编译生成可使用的库文件 ghdl -m --ieee=synopsys ieee
执行完这两条命令后,GHDL就会把Synopsys版本的IEEE库预编译到默认的库目录(一般是~/.ghdl/或系统级的/usr/local/lib/ghdl/下)。
2. 修正测试文件的编译命令
编译你的system_tb.vhd时,除了--ieee=synopsys,可以额外指定库的搜索路径,确保GHDL能找到刚预编译的Synopsys库:
ghdl -a --ieee=synopsys -P/usr/local/lib/ghdl/src/synopsys/ system_tb.vhd
如果预编译后的库文件在~/.ghdl/ieee/目录下,就把-P后面的路径换成这个。
3. 检查代码里的库引用是否正确
确保你的VHDL代码开头的库引用没有问题,必须明确引用std_logic_textio:
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_textio.all; -- 这一行不能少,且要放在ieee库引用之后
毕竟std_logic_textio是Synopsys对IEEE库的扩展,只有指定--ieee=synopsys时,GHDL才会把它归到ieee库下。
4. 清理旧编译产物重试
有时候残留的旧编译文件会导致冲突,先清空它们再重新编译:
rm -rf *.o *.cf work-obj93.cf
然后重新执行预编译库和编译测试文件的步骤。
如果以上方法都试过还是不行,考虑升级你的GHDL版本——0.35-dev是2017年的旧版本,后续的GHDL对Synopsys库的支持做了不少优化,新版本大概率能解决这类兼容性问题。
内容的提问来源于stack exchange,提问作者JCLL

