En los cursos de Diseño Lógico todos aprendimos que es posible minimizar una función lógica, por ejemplo utilizando un mapa de Karnaugh o el Algoritmo Quine-McCluskey . También nos enteramos de que "No me importa" aumentan el potencial de minimización.
Por ejemplo, tome un archivo de registro. El write_address
y write_data
señales no importan realmente cuando el write_enable
la señal es '0'
. Por lo tanto, se les debe asignar un valor "Don't Care" para permitir más optimizaciones en la lógica que se conduciendo estas señales (es decir, no en el propio archivo de registro).
¿Cuál es la forma correcta de especificar estos valores "Don't Care" en VHDL para que la herramienta de síntesis tenga más espacio para posibles optimizaciones?
Hasta ahora he encontrado las siguientes cosas que podrían ser adecuadas. Pero no estoy muy seguro de cuáles son los pros y los contras de cada enfoque:
- Simplemente no asignar la señal. Esto parece que podría funcionar. Sin embargo, he descubierto que no funciona cuando se quiere definir una "constante de no hacer nada" de algún
record
ya que las constantes de los registros tienen que estar completamente especificadas (al menos así me lo dice Modelsim). - El
std_logic_1164
define el valor'-' -- Don't care
parastd_ulogic
. Parece que es la opción semánticamente correcta para un "don't care" explícito, pero nunca he visto que se utilice en ningún sitio (excepto en el no relacionado VHDL-2008case?
construcciones). - Modelsim utiliza el valor
'X'
para mostrar las señales no definidas. Sin embargo, no estoy seguro de que las herramientas de síntesis entiendan un'X'
-asignación como "no me importa".
Aquí hay un fragmento de código sobresimplificado para clarificar, donde he inicializado las señales de no cuidado con '-'
.
Como puede ver, la señal control.reg_write_address
puede tener 3 valores diferentes: "----"
, instruction(11 downto 8);
y instruction(3 downto 0);
. Ahora esperaría que esto se sintetizara en un multiplexor de 2 entradas si '-'
se interpreta como "no me importa". Si hubiera inicializado la señal con (others => '0')
en lugar de '-'
la herramienta tendría que generar un multiplexor de 3 entradas en su lugar.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package mytypes is
type control_signals_t is record
write_enable : std_logic;
write_address : std_ulogic_vector(3 downto 0);
read_address : std_ulogic_vector(3 downto 0);
end record;
-- All members of this constant must be fully specified.
-- So it's not possible to simply not assign a value.
constant CONTROL_NOP : control_signals_t := (
write_enable => '0',
write_address => (others => '-'),
read_address => (others => '-')
);
end package;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library cfx;
use cfx.mytypes.all;
entity control_unit is
port(
instruction : in std_ulogic_vector(15 downto 0);
write_data : out std_ulogic_vector(15 downto 0);
ctrl : out control_signals_t
);
end entity;
architecture rtl of control_unit is
begin
decode_instruction : process(instruction) is
begin
-- Set sensible default values that do nothing.
-- Especially all "write_enable" signals should be '0'.
-- Everything else is mostly irrelevant (don't care).
ctrl <= CONTROL_NOP;
write_data <= (others => '-');
if instruction(15 downto 12) = "1100" then
-- Load 8 bit of data into the register file
ctrl.write_enable <= '1';
write_data <= std_ulogic_vector(resize(signed(instruction(7 downto 0)), 16));
ctrl.write_address <= instruction(11 downto 8);
elsif instruction(15 downto 8) = "11111001" then
-- Load 4 bit of data into the register file
write_data <= std_ulogic_vector(resize(signed(instruction(7 downto 4)), 16));
ctrl.write_address <= instruction(3 downto 0);
elsif instruction(15 downto 8) = "10110101" then
-- Read from the register file. Don't use the write signals at all.
ctrl.read_address <= instruction(3 downto 0);
end if;
end process;
end architecture;
0 votos
¿Podría explicar con más detalle lo que está tratando de hacer con
write_address
ywrite_data
? ¿Qué optimización espera que se produzca?0 votos
Espero que el ejemplo deje más claro lo que quiero conseguir.