Esta questão dá este erro (compilando com -2008 no EDA Playground)
-- Compiling architecture rtl of foo
** Error: design.vhd(31): Type error resolving infix expression "xnor" as type ieee.NUMERIC_STD.UNSIGNED.
** Note: design.vhd(31): (vcom-1499) Aggregate with a single element association must use named association.
para este código de exemplo
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;
entity foo is
port(
clk : in std_logic;
reset: in std_logic;
din : in std_logic;
dout: out unsigned(7 downto 0)
);
end entity foo;
architecture rtl of foo is
signal prbs_fb : unsigned(0 downto 0);
-- changing to std_logic makes the error go away signal prbs_fb : std_logic;
begin
process (clk)
begin
if reset = '1' then
dout <= "00000000";
elsif rising_edge(clk) then
dout(7 downto 0) <= dout(6 downto 0) & prbs_fb;
end if;
end process;
-- below is line 31
prbs_fb <= dout(7) xnor dout(5) xnor dout(4) xnor dout(3);
end architecture;
Posso fazer o erro desaparecer alterando o tipo de signal prbs_fb
para std_logic
.
A definição de tipo unsigned(0 downto 0)
faz mais sentido para mim porque o RHS da atribuição é unsigned. Parece que o código está inferindo um único bit de unsigned no LHS da atribuição e um único bit no RHS da atribuição.
Por que a linha 31 é considerada um agregado? A saída dos operadores lógicos deve ser um bit?
A mensagem produzida pela Cadence é diferente; mas ela também está infeliz com alguma coisa.
prbs_fb <= dout(7) xnor dout(5) xnor dout(4) xnor dout(3);
|
xmvhdl_p: *E,EXPTYP (design.vhd,31|52): expecting an expression of type UNSIGNED 87[8.3] 93[8.4].
xrun: *E,VHLERR: Error during parsing VHDL file (status 1), exiting.
Isso também elimina o erro, porém não está claro por que o VHDL exigiria associação nomeada (a seção 4.12 do livro Ashenden da 3ª edição, Array Aggregates, chama isso de "associação nomeada") para a atribuição de uma matriz de elemento único?
prbs_fb <= ( 0 => dout(7) xnor dout(5) xnor dout(4) xnor dout(3) );
VHDL é fortemente tipado.
prbs_fb
é um tipo de array, edout(n)
são elementos únicos dodout
array, que retornam tipos escalaresstd_logic
. O resultado de todos osxnor
operadores são todos std_logic únicos, que não são um tipo de array, e, portanto, não podem ser atribuídos de volta ao tipo de array.Usar a atribuição agregada (não a associação nomeada como você a chama - a associação nomeada é para mapeamento de listas genéricas ou de interface) implica que o tipo retornado deve ser um tipo de matriz e pode então inferir que esse tipo de matriz é
unsigned
da atribuição.Não importa que seja apenas um único elemento - ele ainda é um tipo de matriz e, portanto, requer o tipo de matriz para a atribuição.