Multiplicador de desplazamiento a la derecha de declaración secuencial ilegal

Estoy tratando de implementar un multiplicador de desplazamiento a la derecha y se supone que esa es la ruta de datos. ¿Por qué este código genera este error?:

Declaración secuencial ilegal.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;

entity data_path_module is
port (
a_in        : In    std_logic_vector(3 downto 0);
b_in        : In    std_logic_vector(3 downto 0);
rst_n       : In    std_logic;
p_in        : In    std_logic_vector(3 downto 0);

a_out       : Out   std_logic_vector(3 downto 0);
b_out       : Out   std_logic_vector(3 downto 0);
valid_out   : Out   std_logic;
p_out       : Out   std_logic_vector(3 downto 0)
);
end entity data_path_module;

architecture data_path_module_df of data_path_module is
signal tmp : std_logic_vector(3 downto 0);
begin
P1 : process (a_in, b_in, rst_n, p_in)
begin
p_out   <= p_in + b_in when (a_in(0) = '1') else p_in;
a_out   <= b_in(0)  & a_in(2 downto 0);
b_out   <= '0'      & b_in(2 downto 0);

valid_out   <= '1';
end process P1;
end architecture data_path_module_df;

Respuestas (2)

No nos ha dicho qué cadena de herramientas está usando, pero la razón probable es que las asignaciones que usan whenno son compatibles con un proceso anterior a VHDL-2008. Active el modo 2008 en su herramienta o use una ifdeclaración en su lugar.

La construcción when-else es una declaración concurrente según los estándares vhdl-93. Lo está utilizando en proceso, como declaración secuencial.