Je souhaite décrire une entité qui peut fonctionner normalement ou être mise en mode test. La conception générale que j'ai est une entité de premier niveau qui enveloppe l'entité «réelle» et une entité de test.Habillage et commutation entre entités similaires en VHDL
J'essaie de trouver la meilleure façon de l'exprimer en VHDL, mais j'ai l'impression de trop compliquer les choses.
Tenir compte d'une petite entité de haut niveau (de façon réaliste, il y a beaucoup plus d'E/S):
entity toplevelobject is
port (
in1 : inout std_logic;
in2 : inout std_logic;
out1 : out std_logic;
out2 : out std_logic;
testline : in std_logic;
testclk : in std_logic;
);
end toplevelobject;
Ceci est censé basculer entre la fonctionnalité réelle et le mode de test en fonction de l'état de « testline "(test de moyens élevés). Notez que le module de test utilise en fait tout sauf clk
comme sortie, même in_*
.
architecture test_passthrough of toplevelobject is
-- This is the actual module
component real_module
port (
in1 : in std_logic;
in2 : in std_logic;
out1 : out std_logic;
out2 : out std_logic;
clk : in std_logic;
-- Note absence of "testline"
);
end component;
-- This is the test module, which will just put the clk
-- signal out on all pins, or play a tune, or something
component test_module
port (
in1 : out std_logic;
in2 : out std_logic;
out1 : out std_logic;
out2 : out std_logic;
testclk : in std_logic;
-- Note absence of "testline"
);
end component;
signal real_in1, real_in2 : std_logic;
signal real_out1, real_out2 : std_logic;
signal test_in1, test_in2 : std_logic;
signal test_out1, test_out2 : std_logic;
begin
real_0 : real_module port map (
in1 => real_in1,
in2 => real_in2,
out1 => real_out1,
out2 => real_out2,
clk => clk,
);
test_0 : test_module port map (
in1 => test_in1,
in2 => test_in2,
out1 => test_out1,
out2 => test_out2,
testclk => clk,
);
-- Ports that are outputs on both don't need
-- much special attention
out1 <= real_out1 when testline = '0' else test_out1;
out2 <= real_out2 when testline = '0' else test_out2;
end test_passthrough;
J'ai donc quelques questions:
Pour les
inout
ports, dois-je avoir un grand processus avec une déclarationcase ... when
qui passe surtestline
? Ou un processus pour chaque E/S avec une instructionif
? Théoriquement, je pense que de nombreux processus plus petits sont exécutés simultanément et non séquentiellement, mais cela va-t-il réellement faire une différence dans la simulation ou la synthèse? Par exemple:passthrough_in1 : process(testline, in1, test_in1) is begin if testline = '0' then real_in1 <= in1; else in1 <= test_in1; end if; end process passthrough_in1;
... vs ...
passthrough_all : process(in1, test_in1, in2, test_in2, testline) is
case testline is
when '0' =>
real_in1 <= in1;
real_in2 <= in2;
when '1' =>
in1 <= test_in1;
in2 <= test_in2;
end case;
end process passthrough_all;
- Est-ce une approche saine d'esprit ou est-il quelque chose de plus simple?
- Je suis confus au sujet de la sensibilité - ai-je besoin
passthrough_in1
(ou mêmepassthrough_all
être sensibles à tout autre quetestline
- Ai-je besoin
real_in1
/test_in1
pour choisir entre les deux entités enveloppées Ou est-il une autre façon? dire « sitestline
est élevé, connecteztest_module
sortiein_1
autoplevelobject
I/Oin_1
Oui, ils ont plus de sens dans le vrai ... mais il y en a environ 60 :) Dans cet exemple, cependant, c'est plutôt qu'ils désignent des "broches qui seraient des entrées si c'était juste le vrai module". Je n'avais pas pensé à l'option 'Z' ... Je me suis dit que je devrais voir comment régler les trois états pour les broches sur mon appareil particulier, donc je devrais vérifier pour voir si cela sera le même dans la synthèse. Oh, et j'aime vraiment l'idée de l'entité "switcher" séparée ... même si elle ne sauvegarde pas de code, cela * signifie * que je peux corriger les erreurs en un seul endroit. – detly
Un problème avec l'idée de "l'entité de commutation" est que certaines entrées ne sont que des signaux simples et que d'autres sont des vecteurs. Pourtant, c'est mieux que l'approche verbatim. – detly
Créez un sélecteur qui accepte un vecteur std_logic_vector non contraint - qui fonctionnera alors pour tous les vecteurs. Pour les bits simples: passez-les dans le vecteur un (probablement avec un casting slv je pense) - ils seront vus comme un slv (0 à 0). Vous pouvez créer un wrapper single_bit pour faire cela pour vous, en fonction de l'emplacement de votre tolérance de casting :) –