2017-02-25 4 views
0

Wir haben ein Projekt für die Hochschule, wo wir eine MAC-Einheit für DSP simulieren müssen. Für die Simulation verwende ich Aldec Riviera Pro 2014.06 über EDA Spielplatz. Das Problem ist, dass, obwohl ich ein 32-Bit-signed-Signal mit dem Namen add_res initialisiert hat, wird der Wert während der Simulation als XXXX_XXXX die ganze Zeit angezeigt.Signalwert wird während der Simulation nicht initialisiert

Here's the simulation's result.

Hier ist der Code des design.vhd

LIBRARY IEEE; 
USE IEEE.std_logic_1164.all; 
USE IEEE.numeric_std.all; 
----------------------------- 
ENTITY mac IS 
     PORT (B, C : IN SIGNED (15 DOWNTO 0); 
      clk : IN STD_LOGIC; 
      A : OUT SIGNED (31 DOWNTO 0)); 
END mac; 
----------------------------- 
ARCHITECTURE mac_rtl OF mac IS 
     SIGNAL mul_res: SIGNED (31 DOWNTO 0); 
     SIGNAL add_res: SIGNED (31 DOWNTO 0) := (others => '0'); 
BEGIN 

     mul_res <= B * C; 

     PROCESS (clk) 
     BEGIN 
      A <= mul_res + add_res; 
      add_res <= A; 
     END PROCESS; 

END mac_rtl; 

Und hier ist der Code des testbench.vhd

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.numeric_std.all; 

entity testbench is 
end entity testbench; 

architecture BENCH of testbench is 
component mac is 
port (B, C : in SIGNED (15 DOWNTO 0); 
     clk : in STD_LOGIC; 
     A : out SIGNED (31 DOWNTO 0)); 
end component; 

    signal StopClock : BOOLEAN; 
    signal clk : STD_LOGIC; 
    signal B, C : SIGNED (15 DOWNTO 0); 
    signal A : SIGNED (31 DOWNTO 0); 

begin 

    ClockGenerator: process 
    begin 
    clk <= '0'; 
    wait for 2 ns; 
    while not StopClock loop 
     clk <= '0'; 
     wait for 1 ns; 
     clk <= '1'; 
     wait for 1 ns; 
    end loop; 
    wait; 
    end process ClockGenerator; 

    Stimulus: process 
    begin 

    B <= "0000000000000010"; 
    C <= "0000000000001000"; 
    wait; 

    end process Stimulus; 

    DUT : entity work.mac 
    port map (B, C, clk, A); 

end architecture BENCH; 

Ich habe im Allgemeinen hier und in Google gesucht für andere mit dem gleichen Problem, aber die gegebenen Lösungen haben nicht geholfen.

Ich habe versucht und mit einem Reset Variable von Testbench, aber nichts. Es ist so, als würde es überhaupt nicht initialisiert werden, während alles andere normal funktioniert.

+0

Sie versuchen, einen Port des Modus 'out' (' A') zu einem Signal ('add_res') zuzuweisen, was nicht möglich ist – gsm

+0

Das ist, weil ich versuche, ein Feedback zu implementieren, wie es hier gezeigt wird: [link] (http://turbo-cf.narod.ru/docs/MCF5307/MCF5307BUM-MAC.pdf) Seite 2. – jimkats

+0

Das Lesen eines Ports im Modus out ist in IEEE Std 1076-2008 6.5.2 Interface object explizit erlaubt Deklarationen, Abs. 13 "** out **. Der Wert des Schnittstellenobjekts darf aktualisiert werden und, sofern es sich nicht um einen Signalparameter handelt, gelesen werden." Ein Signalparameter bedeutet ein Klassensignalschnittstellenobjekt für ein Unterprogramm, siehe 6.5.2 Abs. 1.Was im Code enthalten ist, ist -2008. – user1155120

Antwort

0

Das Problem ist, dass der Wert von add_res und mul_res zu dem Zeitpunkt bekannt sein muss, zu dem add_res in ein Register geladen wird.

Beachten Sie, dass der Prozess clk empfindlich ist, aber keine Kante verwendet noch mit einem Wert von clk qualifizieren.

Ich habe Ihre Architektur geändert, um die Aktualisierung von add_res an die steigende Flanke von clk anzupassen. Es gibt eine integrierte Annahme, dass Sie zu diesem Zeitpunkt nicht-metavalue-Werte auf mult_res haben. Dies kann teilweise durch Definieren eines Standardanfangswerts behandelt werden.

Auch der neue Wert von A ist nicht verfügbar, bis die Signale aktualisiert werden, was nicht der Fall ist, wenn Prozesse im aktuellen Simulationszyklus wieder aufgenommen werden müssen. Das heißt, Sie zu add_res zuweisen müssen (die ohnehin den akkumulierten Wert hält) und einen außerhalb des Prozesses zuzuweisen:

ARCHITECTURE mac_rtl OF mac IS 
     SIGNAL mul_res: SIGNED (31 DOWNTO 0) := (others => '0'); -- added init val 
     SIGNAL add_res: SIGNED (31 DOWNTO 0) := (others => '0'); 
BEGIN 

     mul_res <= B * C; 

     PROCESS (clk) 
     BEGIN 
      if rising_edge(clk) then -- ADDED 
       -- A <= mul_res + add_res; CHANGED 
       add_res <= mul_res + add_res; 
       -- add_res <= A;   CHANGED 
      end if;     -- ADDED 
     END PROCESS; 

     A <= add_res; 

END mac_rtl; 

Und das gibt:

mac_testbench_fixed.png

Sie könnten bemerken gibt es keine muss versuchen, A und add_res zu reduzieren. Für Simulationszwecke benötigen Delta-Zyklen, die durch Signalzuweisungen verursacht werden, die nach Ablauf der 0-Simulationszeit wirksam werden, keine Simulationszeit.

Geplante Signalaktualisierungen und Delta-Zyklen werden verwendet, um die Gleichzeitigkeit von Signalen zu emulieren, die inhärent sequenziell zugewiesen sind. (Und ja, in der modifizierten Architektur wird die Zuweisung zu A um einen Delta-Zyklus später als add_res erfolgen).

(Und ja, ich legte eine StopClock-Transaktion am Ende der Reize in Prozess Stimulus in der Testbench).

+0

Vielen Dank. Es ist so albern, dass ich vergessen habe, die steigende Flanke der Uhr zu benutzen, weil ich dachte, dass sie für diese Implementierung nicht benötigt wird. Jetzt funktioniert alles wie es soll. – jimkats

Verwandte Themen