2017-02-25 16 views
0

私たちはDSPのMACユニットをシミュレートする必要がある大学向けプロジェクトを行っています。 シミュレーションのために、私はAldec Riviera Pro 2014.06をEDAプレイグラウンドを通して使用しています。 問題は、add_resという名前の32ビット符号付き信号を初期化しても、シミュレーションではその値が常にXXXX_XXXXとして表示されるということです。シミュレーション中に信号値が初期化されない

Here's the simulation's result.

ここ

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; 

そして、ここでは、私は一般的にこことGoogleで検索した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; 

のコードだdesign.vhdのコードです他の人にとっては同じ問題を抱えていますが、与えられた解決策は役に立たなかった。

変数をテストベンチからリセットしましたが、何も試していません。他のものはすべて正常に動作しますが、初期化されないようです。

+0

シグナル( 'add_res')に' out '( 'A')モードのポートを割り当てようとしていますが、これは可能ではありません – gsm

+0

ここに示すようにフィードバックを実装しようとしているからです。 [link](http://turbo-cf.narod.ru/docs/MCF5307/MCF5307BUM-MAC.pdf)ページ2. – jimkats

+0

モードのポートを読み取ることは、IEEE Std 1076-2008で明示的に許可されています。6.5.2インターフェイスオブジェクト宣言、para 13 "** out **。インタフェースオブジェクトの値は更新することが許されています。信号パラメータは、サブプログラムのクラス信号インタフェースオブジェクトを意味する(6.5.2パラ1参照)。コードで暗示される内容は-2008です。 – user1155120

答えて

0

add_resとmul_resの値は、add_resがレジスタにロードされるときに知る必要があるという問題があります。

このプロセスはclkに対して敏感ですが、エッジを使用することも、clkの値で修飾することもありません。

clkの立ち上がりエッジでadd_resを修飾するようにアーキテクチャを変更しました。その時点でmult_resに非メタバール値を持っていることを前提に構築されています。これは、デフォルトの初期値を定義することによって部分的に処理することができます。

シグナルが更新されるまで、新しい値Aは使用できません。これは、現在のシミュレーションサイクルで再開が保留されているプロセスがある間は発生しません。これは、あなたが(とにかく累積値を保持する)add_resに割り当て、プロセス外に割り当てる必要があることを意味しません:

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; 

そして、これは与える:

mac_testbench_fixed.png

あなたは注意してください可能性がまったくありAとadd_resを崩壊させようとする必要があります。シミュレーション目的のために、0シミュレーション時間が経過した後に有効になる信号割り当てによって引き起こされるデルタサイクルは、シミュレーション時間を取らない。

スケジュールされた信号更新とデルタサイクルは、本質的に逐次的に割り当てられる信号の並行性をエミュレートするために使用されます。 (そして、修正されたアーキテクチャでは、Aへの代入はadd_resよりも遅れて1デルタサイクルで行われます)。

(はい、テストベンチのStimulusプロセスで刺激の最後にStopClockトランザクションを挿入します)。

+0

ありがとうございます。私はそれがその実装のために必要ではないと思ったので、私は時計の立ち上がりを使用することを忘れて、とてもばかげている。今はすべてが正常に動作します。 – jimkats

関連する問題