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

VHDL Case choice is not locally static

此代码适用于某些工具

但其他人则不然

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;

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

因为 CMD_A 和 CMD_B 被声明为 constant 记录,我希望它能工作...

有什么妙语还是只是个坏主意?

尝试将约束放入整数。

instruction : IN INTEGER RANGE 0 TO ...;

我不确定 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

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

IEEE Std 1076-2008 修订版更改了 9.4.2 本地静态原色中的一些定义

9.4.2 Locally static primaries

An expression is said to be locally static if and only if every operator in the expression denotes an implicitly defined operator or an operator defined in one of the packages STD_LOGIC_1164, NUMERIC_BIT, NUMERIC_STD, NUMERIC_BIT_UNSIGNED, or NUMERIC_STD_UNSIGNED in library IEEE, and if every primary in the expression is a locally static primary, where a locally static primary is defined to be one of the following:

...
m) A record aggregate in which all expressions in element associations are locally static expressions.
...

在 -2008 之前,聚合不能是本地静态的。聚合是一个表达式,它是 'a formula that defines the computation of a value',以前对于常量声明值表达式总是全局静态的。

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

使用 Aldec Riviera Pro 分析您的代码根据 EDA playground session from your comment:

使用了符合 -2008 的标志

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