我有一个带有通用参数列表的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 …
我的测试平台使用在modelsim包(init_signal_spy)中定义的函数.所以我不能将这个测试平台用于与ModelSims vsim不同的模拟器,例如Candence的ncsim.但是在cadence包中有一个与ncsim(nc_mirror)等效的函数.解决方案是我需要有两个不同的测试平台.
但我只想使用一个.一种解决方案可能是,仅在设置了某个常量时才定义包.但我不知道这是否可行.