VHDL 案例选择不是局部静态的

Cas*_*par 2 vhdl ghdl

此代码适用于一些工具

  • Aldec Riviera Pro

但不是其他人

  • GHDL(错误选择必须是本地静态表达式)
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

ENTITY INSTRUCTION_PROCESSOR IS

    PORT (
        clk : IN std_logic;
        instruction : IN INTEGER
    );
END ENTITY INSTRUCTION_PROCESSOR;
ARCHITECTURE behavioural OF INSTRUCTION_PROCESSOR IS

    TYPE INSTRUCTION_t IS RECORD
        instr : INTEGER;
        cycles : INTEGER;
    END RECORD;

    CONSTANT CMD_A : INSTRUCTION_t := (instr => 0, cycles => 5);
    CONSTANT CMD_B : INSTRUCTION_t := (instr => 1, cycles => 3);

BEGIN
    PROCESSOR : PROCESS (clk)
        VARIABLE loop_cycles : INTEGER := 0;
    BEGIN
        IF clk'event AND clk = '1' THEN
            CASE instruction IS
                WHEN CMD_A.instr =>
                    loop_cycles := CMD_A.cycles;

                WHEN CMD_B.instr =>
                    loop_cycles := CMD_B.cycles;

                WHEN OTHERS =>
                    NULL;
            END CASE;
        END IF;
    END PROCESS;
END ARCHITECTURE;
Run Code Online (Sandbox Code Playgroud)

https://www.edaplayground.com/x/jYD

由于 CMD_A 和 CMD_B 被声明为常量记录,我希望这能起作用......

有什么智慧的话还是只是一个坏主意?

小智 6

我不确定 EDA playground 上的 ghdl-0.35 版本是否可以在--std=08不尝试的情况下处理(-2008)这个问题。最近的 ghdl-0.37-dev 版本显示它有效:

ghdl -a --std=08 instruction_processor.vhdl
ghdl -e --std=08 tb
instruction_processor.vhdl:68:8:error: for default port binding of component instance "uut":
instruction_processor.vhdl:68:8:error: type of signal interface "instruction" declared at line 56:9
instruction_processor.vhdl:68:8:error: not compatible with type of port "instruction" declared at line 9:9
instruction_processor.vhdl:68:8:error: signal interface "cycles" has no association in entity "instruction_processor"
ghdl:error: compilation error
Run Code Online (Sandbox Code Playgroud)

即使测试平台和/或实体头需要一些工作。INSTRUCTION_PROCESSOR 和 TB 都位于上面使用的同一个设计文件中。

IEEE Std 1076-2008 修订版更改了 9.4.2 Locally static primaries 中的一些定义

9.4.2 局部静态原色

当且仅当表达式中的每个运算符都表示一个隐式定义的运算符或在库 IEEE 中的包 STD_LOGIC_1164、NUMERIC_BIT、NUMERIC_STD、NUMERIC_BIT_UNSIGNED 或 NUMERIC_STD_UNSIGNED 之一中定义的运算符,并且如果在该表达式是一个本地静态主要,其中本地静态主要被定义为以下之一:

...
m) 一个记录聚合,其中元素关联中的所有表达式都是本地静态表达式。
...

在 -2008 a 之前,聚合不能是本地静态的。聚合是一个表达式,它是“定义值计算的公式”,以前对于常量声明值表达式总是全局静态的。

允许某些表达式是本地静态的来自 VHDL-200x 的努力,产生了 -2008 修订版(快速通道提案FT-22)。这个想法是具有本地静态原语的表达式,这些表达式从基本或预定义的操作中产生值,包括在上面列出的 IEEE 库包中找到的值,作为纯函数实现,不依赖于细化。为了避免混淆,过程调用是一个语句。

根据您评论中EDA 游乐场会话,使用 Aldec Riviera Pro 分析您的代码使用了 -2008 兼容标志:

https://www.edaplayground.com/x/jYD

如果由于工具链限制而需要对标准进行更早的修订,则可以用 if 语句或并发条件赋值语句替换 case 语句,这意味着和 if 语句等效。另一方面,选定的信号赋值语句意味着一个 case 语句并符合相同的语义。