我正在设计一条通用数据路径,其中一部分是不同解码器使用的恒定模式。例如:
NBITS = 4->常数将为“ 1000”
NBITS = 5->常数将为“ 10000”
NBITS = 16->常量将为“ 1000_0000_0000_0000”
我发现以下方法可以解决问题: {{1}}
但是可惜没有编译并产生错误:非静态选择会排除其他选择。
如何指定作为通用参数的函数的恒定位模式?
答案 0 :(得分:4)
有一个要求,就是当一个选项有多个时,聚合必须具有本地静态选项。 (用于确定表达式值的代码是在分析时构造的。)
IEEE Std 1076-2008 9.3.3.3数组汇总第6段:
除了具有单个选择 others 的最终元素关联之外,数组集合的其余(如果有)元素关联应全部为位置或全部命名。仅当集合包含单个元素关联且该元素关联具有单个选择时,才允许数组聚合的命名关联具有非局部静态的选择,或者同样具有null范围的选择。如果适用的索引约束是局部静态的,则 others 选择是局部静态的。
可以通过详细说明(14.4.2.5对象声明)的函数调用(表达式,9.3.4函数调用)提供常量(6.4.2.2常量声明)的值表达式或变量或信号的初始表达式。 )。该功能可能不纯正(4.子程序和软件包,4.1常规,9.4.3全局静态基数,注2)。
构造Minimal, Complete, and Verifiable example可以证明这一点:
library ieee;
use ieee.std_logic_1164.all;
ravenwater_mcve is
generic (NBITS: natural := 42);
end entity;
architecture foo of ravenwater_mcve is
impure function leftbit return std_logic_vector is
variable retv: std_logic_vector (NBITS - 1 downto 0) :=
(others => '0');
begin
retv(retv'LEFT) := '1';
return retv;
end function;
constant NaR: std_logic_vector(NBITS - 1 downto 0) := leftbit;
-- (NBITS - 1 => '1', others => '0');
begin
end architecture;
MCVe进行分析,阐述和模拟。
您可以添加一个过程来确定值表达式是否正确:
RESULT:
process
begin
report "NaR = " & to_string(NaR);
wait;
end process;
如果使用-2008之前的VHDL标准修订版,请提供to_string函数:
function to_string (inp: std_logic_vector) return string is
variable image_str: string (1 to inp'length);
alias input_str: std_logic_vector (1 to inp'length) is inp;
begin
for i in input_str'range loop
image_str(i) := character'VALUE(std_ulogic'IMAGE(input_str(i)));
end loop;
return image_str;
end function;
这会产生:
ghdl -r ravenwater_mcve
ravenwater_mcve.vhdl:33:9:@ 0ms :(报告注释):NaR = 100000000000000000000000000000000000000000000000
(也许我应该为通用常量使用较小的默认值。)
您还可以将泛型的值作为参数传递给纯函数。