我可以从外部访问实例化实体中的常量吗?

时间:2015-06-01 01:18:34

标签: vhdl

我有一个带有通用参数列表的VHDL实体。该实体的体系结构计算了几个常量,这些常量是创建预期功能所必需的。

是否可以从外部访问其中一个常量?

示例1:
假设有一个FIFO根据DEPTH和OUTREG决定最佳实现是什么(基于寄存器,基于SRL或基于BlockRAM)。根据这一点,通过FIFO的最小延迟可以在1到2个周期之间变化。

示例2:
考虑相同的FIFO是交叉时钟兼容的。现在最小延迟还取决于选择的同步电路和频率差。

示例3:
除法实体需要N个周期来计算 a div b 。 N取决于BITS,RADIX,OUTREG,IS_SIGNED,......

进一步说,每个实体都有一个类型为NATURAL的MIN_DELAY常量,这对其他实例很有用。

E.g。实例化实体需要知道它必须至少等待一个结果。

我可以想到2个解决方案,但我认为两者都不是很好。

解决方案1:
我可以将算法存储在一个包中,因此它可以全局访问。但这违反了封装原则:)。外界只需要知道延迟值而不是算法。

解决方案2:
我可以使用有效位。这在动态,自适应或流水线系统中始终是一个很好的解决方案,但是这个位不能在合成时用于进一步的选择或优化。

可能的解决方案3:
VHDL能够定义新属性,但是可以访问它们吗?

示例实体:alu_div:

constant MIN_DELAY : NATURAL := BITS / log2(RADIX) + 2;
attribute DELAY   : NATURAL;
attribute DELAY of alu_div : entity is MIN_DELAY;

示例顶部:

mydiv : entity work.alu_div
   generic map (....)
   port map (....);

blk : block
  constant my : NATURAL := mydiv'delay;
begin
  ....
end block;

新:可能的解决方案4:
我发现了这个SE问题,其中 Jim Lewis 注意到分层引用也应该与常量一起使用 alias MY_DELAY is <<constant mydiv.DELAY : NATURAL >>;
Get internal signals of vhdl design in ncvhdl (alternative to modelsim's signal spy)

4 个答案:

答案 0 :(得分:2)

好问题。我有时觉得需要&#34; OUT模式泛型&#34;也可以在体系结构中计算其实际值,再次允许层次结构中的更高级别知道(并调整)处理单元的管道深度。

可能值得写一个提议,允许VHDL-201x中的某种类型并将其提交给standards group,但同时我们必须忍受我们拥有的东西。

我的正常解决方案是使用与单元关联的包,同时保存初始常量(而不是通用)和从属量。这限制了封装破坏&#34;那些use包裹的编制单位,使它们至少容易识别。

在包中,常量被推迟,或者无参数(不纯)函数,这些都是相同的。

我还没有探索过一种可能的方法,即PORT list之后的实体声明也允许零个或多个entity_delarative_item。如果这些可能包含函数声明,那么我们可能会以这种方式返回此类信息。

编辑:David指出了LRM规则(8.3),该规则阻止了当前VHDL版本的这种方法:有限放宽该规则可能是&#34; OUT模式泛型的替代方案&#34;。

实体声明还可能包含begin和一些被动构造 - 例如断言一组泛型和端口宽度是一致的。这样你就必须输入所有必需的值,但是至少构建将失败报告错误,例如, widthdepth不一致。

答案 1 :(得分:1)

同意它有时对有关实施的信息非常有用 来自实体的细节,即使它打破了封装原则,但是 对于白盒验证,它可以提供很大的帮助。

尝试使用基于实体的实体属性,如:

entity alu_div is
  generic(
    BITS  : positive;
    RADIX : positive);

  port(
    ...);
  constant MIN_DELAY : NATURAL := BITS / log2(RADIX) + 2;
  attribute DELAY   : NATURAL;
  attribute DELAY of alu_div : entity is MIN_DELAY;
end entity;

但实例化alu_div的模块无法访问它 使用例如alu_div_0'DELAY,因为ModelSim会出错:

  

没有带有指示符“DELAY”的属性规范装饰标签“alu_div_0”。

一种对白盒验证有用的方法,即验证 取决于实现,是用一个输出端口来提供信息 实施,如​​:

entity alu_div is
  ...
  port(
    ...
    DELAY_O : out natural);
  ...
end entity;

architecture syn of alu_div is
begin
  DELAY_O <= MIN_DELAY;
  ...

它不是真正的常数,因为对于模拟,它需要一个delta周期 在获得该值之前,但在许多情况下它可能是一个充分的解决方案。

答案 2 :(得分:1)

这是对Morten的第一个实体声明的修改,其中对于'module'实例化alu_div我期望有一个组件声明,它提供名称alu_div的声明。

没有属性装饰该声明,因此在标签alu_div_0找到的实例化没有属性DELAY

如果您要使用直接实体实例化,它可能会起作用:

entity alu_div is
  constant MIN_DELAY : NATURAL := 42;
  attribute DELAY   : NATURAL;
  attribute DELAY of alu_div : entity is MIN_DELAY;
end entity;

architecture foo of alu_div is

begin
end architecture;

entity test is
end entity;

architecture foo of test is

begin
alu_div_0: 
    entity work.alu_div ;

MONITOR:
    process 
    begin
        wait for 1 ns;
        report "alu_div'DELAY = " & natural'image(work.alu_div'DELAY);
        wait;
    end process;
end architecture;

给出了:

  

ghdl -a alu_div.vhdl
  ghdl -e test
  ghdl -r test
  alu_div.vhdl:25:9:@ 1ns :(报告单):alu_div'DELAY = 42
  &GT;

我们的想法是,如果您使用带有选定名称(扩展名称)的直接实体实例化,那么您将使用前缀标注的库中的声明(在本例中为WORK)。

以下演示了访问alu_div'DELAY的值可以在详细说明中完成:

entity alu_div is
 generic (pickone: natural := 1);
  constant MIN_DELAY : NATURAL := 42;
  constant TARG_DELAY:  natural := MIN_DELAY + pickone;
  attribute DELAY   : NATURAL;
  attribute DELAY of alu_div:  entity is MIN_DELAY;
  -- attribute DELAY of alu_div : entity is TARG_DELAY;
end entity;

architecture foo of alu_div is

begin
end architecture;

entity test is
end entity;

architecture fie of test is
    constant fumble: natural := work.alu_div'DELAY;
    component alu_div is
        generic (pickone: natural := 1);
    end component;
begin
alu_div_0: 
    alu_div
    generic map(1);

MONITOR:
    process 
    begin
        report "constant fumble = " & natural'image(fumble);
        report "alu_div'DELAY = " & natural'image(work.alu_div'DELAY);
        wait;
    end process;
end architecture;

这有效:

  

ghdl -a alu_div.vhdl
  david_koontz @ Macbook:ghdl -e test
  david_koontz @ Macbook:ghdl -r test
  alu_div.vhdl:60:9:@ 0ms :(报告说明):常量fumble = 42
  alu_div.vhdl:61:9:@ 0ms :(报告说明):alu_div'DELAY = 42

此外,根据Jonathan的评论,该问题试图通过泛型提供的实例化组件循环信息,我尝试将实体属性切换为依赖于泛型(使用MIN_DELAY注释掉一个),取消注释TARG_DELAY {1}})导致与Morten提供的错误不同:

  

ghdl -a alu_div.vhdl
  alu_div.vhdl:36:13:实体的属性表达式必须是局部静态的   ghdl:编译错误

这个错误在2008年LRM中非常有用并且很容易找到,并且非常具体:

  

7.2属性规范(第8段):

     

表达式为由此属性规范继承该属性的每个命名实体指定此属性的值。属性规范中表达式的类型应与相应属性声明中的类型标记相同(或可隐式转换)。 如果实体名称列表表示实体声明,体系结构主体,配置声明或声明为设计单元的未实例化包,则表达式必须是本地静态的(请参阅9.4.1)。 ...

此要求在'93 LRM(5.1属性规范)中引入。并且研究我们发现-1992标准化工作(在-1993批准)中有 out-mode generics 的提案。

同样在'87问题报告40(IR00040.txt)之后,第一份ISAC理论报告讨论了与在架构内设置属性有关的问题:

  
      
  1. 这种能力会极大地(并且消极地)影响至少一些       实现。一种直截了当的实施方法       规范是用信息装饰命名实体       包含在规范中。 然而,当实体出现时       一个设计单位和适用的规范出现在另一个,       结果很多。没有,就无法分析规范       修改包含实体的库单元,这可能导致       潜在的循环依赖链。 而且,多重       对应于给定实体接口的体系结构不能各自       为某些接口驻留的属性提供不同的值       实体。最后,如果有一个架构,则没有LRM要求       属性一些接口驻留实体,然后所有必须,似乎       可取的。
  2.   

您可以注意到,依赖于泛型的属性也可能存在不需要的循环依赖关系。或者类似于out-mode泛型,问题从分析顺序中的循环依赖(属性声明中的局部静态表达式)转移到详细顺序(评估全局静态表达式),这可能相当困难。 out-mode generics在可用记录中显示零星提及,最后一次在vhdl-200x-mp(建模和生产力)电子邮件反射器上。

如果没有人定义如何处理后期绑定(链接加载程序时间)顺序依赖性,那么这些中的任何一个都不会发生变化。

同时Brian说接受的方法是使用通常共享的包,它使用本地静态常量声明(并且依赖于声明顺序)。您还可以通过配置来管理问题。

答案 3 :(得分:1)

我使用的另一种方法是遵守所有“通用”信息流入模块的限制,方法是从派生参数中指定我想要的结果。

例如,

entity alu_div is
  generic(
    BITS  : positive;
    RADIX : positive;
    DELAY : positive);
  port(
    ...);

在体系结构中,ACTUAL_DELAY常量从其他泛型(加上端口总线宽度等)派生,并与给定的DELAY泛型进行比较。

如果请求的DELAYACTUAL_DELAY相同,则表示一切正常。

如果请求的DELAY超过ACTUAL_DELAY,则架构可以插入管道阶段以满足请求。整体设计将按预期运行,但它可能会消耗更多的寄存器而不是严格必要的。

否则无法满足请求的延迟,并且架构以严重性FAILURE声明。