我在VHDL包中有几个函数和过程。我想问一下是否有办法忽略这些项目。我知道港口地图的 open 关键字。我正在使用分配给程序的虚拟信号。但这可能是更有效的方法。
¿VHDL有这样的事情吗?如果我将输出信号设置为打开,则会出现以下错误:"模式输出的正式 e5 必须具有关联的实际值"
提前感谢,安东尼奥
已编辑:代码
procedure reg2ind
(signal reg : in std_logic_vector(15 downto 0);
signal e1,e2,e3,e4,e5,e6,e7,e8 : out std_logic;
signal e9,e10,e11,e12,e13,e14,e15,e16 : out std_logic) is
begin
e1 <= reg(0);
e2 <= reg(1);
e3 <= reg(2);
e4 <= reg(3);
e5 <= reg(4);
e6 <= reg(5);
e7 <= reg(6);
e8 <= reg(7);
e9 <= reg(8);
e10 <= reg(9);
e11 <= reg(10);
e12 <= reg(11);
e13 <= reg(12);
e14 <= reg(13);
e15 <= reg(14);
e16 <= reg(15);
end reg2ind;
当我使用它时:
reg2ind(val183,ord_p.err.err_17,ord_p.err.err_18,
ord_p.err.err_19,ord_p.err.err_20,open,open,open,open,open,open,
open,open,open,open, open,open);
MCVE对于理解分析误差并不重要。
参见IEEE Std 107-2008,10.7程序调用语句,第4段:
见4.2分对于过程的每个形式参数,过程调用应只指定一个相应的实际参数。此实际参数由关联列表中的关联元素(实际打开元素除外)显式指定,如果没有此类关联元素,则由默认表达式指定(请参阅 6.5.2)。
项程序声明,4.2.2.3信号参数第1段:
对于类信号的形式参数,对信号和/或信号驱动器的引用将传递到子程序调用中。
以及第6段:
如果实际信号与任何模式的信号参数相关联,则实际信号应用静态信号名称表示。如果转换函数或类型转换出现在将实际信号与形式信号参数相关联的关联元素的正式部分或实际部分中,则为错误。
另见14.6 动态阐述,第2,b)(部分):
子程序调用的执行涉及参数关联列表的详细说明。
动态阐述与 open 不兼容,后者会删除对同一过程的其他调用可能需要的驱动程序。
所以规则如4.2子程序声明所示,4.2.2.3信号参数第6段要求实际为静态信号名称。
这个过程的特定示例并不有趣,只是将数组输入的元素分配给信号输出。
MCVE:
library ieee;
use ieee.std_logic_1164.all;
entity foo is
end entity;
architecture fum of foo is
procedure reg2ind
(signal reg : in std_logic_vector(15 downto 0);
signal e1,e2,e3,e4,e5,e6,e7,e8 : out std_logic;
signal e9,e10,e11,e12,e13,e14,e15,e16 : out std_logic) is
begin
e1 <= reg(0);
e2 <= reg(1);
e3 <= reg(2);
e4 <= reg(3);
e5 <= reg(4);
e6 <= reg(5);
e7 <= reg(6);
e8 <= reg(7);
e9 <= reg(8);
e10 <= reg(9);
e11 <= reg(10);
e12 <= reg(11);
e13 <= reg(12);
e14 <= reg(13);
e15 <= reg(14);
e16 <= reg(15);
end procedure reg2ind;
signal val183: std_logic_vector (15 downto 0);
type err_record is
record
err_17: std_logic;
err_18: std_logic;
err_19: std_logic;
err_20: std_logic;
end record;
type some_record is
record
err: err_record;
end record;
signal ord_p: some_record;
signal open5, open6, open7,
open8, open9, open10,
open11, open12, open13,
open14, open15, open16: std_logic;
begin
reg2ind(val183,ord_p.err.err_17,ord_p.err.err_18,
ord_p.err.err_19,ord_p.err.err_20,open5,open6,open7,open8,open5,open6,
open7,open8,open9,open10, open11,open12); -- with dummy outputs
-- reg2ind(val183,ord_p.err.err_17,ord_p.err.err_18,
-- ord_p.err.err_19,ord_p.err.err_20,open,open,open,open,open,open,
-- open,open,open,open, open,open); -- as presented FAILS
end architecture;
感兴趣的读者可以探索使用基于信号的参数的局限性。
最简单的解决方案可能是使用聚合赋值目标,其中元素重新排列以匹配实际的顺序,而不是过程调用:
(ord_p.err.err_20, ord_p.err.err_19, ord_p.err.err_18, ord_p.err.err_17) <=
val183(3 downto 0);
重新排列目标允许右侧是切片名称,而不是也需要限定表达式的聚合。与过程调用相比,这文本复杂性更低。
通过使用过程调用隐藏详细信息的任何动力都可能伴随着提供具有较少参数的过程。
函数调用是表达式,在语义上不可能忽略它们的结果值。您可以将包含函数调用或过程调用语句的语句括在条件执行的语句(例如 if 语句、case 语句)中。