Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vhdl 如何使图书馆工作?_Vhdl - Fatal编程技术网

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
中,所以没有混淆


脚注:。

哦,干得好。我怎么恨你?让我数一数

  • 当一切正常工作时,代码依赖于编译顺序。最后一件事是什么坚持
  • 代码容易出现冗余。每个单个常量必须命名为完全不同的名称,这在大型设计中几乎是不可能的
  • 用于在多个位置声明
    组件
    。这些
    组件
    声明经常冲突
  • 我已经看到在多个包文件中定义了相同的常量和类型,一次又一次地发生冲突
  • 没有杠杆作用的能力
  • 请,请,请使用图书馆!他们在那里是有原因的。它使您的代码更具组织性、灵活性和可移植性

    组织机构

    库应该位于其自己的文件夹中。我喜欢将所有内容放在一个顶级文件夹下,例如UART。在这下面我将有4个目录:build、source、sim、docs。这样,您的模拟和文档都将与库代码一起传递!多甜蜜啊!?你不必担心在哪里可以找到那个愚蠢的UART sim卡,你永远都知道它在哪里。顺便说一句,这意味着自检测试台是强制性的!我的主张是一样的

    灵活便携

    如果您正在为一个项目编写代码,您将进行假设。“哦,我的时钟是25MHz,所以我可以让它成为常数。”但如果你为一个库编写代码,你就会意识到你在做错误的假设。在UART示例中,您需要将波特率设置为
    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