我有一个带有通用参数列表的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)
答案 0 :(得分:2)
好问题。我有时觉得需要&#34; OUT模式泛型&#34;也可以在体系结构中计算其实际值,再次允许层次结构中的更高级别知道(并调整)处理单元的管道深度。
可能值得写一个提议,允许VHDL-201x中的某种类型并将其提交给standards group,但同时我们必须忍受我们拥有的东西。
我的正常解决方案是使用与单元关联的包,同时保存初始常量(而不是通用)和从属量。这限制了封装破坏&#34;那些use
包裹的编制单位,使它们至少容易识别。
在包中,常量被推迟,或者无参数(不纯)函数,这些都是相同的。
我还没有探索过一种可能的方法,即PORT list
之后的实体声明也允许零个或多个entity_delarative_item
。如果这些可能包含函数声明,那么我们可能会以这种方式返回此类信息。
实体声明还可能包含begin
和一些被动构造 - 例如断言一组泛型和端口宽度是一致的。这样你就必须输入所有必需的值,但是至少构建将失败报告错误,例如, width
和depth
不一致。
答案 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理论报告讨论了与在架构内设置属性有关的问题:
- 这种能力会极大地(并且消极地)影响至少一些 实现。一种直截了当的实施方法 规范是用信息装饰命名实体 包含在规范中。 然而,当实体出现时 一个设计单位和适用的规范出现在另一个, 结果很多。没有,就无法分析规范 修改包含实体的库单元,这可能导致 潜在的循环依赖链。 而且,多重 对应于给定实体接口的体系结构不能各自 为某些接口驻留的属性提供不同的值 实体。最后,如果有一个架构,则没有LRM要求 属性一些接口驻留实体,然后所有必须,似乎 可取的。
醇>
您可以注意到,依赖于泛型的属性也可能存在不需要的循环依赖关系。或者类似于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
泛型进行比较。
如果请求的DELAY
和ACTUAL_DELAY
相同,则表示一切正常。
如果请求的DELAY
超过ACTUAL_DELAY
,则架构可以插入管道阶段以满足请求。整体设计将按预期运行,但它可能会消耗更多的寄存器而不是严格必要的。
否则无法满足请求的延迟,并且架构以严重性FAILURE声明。