2014-12-01 4 views
0

Я пытаюсь реализовать кэш-память 16 * 37 в VHDL в DesignWorks 5. Код приведен ниже. Код запускается, но когда я меняю значения с панели ввода-вывода или даже моделирую в любом случае, временная диаграмма ничего не показывает, и по какой-то причине код не работает. Любые предложения будут действительно полезными.Код VHDL работает, но временная диаграмма ничего не показывает

Код:

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_arith.all; 

entity Cache is 
port(cs, r, clr : in std_logic; 
    data : in std_logic_vector(31 downto 0); 
    addr : in std_logic_vector(7 downto 0); 
    cline : out std_logic_vector(31 downto 0); 
    ctag: out std_logic_vector(3 downto 0); 
    v : out std_logic); 
end Cache; 

architecture behav of Cache is 
type RAM is array (0 to 15) of std_logic_vector(36 downto 0); 
begin 
process is 
variable M : RAM; 
variable locn : natural; 
variable temp_val : std_logic_vector(36 downto 0); 
variable cline_val : std_logic_vector(31 downto 0); 
variable ctag_val : std_logic_vector(3 downto 0); 
variable v_val : std_logic; 
    begin 

     if cs = '1' then 
      locn := to_integer(addr); 
      if r = '1' then 
       temp_val := M(locn); 
       cline_val := temp_val(31 downto 0); 
       ctag_val := temp_val(35 downto 32); 
       v_val := temp_val(36); 
      else 
       temp_val(31 downto 0) := data; 
       temp_val(35 downto 32) := addr(3 downto 0); 
       temp_val(36) := '1'; 
       M(locn) := temp_val; 
       v_val := 'Z'; 
       ctag_val:= "ZZZZ"; 
       cline_val:= "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"; 
      end if; 
     end if; 
     if clr ='1' then 
      locn := 0; 
      while(locn<16) loop 
       M(locn) := X"000000000" + "0"; 
       locn:=locn+1; 
      end loop; 
     end if; 
    cline <= cline_val; 
    ctag <= ctag_val; 
    v <= v_val; 
    wait on cs; 
end process; 

end behav; 
+0

Этот код не будет синхронизирован ... Я также предпочел бы какие-то строки комментариев или эксплантаты, особенно для одиночных символов, поэтому другие читатели на SF могут понять ваш код. – Paebbels

ответ

0

Эта линия:

M(locn) := X"000000000" + "0"; 

появляется неправильно.

M - ваш тип массива ram с длиной элемента 37. Нулевой 36-разрядный ноль, добавленный к нулю, по-прежнему составляет 36 бит (это не похоже на то, что вы достигли этого утверждения, это будет ошибка времени выполнения).

Чтобы использовать длину 37 вектор значений '0', используйте `(others => '0').

Вы также можете использовать цикл for для ящика ram, вам не нужно использовать индекс 16, он выходит за пределы диапазона, что говорит о том, что вы также не достигли четкости.

Я думаю, что вы должны показать нам свой стимул, иначе ваши проблемы не могут быть воспроизведены.

Ваш недостающий data и addr в качестве элементов чувствительности (и ya, ваш случай cs окружает, но вы хотите построить здесь аппаратную модель).

Переключиться на список чувствительности (cs, data, addr).

locn является непринужденным естественным и должен иметь диапазон, соответствующий типу массива ram (от 0 до 15). Обратите внимание, что цикл while достигает 16. Действительно, используйте цикл for (показано ниже). Причиной ограничения locn является предотвращение связанной ошибки при доступе к ram(locn).

Примечания для преобразования addr к естественному (locn) вам нужно и маске addr с длиной четыре пробегом «1 ', чтобы не допустить ошибку диапазона для нормальной работы домкрата.

Пакет numeric_std - это аффектация, это проще, чем передача нескольких параметров командной строки в ghdl (ieee=synopsys -fexplict) во время анализа и разработки.

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity cache is 
    port (
     cs, r, clr: in std_logic; 
     data:  in std_logic_vector(31 downto 0); 
     addr:  in std_logic_vector(7 downto 0); 
     cline:  out std_logic_vector(31 downto 0); 
     ctag:  out std_logic_vector(3 downto 0); 
     v:   out std_logic 
    ); 
end entity; 

architecture behav of cache is 
    type ram is array (0 to 15) of std_logic_vector(36 downto 0);  
begin 

    process (cs, data, addr) 
     variable m : ram; 
     variable locn : natural range (ram'range); 
     variable temp_val : std_logic_vector(36 downto 0); 
     variable cline_val : std_logic_vector(31 downto 0); 
     variable ctag_val : std_logic_vector(3 downto 0); 
     variable v_val : std_logic; 
    begin 
     if cs = '1' then 
      locn := to_integer(unsigned(addr and x"0F")); 
      if r = '1' then 
       temp_val := m(locn); 
       cline_val := temp_val(31 downto 0); 
       ctag_val := temp_val(35 downto 32); 
       v_val := temp_val(36); 
      else 
       temp_val(31 downto 0) := data; 
       temp_val(35 downto 32) := addr(3 downto 0); 
       temp_val(36) := '1'; 
       m(locn) := temp_val; 
       v_val := 'Z'; 
       ctag_val:= "ZZZZ"; 
       cline_val:= (others => 'Z'); 
      end if; 
     end if; 
     if clr ='1' then 
      for i in ram'range loop 
       m(i) := (others => '0'); 
      end loop; 
     end if; 
     cline <= cline_val; 
     ctag <= ctag_val; 
     v <= v_val; 
    end process; 
end architecture; 

Этот код анализирует и разрабатывающий, вы могли бы ошибку где-то я не упомянул, и связанные (диапазон) ошибки обнаруживаются во время выполнения в назначениях (выражения не могут заботиться).

И последний бит:

  temp_val(31 downto 0) := data; 
      temp_val(35 downto 32) := addr(3 downto 0); 
      temp_val(36) := '1'; 

может быть выражена:

  temp_val:= '1' & addr(3 downto 0) & data; 

, а также:

  locn := to_integer(addr); 

выражен как:

  locn := to_integer(addr(3 downto 0)); 

Вы также можете создать маску AND с длиной, определенной алгоритмически из ram'range, если вы установите размер плунжера общим.

И, не видя своего стимула, есть несколько мест, которые могут вызвать ошибки во время выполнения. Проверьте вывод консоли.

Смежные вопросы