2

此代码适用于一些工具

  • 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;

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

由于 CMD_A 和 CMD_B 被声明为常量记录,我希望这可以工作......

任何智慧之言还是只是一个坏主意?

4

2 回答 2

6

我不确定 EDA 操场上的 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

即使测试台和/或实体标头需要一些工作。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 之前,聚合不能是本地静态的。聚合是一个表达式,它是“定义值计算的公式”,以前对于常量声明值表达式总是全局静态的。

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

根据您评论中的 EDA 操场会话,使用 Aldec Riviera Pro 分析您的代码使用了符合 -2008 的标志:

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

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

于 2020-02-12T18:26:21.443 回答
0

尝试将约束放入整数。

instruction : IN INTEGER RANGE 0 TO ...;
于 2020-02-12T15:35:49.920 回答