Vhdl 什么是{全局|局部}静态{主|表达式|范围|子表达式},它意味着什么?

Vhdl 什么是{全局|局部}静态{主|表达式|范围|子表达式},它意味着什么?,vhdl,Vhdl,在上找到了许多问题,以引用有关非本地或全局静态的错误消息或警告 关于如何消除此类错误消息,有很多问题需要解决,但令人惊讶的是,似乎从来没有人问过static到底意味着什么 IEEE标准在§9.4中谈到了静态表达式,但其定义并不容易理解(因为它是递归的,很有趣,因此从定义上看,它本身就是静态的) 我认为在一个地方回答静态在VHDL中真正意味着什么的所有含义是很有价值的 如上面的评论所述,静态表达式基本上是可以在编译时完全评估的东西(在编译设计单元的过程中,它被定义为局部静态的,或者在评估使其全局静

在上找到了许多问题,以引用有关非本地或全局静态的错误消息或警告

关于如何消除此类错误消息,有很多问题需要解决,但令人惊讶的是,似乎从来没有人问过static到底意味着什么

IEEE标准在§9.4中谈到了静态表达式,但其定义并不容易理解(因为它是递归的,很有趣,因此从定义上看,它本身就是静态的)


我认为在一个地方回答静态在VHDL中真正意味着什么的所有含义是很有价值的

如上面的评论所述,静态表达式基本上是可以在编译时完全评估的东西(在编译设计单元的过程中,它被定义为局部静态的,或者在评估使其全局静态的完整设计的过程中)

这基本上使静态表达式在求值(“编译”)后成为常量。非常类似于C++中的CONTXPR。 这对合成有什么影响

一个有趣的用法是——考虑到本标准第9.4章中一个看似无辜的脚注:

全局静态表达式的规则意味着可以使用 非全局静态的表达式,例如,调用不纯函数。得到的常量值可能是 全局静态,即使其初始值表达式不是。仅接口常量、变量和信号声明 要求其初始值表达式为静态表达式

您可以实际使用不可合成的VHDL语句(如指针或实数),只要它们满足静态要求,即可以在编译时完全评估为可合成的结构:

architecture rtl of sintab is
    type sinus_table_type is array(natural range <>) of signed(31 downto 0);
    function sinus_table(start_value, end_value, step : real) return  sinus_table_type is
        constant table_size     : natural := 
                                  integer(ieee.math_real.ceil(
                                          end_value - start_value) / step);
        variable sintab : sinus_table_type(0 to table_size - 1);
    begin
        for i in sintab'low to sintab'high loop
            sintab(i) := to_signed(integer(
                              ieee.math_real.sin(start_value + real(i) * step) *
                              32767.0), sintab(i)'length);
        end loop;
        return sintab;
    end function sinus_table;

    function isin(sintab : sinus_table_type; us : signed) return signed is
        variable ret : signed(us'range);
    begin
        ret := sintab(to_integer(us mod sintab'length));
        return ret;
    end function isin;

    constant PI             : real := 3.1415926;
    constant stab           : sinus_table_type := sinus_table(0.0, 2.0 * PI, 0.01);
begin
    calc : process
    begin
        wait until rising_edge(clk);
        res <= isin(stab, arg);
    end process calc;
end architecture rtl;
sintab的体系结构rtl是 表类型是有符号(31到0)的数组(自然范围); 函数窦房结表(起始值、结束值、步长:实数)返回窦房结表类型为 固定表格大小:自然= 整数(ieee.math\u real.ceil( 结束值-开始值/步骤); 变量sintab:sinus_table_type(0到table_size-1); 开始 因为我在从低到高的循环中 sintab(i):=对有符号(整数)( ieee.math_real.sin(起始值+实(i)*步长)* 32767.0),sintab(i)的长度; 端环; 返回辛塔布; 终末功能表; 函数isin(sintab:sinus\u table\u type;us:signed)返回已签名 变量ret:有符号(美国范围); 开始 ret:=sintab(到_整数(us mod sintab'length)); 返回ret; 末端功能isin; 常数PI:real:=3.1415926; 恒定刺伤:窦形表类型:=窦形表(0.0,2.0*PI,0.01); 开始 计算:过程 开始 等待上升沿(clk);
res见9.4.1。我们关注局部静态(在分析或“编译”时已知)或全局静态(在链接和加载时已知)的原因与代码生成和提供值有关。对于强类型、数学意义和支持VHDL作为形式表示法(合成合格子集)能够用于形式证明,存在基于语义的限制。该标准还适用于那些实现VHDL工具的人,语义需要精确。有一个层次结构的定义、VHDL标准(词汇表、语义、BNF)、IEEE技术术语词典(最初为IEEE Std 100)和剑桥英语词典(通过参考标准合并)。语义描述是精确的,标准可以从超文本链接中受益,鼓励读者理解上下文中每个词的含义,所需的努力与奖学金相当。@ USS1155120是的,我知道标准所说的。这个问题的意思与其说是“它是什么”,不如说是“它意味着什么”。当我最初在几年前学习VHDL时,对于我来说,这基本上只是一个抽象的东西,它产生了恼人的错误信息,直到后来我才知道它是一种基本的语言特征,其他语言根本没有,或者(例如C++ TMP和<代码> CONTXPRPR < /代码>)当他们“发明”它的语义限制时,就产生了巨大的炒作。它的语义限制是基于以正式符号确保互操作性,并代表了在采用标准时利益相关方(工具供应商、学者和最终用户)的思想会合。简单地说,在VHDL语言的目标范围内,利益相关方可以达成一致。在这里,这种一致性延伸到当表达式的含义已知时,这意味着生成仿真模型代码所需的努力以及是否需要间接寻址,理解目标是正式而非抽象地描述硬件的行为。