Para evitar travas, é necessário garantir que todas as suas saídas sejam atribuídas em todas as possíveis ramificações do código.
por exemplo,
if a = '1' then
b(0) <= '1';
else
b(1 downto 0) <= "00";
end if;
geraria uma trava, porque na primeira condição, o valor de b (1) não é especificado; portanto, o compilador decidiu que você deseja manter o valor anterior de b (1) lá. Uma maneira de escrever isso que não geraria uma trava é:
if a = '1' then
b <= prev_b;
b(0) <= '1';
else
b(1 downto 0) <= "00";
end if;
...
if rising_edge (clk)
prev_b <= b;
end if;
Aqui, você declara explicitamente que b deve reter seu valor antigo e depois substitui b (0) pelo novo valor.
Outra maneira é dar um valor padrão ba, como na resposta do @ TomiJ.
Se você publicar o código no qual está obtendo uma trava, poderemos ajudá-lo a encontrar o motivo específico.