我有一个带有通用参数列表的VHDL实体.该实体的体系结构计算了几个常量,这些常量是创建预期功能所必需的.
是否可以从外部访问这些常量之一?
示例1:
假设有一个FIFO根据DEPTH和OUTREG决定最佳实现是什么(基于寄存器,基于SRL或基于BlockRAM).根据这一点,通过FIFO的最小延迟可以在1到2个周期之间变化.
示例2:
考虑相同的FIFO与时钟兼容.现在最小延迟还取决于选择的同步电路和频率差.
示例3:
除法实体需要N个周期来计算div b.N取决于BITS,RADIX,OUTREG,IS_SIGNED,......
进一步说,每个实体都有一个类型为NATURAL的MIN_DELAY常量,这对其他实例很有用.
例如,实例化实体需要知道它必须至少等待一段时间.
我可以想到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;
Run Code Online (Sandbox Code Playgroud)
示例顶部:
mydiv : entity work.alu_div
generic map (....)
port map (....);
blk : block
constant my : NATURAL := mydiv'delay;
begin
....
end block;
Run Code Online (Sandbox Code Playgroud)
新:可能的解决方案4:
我发现了这个SE问题,其中 Jim Lewis注意到分层引用也应该与常量一起使用.
alias MY_DELAY is <<constant mydiv.DELAY : NATURAL >>;
在ncvhdl中获取vhdl设计的内部信号(替代modelsim的信号间谍)
小智 2
这是 Morten 的第一个实体声明的修改,其中对于“模块”实例化,alu_div我期望有一个组件声明,它提供 name 的声明alu_div。
没有属性装饰该声明,因此在 label 处找到的实例化alu_div_0没有 attribute 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;
Run Code Online (Sandbox Code Playgroud)
这使:
ghdl -a alu_div.vhdl
ghdl -e 测试
ghdl -r 测试
alu_div.vhdl:25:9:@1ns:(报告注释): alu_div'DELAY = 42
>
这个想法是,如果您使用带有选定名称(扩展名称)的直接实体实例化,您将使用由前缀(在本例中为 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;
Run Code Online (Sandbox Code Playgroud)
这有效:
ghdl -a alu_div.vhdl
david_koontz@Macbook: ghdl -e 测试
david_koontz@Macbook: ghdl -r 测试
alu_div.vhdl:60:9:@0ms:(报告注释): 常量摸索 = 42
alu_div.vhdl:61:9: @0ms:(报告注释): alu_div'DELAY = 42
另外,根据 Jonathan 的评论,即问题试图通过泛型提供的实例化组件循环信息,我尝试将实体属性切换为依赖于泛型(用 注释掉一个MIN_DELAY,用 取消注释一个TARG_DELAY),这会导致与以下错误不同的错误:莫滕提供:
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 年批准)。
此外,在 '87 问题报告 40 ( IR00040.txt ) 中,第一个 ISAC 基本原理报告讨论了与从体系结构内设置属性相关的问题:
- 这种能力将极大地(并且产生负面)影响至少某些实现。实现规范的一种直接方法是用规范中包含的信息来修饰命名实体。 然而,当实体出现在一个设计单元中而适用的规范出现在另一设计单元中时,就会产生许多问题。如果不修改包含实体的库单元,就无法分析规范,这可能导致潜在的依赖循环链。 此外,与给定实体接口相对应的多个体系结构不能分别向某个接口驻留实体的属性提供不同的值。最后,没有 LRM 要求,如果一种体系结构归属于某个接口驻留实体,则所有实体都必须归属,这似乎是可取的。
您可能会注意到,依赖于泛型的属性也可能会出现不需要的循环依赖关系。或者类似地,对于出模式泛型,问题从分析顺序中的循环依赖(属性声明中的本地静态表达式)转移到详细说明顺序(评估全局静态表达式),这可能会更加困难。出模式仿制药显示可用记录中偶尔提及,最后一次是在 vhdl-200x-mp(建模和生产力)电子邮件反射器上。
如果没有人定义如何处理后期绑定(链接加载时间)顺序依赖关系,这两者的状态都不太可能改变。
与此同时,正如布莱恩所说,接受的方法是使用一个共同共享的包,它使用本地静态常量声明(并且与声明顺序相关)。您还可以通过配置来管理问题。