gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:47:37 26 4
gpt4 key购买 nike

此代码适用于一些工具

  • 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 被声明为常量 记录,我希望它能工作...

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

最佳答案

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

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

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

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 之前,聚合不能是本地静态的。聚合是一种表达式,它是“定义值计算的公式”,以前对于常量声明值表达式始终是全局静态的。

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

根据 EDA playground session from your comment 使用 Aldec Riviera Pro 分析您的代码使用了 -2008 兼容标志:

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

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

关于VHDL 案例选择不是局部静态的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60188929/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com