Vhdl 如何使图书馆工作?
在我的同行中,有人担心使用当前工作库的名称作为Vhdl 如何使图书馆工作?,vhdl,Vhdl,在我的同行中,有人担心使用当前工作库的名称作为work(指向当前库的别名),而不是显式使用名称(例如mylib) 例如,如果要引用同一库中的其他设计单元,可以执行以下操作: my_inst : entity work.my_design 或 我觉得使用work更灵活,因为它不依赖于您将设计编译到的库的名称。您可以将mylib重命名为myawesomelib,它仍然可以工作 我能想到的一个明显的例子是,如果您通常将设计单元和测试台编译到同一个库中,work。那么,在您的测试台中,通过工作引用您的
work
(指向当前库的别名),而不是显式使用名称(例如mylib
)
例如,如果要引用同一库中的其他设计单元,可以执行以下操作:
my_inst : entity work.my_design
或
我觉得使用work
更灵活,因为它不依赖于您将设计编译到的库的名称。您可以将mylib
重命名为myawesomelib
,它仍然可以工作
我能想到的一个明显的例子是,如果您通常将设计单元和测试台编译到同一个库中,work
。那么,在您的测试台中,通过工作
引用您的UUT(设计)总是安全的
一个缺点是,如果(如上例所示)myu design
不再位于同一个库中,则设计将停止工作;如果将my_design
或任何使用my_design
至work
的设计分离,则设计将被破坏,必须更新参考
使用work
而不是显式的库名是否还有其他明显的缺点?在分级使用工作的情况下
是否存在混淆哪个库是“当前工作库”的可能原因
例如:
mylib1
(top_design.vhd)
...
my_inst1 : entity mylib2.my_design
...
mylib2
(my_design.vhd)
...
my_inst2 : entity work.my_sub_design
...
编译top_design.vhd时,是否对mylib2
中包含的设计中的工作
参考存在任何混淆?或者因为my_design.vhd
已经编译到mylib2
中,所以没有混淆
脚注:。哦,干得好。我怎么恨你?让我数一数
组件
。这些组件
声明经常冲突李>
generic
而不是常量。这使您的代码更灵活,更易于他人使用
包文件
每个库应该有一个包文件。所有组件都应包含在此包文件中。这样,如果实体发生更改,则只需更新包文件中的组件。包文件应包含该库中使用的所有常量、函数和过程。同样,这允许您在1个位置更改某些内容
结论
库是制作深思熟虑的、可重用的、易于移植的代码的方法。当我看到所有代码都编译成工作时,我会畏缩。我避免使用
work
,因为它隐藏了您希望在其中找到标识符的上下文。将库名包括在内,例如使用mylib.foo
可以明确说明您所指的foo
是什么,而不是当前库中的某个位置的work.foo
。如果要从库外部引用foo
,则无论如何都不能使用work
,因此,根据您在层次结构中的位置,最终可能会使用不同名称引用的相同对象
随意更改库名的灵活性在现实世界中并不特别有用,只会造成不必要的复杂性。使用名为
work
的默认库以及工具处理此问题的不同方式,这进一步加剧了这种情况。选择一个好的库名并坚持使用它。我发现work
最终成为那些懒得将可重用代码划分为逻辑分区的人的拐杖。i、 e.把所有的问题都抛到工作中
,希望没有冲突。我认为这是一个有趣的问题,因为没有明确的答案。视情况而定。对我来说,这取决于项目背景,也取决于个人偏好
@乔希。我不认为在重构库时,您可能必须更改工作
引用的风险是反对使用工作
的理由。命名引用也是如此
@拉塞尔。使用包而不是直接实例化仍然会给您留下这样一个问题:在中x使用x.uart\u pkg.all代码>应该是。不过,您将拥有更少的引用(以牺牲包中的更多代码为代价)
@凯文。我同意mylib.foo
更为明确,但我不认为我知道哪个foo
被编译成mylib
,但我不知道
mylib1
(top_design.vhd)
...
my_inst1 : entity mylib2.my_design
...
mylib2
(my_design.vhd)
...
my_inst2 : entity work.my_sub_design
...
o-netlist (precompiled netlists for a specific FPGA device)
| o-<FPGA-NAME>
| o-mem
| o-ocram
o-sim (waveform configuration files: *.wcfg, *.wdo, *.gtkw)
| o-io
| | o-iic
| | o-uart
| o-mem
| | o-ocram
o-src (sources as *.vhdl or *.v files)
| o-io
| | o-iic
| | o-uart
| o-mem
| | o-ocram
o-tb (testbenches as *.vhdl or *.v files)
| o-io
| | o-iic
| | o-uart
| o-mem
| o-ocram
o-xst (synthesis instruction to generate netlists of components)
| o-mem
| o-ocram